红外接收程序讲解Word格式文档下载.docx

上传人:b****6 文档编号:16209095 上传时间:2022-11-21 格式:DOCX 页数:14 大小:356.44KB
下载 相关 举报
红外接收程序讲解Word格式文档下载.docx_第1页
第1页 / 共14页
红外接收程序讲解Word格式文档下载.docx_第2页
第2页 / 共14页
红外接收程序讲解Word格式文档下载.docx_第3页
第3页 / 共14页
红外接收程序讲解Word格式文档下载.docx_第4页
第4页 / 共14页
红外接收程序讲解Word格式文档下载.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

红外接收程序讲解Word格式文档下载.docx

《红外接收程序讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《红外接收程序讲解Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。

红外接收程序讲解Word格式文档下载.docx

下图为一个发射波形对应的编码方法:

I4.ehsnnnnn_nn_nn

4引导码kI0I1III

IS控陽的u0wW*

这种编码具有以下特征:

以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0;

以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1。

3、红外接收原理a)波形

红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:

innri□nninn

放大,位定义0和位定义1波形如下:

4、解码原理及算法

注:

代码宽度算法:

16位地址码的最短宽度:

1.12x16=18ms位地址码的最长宽度:

2.24msx16=36ms

可以得知8位数据代码及其8位反代码的宽度和不变:

(1.12ms+2.24ms)x8=27ms

所有32位代码的宽度为(18ms+27ms)〜(36ms+27ms)

对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。

单片机得知发过来的是什么信号,然后再做出相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更换电视频道,如按的是遥控器音量键,则单片机会控制增减音量。

解码的关键是如何识别“0和“1”!

!

从位的定义我们可以发现“0'

“1均以0.56ms的低电平开始,不同的是高电平的宽度

不同!

“0为0.56ms,“伪1.68ms,所以必须根据高电平的宽度区别“0和“1。

如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为

“0,”反之则为“1,”为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否

则如果该位为“0;

读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms

最为可靠,一般取0.84ms左右均可。

根据码的格式,应该等待9ms的起始码和4.5ms

的结果码完成后才能读码。

5、实例代码:

注意一下几点:

1.从上面红外接收头与单片机连接原理图”来看,红外接收头的型号脚是与51的into

相连,所以需要使用INTO(外部中断0).

2•由于解码过程中涉及到延时,为精确起见,我们选择使用定期时1来计时

实例代码:

[C++]viewplaincopy

1.#include

2.#include

3.

3.//函数原型

4.voidSystemInit(void);

5.voidDelay_840us(void);

6.voidDelay_2400us(void);

7.voidLedDisp();

8.unsignedcharGetCode(void);

〃获得码

9.voiddelay(unsignedcharloop);

11.

10.//位变量

11.sbitIRIN=P3A2;

12.sbitBEEP=PM6;

13.sbitswch=P1A7;

16.

14.II变量

15.unsignedcharKeyValue;

II机器码

16.unsignedcharMaValue;

II键值码;

17.unsignedchardisbuf[4];

II数码管显示缓冲

18.unsignedcharscan[4]={0x04,0x08,0x10,0x20};

〃p2位选择

19.unsignedcharcodetable[16]=II共陰碼

20.{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x7

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36.

37.

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48.

49.

50.

51.

52.

53.

54.

*延时

*/

voiddelay(unsignedcharloop)

{

unsignedchari;

for(i=0;

i>

8);

TR1=1;

while(!

TF1);

TF1=0;

TR1=0;

}

*延时9ms

voidDelay_9000us(void)

TL1=153.6;

TH1=223.6;

TR1=1;

TF1=0;

TR1=0;

*延时4.5ms

*/voidDelay_4500us(void)

55.{

56.

TH1

=239.8;

57.

TL1=

2O4.8;

58.

TR1

=1;

59.

while

(!

6O.

TF1

O;

61.

=O;

62.}

63.

64./**

65.*系统初始化

66.*/

67.voidSystemInit(void)

68.{

69.IRIN=1;

70.ITO=1;

//INTO负跳变触发

71.TMOD=0x10;

//定时器1工作在方式1

72.EA=1;

73.EXO=1;

74.}

75.

75./**

76.*读码

77.*/

78.unsignedcharGetCode()

79.{

80.unsignedcharn;

82.

83.statictemp=O;

84.

85.for(n=O;

n<

8;

n++)

86.{

87.

88.

89.

90.

91.

92.

93.

94.

95.

96.

97.

98.

99.}100.101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.

IRIN);

//等待高电平,开始解码

Delay_840us();

//延时0.84ms

if(IRIN)//若仍然为高电平,则为1,否则为0{

temp=(0x80|(temp>

>

1));

//1

while(IRIN);

//等待跳变成低电平}else{

temp=(0x00|(temp>

//0

returntemp;

/**

*数码管显示

voidLedDisp()

for(i=0;

i<

4;

i++){

P0=table[disbuf[i]];

P2=scan[i];

delay(50);

P0=0x00;

117.

118.

119.

voidmain(void)

120.

121.

SystemInit();

122.

123.

while

(1)

124.

125.

//以下是查表显示

126.

disbuf[0]=(((KeyValue&

0xf0)>

4)&

0x0f)

127.

disbuf[1]=KeyValue&

0x0f;

128.

disbuf[2]=(((MaValue&

0x0f);

129.

disbuf[3]=MaValue&

130.

LedDisp();

131.

132.

133.

134.

135.

voidinterr_ir(void)interrupt0

136.

137.

138.

*用户码和机器码

139.

140.

unsignedcharaddrl,addrh,num1,num2;

141.

142.

EA=0;

//先关闭外部中断0

143.

144.

Delay_9000us();

//检测9ms开始码

145.

146.

if(IRIN){//检测是否为干扰信号

147.

EA=1;

//重新开启外部中断0

148.

149.

150.

151.

152.

153.

154.

155.

156.

157.

158.

159.

160.

161.

162.

163.

164.

165.

166.

167.

168.

169.

170.

171.

172.

173.

174.

175.

176.

177.

return;

//退出解码

//等待跳为高电平

Delay_4500us();

//检测4.5ms结果码

//重新开启外部中断0return;

//读码

addrl=GetCode();

//用户编码高位addrh=GetCode();

//用户编码低位num1=GetCode();

//机器码num2=GetCode();

//机器码反码

//校验是否为错码

if(num1!

=~num2)

KeyValue=14;

EA=1;

KeyValue=num2;

MaValue=addrh;

178.}

代码分析(只分析关键部位):

1.系统初始化Systemlnit()

系统初始化时,我们设置IRIN为高电平,同时把ITO设置成1,即下降沿(负跳变)触发中断。

这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。

这样,当按下按键时,红外接收到信号,IRIN则发生从预先设置的高电平跳为低电平,

从而产生中断。

2.解码--中断程序interr_ir(void)

首先,第一步把EXO关中断,这步至关重要,因为一个接收波形许多的下降沿,这样会产生干扰中断。

接下来,使用定期时0延时9ms,跳过开始码。

注意,延时后,需要检测一下干扰信号。

下一步,while(!

等待4.5ms高电平的到来,再延时4.5ms,跳过结果。

引导码过后,开始读码,执行GetCode():

32位数据码,分4次读取,所以执行4次GetCode(),读取一个字节数据过程如下:

1.unsignedcharGetCode()

2.{

3.unsignedcharn;

4.

4.statictemp=0;

6.

5.for(n=0;

6.{

7.while(!

//等待高电平,开始解码

10.

11.Delay_840us();

12.

13.if(IRIN)//若仍然为高电平,则为1,否则为0

14.{

15.temp=(0x80|(temp>

16.while(IRIN);

//等待跳变成低电平

17.}

18.else{

19.temp=(0x00|(temp>

20.}

21.}

22.

23.returntemp;

24.}

1.从上述位定义看,位0和位1都是0.56ms的低电平过后,高电平开始延时。

所以,读码的第一步while(!

是等待这个0.56ms的低电平之后的高电平。

2.从高定平到后开始延时0.84ms

3.判断0.84ms的波形高电平还是低电平。

若仍然是高电平证明,该位为“1,”否则为

“0。

到这里读码结束。

3.校验

由于32位数据码中,后两个字节是键数据码和健数据反码。

可以通过这两个字节数来实行校验。

即,把前一个字节去反判读是否等于后一字节。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1