单片机与红外遥控技术原理 第2页
图5为接收头常用的接法,红外接收头接收到红外光后,直接解调后输出我们需要的高低电平,可送往处理器直接处理,但值的注意的一点是,接收到的数据刚好与发射的信号电平相反。例如图6:
图5 发射的信号与接收到刚好相反 论文范文http://www.chuibin.com/
因此,由信号结构可以知道,1与0,和引导码的信号由发射时的高电平到低电平的顺序变为接收时的低电平到高电平,第一个信号开头都会有一个下降沿,这样我们可以用单片机的外部中断来感应每一个信号的到来。
2 程序设计程序设计思路:利用定时器与外部中断来接收红外信号的,并把接收函数放进中断函数里面。下面的是结构图
接收到的引导码,和数据“0”与“1”是由先低后高的电平组成的,单片机外部中断设置为下降沿中断,即每当引导码和数据0与1到来时,都会产生一个中断,中断后,启动定时器计时,并等待下一个中断到来。因此,二个中断之间的时间差就可以由定时器算出,如果判断后得中断时间差为9MS,则可知道收到的是引导码;如果时间差为1.125ms,则这个数据为0;如果时间差为2.25,则这个数据为1;如果这个时间差不在这个范围,我们定义了接收错误,或者为光干拢。取消接收并等待下一指令。
由于单片机的晶振的误差,和程序上的指令运行时间的不精准,接收数据的时间差不一定是刚好9ms,1.125或为2.25.所以程序上采用了相对精准的时间差。例如:
单片机选用的是16位记数器,即采用高8位对其。例如:单片机晶振为12MHZ,定时器每记一个数为1us. 引导码的时间差了9ms=9000us,在定时器里的值为00100011|00101000。在接收引导码时,如果定时器的高8位是等于00100011时,我们就可以粗略当它为9ms的时间差,那它为引导码。这样可以避免单片机时间上的误差而导致接收上的误判。0与1的接收时间上的简化也类似。下面是接收的程序,只附上外部中断的程序。
void OutIR() interrupt 0
{
TR0=0;//停止计数器
th=TH0;//中断来了以后,立急停止计数器,并把TH0数据赋值给th;
TH0=0;TL0=0;TR0=1;//收到数据后,立及启动计数器继续计数;
if((count==1)&&(th<=0x25)&&(th>=0x20)) //判断高8位的数据,即是不是引导码?
{ ok=1; }//OK是用来检测是不是引导码,成功K=1
if(ok==1)//如果引导码成功,才进行下面的数据接收。
{ if((1<count)&&(count<33))//count在1~33之间的都 是数据位,需要接收的
{
if((0x03<=th)&&(th<=0x04))//如果时间差th的值在03~33之间,表示数据为0
{ date[(count-2)/8]=(date[(count-2)/8]<<1)&0xfe; //通过算法,给date移位赋值。Date是一个数组,用来装收到四个字节的数
else
if((0x07<=th)&&(th<=0x09))//如果时间差th值在这个范围,则表示数据为1
date[(count-2)/8]=(date[(count-2)/8]<<1)|0x01; }
}
count++;//每接成功一次,这个数自加一次
if(count>33)//如果计数大于33了,则表示接收玩了,要进行对数据初始化了
{ count=0;TR0=0;ok=0; }
if(ok==0)//这句是用来检测上面的接收是否成功,如果不成功,刚K=0.在这里进行数据复位
{ if(count!=1) count=0;}
}
3 结束语此红外遥控装置,在电路设计上非常简单。代码编程上稍有难度,只有直正了解整个红外传送的格式,才能设计程序,要想装置的接收稳定性好,还应该多注意时间上的误差。这文章从浅入手,详细讲了原理,希望能对你们初学者了解红外遥控方面有一定帮助。李文龙(广东海洋大学 热能与动力工程 热能1073 班,湛江