单片机做红外遥控解码器

发布者:NatureLover最新更新时间:2014-12-31 来源: 51hei关键字:单片机  红外遥控  解码器 手机看文章 扫描二维码
随时随地手机看文章

你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。

该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。发光二极管8个。价钱不足20元。
电路原理介绍:

主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。电路就这么简单了,现在分析具体的编程过程吧。
如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。

开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms高电平周期为1.8ms表示“0”, 0.9ms低电平 2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。比如:
jnb p3.2,$
jb p3.2,$
clr tr0
这3条指令就可以测量一个高电平,接下来读取计数值TH0,TL0就可以分辨是起始位还是“1”或“0”。在确定码表之前,您可以使用P0口的8个发光二极管来显示编码,16位编码分两次显示:
mov p0,keydata
acall delay_1s ;//1ms延时子程序
mov p0,keydata+1
ljmp main
根据P0相继的两次显示的编码,记录每个按键的编码,形成编码表,即遥控器编码的解码完毕。码表确定之后,以后接收到遥控器的编码之后,就与码表比较,找到匹配的码项,并把该码项对应的顺序号输出到P0口,同时也把顺序号向串行口输出到电脑,电脑接收该数据后由串口软件决定如何处理。

程序不长,下面是完整的程序和注释:(先看流程图)
keydata equ 30h ;//该地址和31H地址用来存放遥控器按键编码。
org 00h
main:
    mov keydata,#0  ;// 清零
    mov tmod ,#09h       ;//设置定时0方式1,GATE=1
         mov  r7,#0      ;//计数器,用来计数是否满8位
    mov  r6,#0           ;//计数器,用来计数是否满2字节(解16位编码)
    jb p3.2,$            ;//是否为低电平
again:                         ;//如果为低,继续往下面执行
    mov tl0,#0           ;//清零TL0
    mov th0,#0         ;//清零TH0
    setb tr0              ;//开启定时器0
    jnb p3.2,$           ;//等待高电平到来
    jb p3.2,$     ;//高电平到来,此时开始计数
    clr tr0 ;//高电平结束,停止计数
    mov a,th0     ;//读取th0 值,TL0忽略不计          clr c            ;//
    subb a,#12    ;//
    jc again       ;//th0<12则转,即小于3.4ms,你可以算一下这个时间
    mov a,#14     ;//
    clr c            ;//
    subb a,th0    ;//和14比较,如果TH0>14则大于3.8ms
        jc again        ;//大于3.8ms,从新再检测
nextbit:              ;//起始位找到了,然后下一位
    mov tl0,#0    ;//
    mov th0,#0    ;//
    setb tr0       ;//启动定时器
    jnb p3.2,$    ;//等待高电平
    jb p3.2,$     ;//高电平到来,此时开始计数
    clr tr0  ;//高电平结束,停止计数
    mov a,th0     ;//读取计数值,TL0忽略不计
    clr c            ;//
    subb a,#8     ;//th0和8比较
    jc next  ;;;;//若 <2.2ms则转,再判断是否大于0.84ms
    mov a,#10     ;//再跟10比较
    clr c            ;//
    subb a,th0    ;//
    jc again ;;;;;;;//若 >2.7ms,则放弃,从新检测
    mov a,keydata     ;// 符合大于2.2ms 小于2.7ms,即为“1”
    setb c        ;//C = 1
    rrc a            ;//把1移位进A
    mov keydata,a     ;//保存
    inc r7           ;//计数器加1
    cjne r7,#8,nextbit    ;//是否满8位
    inc r6                  ;//计数加1
    cjne r6,#2,last8       ;//是否满两字节
    sjmp seach           ;//不满两字节,再新采集
last8:                         ;//满1字节,再接下来第二字节
    mov keydata+1,a  ;//把第一字节编码数据保存到31h里
    mov r7,#0            ;//计数器R7清零
    sjmp nextbit           ;//继续采集数据
next:                  ;//小于2.2ms时转到这里
    mov a,th0            ;//读取计数值TH0
    swap a                  ;//高4位与低4位对换
    mov r1,a              ;//保存到R1
    anl tl0,#0f0h            ;//取TL0高4位,低4位忽略不计
    mov a,tl0            ;//
    clr c                   ;//
    rrc a            ;//
    rrc a            ;//
    rrc a            ;//
    rrc a            ;//
    add a,r1       ;//
    mov r1,a       ;//
    subb a,#30    ;//以上几行是把TH0的低4位和TL0的高4位合并为1字节作为计数值
    jc nextbit ; //判断是否 <0.84ms,是则放弃,继续采集
    mov a,r1       ;//否
    clr c            ;//
    cjne a,#64,continue   ;//跟64比较
continue:            ;//
    jnc nextbit ;  //a>64表示采样值 >1.11ms  放弃
    mov a,keydata  ;//否则,符合位“0”
    clr c          ;//C  = 0
    rrc a                   ;//把零右移进A
    mov keydata,a            ;//保存
    inc r7                  ;//计数器加1
    cjne r7,#8,nextbit    ;//是否满8位
    inc r6                  ;//计数器加1
    cjne r6,#2,last_8     ;//是第一字节已经满
    sjmp seach           ;//
last_8:                      ;//如果为第二字节
    mov keydata+1,a  ;//则保存第一字节到31h
    mov r7,#0            ;//清零R7
    sjmp nextbit              ;//
seach:                       ;//匹配按键编码
    mov r0,#-2  ;//按键编码字节个数计数器
    mov r1,#-1  ;//按键顺序计数器
seach1:                ;//
        inc r0             ;//
seach2:               ;//
       inc r0                  ;//
    inc r1                  ;//
    cjne r1,#29,compare  ;//是否R1=29
    sjmp exit0           ;//
compare:                     ;//开始匹配
    mov a,r0              ;//
    mov dptr,#keycode     ;//地址指针指向码表首址
    movc a,@a+dptr    ;//取码
    cjne a,keydata,seach1     ;//比较
    inc r0                  ;//R0+1,再比较下一字节(每个按键编码为2字节)
    mov a,r0              ;//
    ;mov dptr,#keycode  ;//
    movc a,@a+dptr    ;//比较
    cjne a,keydata+1,seach2  ;//是否匹配,不匹配则继续跟下一字节比较
    mov p1,r1         ;//如果匹配,把按键顺序号输出到p1
send:                        ;//
    mov tmod,#20h     ;   //设置timer 1,mode 2
    mov tl1,#0fdh            ;//设置定时器初值
    mov th1,#0fdh            ;//
    mov scon,#01010000b;//以上设置,即设置串口波特率系数为:9600,8,1,0
    setb tr1              ;//启动定时器1
loop_s:         ;//
    mov sbuf,r1    ;//把R1(按键顺序号)输出到串口
    jnb ti,$              ;//等待是否发送完毕
    clr ti                  ;//发送完毕,清零TI
exit0:                       ;//
ljmp main                   ;//循环
 keycode:                     ;//每两字节代表一个按键的编码
db 11111000b,00000000b,    11111100b,00000000b,    11111001b,11000000b
db 11111100b,11000000b,    11111010b,00000000b,    11111010b,00100000b
db 11111010b,01000000b,    11111010b,01100000b,    11111010b,10000000b
db 11111010b,10100000b,    11111010b,11000000b,    11111010b,11100000b
db 11111011b,00000000b,    11111011b,00100000b,    11111011b,01000000b
db 11111011b,01100000b,    11111111b,01100000b,    11111111b,10100000b
db 10001100b,10001110b,    10001101b,11101110b,    10001100b,10101110b
db 10001101b,11001110b,    11111000b,11100000b,    11111100b,10000000b
db 11111100b,01000000b,    11111001b,10100000b,    11111100b,10100000b
db 11111100b,01100000b
end
---------------------------------------------------------------------------------
各种遥控器编码不同,如果你采用的是其他遥控器,修改几个参数即可(当然按键的编码表肯定不同了),即计数器的值不同,不过有的遥控器有机器码(机器码每个按键都是一样的),此时可以跳过机器码的采集。最后有一点想提一下的是,刚开始不知道遥控器的编码是比较麻烦的,笔者在“双龙电子“网站下载了个声卡示波器,用他可以一目了然观看遥控器的波形,测量其脉冲宽度,有了它确实方便很多,该软件可以到双龙公司网站http://www.sl.com.cn/免费下载使用。如果你想用遥控器遥控电脑,你可以自己编写一个接受串行口应用软件,或者你可以直接下载使用Girder这个软件,该软件是专门为串口遥控器做的,很好用,下载地址为:http://www.girder.nl/,你可以利用这个软件定义遥控器来遥控你电脑移动鼠标、键盘操作、上网浏览、打开播放器、关机等。

关键字:单片机  红外遥控  解码器 引用地址:单片机做红外遥控解码器

上一篇:ST7920 12864 经典函数
下一篇:红外遥控器单片机编码程序加详解

推荐阅读最新更新时间:2024-03-16 13:50

单片机LED汉字点阵显示的设计详解
LED显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。它具有发光率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。并广泛的用于公交汽车、商店、体育场馆、车站、学校、银行、高速公路等公共场所的信息发布和广告宣传。LED显示屏发展较快,本文讲述了基于AT89C51单片机16×16LED汉字点阵滚动显示的基本原理、硬件组成与设计、程序编写与调试、Proteus软件仿真等基本环节和相关技术。 1 硬件电路组成及工作原理 本产品采用以AT89C51单片机为核心芯片的电路来实现,主要由AT89C51芯片、时钟电路、复位电路、列扫描驱动电路(74HCl54)、16×16LED点阵5部分组成,如图1所示。其中
[单片机]
<font color='red'>单片机</font>LED汉字点阵显示的设计详解
MCU
微控制单元(Microcontroller Unit;MCU) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。 基本信息 中文名 微控制单元 外文名 Micro Control Unit 应 用 多种I/
[嵌入式]
MCU--几种常见通讯总线
在单片机的应用中,通信协议是其中必不可少的一部分,上位机与下位机,单片机与单片机,单片机与外设模块之间的通信都需要通信协议实现信息交换和资源共享。由于设备之间不同的传输速率、电气特性、可靠性要求的不同,也产生了许多类型的适用于不同情况的通信协议,并被广泛的接受和使用。 1、UART和USART 分别名为通用异步收发器和通用同步异步收发器,速率不快,可全双工,结构上一般由波特率产生器、UART/USART发送器、UART/USART接收器组成,硬件上两线,一收一发。 在UART和USART 有可以扩展为R232和RS485等总线类型。 (1)RS232 RS232(异步传输标准接口),是个人计算机上的通讯接口之一,也
[单片机]
<font color='red'>MCU</font>--几种常见通讯总线
深度解读MCS51单片机时序分析及系统扩展
AT89C51单片机是ATMEL公司设计生产的与MCS51内核兼容的51系列单片机之一,该系列单片机以其优越的性能和成熟的技术在控制和自动化应用领域占有着较大的市场;除此以外,51单片机有着计算机系统中经典的总线结构,即:数据总线、地址总线和控制总线。 在实际应用中,单片机的4个端口中,P0口通常是作为地址/数据总线复用;P2口作为高8位地址总线,高8位地址线在有多余I/O的情况下,配合外部的组合逻辑电路一起构成外部总线译码使用;P3口通常作为第二功能使用,则提供给用户使用的I/O仅仅是P1口。在多数应用场合下是不能满足要求的,因此51单片机系统就或多或少地需要进行系统扩展。另外,由于其内部的RAM只有128 B,在使用C语言
[单片机]
深度解读MCS51<font color='red'>单片机</font>时序分析及系统扩展
STC89C52单片机红外遥控器解码
////////////////////////////////////////////////////////////////////////// 实现功能: 按实验板所佩带的红外遥控器上面的数字键,把红外遥控器的代码显 示在1602液晶上面,通过此实验也可测试你手上所用红外遥控器的代 码编号,一定注意要跟红外探测头的距离不要太远,而且 程序里只编写了遥控器上的数字键的部分 实验板型号:KBL-XYD-C52 实验名称: 红外控制1602液晶的显示 编写人: 谢应东 编写日期: 2012-5-3 ////////////////////////////////////////
[单片机]
基于MSP430单片机实现六自由度机械手模块的设计
当代科学技术发展的特点之一就是机械技术,电子技术和信息技术的结合,机器人就是这种结合的产物之一。现代机器人都是由机械发展而来。与传统的机器的区别在于,机器人有计算机控制系统,因而有一定的智能,人类可以编制动作程序,使它们完成各种不同的动作。六自由度自动寻迹搬运机器人就是其中一种,这种搬运机器人不但能够代替人的某些功能,有时还能超过人的体力能力,可以24小时甚至更长时间连续重复运转,还可以承受各种恶劣环境,因此,搬运机器人是人体局部功能的延长和发展。 本设计主要应用单片机MSP430作为控制核心,直流电机、热释电型红外传感器等相结合的系统。它充分发挥了单片机的性能,其优点硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特点
[单片机]
基于MSP430<font color='red'>单片机</font>实现六自由度机械手模块的设计
利用单片机来控制LED点阵
引言 单片机自20世纪70年代问世以来,以极其高的性价比受到人们的重视和关注,所以应用很广,发展很快。单片机的优点是体积小、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。广大工程技术人员通过学习有关单片机的知识后,也能依靠自己的力量来开发所希望的单片机系统,并可获得较高的经济效益。正因为如此,在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、家用电器等各个方面。在现代工业控制和一些智能化仪器仪表中,越来越多的场所需要用点阵图形显示器显示汉字。汉字显示方式是先根据所需要的汉字提取汉字点阵(如16×16点阵),将点阵文件存入ROM,形成新的汉字编码;而在使用时则需要先根据新的汉字
[单片机]
富士通MCU系列具备免费USB功能和微型主机固件
富士通微电子(上海)有限公司近日宣布,富士通微电子的MB90330/335闪存微处理器系列具备了USB固件,该USB固件的推出可以使客户在无须增加其它成本的基础上,更快地应对市场需求。这种高质量的硬件和软件包可以在各种需要USB功能的应用中使用,包括软件下载、遥控、测量和诊断。 16位的MB90330/335系列中有一组嵌入式的USB宏,其中包括简化的USB微型主机,这些USB宏可以确保USB器件能够充当主机或者起到主机的作用,这样USB 器件就可以在没有任何PC主机协调的情况下直接地互为通讯。同时,MB90330/335还具有其它外围资源(如ADC、USART、I2C)和外部总线接口。 MB90330/335系列的USB功能
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved