搜索
bottom↓
回复: 14

分享一下,昨晚终于用c搞定RC5协议的解码了

[复制链接]

出0入0汤圆

发表于 2005-9-9 17:04:21 | 显示全部楼层 |阅读模式
只用了一个定时器,不用外部中断。红外一体管信号脚接PB1,使用MEGA16

由于实际测量信号电平有干扰,不得不多加个行代码鉴定开始位





点击此处打开armok0168768.pdf





请高手指教



#include <iom16v.h>

#include <macros.h>





#pragma interrupt_handler timer1_ovf_isr:9

#pragma interrupt_handler timer1_compa:7



unsigned char IRstate=0;//红外接收状态



void timer1_compa(void);

void timer1_ovf_isr(void);

void gotonom(void);



void timer1_ovf_isr(void)//第一次得到低电平

{ OCR1A=3360;            //隔0.42毫秒后进入第一个电平检测中间检查

  TCCR1B=0x09;           //使用比较中断较精确

  TIMSK=0x10;

}



void timer1_compa(void)  //红外接收状态1~29(检测27次电平状态)

{unsigned char i,j;

static unsigned char IRcode[24],code,e=0;//IRcode[24]:记录电平;code:数据码;e:错误标记

switch(IRstate)

  {

   case 0:

   if((PINB&0x02)==0)//第一次电平为低

     {IRstate=1;

      OCR1A=6760;    //0.845毫秒后进入第二个电平中间检查

          code=0;

      e=0;

         }

   else             //否则回到正常等待状态

     gotonom();

         

   break;

   case 1:

   if((PINB&0x02)!=0)//第二次电平为高

      {IRstate=2;    //0.845毫秒后进入第三个电平中间检查

          

           }

   else

     gotonom();     //否则回到正常等待状态

         

        break;

        case 2:

        if((PINB&0x02)==0)//第三次电平为高

     {IRstate=3;     //0.845毫秒后进入第四个电平中间检查

         

         }

    else

     gotonom();      //否则回到正常等待状态

         

        break;

        default:         //第4到第27个电平检测

       

         IRstate++;

          if(IRstate<28)  

            IRcode[IRstate-4]=((PINB&0x02)!=0); //贮存第4到第27个电平

          else             //state=28 or 29

            {//2

                if(IRstate==28)//state=28

                        {//1

                             IRstate=29;//212毫秒内不接收

                             OCR1A=1612;

                             TCCR1B=0x0D;

                             for(i=0;i<24;i+=2)//处理结果

                               {//L2

                                if(IRcode==IRcode[i+1])//接收错误

                                {//L1

                                e=1;

                        gotonom();//取消212毫秒内不接收,马上回到等待状态

                                break;

                                }//L1

                                else      //接收正确则解码

                                {//S1

                                if (i>11)             //从第十一个开始

                                { j=1;

                                j<<=((22-i)/2);

                                code+=j*IRcode;

                        }

                            }//S1

                                }//L2

                            if(e==0)

                            {

                                     //接收到红外信息的动作

                            }

                            }//1

                 else//state=29;回到正常

                    gotonom();

                       

                }//2

    break;

  }          

}





void gotonom(void)//回到正常等待状态

{

IRstate=0;

TIMSK=0x04;

TCNT1=65535;

TCCR1B=0x06;

}

void main(void)

  {

   

   

        DDRB=(~0x02);//初始化PB1

        PORTB|=0x02;

       

        TIMSK|=0x04;//初始化TC1,正常等待状态

        TCNT1=65535;

        TCCR1A=0;

        TCCR1B=0x06;

        SEI();

  while(1)  

      {

      }       

            

  }

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

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

出0入0汤圆

发表于 2005-9-9 17:19:53 | 显示全部楼层
RC5,是哪种遥控器.

一般的电视/VCD遥控好像没有用到RC5编码吧?以前写过,是判断脉宽的。

出0入0汤圆

发表于 2005-9-9 19:11:46 | 显示全部楼层
RC5是philips的SAA3010的格式,它是按相位来判定1或者0的,而非其它的判断脉宽。

出0入0汤圆

发表于 2005-9-9 19:31:12 | 显示全部楼层
SAA3010,很常用,但我没实际搞过,猜测一下。



我觉得ATMEL应用笔记的方法更好:

    获得同步后,每3/4周期检测,读取到的电平就是数据了---反相 0就是1,1就是0。



你现在却要检测次数多了一倍。

出0入0汤圆

发表于 2006-3-8 12:21:34 | 显示全部楼层
ytmian

果然大虾,崇拜!!!!!

出0入0汤圆

发表于 2006-3-8 12:53:08 | 显示全部楼层
这种简单的做法在比较恶劣的工矿是不可靠的

出0入0汤圆

发表于 2006-3-8 19:32:08 | 显示全部楼层
的确抗干扰差 我自己写的要检测到第二个低电平才没误动作

出0入0汤圆

发表于 2006-3-11 21:09:10 | 显示全部楼层
能把它改成用一个外部中断来完成的吗!请大虾们出手完成,谢了!

出0入0汤圆

发表于 2006-3-18 12:51:58 | 显示全部楼层
楼主的方法太复杂了点,

出0入0汤圆

发表于 2006-3-18 13:06:02 | 显示全部楼层
cdle 明浩



你好啊,呵呵

出0入0汤圆

发表于 2006-3-18 13:17:48 | 显示全部楼层
呵呵,身分败露了

出0入0汤圆

发表于 2006-3-25 15:42:15 | 显示全部楼层
老大,不行呀,一定有问题。

出0入0汤圆

发表于 2006-8-17 00:36:57 | 显示全部楼层
然来明浩兄也来了。欢迎欢迎!

出0入0汤圆

发表于 2006-11-21 11:19:49 | 显示全部楼层
哪位给个电路图?

出0入0汤圆

发表于 2008-4-25 20:21:28 | 显示全部楼层
有电路图吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-12 14:15

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

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