新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机红外解码查询法(HS9148)

单片机红外解码查询法(HS9148)

作者: 时间:2016-11-30 来源:网络 收藏

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时间后会在发一次码,本意是作为上次的校验码,但是本程序只是检测第一次的发生码,第二次的码,没有检测。

if(RB2==1)如果是为1,说明80a间间隔到来,

{

code_ok=1;//认为解码成功

return; //并且退出整个解码程序,回到主程序的其他函数执行。Return语句有退出整个函数的功能。

}

}

void main()

{

TRISB=0b00000100;

PORTB=0X00;

TRISC=0b00000000;

PORTC=0X00;

while(1)

{

head_scan();//头码检测

if(head_ok==1)

{

code_scan();//解码函数

}

if(code_ok==1)//解码成功

{

switch(code2)//散转功能

{

case 0x20:

RC0=1;

RC1=0;

RC2=0;

RC3=0;

break;

case 0x10:

RC0=0;

RC1=1;

RC2=0;

RC3=0;

break;

case 0x40:

RC0=0;

RC1=0;

RC2=1;

RC3=0;

break;

case 0x80:

RC0=0;

RC1=0;

RC2=0;

RC3=1;

break;

}

}

}

}

本程序是对12位码元进行解码,还涉及,解码成功后,码元的存放问题,由于定义的变量为char型,只有8位,所以要分别给系统码和按键码独立定义变量,code1,code2。以按键K1为例,K1的码为:000001,由于第一次判断其为1的时候,把他放在char型变量中,其值为,10000000,那么向右移动5次后变成00000100(0X04)。以此类推其他码为:

K2—00001000;四次移位(0X80)

K3—00010000;三次次移位(0X10)

K4—00100000;二次次移位(0X20)

K5—01000000;一次移位(0X40)

K6—10000000;0次移位(0X80)

本文只是初步实现简单方法解码过程,各项指标还要进一步提高。


上一页 1 2 下一页

评论


技术专区

关闭