1、下图为一个发射波形对应的编码方法:I 4.ehs n n n n n_n n _n n4 引导码 k I 0 I 1 I I IIS控陽的u0 w W *这种编码具有以下特征:以脉宽为 0.565ms、间隔0.56ms、周期为1.125ms的组合表 示二进制的“0;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制 的“ 1。3、红外接收原理 a)波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:innri nn inn放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:1.12 x 16=18ms位地址码
2、的最长宽度: 2.24ms x 16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms) x 8=27ms所有32位代码的宽度为(18ms+27ms)(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但 能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出 红外光信号,即我们通常所说的解码。单片机得知发过来的是什么信号,然后再做出 相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更换电视频 道,如按的是遥控器音量键,则单片机会控制增减音量。解码的关键是如何识别 “ 0和“ 1”
3、 !从位的定义我们可以发现 “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、实例代码:注
4、意一下几点:1.从上面红外接收头与单片机连接原理图”来看,红外接收头的型号脚是与 51的into相连,所以需要使用INTO(外部中断0).2由于解码过程中涉及到延时,为精确起见,我们选择使用定期时 1来计时实例代码:C+ view pla in copy1.#include2.#i nclude3.3./函数原型4.void SystemI nit(void);5.void Delay_840us(void);6.void Delay_2400us(void);7.void LedDisp();8.unsigned char GetCode(void); 获得码9.void delay(uns
5、igned char loop);11.10./位变量11.sbit IRIN = P3A2;12.sbit BEEP = PM6;13.sbit swch = P1A7;16.14.II变量15.unsigned char KeyValue; II机器码16.unsigned char MaValue; II 键值码;17.unsigned char disbuf4; II 数码管显示缓冲18.unsigned char scan4=0x04,0x08,0x10,0x20; p2 位选择19.unsigned char code table16 = II 共陰碼20.0x3f,0x06,0x
6、5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x724.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.* 延时*/void delay(unsigned char loop)unsigned char i;for(i=0;i8);TR1=1;while(!TF1);TF1=0;TR1=0;* 延时 9msvoid Delay_9000us(void)TL1 = 153.6;TH1
7、= 223.6;TR1 = 1;TF1 = 0;TR1 = 0;* 延时 4.5ms*/ void Delay_4500us(void)55. 56.TH1= 239.8;57.TL1 =2O4.8;58.TR1= 1;59.while(!6O.TF1O;61.= 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
8、.unsigned char GetCode()79.80.unsigned char n;82.83.static temp = O;84.85. for( n = O; n 1); / 1while(IRIN); / 等待跳变成低电平 else temp=(0x00|(temp / 0return temp;/* 数码管显示void LedDisp() for(i=0;i4)&0x0f)127.disbuf1=KeyValue&0x0f;128.disbuf2=(MaValue&0x0f);129.disbuf3=MaValue&130.LedDisp();131.132.133.134.
9、135.void interr_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.
10、169.170.171.172.173.174.175.176.177.return ; / 退出解码 / 等待跳为高电平Delay_4500us(); / 检测 4.5ms 结果码 /重新开启外部中断 0 return ;/ 读码addrl=GetCode(); / 用户编码高位 addrh=GetCode(); / 用户编码低位 num1=GetCode(); / 机器码 num2=GetCode(); / 机器码反码/校验是否为错码if(num1!=num2)KeyValue=14;EA=1;KeyValue=num2;MaValue=addrh;178. 代码分析(只分析关键部位):1
11、.系统初始化Systemlnit()系统初始化时,我们设置IRIN为高电平,同时把ITO设置成1,即下降沿(负跳变)触 发中断。这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。这 样,当按下按键时,红外接收到信号, IRIN则发生从预先设置的高电平跳为低电平,从而产生中断。2.解码-中断程序 interr_ir(void)首先,第一步把EXO关中断,这步至关重要,因为一个接收波形许多的下降沿,这样 会产生干扰中断。接下来,使用定期时0延时9ms,跳过开始码。注意,延时后,需要检测一下干扰信 号。下一步,while(!等待4.5ms高电平的到来,再延时 4.5ms,跳过结果。引导
12、码过后, 开始读码,执行 GetCode():32位数据码,分4次读取,所以执行4次GetCode(),读取一个字节数据过程如下:1.un sig ned char GetCode()2.3.un sig ned char n;4.4.static temp = 0;6.5.for ( n = 0;6.7.while (! /等待高电平,开始解码10.11. Delay_840us();12.13.if(IRIN) / 若仍然为高电平,则为 1,否则为 014.15.temp = (0x80|(temp16.while(IRIN); / 等待跳变成低电平17.18. else 19.temp=(0x00|(temp20.21.22.23. return temp;24. 1.从上述位定义看,位 0和位1都是0.56ms的低电平过后,高电平开始延时。所以, 读码的第一步 while(!是等待这个0.56ms的低电平之后的高电平。2.从高定平到后开始延时 0.84ms3.判断0.84ms的波形高电平还是低电平。若仍然是高电平证明,该位为 “1,”否则为“ 0。”到这里读码结束。3.校验由于 32 位数据码中,后两个字节是键数据码和健数据反码。可以通过这两个字节数来 实行校验。即,把前一个字节去反判读是否等于后一字节。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1