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

控制/MCU

1879人已加入

描述

下面我们来说说本问利用51单片机软件解密的方法 首先大家看了我刚才贴出来的连接 应该知道了 编码无非就是低电平高电平。

具体我们怎么记录这种规律 很简单 我们用定时器把每个高低电平的时间记下来 然后显示在数码管上 设置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

51单片机

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

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

51单片机

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

51单片机

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

文章写完了。希望能对大家有少许的帮助 觉得有用就拿去研究。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分