摘 要: 传统的红外遥控器解码,需要预知发射端红外编码格式,不同的编码格式软件不通用,可移植性差。通过对遥控器红外信号的采集、分析,提出基于AT87C52单片机外部中断,利用HS0038红外线接收器的红外遥控器的解码软件的设计及其应用,可以在不掌握遥控器的编码格式的情况下,破译每个键的红外编码,进而将其扩展为单片机的键盘系统。其程序通用性好,装置集成化高,可以方便地应用于其他红外遥控接收装置。
关键词: 单片机;外部中断;红外遥控器;解码;键盘
红外遥控器是一种无线的、非接触控制装置,具有抗干扰能力强、信息传输可靠、功耗低、成本低的特点,广泛应用于日常生活和工业中[1]。由于不同公司生产的遥控器编码码制往往不同,通常不可移植。考虑到C语言与汇编语言相比具有书写方便易于开发等特点,本文设计了一种简单的红外线接收电路,通过C语言软件设计,实现对万用遥控器的解码,可以方便地应用于其他红外遥控设备。
1 系统的实现
1.1 红外信号的构成
红外通信主要由发射和接收两部分组成。发射端将待发送的二进制信号编码成一系列脉冲串信号,通过红外发射管发送。接收端接收信号的同时,对红外信号进行放大、检波、整形后得到TTL电平编码,送入单片机处理[2]。红外发射二极管发送的信号是频率为38 kHz的间断脉冲串,相当于用二进制信号的编码乘以频率为38 kHz的脉冲信号得到的间断脉冲串。如图1所示,A是二进制信号的编码波形,B是频率为38 kHz周期为26 μs的连续脉冲串,C是经调制后的间断脉冲串(相当于C=A×B),用于红外发射二极管发送的波形。图1中,待发送的二进制数据为101。
1.2 红外发射接收部分设计
本文采用的红外遥控器共6个键,分别是开关、震动、气泡、定时、加温、减温。接收的部分选用HS0038红外接收探头,接收频率为38 kHz、周期为26 μs的红外信号。HS0038是黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。在用小功率发射管发射信号的情况下,其接收距离可达35 m;它能与TTL、CMOS电路兼容;HS0038为直立侧面收光型,同时能对信号进行放大、检波、整形得到TTL电平的编码信号。3个管脚分别是地、+5 V电源、解调信号输出端。
红外解码电路如图2所示,当HS0038接收到红外信号时,输出端输出脉冲,触发三极管导通,发光二极管通电发光[3],这样可以直观地看到发射、接收部分是否正常工作。输出端接AT87C52单片机的T0口,下降沿触发T0计数器计数[4]。
2 解码方案
单片机T0口接收到脉冲下降沿后,T0计数器计数,下一次下降沿触发计数器停止,并把结果存在预先设置好的数组中。数组里面的数字代表一个信号的长短。虽然不同厂商的红外遥控器编码形制不同,但在所有的编码中,0、1信号只有长度的区别。根据这个原理,对采集到的信号组进行分析,定义长的信号为1,短的信号为0。反复实验就得到各个按键的编码,破解后的遥控器可以用作单片机的扩展键盘。图3为解码程序主流程图。
void int1()
{
IT0=1; //下降沿触发外部中断IT0;
EX0=1; //允许外部中断;
EA=1; //CPU中断总允许;
}
void main()
{
int i=0,j=0; //设置变量;
int1(); //初始化;
TMOD=0x01;//定时模式;
TH0=0; //计数器高8位清零;
TL0=0; //计数器低8位清零;
TR0=1; //开启定时器;
Running=0; //设置引导码标志位,初始值为“0”;
Time=0; //接收次数
}
for(i=0;i<32;i++)
{
calendar[i]=0; //清空信号存储数组
}
}
void s_int0(void) interrupt 0 using 0://外部中断T0[5]
int th,tl; //设置变量用于暂时存储计数器里的数值
TR0=0; //关闭定时器;
if(running==0) //判断引导码标志位的数值是否为“0”
{
running=1; //标志位置“1”;
}
else //已经接收过引导码;
{
th=TH0;
tl=TL0;
calendar[time]=th*256+tl; //高8位与低8位整合
为一个数,存入数组中;
time++ ; //采样次数标志位加1;
if(time>=32) //判断是否采集够32位
{
EA=0; //关总中断;
EX0=0;//关外部中断;
}
}
TH0=0; //计数器高8位清零;
TL0=0; //计数器低8位清零;
TR0=1; //开启定时器;
}
数据分析:以开关键为例,采到的数据如表1所示。
由表1可以看出,开头与结尾的3个信号时间比较长,其余的信号可分为两种(大约是1 100和2 200)。开头的13 521是引导码,结尾的40 498和11 235是终止码。把2 200定义为逻辑1,1 100定义为逻辑0,得到第一个键码制为00FF30CF。用同样的方法得到其他键的码值分别为00FF10EF、00FF20DF、00FF00FF、00FF807F、00FFA05F。前16位相同,是客户代码。
3 应用
遥控器解码之后,可以通过单片机将其用于其他装置(此系统已成功应用于本实验室的微机继电保护系统中)。由于计数器低8位的数值对整体影响不大,本文根据高8位的数值判断收到的信号为0或1,根据之前测得脉冲范围,规定TH0接收的数值在0x07~0x09之间,键位码为1;数值在0x02~0x05之间,键位码为0。如此循环即可得到一个完整的码值。然后进入功能实现区,用户可以根据自己的需要,定义键位功能,具有很高的灵活性。
应用部分软件设计:
(1)读键位循环的代码如下:
void s_int0(void)interrupt 0 using 0
{ int th,tl;
th=TH0;
tl=TL0;
calendar[time]=th*256+tl;
if((TH0>=0x07)&&(TH0<=0x09))
//如果高8位数值在0x07~0x09之间;
{codegroup=(codegroup*2+1); //在键位码结尾加1;
}
else if((TH0>=0x02)&&(TH0<=0x05))
//如果高8位数值在0x02~0x05之间;
{ codegroup=codegroup*2; //在键位码结尾加0;
}
else{leader=0;}
time++;
}
(2)键位功能代码如下:
if(code1==0x30CF) //读键位码
{ while(code1==0x30CF); //确认键位码
code1=0; //清空码值,等待下一次按键
(实现功能1)
}
if(code1==0x10EF)
{ while(code1==0x10EF);
code1=0;
(实现功能2)
…………………………
if(code1==0x00FF)
{ while(code1==0xA05F);
code1=0;
(实现功能6)
}
基于AT87C52单片机的万能遥控器解码及其应用,提出了一种简易的红外遥控器解码方法,此法可以在完全不知遥控引导码和结束码使用的编码规则的情况下,直接解码,自主定义1和0。具有操作简便,可移植性强的特点。
参考文献
[1] 戴培山,冯承德,刘栋.基于keilC51的红外解码设计[J].自动化仪器与仪表,2003(6):11-23.
[2] 卢灵,刘远峰.红外通信技术在温湿度变送器上的应用[J].微计算机信息,2010(9-2):158-160.
[3] 童诗白,华成英.模拟电子技术基础(第四版)[M].北京:高等教育出版社,1980.
[4] 魏立峰,王宝兴.单片机原理与应用技术[M].北京:北京大学出版社,2006.
[5] 马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计(第四版)[M].北京:北京航空航天大学出版社,2007.