1、红外接收程序讲解红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编 /解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、 LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。讨编码调制卜-遥控发射器|此/电放大1ci namsa rv 8);TR1=1;while(!TF1);TF1=0;TR1=0;* 延时 9ms*/void Delay_9000us(void)TL1 = 153.6;TH1 = 223.6;TR1 = 1;while(!TF1);TF1 = 0;TR1 = 0;* 延时 4.5ms*/ void De
2、lay_4500us(void)55. 56.TH1= 239.8;57.TL1 =2O4.8;58.TR1= 1;59.while(!TF1);6O.TF1O;61.TR1= O;62. 63.64./*65.* 系统初始化66.*/67. void SystemInit(void)68.69.IRIN = 1;70.ITO = 1; /INTO负跳变触发71.TMOD = 0x10; /定时器 1 工作在方式 172.EA = 1;73.EXO = 1;74.75.75./*76.* 读码77.*/78.unsigned char GetCode()79.80.unsigned char
3、n;82.83.static temp = O;84.85. for( n = O; n 1); / 1while(IRIN); / 等待跳变成低电平 else temp=(0x00|(temp1); / 0return temp;/* 数码管显示*/void LedDisp()unsigned char i; for(i=0;i4)&0x0f)127.disbuf1=KeyValue&0x0f;128.disbuf2=(MaValue&0xf0)4)&0x0f);129.disbuf3=MaValue&0x0f;130.LedDisp();131.132.133.134.135.void i
4、nterr_ir( void) interrupt 0136.137./*138.* 用户码和机器码139.*/140.unsigned char addrl,addrh,num1,num2;141.142.EA = 0; /先关闭外部中断 0143.144.Delay_9000us(); / 检测 9ms 开始码145.146.if (IRIN) / 检测是否为干扰信号147.EA = 1; /重新开启外部中断 0148.149.150.151.152.153.154.155.156.157.158.159.160.161.162.163.164.165.166.167.168.169.17
5、0.171.172.173.174.175.176.177.return ; / 退出解码while(!IRIN); / 等待跳为高电平Delay_4500us(); / 检测 4.5ms 结果码if (IRIN) / 检测是否为干扰信号EA = 1; /重新开启外部中断 0 return ; / 退出解码/ 读码addrl=GetCode(); / 用户编码高位 addrh=GetCode(); / 用户编码低位 num1=GetCode(); / 机器码 num2=GetCode(); / 机器码反码/校验是否为错码if(num1!=num2)KeyValue=14;EA=1;return
6、 ;KeyValue=num2;MaValue=addrh;EA=1;178. 代码分析(只分析关键部位):1.系统初始化Systemlnit()系统初始化时,我们设置IRIN为高电平,同时把ITO设置成1,即下降沿(负跳变)触 发中断。这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。这 样,当按下按键时,红外接收到信号, IRIN则发生从预先设置的高电平跳为低电平,从而产生中断。2.解码-中断程序 interr_ir(void)首先,第一步把EXO关中断,这步至关重要,因为一个接收波形许多的下降沿,这样 会产生干扰中断。接下来,使用定期时0延时9ms,跳过开始码。注意,延时后
7、,需要检测一下干扰信 号。下一步,while(!IRIN);等待4.5ms高电平的到来,再延时 4.5ms,跳过结果。引导码过后, 开始读码,执行 GetCode():32位数据码,分4次读取,所以执行4次GetCode(),读取一个字节数据过程如下:C+ view pla in copy1.un sig ned char GetCode()2.3.un sig ned char n;4.4.static temp = 0;6.5.for ( n = 0; n 1); / 116.while(IRIN); / 等待跳变成低电平17.18. else 19.temp=(0x00|(temp1); / 020.21.22.23. return temp;24. 1.从上述位定义看,位 0和位1都是0.56ms的低电平过后,高电平开始延时。所以, 读码的第一步 while(!IRIN);是等待这个0.56ms的低电平之后的高电平。2.从高定平到后开始延时 0.84ms3.判断0.84ms的波形高电平还是低电平。若仍然是高电平证明,该位为 “1,”否则为“ 0。”到这里读码结束。3.校验由于 32 位数据码中,后两个字节是键数据码和健数据反码。可以通过这两个字节数来 实行校验。即,把前一个字节去反判读是否等于后一字节。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1