×
单片机 > 单片机程序设计 > 详情

如何采用51单片机读出红外遥控器的按键码

发布时间:2020-06-05 发布时间:
|

在这里我仅把一些关键的带出来关于硬件电路那么抛开那么多文字介绍最后意思就是说 你家里的遥控板 也就是发射部分 是把所有的封装好了的 比如键盘矩阵、编码调制、LED红外发送器 等等那么接受部分 SM0038 3个脚 一个脚地 一个脚电源一个脚信号脚 接到单片机随便个P口上(此处是P3。6) OK 硬件部分就搞定了当然还有数码管显示,这些肯定不用说你都能搞定吧,这些东东都有,所以就不用自己去搭电路那么麻烦了),那么 我们想 我们按一下遥控板 大家看到 有个灯闪了一下 然后OVER 那么 我们现在要做的就是在灯闪了那一下之后让 单片机来读它的键码 然后不同的键码来干不同的事,本文 是向大家解释一种方法 当然如果你知道遥控器的编码 那么 我想写解码程序应该是很简单的事 而我的意思是说我们现在从0开始 拿到任何一种遥控板 那怕不知道它的型号 但是 大家想 即使它什么型号都没写 但是按一下不同的键 它的发射的脉冲 肯定不一样 无非就是引导码 然后 地址码 键码验证码 因为不同的遥控板 它所定义的规则不一样 (这里说一点题外话 其实在读出波型后 大家就可以看出这个遥控板最开始设计时的人的意思 或者说考虑 它的这个设计方式是否是最好的 是否稳定 是否具有通用性 或者说 日本的和中国的设计师 在设计时他们所考虑的 名牌和 杂牌的 他们在设计时所考虑的 等等 这些其实也是件很有意思的事 就像偷窥到一个人的内心世界一样 扯远了。)

下面我们来说说本文利用51单片机软件解密的方法,编码无非就是低电平高电平。但是我们知道一点 它肯定是有规律的(这里申明一下 如果你能找到它的PDF 上面写好了它的波形 或者你在网上找到了前人把某型号的遥控器的波形已经分析出来了那么你完全可以把这篇帖子当水贴 跳过 我这里的目的是想通过一种方法 一种 完整的分析方法 就像医生拿起手术刀 解开它的内部 看常人所不能看到的东西 最终能把一种很通用的东西 把它的内部原理能够完全的理解一切从简单学起 做起 以后凡是涉及到 这种 类型的东西 相信你会更加自信 而不是只满足做一个课程设计 一个老师布置的作业扯远了。。 )

具体我们怎么记录这种规律 很简单 我们用定时器把每个高低电平的时间记下来 然后显示在数码管上 设置2秒显示一个数据 然后用EXCLE记录下来

再用铅笔 或者 随便什么画图软件 把它的波形画出来 标上 低电平 高电平 再对比下不同的键的区别 一切就豁然开朗了

现在举 实际的例子

万能遥控板大家应该都知道吧

随便去那都能买到 几块钱 左右 安上电池 设置好型号(这里例子设置的是长虹 如果用家里的遥控板 那么不用设置了 )

单片机上电 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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码