📄 红外线遥控器解码.txt
字号:
DECFSZ CNT0,1
GOTO RCV1
DECFSZ CNT1,1
GOTO RCV1
GOTO LOOP ;低电平大于4*256*10US=10.24MS则是错误脉冲
RCV2
MOVLW 3
SUBWF CNT1,0 ;低电平小于2*256*10US=5.12MS则是错误脉冲
SKPNC
GOTO LOOP
MOVLW 3
MOVWF CNT1 ;3*256*10us
CLRF CNT2
CLRF CNT0
RCV3
GOTO $+1 ;每一个循环10US
NOP
BTFSS PORTA,RMT
INCF CNT2,1
BTFSC PORTA,RMT
CLRF CNT2
BTFSC CNT2,3 ; 低电平大于8*10US=80US则为有效低电平,否则是一些干扰信号
GOTO RCV4
DECFSZ CNT0,1
GOTO RCV3
DECFSZ CNT1,1
GOTO RCV3
GOTO LOOP ;高电平大于3*256*10US=7.68MS则是错误的
RCV4
MOVLW 3
SUBWF CNT1,0 ;高电平小于1*256*10US=2.56MS则是错误的
SKPNC
GOTO LOOP
MOVLW 32
MOVWF CNT2 ;接收数据共32位,16位用户码,8位控制码加8位控制码的反码
RCV5
CLRF CNT3
MOVLW 170 ;低电平大于256-170=86*10US=860US错误
MOVWF CNT0
MOVLW 56
MOVWF CNT1 ;高电平大于256-56=200*10US=2MS错误
RCV5_HI
GOTO $+1
NOP
BTFSC PORTA,RMT
INCF CNT3,1
BTFSS PORTA,RMT
CLRF CNT3
BTFSC CNT3,2 ;高电平大于8*10US=80US则为有效高电平
GOTO RCV6
INCFSZ CNT0,1
GOTO RCV5_HI ;低电平大于860US则是错误的
GOTO LOOP
RCV6
CLRF CNT3
RCV6_LO
GOTO $+1
NOP
BTFSS PORTA,RMT
INCF CNT3,1
BTFSC PORTA,RMT
CLRF CNT3
BTFSC CNT3,3 ;低电平大于10*8US=80US则是有效低电平
GOTO COMPARE
INCFSZ CNT1,1
GOTO RCV6_LO ;高电平大于256-56=200*10US=2MS错误
GOTO LOOP
COMPARE
MOVLW 170
SUBWF CNT0,1 ;CNT0的值减初始值等于实际低电平计数值
MOVLW 56
SUBWF CNT1,1 ;CNT1的值减初始值等于实际高电平计数值
MOVFW CNT1
ADDWF CNT0,1 ;将高低电平的计数加在一起并存入CNT0,通过比较高低电平总的时间来确定是1还是0
SKPNC
GOTO LOOP ;总的值大于255(即时间大于255*10US=2.55MS)则错误
MOVLW 70
SUBWF CNT0,0
SKPC
GOTO LOOP ;总的时间小于70*10US=700US则是错误的
MOVLW 130 ;130*10=1.3MS
SUBWF CNT0,0
SKPNC
GOTO COMPARE_H ;时间大于1.3MS转去确定是否1
BCF FLAGS2,BITIN ;时间在700US-1.3MS之间则是0
GOTO MOVDATA ;送数
COMPARE_H
MOVLW 160
SUBWF CNT0,0
SKPC
GOTO LOOP ;小于160*10US=1.6MS,则错误
MOVLW 230
SUBWF CNT0,0
SKPNC
GOTO LOOP ;大于230*10US=2.3MS,则错误
BSF FLAGS2,BITIN ;时间在1.6MS-2.3MS之间则是1
MOVDATA
RRF CSR0A,1 ;将每一位移入相应寄存器
RRF CSR1A,1
RRF CSR2A,1
RRF CSR3A,1
BCF CSR0A,7
BTFSC FLAGS2,BITIN ;接收当前位送入CSR0.7
BSF CSR0A,7
DECFSZ CNT2,1 ;是否接收完32位
GOTO RCV5
MOVFW CSR0A ;将临时寄存器中的数存回相应寄存器
MOVWF CSR0
MOVFW CSR1A
MOVWF CSR1
MOVFW CSR2A
MOVWF CSR2
MOVFW CSR3A
MOVWF CSR3
COMF CSR0,0 ;比较键码的反码取反后是否等于键码
XORWF CSR1,0
BNZ LOOP ;不等于则接收到的是错误的信息
;将键码送显示
SWAPF CSR1,W ;显示值高低位交换,先处理高位
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_H ;存入寄存器
MOVFW CSR1 ;显示值低位处理
ANDLW 0FH ;屏蔽掉高位
MOVWF DISPBUF_L ;存入寄存器
GOTO LOOP
;------------------------------------------------------
END
;***********************************************************
2005-1-15 02:39 voyage
很想很想
我们没有学过单片机,但我们好想好想将来也能像那些高手一样写出有应用价值 的东东来。。
2005-1-15 09:18 不轻言放弃
摘要:通过对红外遥控器各按键发送冲波形的分析可以识别码型,从而为软件解码提供依据。本文以实例介绍红外遥控器与单片机的硬件接口,并从原理出发给出软件解码的方法。这是一个可以直接引用的成功例子,同时也为各类红外遥控器在单片机控制产品中的开发应用提供了一个非常实用的参考。
关键词:遥控器 软件解码 单片机
在单片机控制产品的开发应用中,为了向控制系统软件控制命令,键盘往往是不可缺少的。传统方法是利用并行输入/输出接口芯片扩展一个键盘接口,或者直接利用单片机的并行端口进行扩展。在某些应用环境下,这种方式2个弊端:①键盘和控制系统连在一起,不灵活,环境适应性差;②浪费单片机的端口,且硬件成本较高。
使用红外遥控器作为控制系统的输入设备,具有成本低、灵活方便的特点。本文目的就在于介绍软件解码研究的一般方法和红外遥控器进行二次开发的应用技术。该方法已在多个应用系统设计中成功地实现,效果良好。
红外遥控器是一种非常容易买到,且价格便宜的产品,种类很多,但它们都是配合某种特定电子产品的(如各种电视机、VCD、空调器等),由专用CPU解码,作为一般的单片机控制系统能直接使用。使用现成遥控器作为控制系统的输入,需要解决如下几个问题:如何接收红外遥控信号;如何识别红外遥控信号;解码软件的设计。其它的问题都是非本质的,例如遥控器面板功能键标注的问题,可自行设计、重印即可。
1 红外遥控信号的接收
接收电路可以使用集成红外接收器成品。接收器包括红外接收管和信号处理IC。接收器对外只有3个引脚:Vcc、GND和1个脉冲信号输出PO。与单片机接口非常方便,如图1所示。
①Vcc接系统的电源正极(+5V);
②GND接系统的地线(0V);
③脉冲信号输出接CPU的中断输入引脚(例如8031的13脚INT1)。采取这种连接方法,软件解既可工作于查询方式,也可工作于中断方式。
2 脉冲流分析
要了解一个未知的遥控器,首先要分析其脉冲流,从而了解其脉冲波形特征(以何种方式携带“0”、“1”信息),进而了解其编码规律。脉冲流的分析应从分析脉冲的高、低电平宽度入手。笔者用软件的方法实现了对脉冲流的分析。以图1所示的接口为例,如果没有红外遥控信号到来,接收器的输出端口PO保持高电平;当接收到红外遥控信号时,接收器件信号转换成脉冲序列加到CPU的中断输入引脚。用软件测试引脚的逻辑电平,同时启动TC计时器,测量该引脚分别为逻辑“0”和逻辑“1”情况下的时间值,存储起来,然后打印、分析。下面用8051汇编语言给出对脉冲流进行采集、存储的程序段:
MOV R0,#00H
MOV R1,#28H
MOV TMOD,#01H
TK:JB P3.3,TK ;等待低电平到来
;测低电平宽度
TK1:MOV TH0,#00H
MOV TL0,#00H
SETB TR0
TK0:JB TF0,TKE ;超时无效返回
JNB P3.3,TK2
CLR TR0
MOV A,TH0
MOVX @R0,A
INC R0
MOV A,TL0
MOVX @R0,A
INC R0
;测高电平宽度
MOV TH0,#00H
MOV TL0,#00H
SETB TR0
TK3:JB TF0,TKE ;超时无效返回
JB P3.3,TK3
CLR TR0
MOV A,TH0
MOVX @R0,A
INC R0
MOV A,TL0
MOVX @R0,A
INC R0
DJNZ R1,TK1 ;循环
TKE:RET
这段程序首先将TC0设置成16位定时器方式,初始化RAM地址指针R0和循环计数指针R1,每当引脚的逻辑电平发生跳变时,停止计时,将计时值保存到连续的RAM中。这段程序可以连续测量40个脉冲的时间值(包括40个低电平脉宽)。笔者以TC9012芯片的遥控器为对象,采集了所有按键的编程脉冲波形,并且对同一按键进行了重复实验。限于篇幅,采样数据不能给出,仅给出脉冲流的规律(仿真机CPU晶振为6MHz):
①引导脉冲是一个时间值为0937H~0957H的低电平和时间值为084FH~086FH的高电平;
②数据脉冲的低电平时间值约为0.127H~0177H;
③高电平时间值有2种情况:00BBH~00FFH(窄)、02EFH~0333H(宽)。
由大量数据总结分析,按键编码有如下规律:
①除引导脉冲外的脉冲是数据编码脉冲,数据“位”信息由高电平脉宽决定:窄脉宽表示“0”、宽脉宽表示“1”;
②每个按键的脉冲流译码后,包含4个字节的信息:
*所有按键的前2个字节编码都一样,都是2个字节的“0EH”;
*第3字节是键码;
*第4字节是键码的反码。
经过对相同按键脉冲进行多次采样发现,相同按键脉冲序列的对应位置脉宽时间值是在一个小范围内波动的(不是一个确定值),因此,对模式的识别不能采取精确比较法。对此,本人采取模糊的办法进行了抽象处理。根据上述实验规律,将软件译码时对脉冲的分析判断依据及算法设计思想总结如下:
①引导脉冲的低电平和高电平宽度的判断依据是时间值的“高字节大于08H”,低字节忽略;
②数据脉冲流的低电平脉宽相同,忽略不判断;
③高电平脉宽是判断数据流每位是“0”还是“1”的依据。本人抽取的判断是脉宽的高字节若小于2表示“0”,否则表示“1”,脉宽的低字节忽略。
实践证明,上述判据是有效可行的。这样处理不仅使解码软件的设计简单化,而且大大提高了解码的速度。使用上述判据编写软件解码程序时,要注意脉冲流采样数据存储地址与脉冲的对应关系。软件主要有如下几部分:
①判断遥控信号的到来(在解码前调用1个独立的子程序);
②采样并存储脉冲流;
③判断引导脉冲是否有效;
④解码前2个字节并判断是否为“0EH”;
⑤解码第3个字节,该字节即为有效键码;
⑥键码的查表映射(如果使用原键码,可省略这一步)。
3 解码软件的设计
基于上述思路设计的软件解码系统成功地应用于多个控制系统。下面给出一个实例(用MCS-51系列MC交通规则TC9012红外遥控器进行软件解码)的汇编语言程序。程序中使用的参数是针对MCU使用6MHz晶振的情况,使用其它频率的晶振,只需修改脉宽判据即可。
本文虽然是用MCS-51系列MCU对TC9012红外遥控器软件解码的研究,但其方法具有一般性。具体的应用,可自行变通。
2005-1-15 12:24 sina3228
用单片机制作通用型电视遥控器
文章作者:四川长虹电器公司,李王旬
文章出处:电子设计应用
--------------------------------------------------------------------------------
摘要:本文介绍了一种用MCS-51系列单片机AT89C52代替专用遥控芯片的设计方案,通过软件模拟实现了电视机遥控编码的发射,并且达到“一器多用”。
关键词:全码;简码;引导码;系统码;数据码
引言
上世纪八十年代初,日本率先在电视产品中使用了红外遥控技术,目前已经在电视机上得到了广泛应用。电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,如东芝TC9012,飞利浦SAA3010T等。这些芯片价格较贵,且相互之间采用的遥控编码格式互不兼容,所以各机型的遥控器通常只能针对各自的遥控对象而无法通用。本文在试验验证的基础上,介绍了如何利用低成本的MCS-51系列单片机来实现遥控码的模拟发射,并实现遥控器的通用化。
遥控发射技术的基本原理
[img]http://www.xunpeng.com/design/images/0718001.jpg[/img]
图1 NEC标准下的主码表示
[img]http://www.xunpeng.com/design/images/0718002.jpg[/img]
图2 NEC标准下,数据0和1的表示
[img]http://www.xunpeng.com/design/images/0718003.jpg[/img]
图3 PHILIPS标准下的全码表示
[img]http://www.xunpeng.com/design/images/0718004.jpg[/img]
图4 硬件原理图
通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在32~56KHz范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。
不同公司的遥控芯片,采用的遥控码格式也不一样。在此介绍较普遍的两种,一种是NEC标准,一种是PHILIPS 标准。
NEC标准:遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。简码重复延时108ms,每两个引导脉冲上升沿之间的间隔都是108ms。一个完整的全码如图1所示。 其中,引导码高电平4.5ms,低电平4.5ms;系统码8位,数据码8位,共32位;数据0用“高电平0.5625ms+低电平0.5625ms”表示,数据1用“高电平0.5625ms+低电平1.6875ms”表示,如图2所示:一个简码=引导码+系统码位0的反码+结束位(0.5625ms)高电平。
各部分码的作用:引导码用来通知接收器其后为遥控数据。系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。简码是在持续按键时发送的码。它告知接收端,某键是在被连续地按着。
遥控数据传输系统的关键是数据传输的可靠性。为了提高编码的可靠性,NEC标准规定系统码、数据码后分别接着传送一个同样的码或者反码,供误码校验用。
PHILIPS标准:载波频率为38KHz;没有简码,点按键时,控制码在1和0之间切换,若持续按键,则控制码不变。一个全码=起始码‘11’+控制码+系统码+数据码,如图3所示。
数据0用“低电平1.778ms+高电平1.778ms”表示;数据1用“高电平1.778ms+低电平1.778ms”表示。 连续码重复延时114ms。
硬件原理图
图4为硬件原理图,电路主要由三大部分组成:AT89C52及其外围电路部分;8×8键矩阵部分;及直流电源部分。
AT89C52单片机及其外围电路组成的控制和遥控码产生部分:主要有外中断信号处理、12M时钟、CPU复位、I/O口上拉电路、红外遥控发射、按键指示等。由P0口和P2口搭成按键矩阵,当有键按下时,产生的外中断请求信号(低电平有效)经八输入与非门和非门后送至P32端,使CPU进入中断处理,同时点亮按键指示灯。系统产生的遥控编码信号通过P14端发出,经放大后驱动发射管发射出去。拨码开关DIP的作用是进行不同机芯状态的切换。比如当DIP设置为“1000”时,系统处于长虹CH-10机芯状态;为“1001”时,则处于CN-12机芯状态。R13、C11和按键KEY组成单片机复位电路。
8×8键矩阵部分:由64只键盘开关排列而成,可以根据需要,选择合适的按键数。 8*8键是不增加扩展器件的情况下最多的按键数。
整个系统的工作电源为直流+5V。由电源模块IC31 (PS0500DS)、整流桥HBA、HBK等组成。
程序实现
NEC编码程序用MCS-51系列单片机汇编语言编写而成,PHILIPS编码可以此类推。
NEC、TOSHIBA、SAMSONG公司的编码格式有其共通之处:遥控全码都由“引导码+系统码+系统码(或系统码取反)+数据码+数据码取反”组成;数据“0”和“1”的定义相同;不同的只是引导码高低电平的持续时间不同,系统码位数有长有短,第一个简码和全码最后一位之间的延时不同,简码的引导脉冲不同等;所以可以把相同的部分做成通用子程序,包括产生数据“0”和“1”的子程序“ONE”和“ZERO”,9ms、4.5ms、2.25ms、22ms、45ms等时间控制子程序。
8×8的键矩阵处理,采用外中断的方式,有键按下时,就向CPU发出中断请求,然后按照“先列后排”一个个扫描,从而找出被按下的键,当然这里面还包括了去抖动、多键同时按时只处理一键的处理部分。
机芯的不同状态由单片机P3口的P3.5、P3.4、P3.1、P3.0四位的输入数值来区分判断,比如“0000”表示工作于东芝TC90××系列状态,“0001”则表示要求工作于NEC公司的PD61××系列状态。
判断了是哪一只键按下以及处于机芯的哪种状态以后,程序就严格按照相应的遥控编码方式来进行遥控码的发射,也就是说将一定时段、一定数值的电平脉冲调制在38KHz载波上,逐一发射出去。
流程图
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -