- 1、本文档共61页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动手学AVR单片机二十四、红外遥控器的接收实验
NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式)。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
一、电路实现
??? 红外发射器很容易找到,我们平时家用的电视、DVD遥控器都可以用来进行实验。下面的电路图是红外接收部分的电路图,
?
二、红外接收原理
??????? 关于红外发射部分,由于我们采用的是现成的遥控器,而不同的遥控器其实现电路各不相同,这里我们就不详细介绍。我们只需要知道遥控器发射出来的数据格式,然后通过红外接收器接收数据,并根据数据格式将其进行分解,得到相应键值即可。
???? 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.25ms)组成。其中32位数据格式如下:
??? 这种遥控码具有以下特征:???? 采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,波形如下图:
?
三、程序实现
???
在本实例中,我们利用串口将单片机从一体化红外接收器接收到的红外遥控键值发送到计算机上,通过计算机的串口助手观察接收到的数据。
编程过程中,我们利用单片机的外部中断0口进行检测,一旦检测到有红外遥控信号出现,则程序进入外部中断处理程序,在处理数据过程中关闭外部中断,直到接收完数据,再将外部中断打开。注意使用串口助手查看数据的时候选择16进制显示
??? 红外遥控的数据接收主要在外部中断函数中进行处理:处理过程为:当有遥控键值发送的时候,红外一体化接收器的脉冲信号输出脚发生一个下降沿的电平变化,外部中断采用下降沿出发的方式接收到由外部中断事件发生,程序进入外部中断处理函数,首先关闭外部中断,然后根据一体化接收器脉冲信号输出引脚的高低电平变化时间判断红外遥控发送的数据,共有4个字节的数据,处理完这4个字节数据后,利用单片机的串口将数据发送到计算机。
?
?
下面是完整代码:其中串口数据发送部分的程序请查看前面关于串口的实现部分
#include avr/io.h??????? #include util/delay.h#include avr/interrupt.h?? //中断函数头文件#include usart.h
void INT_Init(void);?? //外部中断初始化void Delayus(unsigned int lus);???????? //us延时函数void Delayms(unsigned int lms);??????? //ms延时函数?
int main(void)??????????? {???Port1_Init();?Usart1_Init();?INT_Init();???sei();????????? //使能全局中断? ??while(1)?{???}}
//外部中断初始化void INT_Init(void){?EICRB |= (1 ISC41);?? //选择外部中断4,下降沿触发中断?EIMSK |= (1 INT4);??? //使能外部中断4}
//ISR(INT4_vect){?unsigned char i,j,k = 0,addr[4] = {0};??EIMSK = 0x00;??? //禁止外部中断4?? 关闭外部中断,开始接受数据?for(i = 0;i 14;i++)?{??Delayus(400);??if(PINE (1 PE4))??? //9MS内有高电平,则判断为干扰,退出处理程序??{???EIMSK |= (1 INT4);??? //使能外部中断4???return;??}?}?while(!(PINE (1 PE4)));? //等待9ms低电平过去?for(i = 0;i 4;i++)?????????????? //?{??for(j = 0;j 8;j++)??????
文档评论(0)