红外遥控解码原理.doc
精品文档,仅供学习与交流,如有侵权请联系网站删除第五讲 红外遥控一、红外接收头外形及与单片机连接电路(a) (b)图1图1(a)为红外接收头HX1838的外形图,它有三个引脚,其中1为接收端2为地端3为电源端。其与单片机连接电路图见(b)所示,红外接收头的接收引脚与单片机的P3.2相连。二、红外遥控简介红外遥控是一种比较廉价的近距离遥控方式。它由发射模块和接收模块两部分组成,编码格式有脉冲宽度调制和脉冲相位调制两大类。本节我们不考虑发射模块而只研究接收端的解码。本例我们以比较容易的脉冲宽度调制来介绍解码原理。三、发射端数据的编码当我们按下遥控器后,遥控器发出一帧数据。这一帧数据由前导码、用户码高8位、用户码低8位、数据码、数据反码组成。其中前导码为9ms高电平接着4.5ms低电平,标志数据帧的开始;用户码(共16位)为红外接收器识别遥控器的身份的标志,不同的遥控器一般用户码不同,以防止不同电器设备之间遥控码的干扰;数据码为红外接收器识别遥控器上不同的按键的标志,对同一遥控器来说,按不同的键所发出的二进制编码具有相同的用户码,不同的数据码,如图1所示.数据反码用于信息正确接收校验。图1红外遥控解码精简设计。孙卫锋,,郑秀娥。山东理工大学学报(自然科学版) 第20卷第6期 2006年 26291、16位用户码,8位数据码和8位数据反码中的数据位定义以脉宽0.56ms间隔0.565ms周期1.125ms表示二进制“0”,以脉宽0.56ms间隔1.69ms周期2.25ms表示二进制“1”,其波形分别如图2(a)和(b)所示。 (a) (b)图22、重复码以9ms高电平,2.25ms低电平,再0.56ms高电平定义为重复码,持续按键时,该键编码连续发送,首帧为数据帧,其后为重复码,周期为108us,如图3所示。图3四、接收端的解码原理解码就是将HX1838输出的脉冲还原为二进制的“0”和“1”,得到二进制“0”,“1”序列,进而分析所含的用户码和数据码。当HX1838在遥控有效距离内,接收到红外遥控脉冲信号后,由内部转换成电压信号并经放大、长时控制、干扰抑制、带通滤波并整形后输出遥控代码脉冲.脉冲的形式为遥控器发射脉冲的倒像.图4表明了遥控发射码与HX1838解码输出码之间的波形关系.一定要注意,单片机接收端与发射端的信号是倒像关系,发射端引导码是9ms高电平,2.25ms低电平,在单片机接收端就变成了9ms低电平和2.25ms高电平,发射端发射位0,则单片机接收端为高电平。五、应用实例应用红外接收头HX1838接收红外信号并送LCD1602显示遥控器按键编码。#include<reg52.h> #include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit IR=P32; sbit RS=P26;sbit RW=P27;sbit E=P25;uchar IRcom6; uint LowTime,HighTime; #define delay_4_nop() _nop_();_nop_();_nop_();_nop_();/*延时*/void delay(uchar i) uchar k,j; for(k=0;k<i;k+) for(j=0;j<255;j+); /*LCD1602*/bit Lcd_R_Busy()bit s;RW=1;delay_4_nop();RS=0;delay_4_nop();E=1;delay_4_nop();s=(P0&0x80);delay_4_nop();E=0;delay_4_nop();return(s);void Lcd_W_Cmd(uchar com)while(Lcd_R_Busy()!=0);RW=0;delay_4_nop();RS=0;delay_4_nop();E=1;delay_4_nop();P0=com;delay_4_nop();E=0;delay_4_nop();void Lcd_W_Dat(uchar dat)while(Lcd_R_Busy()!=0);RW=0;delay_4_nop();RS=1;delay_4_nop();E=1;delay_4_nop();P0=dat;delay_4_nop();E=0;delay_4_nop();void Lcd_Init()Lcd_W_Cmd(0x3c);Lcd_W_Cmd(0x0c);Lcd_W_Cmd(0x01);Lcd_W_Cmd(0x06);Lcd_W_Cmd(0x80);/1602显示字符串/row为行,column为列void showstring(uchar row, uchar column, uchar str)uchar i=0;row &= 0x01; /保证行不超过1 column &= 0x0f; /保证列不超过15if(row=0) Lcd_W_Cmd(0x80|column);if(row=1) Lcd_W_Cmd(0xc0|column);delay(250); while(stri != '0') Lcd_W_Dat(stri);delay(2); i+;/1602显示字符/row为行,column为列,2行(0,1),16列(015)void showchar(uchar row, uchar column, uchar dat) row &= 0x01; /保证行不超过1 column &= 0x0f; /保证列不超过15if(row=0) Lcd_W_Cmd(0x80|column);if(row=1) Lcd_W_Cmd(0xc0|column);Lcd_W_Dat(dat);/*红外部分*/*函数功能:对4个字节的用户码和键数据码进行解码说明:解码正确,返回1,否则返回0*/bit DeCode(void) uchar i,j; uchar temp=0; for(i=0;i<4;i+) for(j=0;j<8;j+) /j=2 temp=temp>>1; /0101 0000 TH0=0; TL0=0; TR0=1; while(IR=0); TR0=0; LowTime=TH0*256+TL0; /3000 TH0=0; TL0=0; TR0=1; while(IR=1); TR0=0; HighTime=TH0*256+TL0; /560 if(LowTime<390)|(LowTime>680) return 0; if(HighTime>450)&&(HighTime<670) /0 temp=temp&0x7f; if(HighTime>1400)&&(HighTime<1890) temp=temp|0x80; IRcomi=temp; if(IRcom2=IRcom3) IRcom5=IRcom2&0x0f;IRcom4=IRcom2>>4;if(IRcom4>9) IRcom4=IRcom4+0x37;else IRcom4=IRcom4+0x30;if(IRcom5>9) IRcom5=IRcom5+0x37;else IRcom5=IRcom5+0x30; return 1; /红外感应处理程序,接收端信号,如果要转成发射端,自己练习转一下,懒了void Function(void)uchar cdis1="Red control"uchar cdis2="IR-CODE: H"Lcd_Init();/lcd初始化函数showstring(0, 0,cdis1);showstring(1, 0, cdis2);showchar(1, 8, IRcom4);showchar(1, 9, IRcom5);/*函数功能:红外线触发的外中断处理函数*/void Int0(void) interrupt 0 using 0 EX0=0; /关INT0中断 TH0=0; TL0=0; TR0=1; while(IR=0); TR0=0; LowTime=TH0*256+TL0; TH0=0; TL0=0; TR0=1; while(IR=1); TR0=0; HighTime=TH0*256+TL0; if(LowTime>8400)&&(LowTime<9600)&&(HighTime>3900)&&(HighTime<5100) if(DeCode()=1) /*DeCode函数用于接收红外信号的数据位并且判断接收是否正确*/ Function(); EX0=1; /*主函数*/void main()TMOD = 0X01;TR0 = 0; /关定时器T0EX0 = 1; /开外部中断int0IT0 = 1; /外部中断下降沿触发EA = 1; while(1) ; 【精品文档】第 5 页