欢迎来到天天文库
浏览记录
ID:37648354
大小:150.93 KB
页数:7页
时间:2019-05-27
《带连码红外接收程序》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、可以处理连码红外接收程序网上流行很多红外接收程序,但都没有处理连码的功能,所以特意在某个程序(网络的)上作了些更改,完成了这个程序。在众多的处理器中,用得最多的单片机可算是AVR了,所以在本文里所描述的程序也是基于AVR家族之一ATTINY24V。选用它的原因并不是这个单片机有什么特殊功能,仅仅是刚好手头上有,而且功能适用。输入捕捉中断、输出比较中断、PWM等功能在用于红外接收和LED亮度控制方面非常适当。所以,若需要移植到其他型号的AVR的话,很简单。说起红外遥控,大家最熟悉的不过是NEC的红外协议了,现在重温一下这个协议。在
2、红外遥控发射端,NEC协议逻辑“1”是560us的38K载波(占空比1/4到1/3,这个占空比值是基于发射端的电源节能考虑的,好比一个周期不变的电源开关,闭合的时间越短就越省电,但刚好能满足接收端的识别要求)和1690us的低电平组成;逻辑“0”则是由560us的38K载波和560us低电平组成。所以两者的周期各为:2.25ms和1.12ms,具体如图1所示。图1图1是发射端的发射波形,在接收端的一体化接收器处理后是反相的,但是滤去了38K的载波信号,如下面图2所示:图2一串完整的信号如下面图3所示(遥控发射端),其中深色的部分
3、是38K的载波信号,空白部分为低电平:图3在接收端经过一体化红外接收器处理后,在输出引脚的波形如下图4所示,我们需要解码的信号就是下面的波形,所以软件都是根据这个信号进行编写的:图4事实上,红外一体化接收器在空闲时,输出引脚总是高电平(这和串口通讯的TXD和RXD的电平状况一样),所以一旦有信号,一体化接收器输出引脚马上变为低(如图4波形所示),但是每个逻辑“0”或“1”都会在位周期内变低,那么处理器该如何识别红外信号的开始呢?这就需要引导码(各种协议的引导码均有所不同),这里的NEC协议则在一体化接收器处理后首先是约9ms的低
4、电平,然后是约4.5ms的高电平,接下来发送的是则是地址码、地址反码、命令码及其反码。现在开始讨论程序时如何解码的。认真看图4的波形,会很容易发现有一个共同点:包括起始码在内,每个逻辑“1”和“0”都是由低到高的一组电平组组成(“0”---“1”),只不过这组电平组的时间长短不同而已。那么我们就以这个跳变的信号作为解码的依据。前面提及到AVR单片机的输入捕捉中断功能恰好能胜任这个要求:首先使能输入捕捉功能(即是置位输入捕捉噪声抑制器),然后设置输入捕捉触发沿,最后使能输入捕捉中断。根据电平组(“0”---“1”)可知,我们需要设
5、置低电平触发,触发后即进入中断函数,在中断函数里检查捕捉寄存器的数值,然后根据数值的大小来决定这个位是“0”或是“1”,还是启动码。既然设置低电平触发,触发即读出捕捉寄存器的值,仔细的人会注意,刚开始的起始码,触发后读出来的值岂不是“0”(因为定时器尚未启动)不错,的确是0,我们完全根据这个独有的特性来忽略它。比如,只要读到是0,则打开定时器后中断退出。更仔细的人会发现,既然每个“0”和“1”都是由电平组(“0”---“1”)构成,那么这串编码的最后一个电平组(没有下降沿)岂不是没有触发源不能中断进行计数?放心,NEC协议早就考
6、虑到这一点,认真看图4,最后的一个独立的560us低电平就是为这个考虑的。说到这里,要谈及重复码问题了。NEC遥控器,只要你一直按着一个按键,那么它在发送第一个32位编码后,接着每隔110ms发送的并不是这个32编码,而是重复码。一直按着任意键,除开始发送的32位编码不同外,紧接着发送的都是一样的重复码,下面来看看这个重复码的波形特点:图5根据上图所示的特点,那么该如何处理这个重复码?重复码仅仅表示刚发完32编码的数据重复,如之前解码值为0x01码,那么这个重复码的值也应该为0x01;如之前的解码值为0x02,则重复码的值也应该
7、是0x02,既然如此,那么我们仅需要把之前的解码值保存到一个变量里,当有重复码时,则直接使用保存在变量里的值即可。但是会不会乱呢?不会,应该重复码总是跟在一个32位的编码之后的。说到这里,来看看这个解码流程图:定时器输入捕捉中断初始化NO输入捕捉中断?YES上次解码未处理完毕时,进入的中断NO即退出上次解码是否处理完毕?Y停止计数器,此值为0则清0并重新开启计数器读取输入捕捉寄存器值此值不为0N0ICP=输入捕捉寄存器32位码是否已经开NOICP为起始码NOICP为重复码始接收?YYY根据ICP里面的值确定是逻辑0还是逻辑1置位
8、32位码解码结束开始接收重置各变量32位右移1位NOICP为1?YICP为0?NO32位接收完毕?NOY解码结束,重置所有标志位根据以上的流程图,可以写出下面的程序:#include#include#include
此文档下载收益归作者所有