1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>
      (玩电子) 电子技术学习与研究
      当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

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

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


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

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

      随便去那都能买到 几块钱 左右 安上电池 设置好型号(这里例子设置的是长虹 如果用家里的遥控板 那么不用设置了 )
       单片机上电 SM0038接好
        关键程序如下 :(在这里我想鼓励下大家 不要一想到程序就是完整的 可以直接烧进去 看结果的 其实 我?#32454;?#24086;子也说过 你能看程序 看到关键的核心代码 那么说明你已经进步了 能?#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

       

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

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

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


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

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

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

      然后我们 来分析应该怎么解码 我相信到了这一?#25509;?#35813;很简单了吧 比如在这个例子中 我们发现 后面的键码改变的部分完全是重复
       那么为什么完全可以不去读后面的码 只读前面的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;?有兴趣的可以自己扩展
              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位(地址码)存于R6中
                 MOV          A,R6
                 CJNE         A,#47H,JMCW     ;判?#31995;?#22336;码是否为47H,不是转出错返回
                 MOV          A,R7            ;若地址码正确,则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                          ;此时,若引导码、地址码、键值码和键值反码中有一个有问题,A中便为错误代码,否则,A中便为所按键之键值码

       文章写完了。希望能?#28304;?#23478;有少许的帮助 觉得有用就拿去研究下吧。最后放上完整的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>
              三肖中特期准黄大仙房介 任选九场奖金怎么算 黑龙江福彩p62开奖结 双色球历史上080开奖 中国体彩网能投注吗 辽宁福彩35选7 正规的彩票app 好运彩3投注 新2娱乐城最新网址 宁夏体彩11选5论坛 2019年59期内部透码彩图 哪里有彩票合买 体彩刮刮乐卧虎藏龙 安徽时时彩快3开奖结果走势图 辽宁11选5开奖走势图贴吧