下面咱们来说说本问使用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
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中便为所按键之键值码。
文章写完了。期望能对咱们有少量的协助 觉得有用就拿去研讨。