遥控器 解码经常会失灵,

2020-02-04 09:28发布

我在本论坛里面找了一个中断+定时器的遥控器解码程序,可以解得码值,但是,解码程序经常会失灵,不知道是不是与我使用的单片机有关,
当解码程序失灵时,单片机必须要重新上电复位才可用使用解码程序。
单片机是STC12C5A60S2
系统晶振是33mhZ
定时器是256us中断
程序如下:

unsigned char ir_count,count,irtab[4];
unsigned int data continue_ir;
long int data remote_value;
bit ir_flag,ir_9ms_flag;

void time0_init_remote()   //扫描遥控器
{
        TMOD |= 0X01;         //T0:16位定时器HL全用
        TH0 = 0xFD;           //33MHz,time 256us ,time intterrupt
        TL0 = 0x40;
        ET0 = ET_TIME0_ON;        //启动定时器0中断       
        TR0 = TR_TIME0_ON;        //启动定时器0运行标志,在这里启动定时器0               
}


void main()
{
  time0_init_remote();


   while(1)

   {
     if(BIT.BIT.IrOK == 1)
     {
       EX0=0;
       执行代码......

       EX0=1;
       BIT.BIT.IrOK = 0;
     }
   }

}

/****************************************************************
功能:中断函数
描述:定时器0的中断服务程序
参数:无
返回:无
******************************************************************/
//-----------------------------------------
void Time0_Serv() interrupt 1
{
        TH0 = 0xFD;           //33MHz,time 256us ,time intterrupt
        TL0 = 0x40;

        if(ir_flag == 1)
        {
                count++;
        }

        if(ir_9ms_flag == 1)
        {
                continue_ir++;
        }

        if(continue_ir >= 453)         //116ms/0.256ms=453.125
        {
                ir_9ms_flag = 0;                         //如果引导码后116ms都没有出现连续码,则无连续码,重新等待按键。
                count = 0;
                ir_flag = 0;
                ir_count = 0;
                continue_ir = 0;
        }
}


void Extern_int0() interrupt 0 //下降沿触发:接收不到红外时OUT高电平,接收到红外时OUT低电平。
{
        ir_flag = 1;                        //进入中断则标置置1,用于定时器中断中count计数。

        if(ir_count == 0)
        {
                if(count>49 && count<56)                        // 13.5ms/0.256ms=52.73
                {
                         ir_count++;
                        ir_9ms_flag = 1;                //第一位引导码有效
                        count = 0;                                  //从0开始计数。
                        return;
                }
                else if(count>39 && count<50 && ir_9ms_flag==1)         //11.5ms/0.256ms=44.92
                {
                         BIT.BIT.IR_Repeat = 1;                //遥控信号连续码置位
                        continue_ir = 0;                //清除超时标志
                        ir_flag = 0;                                //清除外部中断标志,禁止count计数。
                        count = 0;                                        //计数count清零
                        EX0=0;
                        return;
                }
                else
                {
                        count = 0;
                        ir_count = 0;
                        return;
                }
        }

        if(count>2 && count<6)         //1.125ms/0.256ms=4.39
        {
                remote_value &= 0x7fffffff;                 //保存0值到变量中       
        }
        else if(count>6 && count<11)         //2.25ms/0.256=8.789
        {
                remote_value |= 0x80000000;                 //保存1值到变量中
        }
        else
        {
                count = 0;
                ir_flag = 0;
                ir_9ms_flag = 0;
                ir_count = 0;
                continue_ir = 0;
        }

        remote_value >>= 1;
        ir_count++;

        if(ir_count >=32)
        {
                irtab[3] = (unsigned char)((remote_value&0xff000000) >> 24);
                irtab[2] = (unsigned char)((remote_value&0x00ff0000) >> 16);  
                irtab[1] = (unsigned char)((remote_value&0x0000ff00) >> 8);
                irtab[0] = (unsigned char)(remote_value&0x000000ff);
               
                BIT.BIT.IrOK = 1;           //接收完一帧,标志位置1
    ir_flag=0;
    ir_count=0;
    count=0;
                remote_value = 0;
        }
        count=0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。