c51解密红外 + c语言红外解码xy.docx
- 文档编号:4343346
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:13
- 大小:21.54KB
c51解密红外 + c语言红外解码xy.docx
《c51解密红外 + c语言红外解码xy.docx》由会员分享,可在线阅读,更多相关《c51解密红外 + c语言红外解码xy.docx(13页珍藏版)》请在冰豆网上搜索。
c51解密红外+c语言红外解码xy
首先说一下想写这个帖子看到论坛上有关于遥控器方面的帖子但是都没有很详细的介绍而且是已经有完整的波形仅仅介绍了解码部分而没有分析波形数据方面的介绍,因此有了写一篇完整的关于遥控器方面的文章的冲动此贴对新手可能有点困难不过不要紧我会以最通俗的方式来解释如果有不明白的建议去看看书,自己努力没有不可能的事别人能做到你也一定行,关于红外遥控的基础理论,大家可以到这个贴去看下关于硬件电路那么抛开那么多文字介绍最后意思就是说你家里的遥控板也就是发射部分是把所有的封装好了的比如键盘矩阵、编码调制、LED红外发送器等等那么接受部分SM00383个脚一个脚地一个脚电源一个脚信号脚接到单片机随便个P口上(此处是P3。
6)OK硬件部分就搞定了当然还有数码管显示,这些肯定不用说你都能搞定吧,我这刚好有一块51hei单片机学习板是在的论坛买的,这些东东都有,所以就不用自己去搭电路那么麻烦了),那么我们想我们按一下遥控板大家看到有个灯闪了一下然后OVER那么我们现在要做的就是在灯闪了那一下之后让单片机来读它的键码然后不同的键码来干不同的事,本文是向大家解释一种方法当然如果你知道遥控器的编码那么我想写解码程序应该是很简单的事而我的意思是说我们现在从0开始拿到任何一种遥控板那怕不知道它的型号但是大家想即使它什么型号都没写但是按一下不同的键它的发射的脉冲肯定不一样无非就是引导码然后地址码键码验证码因为不同的遥控板它所定义的规则不一样(这里说一点题外话其实在读出波型后大家就可以看出这个遥控板最开始设计时的人的意思或者说考虑它的这个设计方式是否是最好的是否稳定是否具有通用性或者说日本的和中国的设计师在设计时他们所考虑的名牌和杂牌的他们在设计时所考虑的等等这些其实也是件很有意思的事就像偷窥到一个人的内心世界一样扯远了。
。
--)
下面我们来说说本问利用51单片机软件解密的方法首先大家看了我刚才贴出来的连接应该知道了编码无非就是低电平高电平。
但是我们知道一点它肯定是有规律的(这里申明一下如果你能找到它的PDF上面写好了它的波形或者你在网上找到了前人把某型号的遥控器的波形已经分析出来了那么你完全可以把这篇帖子当水贴跳过我这里的目的是想通过一种方法一种完整的分析方法就像医生拿起手术刀解开它的内部看常人所不能看到的东西最终能把一种很通用的东西把它的内部原理能够完全的理解一切从简单学起做起以后凡是涉及到这种类型的东西相信你会更加自信而不是只满足做一个课程设计一个老师布置的作业扯远了。
。
)
具体我们怎么记录这种规律很简单我们用定时器把每个高低电平的时间记下来然后显示在数码管上设置2秒显示一个数据然后用EXCLE记录下来
再用铅笔或者随便什么画图软件把它的波形画出来标上低电平高电平再对比下不同的键的区别一切就豁然开朗了
现在举实际的例子
万能遥控板大家应该都知道吧
此主题相关图片如下:
图片04.jpg
随便去那都能买到几块钱左右安上电池设置好型号(这里例子设置的是长虹如果用家里的遥控板那么不用设置了)
单片机上电SM0038接好
关键程序如下:
(在这里我想鼓励下大家不要一想到程序就是完整的可以直接烧进去看结果的其实我上个帖子也说过你能看程序看到关键的核心代码那么说明你已经进步了能找出其中的关键代码其他比如SM0038的接口数码管显示的接口等等自己加上去就行了这段程序的结果是最终把脉冲波的个数和每个高低电平的时间数放在寄存器里那么既然你要做的就是用自己手边的单片机把寄存器的值显示到数码管上把数据记录下来然后分析找出规律得出你想要的结果在这个过程中我相信反是喜欢搞砖研的都会享受这个过程)
movr5,#0;用于记录保存的时间值的个数
movr1,#bmhcq;高低电平宽度值缓冲区
decr1
jbp3.6,$;等待变低,即等待按键
next:
setbtr1;启动定时器1
jnbp3.6,$;等待变高,以测量低电平时间宽度
clrtr1;关闭定时器1;1US
incr5;时间值个数加1;1
incr1;1
mov@r1,th1;存低电平时间值,先存高8位,后存低8位;2US
incr1;1
mov@r1,tl1;2
movth1,#0;重赋初值;2
movtl1,#13;13为停止T1到重启T1经过的时间;2
setbtr1;重新启动定时器;1
jbp3.6,$;等待变低
clrtr1;关闭定时器1;1
incr5;1
incr1;1
mov@r1,th1;存高电平时间值;2
incr1;1
mov@r1,tl1;2
movth1,#0;重赋初值;2
movtl1,#15;15为停止T1到重启T1经过的时间;2
ajmpnext;循环检测,直到T1在遥控器无键按下时溢出时产生中断;2
ajmp$
;-----------------------------------------
;定时器1中断程序
;在遥控器无键按下时产生中断,便依次将BMHCQ中的高低电平时间值转换为BCD码并显示出来
;-----------------------------------------
t1zd:
setbtr0;启动T0
clrtr1;关闭T1
setbet0;T0开中断
mova,r5
movr2,a
movr3,#0
lcallhextoxcq
lcalldisplay
jbyszt,$;延时一段时间,以便记录显示的时间值
setbyszt
movr0,#bmhcq
dispnext:
mova,@r0;从BMHCQ中依次取出时间值(16位)调BTOD子程序将其转换为5位BCD码并放入XCQ中再调显示子程序显示
movr3,a;取高8位
incr0
mova,@r0
movr2,a;取低8位
incr0
;lcallBtoD;将高电平或低电平时间值转为BCD码放于XCQ中
lcallHEXtoXCQ;将高电平或低电平时间值转为十六进制的LED码放于XCQ中
lcalldisplay;显示
cplp2.5;改变批示灯的状态,以此说明显示内容的改变
jbyszt,$;延时,以便抄录时间值
setbyszt
djnzr5,dispnext;获取的时间值没显示完则继续
sjmp$;显示完毕,在此踏步
reti
HEXtoXCQ:
push00h
movr0,#xcq
mova,r2
anla,#0fH
movdptr,#LED
movca,@a+dptr
mov@r0,a
incr0
mova,r2
swapa
anla,#0fH
movdptr,#LED
movca,@a+dptr
mov@r0,a
incr0
mova,r3
anla,#0fH
movdptr,#LED
movca,@a+dptr
mov@r0,a
incr0
mova,r3
swapa
anla,#0fH
movdptr,#LED
movca,@a+dptr
mov@r0,a
incr0
mov@r0,#7eh
incr0
mov@r0,#7eh
pop00H
ret
led:
db7eh,30h,6dh,79h,33h,5bh,5fh,70h,7fh,7bh,77h,1fh,4eh,3dh,4fh,47h
;---------------------------------------------
;将存于R3R2中高电平或低电平时间值转为BCD码放于XCQ中
;---------------------------------------------
BtoD:
push00h
movr0,#BCD
movr4,#3
bd0:
mov@r0,#0;BCD缓冲区清0
incr0
djnzr4,bd0
movr6,#16
bd1:
clrc;将R3R2中的16位二进制值转换为三字节BCD码存入BCD缓冲区中
mova,r3
rlca
movr3,a
mova,r2
rlca
movr2,a
movr4,#3
movr1,#bcd
BD3:
mova,@r1
addca,@r1
daa
mov@r1,a
incr1
djnzr4,bd3
djnzr6,bd1
movr0,#xcq;将转换结果从BCD缓冲中存入XCQ中
movr1,#bcd
movr4,#3
bd4:
mova,@r1
xchda,@r0
incr0
swapa
xchda,@r0
incr0
incr1
djnzr4,bd4
pop00h
ret
通过上面的程序我们读出了按下一个键后的编码的本质的东西
那么动手把图画下来找规律解码
我把我例子长虹解码后的波形图发出来
此主题相关图片如下:
01.jpg点击图片放大
01。
JPG是脉冲开始时所有键前8个完全一样的高低脉冲
此主题相关图片如下:
02.jpg
02。
JPG大家注意看按不同的键中间只是有3个脉冲在变化是EXCLE的W列-AC列而这3位数值就是我们解码的关键01。
JPG中8位数大家应该看出所有键都是一样的11100010后面02。
JPG中我们把键码整理出来就是
按1键0000000000H
按2键0001000010H
按3键0000100008H
按4键0001100018H
按5键。
。
。
。
。
后面就不写了
为了大家清晰可见我把画出的最后的波形图03。
JPG贴出来大家看下规律
此主题相关图片如下:
03.jpg点击图片放大
然后我们来分析应该怎么解码我相信到了这一步应该很简单了吧比如在这个例子中我们发现后面的键码改变的部分完全是重复那么为什么完全可以不去读后面的码只读前面的16位的脉冲放在寄存器中再用比较指令跳转下面是针对这个波形图的解码程序相信大家已经能用自己手中的利器把它搞定了
写到这里我觉得很疑惑感觉自己没能把具体问题简单化很多东西还是要靠大家自己去消化理解了
程序看不懂。
?
那么OK去翻指令查书一条一条看吧程序我敢保证都是编译通过的
下面是解码程序的关键代码:
DYKJZ:
JBP3.6,$
LCALLYKJM;核心解码代码子程序
cpla
jzno;判断是否为错误代码(0FFH)
cpla
AJMPJZPD
NO:
LJMPDYKJZ
RET
JZPD:
CJNEA,#09H,JZ1;键码为09H吗?
AJMPKAIS;键码为09H转开始程序()
JZ1:
;不为09H转最开始等待下一次遥控器按键到来
AJMPDYKJZ
RET
KAIS:
;放你需要执行的代码
;比如点亮一个灯给单片机接上串口用单片机控制电脑的打开放音乐。
等等
;这些不属于本问讨论的范围有兴趣的可以自己扩展
RET
;-----------------------
;核心解码代码子程序
;------------------------
YKJM:
PUSHPSW
PUSH02H
PUSH06H
PUSH07H
PUSHB
MOVB,#0FFH
JNBTF1,JMCW;通过T1从0开始定时到溢出来避开遥控器的重发码,也就是说在读了一个遥控按键后
CLRTF1;到少要等到T1从0开始定时到溢出才能读取第二个按键
;引导码正确时执行以下代码
;CLRYKBZ;遥控标志清0
JM21:
MOVR2,#16;每次循环读8位码
MOVR6,#0;存放16位码中的低8位
MOVR7,#0;存放16位码中的高8位
JM3:
JNBP3.6,$;等待低电平结束,不管其宽度,因为是通过高电平的宽度来区分0(约为0.5ms)和1(约为1.6ms)
MOVTH1,#0
MOVTL1,#0
SETBTR1;启动T1,统计高电平的宽度
JBP3.6,$
CLRTR1
MOVA,TH1
CJNEA,#2,JM4;若高电平宽度值大于2,则说明此高电平为宽脉冲
(1),否则为窄脉冲(0)
JM4:
CPLC;当TH1的值大于2时,C=0,小于2时,C=1
MOVA,R7
RRCA
MOVR7,A
MOVA,R6
RRCA
MOVR6,A
DJNZR2,JM3;连读16位,先读的为低位,后读的为高位,高8位(数据码)存于R7中,低8位(地址码)存于R6中
MOVA,R6
CJNEA,#47H,JMCW;判断地址码是否为47H,不是转出错返回
MOVA,R7;若地址码正确,则R7中便为数据码
movr1,#jzh
mov@r1,A
LJMPJMFH
JMCW:
MOVA,B
JMFH:
CLRTF1;T1的溢出标志清0
MOVTH1,#0;为T1设定初值并启动它
MOVTL1,#0;以此来避免对同一按键读两次(避开遥控器的重发代码)
SETBTR2
POPB
POP07H
POP06H
POP02H
POPPSW
RET;此时,若引导码、地址码、键值码和键值反码中有一个有问题,A中便为错误代码,否则,A中便为所按键之键值码
*****************c语言红外解码**************************
#include"STC89C51RC.H"
sbitDQ=P4^3;
sbitSPK=P1^0;
#include
#defineseg1XBYTE[0xffec]
#defineseg2XBYTE[0xffed]
#defineseg3XBYTE[0xffee]
#defineseg4XBYTE[0xffef]
unsignedcharIRMcode[4];
unsignedcharcodeledmap[]=//共阴LED数码管译码表
{
0x3f,0x06,0x5b,0x4f,0x66,//0,1,2,3,4,
0x6d,0x7d,0x07,0x7f,0x6f,//5,6,7,8,9,
0x77,0x7C,0x39,0x5E,0x79,//A,b,C,d,E,
0x71,//F,
};
voiddelay(unsignedint);
voidmain()
{
EA=1;
EX2=1;
while
(1)
{
if(IRMcode[2]==~IRMcode[3]){
seg1=~ledmap[IRMcode[2]/100];
seg2=~ledmap[IRMcode[2]/10%10];
seg3=~ledmap[IRMcode[2]%10];
seg4=0xff;//熄灭
}
}
}
//
//通用延时函数
//22.1184,10=48.4us(5us+43.4)
//22.1184,100=439us(43.4*10+5)
//22.1184,1000=4345us(43.4*100+5)
//22.1184,10000=43450us(43.45*1000+5)
voiddelay(unsignedintt)
{
while(--t);
}
voidSound(void)
{
SPK=0;
delay(10000);
SPK=1;
}
voidIRMint(void)interrupt6using2
{
unsignedcharcount;
unsignedintcount1;
unsignedchari,j;
EA=0;
count=9;
while(--count)
{
delay(100);//440us
if(DQ){EA=1;return;}
}
while(DQ==0);//通过引导码余下的低电平
//以上完成引导码4.5ms的低电平检测
count=9;
count1=0;
while(--count)
{
delay(100);//440us
if(DQ==0){EA=1;return;}
}
while(DQ==1)//通过引导码余下的高电平
{
if(count1++>1000){
P1=0x55;EA=1;return;}
}
//以上完成引导码4.5ms的高电平检测
count1=0;
for(j=0;j<4;j++)//有效字节数设定
{
for(i=0;i<8;i++)//字节bit数
{
while(DQ==0);//通过编码低电平
delay(200);//延时判断编码高电平维持长度
IRMcode[j]<<=1;
if(DQ)IRMcode[j]|=0x01;
while(DQ==1){//通过编码余下的高电平
if(count1++>2000){EA=1;return;}
}
}
}
Sound();
EA=1;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c51解密红外 c语言红外解码xy c51 解密 红外 语言 解码 xy