搜索
bottom↓
回复: 4

遥控器 解码经常会失灵,

[复制链接]

出0入0汤圆

发表于 2012-3-9 09:26:19 | 显示全部楼层 |阅读模式
我在本论坛里面找了一个中断+定时器的遥控器解码程序,可以解得码值,但是,解码程序经常会失灵,不知道是不是与我使用的单片机有关,
当解码程序失灵时,单片机必须要重新上电复位才可用使用解码程序。
单片机是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;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-3-9 10:28:32 | 显示全部楼层
用pca模块解码

出0入0汤圆

 楼主| 发表于 2012-3-9 10:36:17 | 显示全部楼层
PCA效果如何,解码的套路是怎么样的?

出0入0汤圆

发表于 2012-3-9 12:58:24 | 显示全部楼层
你上面程序的方案:下降沿中断+定时器 挺好的,
单纯一个定时器状态机也不错,
PCA不用说,支持脉冲捕获,更方便,

但最主要最关键是看你怎么编程

出0入0汤圆

 楼主| 发表于 2012-3-9 17:29:16 | 显示全部楼层
但是目前那个程序解码时经常会出现按按键失灵的情况,费用单片机断电重启才可用,不知道是哪里出错了?!!!!!如果遥控解码失灵后,其他的功能都是正常的,如机械按键、其他的程序运行又正常,现在搞不清问题出在哪里,望指点指点???!!!!!!11
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 02:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表