微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 详细介绍用51单片机解密任何红外遥控器

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

时间:10-23 来源:互联网 点击:

;---------------------------------------------
;将存于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键 0001000010H
按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中便为所按键之键值码

文章写完了。希望能对大家有少许的帮助。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top