控制/MCU
下面我们来说说本问利用51单片机软件解密的方法 首先大家看了我刚才贴出来的连接 应该知道了 编码无非就是低电平高电平。
具体我们怎么记录这种规律 很简单 我们用定时器把每个高低电平的时间记下来 然后显示在数码管上 设置2秒显示一个数据 然后用EXCLE记录下来
再用铅笔 或者 随便什么画图软件 把它的波形画出来 标上 低电平 高电平 再对比下不同的键的区别 一切就豁然开朗了
现在举 实际的例子
万能遥控板大家应该都知道吧
此主题相关图片如下:图片 04.jpg
随便去那都能买到 几块钱 左右 安上电池 设置好型号(这里例子设置的是长虹 如果用家里的遥控板 那么不用设置了 )
关键程序如下 :(在这里我想鼓励下大家 不要一想到程序就是完整的 可以直接烧进去 看结果的 其实 我上个帖子也说过 你能看程序 看到关键的核心代码 那么说明你已经进步了 能找出其中的关键代码 其他比如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中便为所按键之键值码。
文章写完了。希望能对大家有少许的帮助 觉得有用就拿去研究。
全部0条评论
快来发表一下你的评论吧 !