电视遥控器的C51解码程序及其控制的电动遥控玩具车举例
彩色电视红外线遥控器小巧方便,抗干扰能力强,遥控距离远,得到广泛应用。其基本原理是通过键盘产生编码,对38K载波调制,经放大,形成一串串脉冲由红外线发射管发射出去,现以M50462AP集成电路的遥控器为例,介绍其编码及其用C语言实现的解码程序。
彩电遥控器由键盘、M50462AP和红外发射管等组成,电原理图如图1:
图1
该遥控器的编码形式为脉宽调制方式,每一条指令由16位二进制编码即17个脉冲组成,如图2: C0 C1 C2 C3 C4 C5 C6 C7 D0 D1 D2 D3 D4 D5 D6 D7 引导码 用户码 图2
脉冲宽度0.25MS,编码为“1”时,脉冲间隔为1MS,编码为“0”时,脉冲间隔为2MS,如图3: 0.25ms 0.25ms 1ms 2ms 编码“0” 编码“1”
图3
指令前8位为引导码,后8位为功能码,M50462AP中的引导码C0~C7由1110XX10组成,C4、C5由外引脚C4、C5控制,当C4、C5悬空或为“1”时,C4、C5为0,反之为1,如以熊猫牌遥控器为例,其引导码为“11100010”即十六进制“E2H”,按键时间必须大于18MS才能被确认,具有自动消抖功能,按键22MS后开始发送指令,指令周期为44MS,如此循环发送,直到按键被释放。其编码及其对应的功能按键如表一:
序号 1 2 3 4 5 6 7 8 9 10 11 编码 00H 10H 08H 18H 04H 14H 0CH 1CH 80H 90H 88H 功能 1 2 3 4 5 6 7 8 9 0/30 1+ 序号 12 13 14 15 16 17 18 19 20 21 22 编码 98H 48H 50H 0CCH 0DCH 44H 54H 0C4H 0D4H 0D0H 5CH 功能 2+ CH- CH+ LD+ LD- VOL+ VOL- SD+ SD— BZ TV/AV 序号 23 24 25 26 27 28 29 30 31 32 33 编码 D8H 未知 0D0H 0E8H 0F8H 0E4H 0F4H 0ECH 功能 PIC ——》 〈—— CLK TIME ON-TIME SEL INC 表一
电视遥控器的解码由一片目前广泛使用、体积小而功能极强的AT89C2051单片机作解码芯片, 该单片机内含128B RAM,2K Flash ROM,15根I/O口线,5个中断源,一个全双工串口,2个定时器/计数器,2个外部中断, 时钟频率最高可达24M HZ,而外部引脚仅为20个。遥控接收头直接接89C2051的INT0端,解码利用了定时器T0的门控位GATE位功能捕捉脉冲间隔宽度,即定时器工作不仅要允许位TR0置位,还要INT0引脚为高电平才能开始定时,定时器T0工作在十六位定时器方式,解码如图4: 处理数据 定时过程 0.25ms
图4
至于定时数值的判定,初值为0,以逻辑“1”为例,晶振f=6M HZ,脉宽T=1.75MS,由计算知:
count:=T/(1/f)=875=36BH 由于本文为实验,故仅判定TH0的值,而又因有误差,认为只要 TH0大于等于3即为“1”,否则为“0”,详细见中断流程图。
因大部分工作都由单片机来完成,故硬件电路异常简单,以一电视红外线遥控器遥控的电动程控玩具车为例,用C语言实现的对M50462AP的解码及基本控制,,其具体电路如图5所示:
图5
在电路中,为了简单方便且使成本低廉,变通使用音频放大集成电路TDA2822作电机驱动电路,及所有成品遥控接收头J1,TDA2822中的两个运算放大器构成电压比较器,M1,M2分别为玩具车的前进后退及拐弯电机,本设计只使用了遥控器的7个键,控制前进、后退、前进左拐、前进右拐、后退左拐、后退右拐及停止,若你有兴趣的话,为了逼真还可加上可遥控的前灯、后灯,加上光电管以实现遇障碍物自动拐弯,加上语音芯片实现语言功能,加上霍尔元件实现测量行驶距离,并通过数码管显示出来等。
中断程序流程:
载入定时器值 N 值符合条件
Y N 符合“1”的条件 CY=0
Y CY=1 左移存数 N
满16位 Y 引导码 N 为 E2H Y
得KEY值
计数器0清0 允许计数 中断结束
原程序如下:本程序在KIEL V2.30版调试通过。
#include unsigned char key,count,a,b,data1,data2; sbit left = P1^5; sbit right = P1^4; sbit run = P1^6; sbit last = P1^7; void int_e0(void) interrupt 0 { /* 中断0 */ a=TH0;b=TL0; if ((a>=0x03)|| ((a<=0x02)&&(a>=0x01)) ) { if (a>=0x03) CY=1; else CY=0; data1=data1 | CY; data1<<=1; count-=1; if (count==0x08) data2 = data1; if (count==0x00) { count=0x10; if (data2==0xe2) { if (data1==0xcc) key=0x19; if (data1==0xd4) key=0x18; if (data1==0x50) key=0x13; if (data1==0x48) key=0x14; if (data1==0x44) key=0x15; if (data1==0x54) key=0x16; if (data1==0xc4) key=0x17; } } } TH0=0; TL0=0; TR0=1; } void main(void) { TMOD=0x09; EA=1; EX0=1; IT0=1; P1=0X00; P3=0X04; key=0x00; count=0x00; LOOP2: if(key==0x13) {left=1;run=1;last=0;right=0;} if(key==0x14) {left=0;run=1;right=1;last=0;} if(key==0x15) {last=0;left=0;right=0;run=1;} if(key==0x16) {last=1;left=0;right=0;run=0;} if(key==0x17) {last=1;left=1;right=0;run=0;} if(key==0x18) {last=0;left=0;right=0,run=0;} if(key==0x19) {last=1;left=0;right=1,run=0;} goto LOOP2; } /*前进向左拐*/ 因篇幅问题不能全部显示,请点此查看更多更全内容