1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>
      中国领先的单片机及嵌入式资讯教程开发工具提供者!
      当前位置单片机教程网 >> MCU设计实例 >> 浏览文章

      详细介绍用51单片机解密任何红外遥控器

      作者:佚名   来源:本站原创   点击数:  更新时间2009年07月29日   字体

          首先说一下 想写这个帖子 看到论坛上有关于遥控器方面的帖子 但?#23884;?#27809;有很详细的介绍 而且是已经有完整的波形 仅仅介绍了解码部分 而没有分析波形数据方面的介绍 因此有了写一篇完整的关于遥控器方面的文章的冲动   此贴对新手可能有点困难不过 不要紧 我会以最通俗的方式来解释 如果有不明白的 建议去看看书 自己努力 没有不可能的事  别人能做到 你也一定行关于红外遥控的基础理论大家可以到这个贴去看下www.15888691.com的论坛买的这些东东都有,所以就不用自己去搭电路那么麻烦了那么 我们想 我们按一下遥控板 大家看到 有个灯闪了一下 然后OVER 那么 我们现在要做的就是在灯闪了那一下之后让 单片机来?#20102;?#30340;键码 然后不同的键码来干不同的事 本文 是向大家解释一种方法  当然如果你知道遥控器的编码 那么 我想写解码程序应该是很简单的事 而我的意思是说我们现在从0开始  拿到任何一种遥控板 那怕不知道它的型号 但是 大家想 即使它什么型号都没写 但?#21069;?#19968;下不同的键 它的发射的脉冲 肯定不一样 无非就是引导码 然后 地?#20223;?键码 验证码 因为不同的遥控板 它所定义的规则不一样 这里说一点题外话 其实在读出波型后 大家就可以看出这个遥控板最开始设计时的人的意思 或者说考虑 它的这个设?#21697;?#24335;是否是最好的 是否稳定 是否具有通用性 或者说 日本的和中国的设计师 在设计时他们所考虑的 名牌和 杂牌的 他们在设计时所考虑的 等等 这些其实也是件很有意思的事 就像偷窥到一个人的内心世界一样 ?#23545;?#20102; --


         下面我们?#27492;?#35828;本问利用51单片机软件解密的方法 首先大家看了我刚才贴出来的连接 应该知道了 编码无非就是低电平高电平但是我们知道一点 它肯定是有规律的 这里申明一下 如果你能?#19994;?#23427;的PDF 上面写好了它的波形 或者你在网上?#19994;?#20102;前人把某型号的遥控器的波?#25105;?#32463;分析出来了那么你完全可?#22253;?#36825;篇帖子当水贴 跳过 我这里的目的是想通过一种方法 一种 完整的分析方法  就像医生拿起手术刀 解开它的内部 看常人所不能看到的东西 最终能把一种很通用的东西 把它的内部原理能够完全的理解 一?#20889;?#31616;单学起 做起 以后凡是涉及到 这种 类型的东西 相信你会更加自信 而不是只满足做一个课程设计 一个老师布置的作业 ?#23545;?#20102;  
          具体我们怎么记录这种规律  很简单 我们用定时器把每个高低电平的时间记下来 然后显示在数码管上 设置2秒显示一个数据 然后用EXCLE记录下来
      再用铅笔 或者 随便什么画图软件 把它的波?#20301;?#20986;来 标上 低电平 高电平 再对比下不同的键的区别 一?#33455;?#35905;然开朗了
       现在举 ?#23548;?#30340;例子
      万能遥控板大家应该都知道吧

      此主题相关图片如下?#21644;?#29255; 04.jpg

      随便去?#23884;?#33021;买到 几块钱 左右 安?#31995;?#27744; 设置好型号这里例子设置的是长虹 如果用家里的遥控板 那么不用设置了
       单片机?#31995;?SM0038接好
        关键程序如下 在这里我想鼓励下大家 不要一想到程序就是完整的 可以直接烧进去 看结果的 其实 我?#32454;?#24086;子也说过 你能看程序 看到关键的核心代码 那?#27492;?#26126;你已经进步了 能?#39029;?#20854;中的关键代码 其他比如SM0038的接口 数码管显示的接口 等等 自己加?#20808;?#23601;行了 这段程序 的结果是最终把 脉冲波的个数 和每个高低电平的时间数 放在寄存器里 那么既然你要做的就是 用自己手边的单片机 把寄存器的值显示到 数码管上 把数据记录下来 然后分析 ?#39029;?#35268;律 得出你想要的结果 在这个过程中 我相信反是?#19981;?#25630;砖研的 都会享受这个过程                  
                mov r5,#0            ;用于记录保存的时间值的个数
                 mov r1,#bmhcq    高低电平宽度值缓冲区

                 dec r1
                 jb   p3.6,$          ;等待变低 , 即等待按键
      next:      setb tr1             ;启动定时器1
                 jnb p3.6,$   ;  等待变高以测量低电平时间宽度
                 clr tr1      ;关闭定时器1                             ;1US
                 inc r5       ;时间值个数加1                           ;1
                 inc r1                                                ;1
                 mov @r1,th1  ;存低电平时间值 先存高8位后存低8位   ;2US
                 inc r1                              ;1
                 mov @r1,tl1                     ;2
                 mov th1,#0   ;重赋初值     ;2
                 mov tl1,#13  ;13为停止T1到重启T1经过的时间     ;2
                 setb tr1     ;重新启动定时器    ;1
                 jb p3.6,$    ;等待变低
                 clr tr1      ;关闭定时器1    ;1
                 inc r5                              ;1
                 inc r1                             ;1
                 mov @r1,th1  ;存高电平时间值   ;2
                 inc r1                        ;1
                 mov @r1,tl1              ;2
                 mov th1,#0   ;重赋初值    ;2
                 mov tl1,#15  ;15为停止T1到重启T1经过的时间    ;2
                 ajmp next    ;循环检测直到T1在遥控器无键按下时溢出时产生中断   ;2
                 ajmp $

      ;-----------------------------------------
       ;定时器1中断程序
       ;在遥控器无键按下时产生中断便?#26469;?#23558;BMHCQ中的高低电平时间值转换为BCD码并显示出来
      ;-----------------------------------------
      t1zd:
                setb tr0       ;启动T0
                clr tr1        ;关闭T1
                setb et0       ;T0开中断
                mov a,r5
                mov r2,a
                mov r3,#0
                lcall hextoxcq
                lcall display
                jb yszt,$           ;延时一段时间以便记录显示的时间值
                setb yszt
                mov r0,#bmhcq
      dispnext: mov a,@r0           ;从BMHCQ中?#26469;稳?#20986;时间值16位调BTOD子程序将其转换为5位BCD码并放入XCQ中再调显示子程序显示
                mov r3,a  ;取高8位
                inc r0
                mov a,@r0
                mov r2,a   ;取低8位
                inc r0
                ;lcall BtoD      ;将高电平或低电平时间值转为BCD码放于XCQ中
                lcall HEXtoXCQ   ;将高电平或低电平时间值转为十六进制的LED码放于XCQ中
                lcall display   ;显示
                cpl p2.5        ;改变批示灯的状态?#28304;?#35828;明显示内容的改变
                jb    yszt,$    ;延时以便抄录时间值
                setb  yszt
                djnz r5,dispnext ;获取的时间值没显示完则继续
                sjmp $           ;显示完毕在此踏步
                reti
               
       HEXtoXCQ:
                push 00h
                mov r0,#xcq
                mov a,r2
                anl a,#0fH
                mov dptr,#LED
                movc a,@a+dptr
                mov @r0,a
                inc r0
                mov a,r2
                swap a
                anl a,#0fH
                mov dptr,#LED
                movc a,@a+dptr
                mov @r0,a
                inc r0
               
                mov a,r3
                anl a,#0fH
                mov dptr,#LED
                movc a,@a+dptr
                mov @r0,a
                inc r0
                mov a,r3
                swap a
                anl a,#0fH
                mov dptr,#LED
                movc a,@a+dptr
                mov @r0,a
                inc r0
                mov @r0,#7eh
                inc r0
                mov @r0,#7eh
                pop 00H
                ret
       led:    db 7eh,30h,6dh,79h,33h,5bh,5fh,70h,7fh,7bh,77h,1fh,4eh,3dh,4fh,47h                         

      ;---------------------------------------------
      ;将存于R3R2中高电平或低电平时间值转为BCD码放于XCQ中
      ;---------------------------------------------
      BtoD:
               push 00h
               mov r0,#BCD
               mov r4,#3
      bd0:     mov @r0,#0       ;BCD缓冲区清0
               inc r0
               djnz r4,bd0
               mov r6,#16
      bd1:     clr c            ;将R3R2中的16位二进制值转换为三字节BCD码存入BCD缓冲区中
               mov a,r3
               rlc a
               mov r3,a
               mov a,r2
               rlc a
               mov r2,a
               mov r4,#3
               mov r1,#bcd
      BD3:     mov a, @r1
               addc a,@r1
               da a
               mov @r1,a
               inc r1
               djnz r4,bd3
               djnz r6,bd1
               mov r0,#xcq      ;将转换结果从BCD缓冲中存入XCQ中
               mov r1,#bcd
               mov r4,#3
      bd4:     mov a,@r1
               xchd a,@r0
               inc r0
               swap a
               xchd a,@r0
               inc r0
               inc r1
               djnz r4,bd4
               pop 00h
               ret

       

      通过上面的程序我?#23884;?#20986;了按下一个键后的编码的本质的东西
        那么动手把 图画下来 找规律 解码 
      我把我例子长虹解码后的波形图 发出来

      此主题相关图片如下01.jpg 点击图片放大

       01JPG 是脉冲开始时所有键前8个完全一样的高低脉冲


      此主题相关图片如下02.jpg

      02JPG 大家注意看按不同的键 中间只是有3个脉冲在变化 是EXCLE的 W列-AC列 而这3位数值就是我们解码的关键 01JPG 中8位数 大家应该看出 所有键都是一样的11100010 后面02JPG中我们把键码整理出来就是 
      按1键 00000000  00H
      按2键 00010000  10H
      按3键 00001000  08H
      按4键 00011000  18H
      按5键
      后面就不写了
      为了大家清晰可见 我把画出的最后的波形图03JPG 贴出来 大家看下规律 

      此主题相关图片如下03.jpg 点击图片放大

      然后我们 来分析应该怎么解码 我相信到了这一步应该很简单了吧 比如在这个例子中 我们发现 后面的键码改变的部分完全是重复
       那么为什么完全可以不去读后面的码 只读前面的16位的脉冲 放在寄存器中 再用比?#29616;?#20196; 跳转 下面是针对这个波形图的解码程序  相信大家已经能用自己手中的利器 把它搞定了
      写到这里 我觉得很疑惑 ?#33455;?#33258;己没能把具体问题简单化  很多东西还是要*大家自己去消化理解了
        程序看不懂那么OK  去翻指令 查书 一条一条看吧  程序我敢保证都是 编译通过的
      下面是解码程序的关键代码  

      DYKJZ:     JB   P3.6,$

                 LCALL YKJM  核心解码代码子程序
                 cpl a
                 jz    no     ;判断是否为错误代码0FFH)
                 cpl a

                 AJMP JZPD
      NO:      LJMP  DYKJZ
                  RET
       
       

      JZPD:    CJNE A,#09H,JZ1  键码为09H吗
                  AJMP KAIS            键码为09H 转开始程序

      JZ1:                                不为09H 转最开始 等待下一次遥控器按键到来
                  AJMP DYKJZ      
                  RET
      KAIS 放你需要执行的代码 
                 比如 点亮一个灯 给单片机接上串口   用单片机控制电脑的打开 放音乐等等 
                 这些不属于本问讨论的?#27573;??#34892;?#36259;的可以自己扩展
              RET
      -----------------------
        核心解码代码子程序
      ------------------------
      YKJM
             

                 PUSH         PSW
                 PUSH         02H
                 PUSH         06H
                 PUSH         07H
                 PUSH         B
                 MOV          B,#0FFH
                 JNB          TF1,JMCW         ;通过T1从0开始定时到溢出来避开遥控器的重发码 也就是说在读了一个遥控按键后
                 CLR          TF1                   ;到少要等到T1从0开始定时到溢出才能读取第二个按键


      ;引导码正确时执行以下代码
              ;   CLR          YKBZ              ;遥控标志清0
      JM21:
                 MOV          R2,#16           ;?#30475;?#24490;环读8位码
                 MOV          R6,#0             ;存放16位码中的低8位
                 MOV          R7,#0             ;存放16位码中的高8位
      JM3:
                 JNB          P3.6,$             ;等待低电平结束不管其宽度因为是通过高电平的宽度来区分0约为0.5ms和1约为1.6ms
                 MOV          TH1,#0
                 MOV          TL1,#0
                 SETB         TR1               ;启动T1统计高电平的宽度
                 JB           P3.6,$
                 CLR          TR1
          MOV   A,TH1
                 CJNE         A,#2,JM4      ;若高电平宽度值大于2则说明此高电平为宽脉冲1否则为窄脉冲0
      JM4:       CPL          C                 ;当TH1的值大于2时C=0小于2时C=1
                 MOV          A,R7
                 RRC          A
                 MOV          R7,A
                 MOV          A,R6
                 RRC          A
                 MOV          R6,A
                 DJNZ         R2,JM3          ;连读16位先读的为低位后读的为高位高8位(数据码存于R7中低8位地?#20223;?#23384;于R6中
                 MOV          A,R6
                 CJNE         A,#47H,JMCW     ;判?#31995;仿?#26159;否为47H不是转出错返回
                 MOV          A,R7            ;若地?#20223;?#27491;确则R7中便为数据码
                 mov          r1,#jzh
                 mov          @r1,A
                 LJMP         JMFH
      JMCW:      MOV          A,B
      JMFH:      CLR          TF1            ;T1的溢出标志清0
                 MOV          TH1,#0          ;为T1设定初值并启动它
                 MOV          TL1,#0          ;?#28304;?#26469;避免对同一按键读两次避开遥控器的重发代码
                 SETB         TR2
                 POP          B
                 POP          07H
                 POP          06H
                 POP          02H
                 POP          PSW
                 RET                          ;此时若引导码地?#20223;?#38190;值码和键值反码中有一个有问题A中便为错误代码否则A中便为所按键之键值码

       文章写完了希望能?#28304;?#23478;有少许的帮助 觉得有用就拿去?#33455;?#19979;吧最后放上完整的EXCLE 数据分析表 和 整理出的波形图 大家看不清楚的下载后看完整的图
       “要发只发精品   把最好的给大家”
      [ 原 创 ] Suse| haozi
      2009.5.7 15:55
      原创作品转载请保留本文链接

      发表评论告诉好友收藏此文关闭窗口

      文章评论

      ຣ11ѡ5app

        
        
        1. <em id="3qmea"><ol id="3qmea"></ol></em>
        2. <em id="3qmea"></em>

            
            
            1. <em id="3qmea"><ol id="3qmea"></ol></em>
            2. <em id="3qmea"></em>