51单片机解密红外遥控器

发布者:Mingyue1314最新更新时间:2017-12-26 来源: eefocus关键字:51单片机  红外遥控器 手机看文章 扫描二维码
随时随地手机看文章

     在这里我仅把一些关键的带出来 关于硬件电路 那么抛开那么多文字介绍 最后意思就是说 你家里的遥控板 也就是发射部分 是把所有的封装好了的  比如键盘矩阵、编码调制、LED红外发送器 等等 那么接受部分 SM0038 3个脚 一个脚地 一个脚电源 一个脚信号脚 接到 单片机随便个P口上(此处是P3。6) OK  硬件部分就搞定了当然还有数码管显示 ,这些肯定不用说你都能搞定吧,这些东东都有,所以就不用自己去搭电路那么麻烦了),那么 我们想 我们按一下遥控板 大家看到 有个灯闪了一下 然后OVER 那么 我们现在要做的就是在灯闪了那一下之后让 单片机来读它的键码 然后不同的键码来干不同的事 ,本文 是向大家解释一种方法  当然如果你知道遥控器的编码 那么 我想写解码程序应该是很简单的事 而我的意思是说我们现在从0开始  拿到任何一种遥控板 那怕不知道它的型号 但是 大家想 即使它什么型号都没写 但是按一下不同的键 它的发射的脉冲 肯定不一样 无非就是引导码 然后 地址码 键码 验证码 因为不同的遥控板 它所定义的规则不一样 (这里说一点题外话 其实在读出波型后 大家就可以看出这个遥控板最开始设计时的人的意思 或者说考虑 它的这个设计方式是否是最好的 是否稳定 是否具有通用性 或者说 日本的和中国的设计师 在设计时他们所考虑的 名牌和 杂牌的 他们在设计时所考虑的 等等 这些其实也是件很有意思的事 就像偷窥到一个人的内心世界一样 扯远了 。。--)

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

点击浏览下一页
随便去那都能买到 几块钱 左右 安上电池 设置好型号(这里例子设置的是长虹 如果用家里的遥控板 那么不用设置了 )
 单片机上电 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 是脉冲开始时所有键前8个完全一样的高低脉冲 


点击浏览下一页
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 贴出来 大家看下规律 

点击浏览下一页
然后我们 来分析应该怎么解码 我相信到了这一步应该很简单了吧 比如在这个例子中 我们发现 后面的键码改变的部分完全是重复 那么为什么完全可以不去读后面的码 只读前面的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中便为所按键之键值码


关键字:51单片机  红外遥控器 引用地址:51单片机解密红外遥控器

上一篇:基于51单片机的步进电机控制器在玻璃管加热控制系统中
下一篇:基于51单片机的电子测速里程防盗报警器设计程序

推荐阅读最新更新时间:2024-03-16 15:50

linux系统与51单片机实现串口数据交互
// 以下是 用于 linux IO INPUT AND OUT PUT 参考代码详细 参考一下网站 写得都很详细 其中函数代码和所遇问题测试摘自一下网站,感谢他们提供的函数资源 大家可以先去看看函数模型以及方法 个人觉得他们归纳的比较好 //http://www.cnblogs.com/meronzhang/archive/2012/11/24/2786165.html //http://www.cnblogs.com/meronzhang/archive/2012/11/24/2786166.html //http://www.doc88.com/p-9045754154843.html 以下是代码 其中,mian函数和5
[单片机]
用Proteus学习51单片机之AD转换
现实中的很多量,都是模拟量,如温度,压力等,单片机要去了解它们,首先就要把这些量进行数字化,AD转换即把模拟量转变为数字量。这次书上介绍的AD芯片为ADC0804,8位并行AD转换芯片。关于AD转换的详细原理,我就不抄了,网上有的是。 ADC0804的使用,比前面用过的锁存器74LS573难用得多,主要是读写数据都要根据时序图,进行电位的变化,而且芯片的接法也相对麻烦一点。下面记录一下引脚定义: VIN(+),VIN(-):待测量的模拟信号输入 DB0~DB7:测量结果输出 AGND:模拟信号地 DGND:数字信号地 CLK:时钟信号输入端 CLKR:内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率为1/
[单片机]
用Proteus学习<font color='red'>51单片机</font>之AD转换
51单片机(STC89C52)的中断和定时器
STC89C51/STC89C52 Timer 内部不带振荡源, 必须外接晶振 采用11.0592MHz,或22.1184MHz,可方便得到串口通讯的标准时钟. STC89和STC90系列为12T, STC11/STC12系列为1T, 也就是一个指令一个机器周期, 这些都需要外置晶振; STC15系列有内置晶振. 中断 中断允许控制寄存器 IE 字节地址A8H, CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的 EA (IE.7): 整体中断允许位, 1:允许 ET2(IE.5): T2中断允许位, 1:允许(for C52) ES (IE.4): 串口中断允许位, 1:允许 ET1(IE.3
[单片机]
<font color='red'>51单片机</font>(STC89C52)的中断和定时器
有保护功能的51单片机编程器
这款简易编程器具有自动断电保护功能,当单片机插反,保护电路会立刻切断电源(电源指示灯进入闪烁状态),既保护了单片机、编程器,也保护了计算机USB口,避免造成不必要的损失。它所支持的芯片型号如下表所示。 一、特点及性能 ①具有自动断电保护功能,当单片机插反,保护电路会立刻切断电源(电源指示灯进入闪烁状态),即保护了单片机、编程器,也保护了计算机USB接口,避免造成不必要的损失。 ②使用串口通信,芯片自动判别,编程过程中的擦除、烧写、校验各种操作完全由编程器上的监控芯片89C51控制,不受PC配置及其主频的影响,因此烧写成功率高可以达到100%,烧写速度很快并且.烧写速度和微机的档次无关。 ③采用最高可达57600bps高速波特
[单片机]
有保护功能的<font color='red'>51单片机</font>编程器
基于51单片机的库房温湿度控制系统
  引 言   目前,国内大中型库房在仓储管理中由于技术和资金上的原因,多数仅限于只对温度进行监测,当温度超标时进行强制通风和翻仓,即使如此,处理不及时或因设备人力条件有限仍会造成大量损失。实现库房储藏物的温升主要是由于湿度引起的,库房储藏物本身的水分过高或连续的高湿天气将导致储藏物新陈代谢加快而放出热量,放热引起的温升又使代谢进一步加剧以至发霉变质。这种恶性循环一旦形成很难进行有效控制。因此,库房在进行温度监测的同时,必须重视对空气湿度的检测,以利于提前采取有效措施控制库房储藏物升温而霉变。本文所介绍的温湿度控制系统以AT89C2051单片机为控制核心,结合传感器、通讯和数字电子电路技术,实现了温度和湿度检测与库房温度和湿度的
[单片机]
基于<font color='red'>51单片机</font>的库房温湿度控制系统
51单片机入门教程(5)——定时器中断
写在开头:中断是包括单片机在内的所有微处理器很重要的功能之一,初学单片机必须这一部分的知识。 一、中断的概念 先看百度百科是怎么定义中断的: 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 —— 百度百科 那么怎么理解中断?看下面的例子。 关于中断: 小A正在学习。这时,他的朋友小B叫他一块儿吃鸡,小A停止学习,转去玩吃鸡游戏。玩了几局后,关掉游戏,继续学习。 关于中断优先级: 小A正在学习。这时,他的朋友小B叫他一块儿吃鸡,小A停止学习,转去玩吃鸡游戏,(吃鸡过程中,小A女朋友打来电话,于是挂机游戏,去接电话
[单片机]
<font color='red'>51单片机</font>入门教程(5)——定时器中断
AT89C51单片机详解
上面是AT89C51单片机的RAM内存分布表,必须要了解! 二进制需要加B,十进制加D也可以省略,十六进制需要加H,A~F前要加0 电源控制寄存器PCON
[单片机]
AT89C<font color='red'>51单片机</font>详解
基于C8051单片机和FPGA实现导纳测量仪的系统设计
虚拟仪器的广泛应用,使得用户可以根据需求,设计自己的仪器系统。无源网络导纳测量仪即是虚拟仪器设计思想的一种具体运用,旨在实现对端口网络的导纳进行自动测量。测量仪是以C8051单片机为控制和处理核心,采用可编程逻辑器件EPF10K10,根据DDS原理产生信号源,将信号源连接到待测的网络上,对网络两端的电压和电流进行差分放大,使其输出电压尽可能达到ADC的最大输入电压,然后进行A/D采样,采样时,频率随信号频率而改变,一个周期内固定采32个点,用单片机的P1、P2直接接收数据,边采样边接收。对采样所得的电流、电压数据进行快速傅立叶变换(FFT),并分别求出其模值和相位,则导纳的模值为电流模值与电压模值之比,相位为电流与电压的相位之差。
[单片机]
基于C80<font color='red'>51单片机</font>和FPGA实现导纳测量仪的系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved