红外线遥控器编码解码(1):引导码(leader code)
引导码可以说是各个不同遥控器的身份证。但是更确切的说,应该是遥控器内编码芯片的身份证。
不同的编码芯片其引导码的高低电平持续时长不尽相同。本文将通过实验证明此观点。
实验设备:
51单片机开发板,遥控器数个,TL1838红外接收器一个,RSR232串行线一根,USB转串口线一根
实验原理
TL1838是一个一体化的红外接收器,能将空间中传播的38kHz编码的红外信号解码并直接输出TTL电平。
本实验中,TL1838的输出端与51单片机INT0外中断端口P3.2相连,常态下,TL1838输出高电平,一旦有红外信号,立即产生一个低电平,这样通过设置INT0的下降沿触发方式,我们就能捕获一个红外信号。之后我们需要对后继的电平信号进行分析,在本文中我们只分析后继的第一组TTL电平信号——引导码信号,如下图所示:
这是一个来自uPD7121G的引导编码,uPD7121G是一种被广泛使用的红外线编码芯片。我们从图中可以看出,它的引导码以9ms高电平开始,然后产生一个下降沿,并持续4.5ms低电平。
请读者注意,这是红外发射器发出的电平,而接收器TL1838输出的将是这些电平的反码(高电平变成低电平,低电平变成高电平)。
本文将重点通过实验测试各种不同红外发射器的的引导码(高低电平的时间持续)而不仅仅是uPD7121G所发出的引导码。
测试程序
正如本文前面提到的,由于TL1838输出反码,没有红外信号的时候持续输出高电平,因此我们将使用INT0的下降沿触发方式来捕获红外信号的开始。之后,我们打算经过使用8052的Timer2[1](只有8052才有,用法与Timer0和Timer1基本相同,本文中只涉及计时功能)进行计时,直到下一个电平信号出现才停止计时,并立即存储这个变量,开始下一轮计时。
由于只测试引导编码,所以只需要计时两个电平:一个低电平(9ms)和一个高电平(4.5ms)。当然如果是不同的编码芯片,其持续时间会不同,我们将重点证明这一点。
[cpp]
#include "apue.h"
#include "uart.h"
void main()
{
TMOD = 0x20; // timer1, auto-load
TH1 = TL1 = 0xFF;
PCON = 0x80; // 57600bps on 11.0592M
SCON = 0x50; // UART, REN
IE = 0x91; // EA, ES, EX0
TR1 = 1; // start
while(1);
}
void int0_IR() interrupt 0
{
size_t lowTime, highTime;
EX0 = 0;
memset(UARTBuf, 0, SLEN);
/* detect leader code pluse */
TH2 = TL2 = 0; // Clear timer
TR2 = 1; // run timer
while(IR == 0); // until MCU detect high level
TR2 = 0; // stop timer
UARTBuf[0] = TH2; // store timer value
UARTBuf[1] = TL2;
TH2 = TL2 = 0;
TR2 = 1;
while(IR == 1);
TR2 =0;
UARTBuf[2] = TH2;
UARTBuf[3] = TL2;
UARTBuf[SLEN – 1] = 0x7e; // end of data
UARTSend(); // send data to PC over RS232
delayms(1000); // delay 1 second
EX0 = 1;
}
}
[/cpp]
以上代码将捕获INT0外中断,获得一个下降沿脉冲后,关闭INT0外中断,以进行计时分析。我们将计时器所记录的时间存入UARTBuf以发送回PC机,在数据段的最后一个字节设置0x7f作为结束符。
我们将通过这个程序查看几种遥控器的引导编码。
实验结果
实验结果如下图,我们测试了三种不同的遥控器,第一种是某品牌网络机顶盒遥控器,第二种是有线电视机顶盒的遥控器,第三种是某品牌电视机遥控器,分别对应截图的第1,2,3行,每行测试两次。
分析
数据中前两个字节表示接收到的低电平所用时间单位,后两个字节表示高电平所持续时间单位。一个时间单位在11.0592MHz晶振的系统上大约为1.085us,我们并不关心具体到多少微妙,我们只关心低电平与高电平时间的比例。
从第一行数据中我们可以看到,0x1fd3/0x0fc3≈2,这符合uPD6121G编码器的标准,事实上具体时间也符合,因此可以断定这个遥控器使用的就是这款编码芯片。
第二行数据,0x0d2b/0x0621≈2,但是具体时间上并不符合uPD6121G编码器的标准。
第三行数据比较离谱,0x0a65/0x0a57≈1
结论
我们从实验结果中不难总结出,不同遥控器的编码确实是不同的。但是只要他们在二次编码的时候采用38KHz载频,我们都可以使用TL1838进行解码。
我们可以通过这种测试以测序各种不同遥控器的引导码,从而满足我们的应用需求。
Note:
[1] 为了与笔者的毕业设计的项目兼容,本文坚持使用Timer2,当然您也可以使用另外两个计时器。
原创文章,转载请注明出处。
版权声明
本文出自 Lesca 技术宅,转载时请注明出处及相应链接。
本文永久链接: https://www.lesca.cn/archives/ir-remote-code-and-decode.html