当前位置:文档之家› 红外遥控编解码全攻略

红外遥控编解码全攻略

-DYDIY-红外遥控编解码全攻略作者:杜洋2005-9-26红外遥控器的解码并对电器进行遥控一直是广大单片机爱好者的一个心愿。

自己动手实现红外遥控电器也是大家单片机学习提高的一个重要的实验。

现在网上关于红外线遥控器的解码的资料和文章很多,可是我在半年前学习红外遥控的解码时可是费了不少的力气。

因为网上大部分资料和源程序都是针对某一种的红外遥控进行说明,只有买了和文章中一样的遥控器才可以继续实验。

而且网上很少有遥控器的编码资料(用单片机模拟红外遥控器),经过了半年的学习与实践现在终于对红外遥控信号的编解码有了一个微薄的认识,在止写成文章希望对初学红外遥控的朋友有一定的帮助,更渴望有深入了解这方面的高手批评指正,谈谈自己的理解与看法,我就算是抛砖引玉了。

呵呵!红外遥控器的解码:大部分的红外遥控的解码资料都是采用串口或是利用一个专用的单片机解码电路取码,前者的制作麻烦而且还要有专用的软件支持。

后者则必须单独做一块解码板,而且一般只对某一种或一类的红外遥控器有效。

而我有一种方法,只用一条不需要电路板的接线,用声卡测出红外遥控的波型。

经过了长时间的使用效果很好,而且不仅对各种红外遥控的解码,还可以对无线通信或各种低波特率的编码进行分析,相当一个高级的试波器。

红外遥控器声卡波形解码一法:采用我的解码方法需要以下的条件:1,一台有MIC输入的声卡的电脑。

2,一条制作好的红外转换线(自己制作,以下有介绍)3,安装高级音频编辑软件COOL EDIT PRO 2.0(各大下载网均有破解版下载)红外遥控协议说明:一般的,红外遥控的编码由前导码、地址码和数据码组成。

而且有比较精准的时序要求。

遥控码的发射由38KHZ或40KHZ的载波信号,由信号的时间长度来表示二进制数据。

遥控的协议表示方法很多,下面是几种典型的例子:1,1E-mail:dydiy@E-mail :dydiy@2这是某型号长虹电视机遥控器的波形,从图中可以看得出它是用一个4.5毫秒的高电平和4.5毫秒的低电平作为前导码。

之后以0.56毫秒高电平和0.56毫秒低电平表示数据“0”,以0.56毫秒高电平和1.65毫秒低电平表示数据“1”。

一般前导码都是明显比数据码长的信号,我们用COOL EDIT 得到波型图之后可以一眼就看出来。

通过前导码之后有32个数据码(“0”,“1”代码),被分成4个字节,每个字节8位(8个数据)。

数据是由高位到低位排列的,我们可以通过看数据码低电平的长度来看出数据值(长为1)。

写下数据再每8位组成一个字节,我们就可以得出70H ,70H ,1AH ,E5H 这4个字节的数据,前2个字节为地址码,用来区别各个产家或各种型号的遥控器(前导码和数据帧的不同也可以区分不同的遥控器)。

一般第一个字节与第二个字节是校验关系,第二个字节是第一个字节的反码(反码:相反的数据,如果数据为“0”反码则是“1”)或是两个字节相同,上图的字节相同。

后两个字节是数据码,用来区别遥控器的按键值,一般第三个字节与第四个字节也是同码或反码的关系,上图为反码关系。

2,此为SAA3010遥控器的波形,说实话我对这个遥控的协议不了解,不过还是知道一点点,在这里小说一下,让高手见笑大方了。

这种遥控的数据是由T (一定长度,集体没量)表示数据“0”,用数据2T 表示数据“1”。

这种协议是不分高低电平的,不论高还是低只要长度相当就表示数据,这种遥控协议的精度不高容易产生错误。

用T 的高电平表示前导码,后有24个数据码,T 长度为0,2T 长度为1,每8位组成一个字节,共有3个字节。

集体的地址字节和数据字节怎么分我就不了解了。

3,这是SONY-D7C8遥控器的波形,和长虹的遥控相似,它用4T长度高电平表示前导码,用T长度低电平和T长度高电平表示“0”,用T长度低电平和2T 长度高电平表示“1”。

共有12个代码,后4个码都为“0”,可能是地址码,可以不理采。

前8位可以组成一个字节的数据,仅用这一个字节表示数据信息。

以上可以看出遥控的编码各有不同,地址码,数据码也不同,所以我们只要了解了代码的形式(即前导码及数据“0”,“1”的表示方式),就可以完全的玩转红外遥控。

解码思路与方法:我利用电脑的声卡和COOLEDIT软件读出遥控码,首先我们得作一条转接线。

我们可以用红外一体化接收头将38K或40KHZ的调制信号解调、放大、输出TTL数据信号电平。

这里我使用的是红外一体接收集成电路TSOP1738,它有3个引脚,分别为电源VDD,地VSS,信号输出OUT。

TSOP17385V的电源我们可以用稳压电源或是从USB口取电,将输出和地接一条音频线接声卡。

就这么简单,快作吧。

电路图:3E-mail:dydiy@E-mail :dydiy@4下面安装COOL ,这个工作我就不多说了,不然大家说我八卦了。

打开COOL ,在多音轨窗口选择一个音轨,点中R 并单击录音键。

用左上角的音轨窗口转换按钮变到单轨方式。

用放大波形和减少幅度工具调整图像。

就这样,波形出来了。

从图中我们可以看出前导码和代码协议方式。

用下面的标尺还可以算出帧长度,也可以读出代码和字节,一举三得。

知道了波形了,下面我们就开始解码遥控了。

(你可以事先把你手中的遥控器每一个键的波形全5E-mail:dydiy@用COOL录下来,以方便工作)遥控码的解码方法:好了,我们了解了遥控码的协议方式了,可是我们怎么用单片机读这个码,并对电器进行遥控呢?下面就说说单片机解码的原理。

我们的单片机解码电路采用SOTP1738作为红外信号的前期检波、放大、输出TTL电平。

将1738的OUT(输出引脚)直接接到单片机的一个I/O口,再接一个单片机的最小系统(由振荡电路、复位电路、稳压电源电路组成),我们的解码硬件电路就准备好了。

为了读取数据的方便,可以在P1口接8个LED用于显示二进制数据,在一般的51单片机学习板都有这个硬件结构。

好像已经成了一个学习板的标准了。

晶振采用12MHZ和11.0592MHZ都可以,只是在延时读数上我一定的区别。

SOTP1738的输出脚(OUT)在没有信号输入时为高电平(=Vdd),当有38KHZ 的调制信号时则呈低电平(=Vss),我们用单片机的I/O口查寻电平的高低,并查寻某一电平的时间长度,就可以读出数据了。

我们以长虹遥控器为例,说说遥控码的读取:遥控码发射是由9毫秒的高电平和4.5毫秒低电平表示前导码。

用560微秒高电平和1120微秒低电平表示数据“1”,用560微秒高电平和560微秒低电平表示数据“0”。

前导码后共4个字节。

判断数据中低电平的长度是读出数据的要点,这里我们用882US(560~1120US之间)作为标尺,如果882uS之后P3.2还是低电平则表示数据1,将1写入寄存器就可以了(数据为一时还需要再延时一小段时间使电平变为高,以用来检测下一个低电平的起始)。

882US后的电平为高则将0写入寄存器。

之后程序等待下一个低电平的到来。

(发射电路发射的高电平信号被1738接收并输入单片机的是低电平,编程6E-mail:dydiy@时一定要注意。

在COOL的读码时上沉是低电平,下沉是高电平。

)仅对长虹遥控器用查寻方式解码的流程图如下:这是比较常用的解码原程序,其中还加上了正码反码校验(流程图上没有)。

7E-mail:dydiy@系统晶振为12MHZ,如果用11.0592MHZ则需要改动延时子程序。

如果用中断法的程序相似,请大家自己写吧。

JB P3.2,$ ;查寻等待低电平MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R7,#16 ;忽略前26位系统识别码JJJJA:JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUUA ;如果为0就跳转到UUUALCALL YS3 ;检测到高电平1的话延时1毫秒等待脉冲高电平结束UUUA: DJNZ R7,JJJJAMOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4 ;接收从1AH到1DH的4个内存,用于存放操作码和操作反码PP: MOV R3,#8 ;每组数据为8位JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU; ; ;如果为0就跳转到UUULCALL YS3 ; ;检测到高电平1的话延时1毫秒等8E-mail:dydiy@待脉冲高电平结束UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1数值的内存中DJNZ R3,JJJJ ;接收满8位换一个内存INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中MOV A,1AHCJNE A,1BH,EXIT ;如果不等表示接收数据发生错误,放弃MOV A,1CHCPL A ;对1AH取反后和1BH比较CJNE A,1DH,EXIT ;如果不等表示接收数据发生错误,放弃;1A为遥控地址码正码1B为反码MOV A,1CH;CJNE A,#10H,EXIT; ;10H为遥控器的Power键的值SETB P0.0 (设P0.0口接一个控制电器)即当键值为10H时执行相应功能MOV P1,A ;显示键值;-----------------延时子程序--------------;YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10; ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#2489E-mail:dydiy@DJNZ R5,$DJNZ R4,D3RETYS4: MOV R4,#2 ;延时程序3,精确延时??微秒D4:MOV R5,#200D5:MOV R6,#250DJNZ R6,$DJNZ R5,D5DJNZ R4,D4RETEND(此程序仅为参考程序,并不实用,如要使用,请自行修改)可以了,我们用单片机读出了数据值(从P1口的二进制数读出,由高位到低位),之后我们就可以比对这个值控制电器了。

相关主题