预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

电视遥控器的C51解码程序及其控制的电动遥控玩具车举例 彩色电视红外线遥控器小巧方便,抗干扰能力强,遥控距离远,得到广泛应用。其基本原理是通过键盘产生编码,对38K载波调制,经放大,形成一串串脉冲由红外线发射管发射出去,现以M50462AP集成电路的遥控器为例,介绍其编码及其用C语言实现的解码程序。 彩电遥控器由键盘、M50462AP和红外发射管等组成,电原理图如图1: 图1 该遥控器的编码形式为脉宽调制方式,每一条指令由16位二进制编码即17个脉冲组成,如图2: C0C1C2C3C4C5C6C7D0D1D2D3D4D5D6D7 引导码 用户码 图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,如此循环发送,直到按键被释放。其编码及其对应的功能按键如表一: 序号编码功能序号编码功能序号编码功能100H11298H2+23D8HPIC210H21348HCH-24未知——》308H31450HCH+250D0H〈——418H4150CCHLD+260E8HCLK504H5160DCHLD-270F8HTIME614H61744HVOL+280E4HON-TIME70CH71854HVOL-290F4HSEL81CH8190C4HSD+300ECHINC980H9200D4HSD—311090H0/30210D0HBZ321188H1+225CHTV/AV33表一 电视遥控器的解码由一片目前广泛使用、体积小而功能极强的AT89C2051单片机作解码芯片,该单片机内含128BRAM,2KFlashROM,15根I/O口线,5个中断源,一个全双工串口,2个定时器/计数器,2个外部中断,时钟频率最高可达24MHZ,而外部引脚仅为20个。遥控接收头直接接89C2051的INT0端,解码利用了定时器T0的门控位GATE位功能捕捉脉冲间隔宽度,即定时器工作不仅要允许位TR0置位,还要INT0引脚为高电平才能开始定时,定时器T0工作在十六位定时器方式,解码如图4: 处理数据定时过程 0.25ms 图4 至于定时数值的判定,初值为0,以逻辑“1”为例,晶振f=6MHZ,脉宽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 允许计数 中断结束 原程序如下:本程序在KIELV2.30版调试通过。 #include<At892051.h> #include<stdio.h> unsignedcharkey,count,a,b,data1,data2; sbitleft=P1^5; sbitright=P1^4; sbitrun=P1^6; sbitlast=P1^7; voidint_e0(void)interrupt0{/*中断0*/ a=TH0;b=TL0; if((a>=0x03)||((a<=0x02)&&(a>=0x01))) {if(a>=0x03)CY=1; elseCY=0; data1