(玩电子) 电子技术学习与研讨
当时方位:单片机教程网 >> MCU规划实例 >> 阅览文章

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

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

    首要说一下 想写这个帖子 看到论坛上有关于遥控器方面的帖子 可是都没有很具体的介绍 并且是现已有完好的波形 仅仅介绍了解码部分 而没有剖析波形数据方面的介绍 ,因此有了写一篇完好的关于遥控器方面的文章的激动   此贴对新手或许有点困难不过 没关系 我会以最浅显的办法来解说 假如有不明白的 主张去看看书 自己尽力 没有不或许的事  他人能做到 你也必定行,关于红外遥控的根底理论,咱们能够到这个贴去看下http://www.62pa.com/mcu/184.html,里边有具体的介绍。在这儿我仅把一些要害的带出来 关于硬件电路 那么抛开那么多文字介绍 终究意思便是说 你家里的遥控板 也便是发射部分 是把全部的封装好了的  比方键盘矩阵、编码调制、LED红外发送器 等等 那么承受部分 SM0038 3个脚 一个脚地 一个脚电源 一个脚信号脚 接到 单片机随意个P口上(此处是P3。6) OK  硬件部分就搞定了当然还有数码管显现 ,这些必定不必说你都能搞定吧,我这刚好有一块51hei单片机学习板是在www.62pa.com的论坛买的,这些东东都有,所以就不必自己去搭电路那么麻烦了),那么 咱们想 咱们按一下遥控板 咱们看到 有个灯闪了一下 然后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
原创著作转载请保存本文链接

宣布谈论】【告知老友】【保藏此文】【封闭窗口

文章谈论

m88 188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet