专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:佚名   来源:本站原创   点击数:  更新时间:2013年11月11日   【字体:
      本方案解码对象是苏州华芯微电子的HS9148发生芯片的遥控信号;该芯片可以有单发码,连发码,等组合方式。具体功能可以参考其PDF文件。现在对其中6组连发码K1-K6进行解码。本程序采用PIC16F505进行软件延时方法,通过查询红外接收口的电平变化规律,来进行按键解码。
 

     先看一下连发码的传输规律,如下图所示

这个是发射器上面的码型,经过红外接收模块后,信号与发射型号是反相的。如下图:



 

其中a的值可以左右计算a=(1/fosc)*192,当采用455E的晶振时候 a=0.422ms.

在看看“0”和“1”的定义,对单片机接收端而言,下面图示是01的定义


 

由图可以看出来,高电平过后,低电平持续时间为3a定义为逻辑1,高电平过后低电平持续时间为a定义为逻辑0。(理解了这个规律对解码能否成功有着非常重大的意义)。

     为了验证PDF上的高低电平时间定义的正确性,用示波器检测了其中某几个按键的红外接收端的波型。如下所示:


 

 




对其时间测试发现和
PDF上的资料基本符合。

本程序灵敏度和抗干扰能力还有待提高。本文目的在于寻找红外解码的方法,如何做到简单有效。RB2为遥控接收脚,RC0RC1RC2RC3链接LED指示灯,程序代码如下(下载地址:http://www.51hei.com/f/pichon.rar ):

#include<pic.h>

__CONFIG(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.5msC1C2C3根据资料为:110)意思是,低电平过后延时10a的时间,如果RB2为高电平,说明C1C2C3已经来到单片机端口。

if(RB2==1)//如果是高电平说明头码来了

{

 

head_ok=1;//头码标志置1

 

}

else goto HH;没有找到头码,继续回到HH口寻找。

}

 

void code_scan()

{

for(i=0;i<3;i++)//检测HS1S2几位码

{      

              delay2(17);//延时0.844MS

              code1=code1>>1;

              if(RB2==0)//延时0.8MS如果RB20说明,是逻辑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次后变成000001000X04)。以此类推其他码为:

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

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

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

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

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

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

关闭窗口

相关文章