[单片机教程]中断应用—红外解码
更新时间:2009年01月08日浏览次数: 351 作者:http://www.cepark.com/Common/ShowAuthor.aspx?authorname= 来源:http://www.cepark.com/Common/ShowCopyFrom.aspx?copyfrom=
第九课 中断应用—红外解码
上一课,我们学习了中断系统,并且以计数器溢出中断编写了一个秒计数器。这一课继续讲解中断中的另一种应用—红外解码,这是外部中断的一种应用。红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。我们来看看红外发射和接收的工作框图。
一般由专用的芯片来进行编码,调制然后发射,接收端接收到红外信号后进行放大、解调、然后送到专门的芯片去进行解码输出。这一课,我们要做的就是用单片机来实现解码。
在实验板上,有一个一体化的红外接收头,它用于接收红外信号并且整理成单片机可以直接处理的标准电平信号,看下图。
左端是单一的红外接收二极管,只起到接收信号的作用,而右端二种是一体化的红外接收头,一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。在实验板上的P32口我们接了一个一体化的红外接收头。P32口是单片机的外部中断INT0的入口。我们以uPD1621芯片的编码方式来讲解红外解码的过程。
uPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。后16位为8位操作码(功能码)及其反码。uPD6121G最多达128种不同组合的编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,下图为发射波形图。
当发射端一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms-18ms),高8位地址码(9ms-18ms),8位数据码(9ms-18ms)和这8位数据的反码(9ms-18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
当发射端一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms-18ms),高8位地址码(9ms-18ms),8位数据码(9ms-18ms)和这8位数据的反码(9ms-18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
图四①图为位的波形图,我们要用单片机来解码,关键在于如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为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的结果码(称之为引导码)完成后才能开始读码。图四③图中为连发的格式,这个波形是发生在已经发送了一次完整的108ms的编码之后,如果按键仍按下,则只发③图中的波形。
我们来看看单片机程序上如何解码。
程序进行接收解码,并且将解码得到的值在数码管上进行显示。
IT0=1;从第八课的图一中断系统图中,我们可以知道,定义外部中断为负跳变的边缘触发方式,这样当P32上的引脚信号由高变低的瞬间,单片机就可以产生中断信号。
主程序中,不停做扫描显示,当有红外信号时,中断进入中断处理子程序,先做检测起始码,避免由于干扰信号造成误动作,然后再等待高电平之后跳过结果码,就开始读入32位的二进制码组。解码出来的数值存放在个变量中,我们在数码管上显示出码值及其反码值,这样可以看到解码是否正确。
这次我们的中断处理子函数我们写成void Decode() interrupt 0,和上一课的interrupt 1不同,大家对照第八课的中断系统图,从上到下,分别就是interrupt 0~4共5个中断。
在解码过程中,当我们按一下遥控器时,可以显示出码值,但如果持续按住,则解出来全是FF,这是对连发格式的解码得到的值,在判断是否连发时,程序中还要进行处理。大家可以想想怎么做连发判断。另外,在解码的时候,大家应该注意到了,数码管的显示有闪动,这是因为解码过程中,用了延时而没有进行数码管扫描,大家想想有什么办法可以减少这种闪动。
好了,这一课到此结束,这个解码程序还有需要改进的地方,比如里面用到了 while做电平判断,这样如果受到干扰容易在此处死循环,大家想想如何改进这里,可以使其既能做电平判断又不至于会出现死循环的状况。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。