用中断加定时器的红外解码程序

2020-02-04 09:24发布

下面是个用中断加定时器的红外解码程序,但是精度不高,我试了一下,只有75%。我想把它的精度提供一下,可是调了好久都没有调出来,所以就先把程序贴出来,请高手帮忙解答解答了,,
// P3^2接红外接收头,p2^1接蜂鸣器,用于解码正确时叫一下,竞争为12MHz的,
//定时器用的是T1,先谢谢了!!!
//Crystal Frequency=12.000000M
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar wb=0,irr_b=0,p=0;
uint ds=0,a=0;
long da=0,da1=0;
sbit beep=P2^1;
void delay_ms(uchar k)
{
  uchar i,j;
  for (i=k;i>0;i--)
   for (j=121;j>0;j--);
}
void beep_di()
{
  beep=0;
  delay_ms(100);
  beep=1;
}
void ext_int0_isr(void) interrupt 0
{
  a=TH1*256+TL1;               //读取定时器的值
  if(irr_b==0)        //第一个中断
  {
    irr_b=1;          //状态为:开始接收
    TH1=0x00;      //定时器清零
TL1=0x00;
  }
  else if(irr_b==1)   //第二个以后的中断
  {
      //a=TCNT1L;      
   //判断是引导,还是数据
   if((12000<a)&&(a<14500))       //引导
     {
      wb=0;                   //数据计数清零     
   da=0;                   //数据清零
   TH1=0x00;            //定时器清零
   TL1=0x00;
   }
     else if((900<a)&&(a<1800))     //数据0
     {
     wb++;
     da=(da<<1);
  TH1=0x00;
  TL1=0x00;
     }
     else if((1850<a)&&(a<3000))    //数据1
     {
     wb++;
  da=(da<<1)+1;
  TH1=0x00;
  TL1=0x00;
     }
}
if(wb==32)                    //数据长度够32位
  {
    irr_b=0;                    //状态为停止接收
    wb=0;                       //数据计数清零
    p=da;
P0=da;
beep_di();         
   }
}
//*****************************************************************************
void init()
{
     TMOD=0x10;
     ET1=1;
     TR1=1;
     TH1=0;  //9ms
     TL1=0;
     TF1=0;
  EX0=1;
  IT0=1;
     EA=1;
     
}
//*****************************************************************************
void timeout()
{
    ds=TH1*256+TL1;;
if(ds>32000)     //定时器超时,接收复位
   {
      TH1=0;
   TL1=0;
      irr_b=0;
      da=0;
         wb=0;
   p=0;
   }
}
void main()
{
   init();
   while(1)timeout();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。