先看一下连发码的传输规律,如下图所示
这个是发射器上面的码型,经过红外接收模块后,信号与发射型号是反相的。如下图:
其中a的值可以左右计算a=(1/fosc)*192,当采用455E的晶振时候 a=0.422ms.。
在看看“0”和“1”的定义,对单片机接收端而言,下面图示是0和1的定义
由图可以看出来,高电平过后,低电平持续时间为3a定义为逻辑1,高电平过后低电平持续时间为a定义为逻辑0。(理解了这个规律对解码能否成功有着非常重大的意义)。
为了验证PDF上的高低电平时间定义的正确性,用检测了其中某几个按键的红外接收端的波型。如下所示:
对其时间测试发现和PDF上的资料基本符合。
本程序灵敏度和抗干扰能力还有待提高。本文目的在于寻找红外解码的方法,如何做到简单有效。RB2为遥控接收脚,RC0,RC1,RC2,RC3链接LED指示灯,程序代码如下(下载地址:http://www.ruidan.com/f/pichon.rar):
#include<pic.h>
__CFIG(0X034);
#define uchar unsigned char
#define uint unsigned int
Unsigned char head_ok;//头码标志
unsigned char code_ok;//解码成功标志
unsigned char code1;//系统码
unsigned char code2;//按键码
unsigned char i,//系统码解码次数
unsigned char n,//按键码解码次数
void delay2(uint b)//us级别延时
{
unsigned int j;
for(j=0;j<b;j++)
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
}
void head_scan()//头码检测,实际上是在检测C1C2C3也就是遥控器类型识别,意思是,你要遥控电视机还是电风扇,本程序并没有对这几位码进行识别,而是把他们当初红外信号的有无处理
{
HH:
while(RB2);等待RB2脚变成低电平
delay2(100);//延时4.5ms(C1C2C3根据资料为:110)意思是,低电平过后延时10a的时间,如果RB2为高电平,说明C1C2C3已经来到单片机端口。
if(RB2==1)//如果是高电平说明头码来了
{
head_ok=1;//头码标志置1
}
else goto HH;没有找到头码,继续回到HH口寻找。
}
void code_scan()
{
for(i=0;i<3;i++)//检测H,S1,S2几位码
{
delay2(17);//延时0.844MS
code1=code1>>1;
if(RB2==0)//延时0.8MS如果RB2为0说明,是逻辑1。
{
code1=code1|0x80;
while(RB2);//等待RB2变成低电平,为接收下一位做准备
}
else
code1=code1|0x00;
while(RB2);//等待RB2变成低电平,为接收下一位做准备
}
for(n=0;n<6;n++)//解码K1-K6
{
delay2(17);//延时0.844US
code2=code2>>1;
if(RB2==0)
{
code2=code2|0x80;
while(RB2);
}
else
{
code2=code2|0x00;
while(RB2);
}
delay2(100);//延时4.5MS//由于本程序是检测按下一次有效的情况,所以,第一次解码完毕后,发射器在过了80a