51单片机红外解码C程序

51单片机红外解码C程序,第1张

单片机采用外部中断P3.3管脚和红外接收头的信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位 *** 作码提取出来在数码管上显示。

// 解码值在Im[2]中,当IrOK=1时解码有效。 

/* 51单片机红外遥控解码程序 */

//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码

#include <reg52.h>

#define uchar unsigned char 

sbit dula=P2^6

sbit wela=P2^7

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

uchar f

#define Imax 14000    //此处为晶振为11.0592时的取值, 

#define Imin 8000    //如用其它频率的晶振时,

#define Inum1 1450    //要改变相应的取值。

#define Inum2 700 

#define Inum3 3000

unsigned char Im[4]={0x00,0x00,0x00,0x00}

uchar show[2]={0,0}

unsigned long m,Tc

unsigned char IrOK

void delay(uchar i)

{

  uchar j,k 

  for(j=ij>0j--)

    for(k=125k>0k--)

}

void display()

{

   dula=0

   P0=table[show[0]]

   dula=1

   dula=0

   wela=0

   P0=0xfe

   wela=1

   wela=0

   delay(5)

   P0=table[show[1]]

   dula=1

   dula=0

   P0=0xfd

   wela=1

   wela=0

   delay(5)

} //外部中断解码程序

void intersvr1(void) interrupt 2 using 1

{

 Tc=TH0*256+TL0                                               //提取中断时间间隔时长

 TH0=0 

    TL0=0              //定时中断重新置零

 if((Tc>Imin)&&(Tc<Imax))

      { 

  m=0

        f=1

  return

      }       //找到启始码

   if(f==1)

      {

        if(Tc>Inum1&&Tc<Inum3) 

    {

   Im[m/8]=Im[m/8]>>1|0x80m++ 

       }

      if(Tc>Inum2&&Tc<Inum1) 

        {

         Im[m/8]=Im[m/8]>>1m++//取码

  }

  if(m==32) 

   {

         m=0  

         f=0

         if(Im[2]==~Im[3]) 

      {

           IrOK=1 

   }

        else IrOK=0   //取码完成后判断读码是否正确

     }

               //准备读下一码

   }

}

/*演示主程序*/

void main(void)

{

    unsigned int  a

 m=0

    f=0

 EA=1

 IT1=1EX1=1

 TMOD=0x11  

 TH0=0TL0=0

 TR0=1//ET0=1

 while(1)

 {

       if(IrOK==1) 

  {

      show[1]=Im[2] &0x0F     //取键码的低四位

           show[0]=Im[2] >>4 

           IrOK=0

  }

           for(a=100a>0a--)

          {

    display()

   }

 }

}

解码程序这个就能实现

红外收发中,IRDATA[2]与IRDATA[3]是取反的关系。也就是说两个数对应各位前者为1后者就为0

其余的问题,都是根据红外接收时序来编的程序,以下总结以下红外收发时序供参考,你读懂就可以理解了。

采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1“上述"0"和"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H后16位为8位 *** 作码(功能码)及其反码

发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。

解码的关键是如何识别"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms的高+0.56ms的低。所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。为了共用引导部分延时程序,一般用0.9ms延时。

由此可见,有效数据是4字节(32位)。前两个字节可定义用户编码,后两个字节分别是真正的数据及其反码。

定时器的功能就是对红外信号进行时间计算,判断是否是头码,是否是逻辑0或逻辑1,这个时间计数然后作为外部中断解码的重要依据;

外部中断的功能就是解码,分别判断接收到的信号的时间,对这个时间进行解析,为头码还是逻辑1或逻辑0,地址是否正确,然后根据判断结果将接收到的一位一位的数据组合成一个8位数据,这个8位数据就是红外信号的内容了,发送的东西就是这个8位数据,让偶将这个8位数据送去处理,需要做什么就写什么函数去做。

希望我的回答能帮助到你。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11815674.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存