原创 红外解码程序

2009-9-20 21:35 2579 2 2 分类: MCU/ 嵌入式

遥控器波形:


827bb11b-0640-4022-8317-65b2fbe59706.JPG


这个是1组波形,按键一次连发3次


程序很简单,但是开始的时候忘了设置INT0的触发方式。调了半天


 


#include <REGX52.H>
typedef unsigned char uchar;


/*硬件引脚定义*/
sbit IR="P3"^2; //红外口


/*全局变更定义*/
bit NewCode="0";  //新红外数据标志
bit IR_Decodeing=0; //解码中标志
uchar IRCode;     //红外数据
uchar IRbits="0";
uchar LastCode;  //3次比较用
uchar IRCount="0";


/*函数申明*/
void init(void);


main()
{
 init();
 while(1)
 {
  if(NewCode)
  {
   P0=IRCode;
   SBUF=IRCode;
   while(!TI);
   TI=0;
   NewCode=0; 
  }
 }
}



/************************************************************
*Function:初始化                                       
*************************************************************/
void init(void)
{
   
    TMOD="0x21";      //定时器1模式1
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
 EX0=1;
 ET0=1;
 IT0=1;   //INT0下降沿触发
 SCON=0x50;
 EA=1; /* 开中断 */
}


/************************************************************
*Function:INT0中断                                  
*************************************************************/
void int0(void) interrupt 0
{


 if(IR_Decodeing)
 {
  TH0=0xFC;    //定时1ms
  TL0=0x66;
 }
 else //前导判断
 {
  TH0=0xFA;    //1.5ms
  TL0=0x99;
 }
 TR0=1;
}


/************************************************************
*Function:TIMER0中断                                  
*************************************************************/
void timer0(void) interrupt 1
{
 if(IR_Decodeing)
 {
  IRbits++;
  IRCode>>=1;
  if(IR==0)
  {
    IRCode+=0x80;//低电平代表1
  }
  if(IRbits==8)
  {
   if(LastCode==IRCode)
    IRCount++;
   else
   {
    IRCount=0;
    LastCode=IRCode;
   }
   if(IRCount==2)   //3次数据一样
   {
    NewCode=1;
    IRCount=0;
    LastCode=0xff;
   }
   IR_Decodeing=0;
  }
 }
 else //判断是否是前导
 {
  if(IR)
  {
   return;
  }
  else    //低电平是前导
  {
   IR_Decodeing=1;
   IRbits=0;
  }
   
 }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条