马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
用单片机解码红外遥控器
# q+ e! Y: w( j 遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。下面以TC9012编码芯片的遥控器为例。谈谈如何用常用的51系统单片机进行遥控的解码。& Y8 ?' @7 _/ g: d2 T3 _
一、编码格式8 E; q# P1 j6 T+ ?
1、0和1的编码
1 n- N- |% _# ^+ V1 Z& f 遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。- q6 }- `4 j' P" f( F
2、按键的编码
! c% u; M0 O0 j2 P 当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。根据各部分的功能。可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。遥控器发射代码时.均是低位在前。高位在后。由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。当2 N) j5 Y' D5 \$ a
接收到此码时.表示一帧数据的开始。单片机可以准备接收下面的数据。地址码由8位二进制组成,共256种.图中地址码重发了一次。主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。不同的设备可以拥有不同的地址码.因此。同种编码的遥控器只要设置地址码不同,也不会相互干扰。图中的地址码为十六进制的0EH(注意低位在前)。在同一个遥控器中.所有按键发出的地址码都是相同的。数据码为8位,可编码256种状态,代表实际所按下的键。数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系.则本次遥控接收有误.数据应丢弃。在同一个遥控器上.所有按键的数据码均不相同。在图2中,数据码为十六进制的0CH,数据反码为十六进制的0F3H(注意低位在前).两者之和应为0FFH。+ i& `& c+ T/ h% ]3 |
二、单片机遥控接收电路
, n. D. A2 H/ T% a) V4 } 红外遥控接收可采用较早的红外接收二极管加专用的红外处理电路的方法。如CXA20106,此种方法电路复杂,现在一般不采用。较好的接收方法是用一体化红外接收头,它将红外接收二极管、放大、解调、整形等电路做在一起,只有三个引脚.分别是+5V电源、地、信号输出。常用的一体化接收头的外形及引脚见图3和图4。红外接收头的信号输
- m1 f' f+ x# B9 G8 c出接单片机的INTO或INTl脚.典型电路如图5所示.图中增加了一只PNP型三极管对输出信号进行放大。0 C; v+ U! W1 ~4 |9 E* P4 E
三、遥控信号的解码算法及程序编制1 \1 Y6 {; g. C1 z
平时。遥控器无键按下。红外发射二极管不发出信号,遥控接收头输出信号1。有键按下时.O和1编码的高电平经遥控头倒相后会输出信号O.由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿产生中断)。单片机在中断时使用定时器0或定时器1开始计时.到下一个脉冲到来时,即再次产生中断时,先将计时值取出。清零计时值后再开始计时.通过判断每次中断与上一次中断之间的时间间隔。便可知接收到的是引导码还是 O和1。如果计时值为9ms。接收到的是引导码,如果计时值等于1.12ms,接收到的是编码O。如果计时值等于2 25ms.接收到的是编码1。在判断时间时,应考虑一定的误差值。因为不同的遥控器由于晶振参数等原因,发射及接收到的时间也会有很小的误差。
6 r2 c9 @( N7 Z2 Y1 k& a 以接收TC9012遥控器编码为例,解码方法如下:
* c; U! K( V4 q7 g (1)设外部中断0(或者1)为下降沿中断,定时器0(或者1)为16位计时器.初始值均为O。* @9 Z6 [2 Z9 N s! x! V( b# K
(2)第一次进入遥控中断后,开始计时。7 u+ n2 S6 ?. w1 \/ X9 R, A
(3)从第二次进入遥控中断起,先停止计时。并将计时值保存后,再重新计时。如果计时值等于前导码的时间,设立前导码标志。准备接收下面的一帧遥控数据,如果计时值不等于前导码的时间,但前面已接收到前导码,则判断是遥控数据的O还是1。
, g$ G+ d5 s7 n6 e$ \- C (4)继续接收下面的地址码、数据码、数据反码。
* ^" R% S' {% N# u! f3 A1 _ (5)当接收到32位数据时,说明一帧数据接收完毕。此时可停止定时器的计时,并判断本次接收是否有效.如果两次地址码相同且等于本系统的地址,数据码与数据反码之和等于0FFH,则接收的本帧数据码有效。否则丢弃本次接收到的数据。
1 c6 F+ s N Z& S R (6)接收完毕,初始化本次接收的数据,准备下一次遥控接收。
6 V/ \/ I# e2 @0 f8 W 示例程序如下: E1INT:
. W. q5 p- O7 \7 G5 { O PUSHACC
4 D& A2 D5 m0 ?/ f PUSH PSW
9 ~, }$ H3 i, f K' p+ u/ v CLRTR1
5 K2 M5 l! x* n MOV RM—TLEN,TH1 、
6 r5 |' f8 ^. O5 U/ Z& Q8 i: ` MOVTH1,#00H
) t- I6 y, K9 ]7 C% J. m8 Z; J+ u, X MOV TL1,#00H! ~( \7 O7 n+ j; B
SETBTR1( e1 s) Z! f$ p. h8 G/ |
MOV A,RMJLEN$ I! H% o+ I# {/ ~
JNZ LBL—RM—DAT—BIT
: C8 I0 P; U% E2 [% f: e MOV RM—ADDR.#00H
2 P* p' \" s/ a MOV RM—RADDR,#00H' y, }0 L. E ] N! L
MOV RM—DAT,#00H* i1 L1 B& P# h; k& f2 A
MOV RM—RDAT,#00H
f& ^% Y1 h- D# N! r' E9 D7 S7 D MOV RM—BIT_CNT,#00H; T, {* o$ R) P0 x' `, l
CLR RM—OK+ X9 m5 K1 e# E- C
CLR RM—GUIDE
# A+ d1 k# ], S/ Z# d POPPSW0 G) y( R4 i. J4 E, H' Q2 m3 T { o6 Y
POPACC1 [7 L3 ^7 x* d5 `5 M- I. l& r
RET1 I BI RM DAT BIT:
; v& e6 U0 q; P MOV A,RM_TLEN
; M- p0 b: M" s% r2 \+ {; x CJNE A,#23H,LBL—RM_ADDR_DAT- ]' {- R2 f* v$ Q
SETB RM—GUIDE
: @' y, M, X. Y8 G SJMP LBLE1 INT-RET
- j7 h1 n" T; T; T5 E6 p) ~8 v4 C LBLRM_ADDR_DAT;+ `8 V0 W7 S* R& B( d3 D% B
JNB RM—GUIDE,LBL—RM—ERROR. A. c$ X7 b$ }! r
CJNE A,#04H,LBL_RM_ONE
/ o0 }% V% G0 T- | CLR C
( F) h3 O; t, O3 V/ O: r SJMP LBL_RM—SHIFT
% Q: C( H( a1 S5 a6 t LBLRM—ONE:
, i8 S/ j4 W) F9 `' p; b) I CJNE A。#08H。LBL—RM—ERROR% e: A8 I! n8 z( {5 I# Q
SETB C
( }5 |1 G5 f! ^* I' J4 g LBL_RM_SHIFT:
# \# y; s0 Z0 w6 e MOV A,RM—RDAT
7 f' A$ M) ], }4 e7 }' \ RRC A
7 O, V7 N, ]. N% { MOV RM—RDAT.A9 A, _7 n$ Y8 l# N( |; _. l6 X
MOV A,RM—DAT
: e0 l- o4 u) y$ d RRC A% q% Q6 a& L' t8 {8 G7 W B7 C
MOV RM—DAT,A
" \: v1 R: e8 l) s# T3 P) X MOV A,RM—RADDR$ j4 V f* ]! ~% @# e
RRC A; @2 I8 v( A! [1 N3 V0 E, {& Q
MOV RM RADDR.A8 ]2 T' v1 W" x$ J0 s
MOV A。RM—-ADDR+ ~) m+ A N" w8 n( ?
RRC A
! }( T/ x9 t! k& Q1 s MOV RM—.ADDR.A0 Y$ D2 C, u7 A7 M+ F: Q
LBL—RM—END:/ |3 O8 k- u& W6 T# a e% D6 G
INC RM—BIT—CNT
: L# `; Z' W/ P% Q1 \+ H0 g, c MOV A,RM_BIT_CNT
* R) n. m0 u2 G% }5 D& |/ B CJNE A,#32,LBLE1 INT_RET
4 Q8 C: j$ i- }! o8 r$ Z! G CLRTR13 u+ I5 t# E* ]6 J- j1 H
MOV TH1,#00H e3 E( ]- ]. a
MOVTL1,#00H9 G$ F' Q- c0 D6 C8 r, V( g! S% ]
MOV HOUR.RM—ADDR
! K$ `/ d! i5 c' { MOV MINUTE,RM—DAT
- x8 ^4 r1 d+ W, _ MOV RM—_ADDR,#00H* r% N9 D" v u, K4 [( m- D' `0 K' W
MOV RM—RADDR,#00H
?- p& b9 u. K! u# e1 ^* K) m MOV RM—DAT,#00H
7 z9 {" n' d( p4 U- I: G1 ?2 _4 ?9 I. a MOV RM—RDAT,#00H
H) C: R- X/ t$ D/ m/ {# N MOV RM一8IT_CNT,#00H% p1 ?+ ~7 p+ ^
CLR RM—GUIDE& h# Q- a# d0 b2 ]8 q, ? `1 g I+ L8 e
SEITB RM—OK' \& q: K% ^. e5 B& N
SJMP LBL—E1 INT—RET LBL—RM—ERROR:* N- x; B/ T9 l6 j& W
CLRTR1
+ ~) {( s% c7 X4 D" S2 ^ MOV TH1,#0OH& H$ Z3 x* o$ A+ v6 n T% G1 z+ o
MOVTL1,#00H 4 Z* E* e6 F5 Y+ O. N% ]+ G
MOV RM—_ADDR,#00H% S9 n) _5 ^. P9 G4 ~
MOV RM—RADDR,#00H6 s9 |: V( o: I6 D6 T- Q
MOV RM—DAT,#00H' O3 Z- M: Z j
MOV RM—RDAT,#00H
9 c1 x$ G3 C' w2 D- G MOV RM—B1T—CNT,#00H& v( ^' w! k& q5 k- z k
CLR RM—GUIDE
$ ]' ?7 Z7 S* G) D2 [ LBL—E1 INT—RET:
% O4 e+ \3 @# M# ~2 \; c0 z9 e4 }8 C, w POPPSW
" x4 R+ S; U$ J5 I" h2 G POPACC
( e5 g+ x6 s" A& U! X RETI% ?% c1 d5 O) M' j! C2 v
四、遥控代码与键盘码的转换
+ T; o( y2 p; H$ E# m% f 在应用系统中,带遥控器的仪器设备一般都带按键。而且二者功能相同。将遥控键值转换成标准的按键值后。遥控按键散转表格可以与键盘散转表格复用。转换方法可用查表法。通过查表。使遥控的按键值转换成本机键盘的值。这样既可以使用按键操作,也可以使用遥控操作,而且相应的处理程序非常简单。- X: [6 f! @& V4 q# W
以上以Tc9012编码格式为例,说明了解码的原理与方法。只要注意一帧数据的格式及引导码、O码和1码的时间长度.其它编码芯片如 HT6121、M50560、LC7461等也非常容易解码。 |
|
|
|
|