234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

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

        首先说一下 想写这个帖子 看到论坛上    有关于遥控器方面的一帖子 但是都没有很详细的一介绍 而且是已经有完整的一波形 仅仅介绍了解码部分 而没有分析波形数据方面的一介绍 ,因 此有了写一篇完整的一关于遥控器方面的一文章的一冲动   此贴对新手可能有点困难不 过 不 要紧 我会以最通俗的一方式来解释 如果有不 明白的一 建议去看看书 自己努力  没有不 可能的一事  别人能做到 你也一定行,关于红外遥控的一基础理论,大家可以到这个贴去看下http://www./mcu/184.html,里面有详细的一介绍 。在这里我仅把一些关键的一带出来 关于硬件电路 那么抛开那么多文字介绍 最后意思就是说 你家里的一遥控板 也就是发射部分 是把所有的一封装好了的一  比如键盘矩阵、编码调制、LED红外发送器 等等 那么接受部分 SM0038 3个脚 一个脚地 一个脚电源 一个脚信号脚 接到 单片机随便个P口上    (此处是P3 。6) OK  硬件部分就搞定了当然还有数码管显示 ,这些肯定不 用说你都能搞定吧,我这刚好有一块51hei单片机学习板是在www.的一论坛买的一,这些东东都有,所以就不 用自己去搭电路那么麻烦了),那么 我们想 我们按一下遥控板 大家看到 有个灯闪了一下 然后OVER 那么 我们现在要做的一就是在灯闪了那一下之后让 单片机来读它的一键码 然后不 同的一键码来干不 同的一事 ,本文 是向大家解释一种方法  当然如果你知道遥控器的一编码 那么 我想写解码程序应该是很简单的一事 而我的一意思是说我们现在从0开始  拿到任何一种遥控板 那怕不 知道它的一型号 但是 大家想 即使它什么型号都没写 但是按一下不 同的一键 它的一发射的一脉冲 肯定不 一样 无非就是引导码 然后 地址码 键码 验ζ证码 因 为不 同的一遥控板 它所定义的一规则不 一样 (这里说一点题外话 其实在读出波型后 大家就可以看出这个遥控板最开始设计时的一人的一意思 或者说考虑 它的一这个设计方式是否是最好的一 是否稳定 是否具有通用性 或者说 日本的一№和中国的一设计师 在设计时他们所考虑的一 名牌№和 杂牌的一 他们在设计时所考虑的一 等等 这些其实也是件很有意思的一事 就像偷窥到一个人的一内心世界一样 扯远了  。 。--)


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

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

    随便去那都能买到 几块钱 左右 安上    电池 设置好型号(这里例子设置的一是长虹 如果用家里的一遥控板 那么不 用设置了 )
     单片机上    电 SM0038接好
      关键程序如下 :(在这里我想鼓励下大家 不 要一想到程序就是完整的一 可以直接烧进去 看结果的一 其实 我上    个帖子也说过 你能看程序 看到关键的一核心代码 那么说明你已经进步了 能找出其中的一关键代码 其他比如SM0038的一接口 数码管显示的一接口 等等 自己加上    去就行了 这段程序 的一结果是最终把 脉冲波的一个数 №和每个高低电平的一时间数 放在寄存器里 那么既然你要做的一就是 用自己手边的一单片机 把寄存器的一值显示到 数码管上     把数据记录下来 然后分析 找出规律 得出你想要的一结果 在这个过程中 我相信反是喜欢搞砖研的一 都会享受这个过程   )               
              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中断程序
     ;在遥控器无键按下时产生中断,便依次将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中依次取▓出时间值(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        ;改变批示灯的一状态,以此说明显示内容的一改变
              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

     

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

    此主题相关图片如下: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 点击图片放大

    然后我们 来分析应该怎么解码 我相信到了这一步应该很简单了吧 比如在这个例子中 我们发现 后面的一键码改变的一部分完全是重复
     那么为什么完全可以不 去读后面的一码 只读前面的一16位的一脉冲 放在寄存器中 再用比较指令 跳转 下面是针对这个波形图的一解码程序  相信大家已经能用自己手中的一利器 把它搞定了
    写到这里 我觉得很疑惑 感觉自己没能把具体问题简单化  很多东西还是要*大家自己去消化理解了
      程序看不 懂 。?那么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: ;放你需要执行的一代码 
               ;比如 点亮一个灯 给单片机接上    串口   用单片机控制电脑的一打开 放音乐 。等等 
               ;这些不 属于本问讨论的一范围 有兴趣的一可以自己扩展
            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           ;每次循环读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     ;判断地址码是否为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          ;以此来避免对同一按键读两次(避开遥控器的一重发代码)
               SETB         TR2
               POP          B
               POP          07H
               POP          06H
               POP          02H
               POP          PSW
               RET                          ;此时,若引导码、地址码、键值码№和键值反码中有一个有问题,A中便为错误代码,否则,A中便为所按键之键值码

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

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

    文章评论