ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:387.10KB ,
资源ID:6240725      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6240725.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(红外遥控小车.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

红外遥控小车.docx

1、红外遥控小车 红外遥控小车的制作 指示灯51单片机一体化红外接收头VS1838B红外遥控器电机驱动模块第一部分:红外遥控的解码 红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。 通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包

2、括光、电转换放大器、解调、解码电路。 遥控发射器及其编码:遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以兼容NEC的uPD6121G芯片发射码格式的芯片组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。上述“0”和“1”组成的32位二进制码经38kHz

3、的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图。UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。芯片厂商把用户识别码固定为十六进制的一组数;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合的编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在4563ms之间,图4为发射波形图。当一个键按下超过36ms,振荡器使芯片激活,

4、将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms18ms),高8位地址码(9ms18ms),8位数据码(9ms18ms)和这8位数据的反码(9ms18ms)组成。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。接收器及解码:一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。实物如下图所示:电源端接地端信号输出

5、端 注意:一体化红外接收头在使用时,应通过一个限流电阻与电源连接。红外接收头将38K载波信号过虑,得到与发射代码反向接收代码。也就是说若发射端发射的是: 则接受端解析输出的是:解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已

6、是下一位的高电平,因此取0.56ms+(1.12-0.56)/2=0.84ms最为可靠,一般取0.84ms左右均可。根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。第二部分:程序中的子函数1、指示灯函数:/当一体化接收头接收到信号并解析成功后,指示灯闪烁一下 sbit zhishideng= P10; void zhishi() unsigned char i=200,j=125; zhishideng=0; while(i-) while(j-); zhishideng=1;2、中断控制函数: /当有按键按下时,触发外部中断0,中断函数先对红外的引导码进行识别,若识别

7、正确,则调用后面的解码函数对红外进行解码。void Int0(void) interrupt 0 EX0=0; /关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号 TH0=0; /定时器T0的高8位清0 TL0=0; /定时器T0的低8位清0 TR0=1; /开启定时器T0 while(IR=0); /如果是低电平就等待,给引导码低电平计时 TR0=0; /关闭定时器T0 LowTime=TH0*256+TL0; /保存低电平时间 TH0=0; /定时器T0的高8位清0 TL0=0; /定时器T0的低8位清0 TR0=1; /开启定时器T0 while(IR=1); /如果是高电平

8、就等待,给引导码高电平计时 TR0=0; /关闭定时器T0 HighTime=TH0*256+TL0; /保存引导码的高电平长度 if(LowTime8500)&(LowTime4200)&(HighTime4800)/如果是引导码,就开始解码,否则放弃。 if(DeCode()=1) / 执行遥控解码功能 /此处是小车的功能实现代码 zhishi(); EX0=1; /开启外中断EX03、单片机解码红外函数: /当正确识别后,函数返回1。(注:本小车的单片机使用的是12M的晶振) bit DeCode(void) unsigned char i,j; unsigned char temp;

9、/储存解码出的数据 for(i=0;i4;i+) /连续读取4个用户码和键数据码 for(j=0;j1; /temp中的各数据位右移一位,因为先读出的是高位数据 TH0=0; /定时器清0 TL0=0; /定时器清0 TR0=1; /开启定时器T0 while(IR=0); /如果是低电平就等待,低电平计时 TR0=0; /关闭定时器T0 LowTime=TH0*256+TL0; /保存低电平宽度 TH0=0; /定时器清0 TL0=0; /定时器清0 TR0=1; /开启定时器T0 while(IR=1); /如果是高电平就等待 TR0=0; /关闭定时器T0 HighTime=TH0*25

10、6+TL0; /保存高电平宽度 if(LowTime660) return 0; /如果低电平长度不在合理范围,则认为出错,停止解码 if(HighTime460)&(HighTime1500)&(HighTime1900) temp=temp|0x80; /如果高电平时间在1680微秒左右,则该位是1。 ai=temp; /将解码出的字节值储存在ai if(a2=a3) return 1; /验证键数据码和其反码是否相等,一般情况下不必验证用户码。 第三部分:程序整体1、 首先从实现最简单的功能开始:前进、后退和停止。#include /包含单片机寄存器的头文件sbit IR=P32; /将

11、IR位定义为P3.2引脚sbit zhishideng= P10;sbit dianji1=P11;sbit dianji2=P12; unsigned char a4; /储存用户码、用户反码与键数据码、键数据反码unsigned int LowTime,HighTime; /储存高、低电平的宽度 void zhishi() /指示灯函数 unsigned char i=200,j=125; zhishideng=0; while(i-) while(j-); zhishideng=1;bit DeCode(void) /单片机解码函数 unsigned char i,j; unsigned

12、 char temp; /储存解码出的数据 for(i=0;i4;i+) /连续读取4个用户码和键数据码 for(j=0;j1; /temp中的各数据位右移一位,因为先读出的是高位数据 TH0=0; /定时器清0 TL0=0; /定时器清0 TR0=1; /开启定时器T0 while(IR=0); /如果是低电平就等待,低电平计时 TR0=0; /关闭定时器T0 LowTime=TH0*256+TL0; /保存低电平宽度 TH0=0; /定时器清0 TL0=0; /定时器清0 TR0=1; /开启定时器T0 while(IR=1); /如果是高电平就等待 TR0=0; /关闭定时器T0 Hig

13、hTime=TH0*256+TL0; /保存高电平宽度 if(LowTime660) return 0; /如果低电平长度不在合理范围,则认为出错,停止解码 if(HighTime460)&(HighTime1500)&(HighTime8500)&(LowTime4200)&(HighTime4800)/如果是引导码,就开始解码,否则放弃。 if(DeCode()=1) / 执行遥控解码功能 if (a2=0x09) P0=0x05;/如果按下后退键,则电机反转 if (a2=0x15) P0=0x0a;/如果按下前进键,则电机正转 if (a2=0x47) dianji1=dianji2=

14、0;/如果按下停止键,则电机不使能 zhishi();/指示灯闪烁,表示正确解析红外信号并进行相关操作,且有适当延时效用 EX0=1; /开启外中断EX02、 在实现了前进、后退和停止的功能后,我们可对程序进行适当扩充,使小车具有除前进、后退和停止功能外,还具有开启、加速、减速、左转、右转和原地打转的功能。代码如下:#include sbit jieshou=P32;sbit zhishideng=P10; unsigned char flag1=0,flag2=0;unsigned char a4;unsigned int hightime,lowtime;void delay(unsign

15、ed char i)/延时函数 unsigned char j=124; while(i-) while(j-);void zhishi()/指示灯函数 zhishideng=0; delay(200); zhishideng=1;int shibie()/单片机解码红外函数 unsigned char i,x,temp; for(i=0;i4;i+) for(x=0;x1; TH0=0; TL0=0; TR0=1; while(jieshou=0); TR0=0; lowtime=TH0*256+TL0; TH0=0; TL0=0; TR0=1; while(jieshou=1); TR0=

16、0; hightime=TH0*256+TL0; if(lowtime700) return 0; if(hightime450 & hightime1410 & hightime1955) temp=temp | 0x80; ai=temp; if(a2=a3) return 1;void main() EA=1; /开启总中断 EX0=1; /开外中断0 ET0=1; /定时器T0中断允许 TMOD=0x01; /使用定时器T0的模式1 TR0=0;/定时器T0关闭 while(1) if(flag1=+)/前进时,把速度分为5挡,通过占空比来控制 if(flag2=1) P0=0xf5;

17、delay(2);P0=0xf0;delay(8); if(flag2=2) P0=0xf5;delay(4);P0=0xf0;delay(6); if(flag2=3) P0=0xf5;delay(6);P0=0xf0;delay(4); if(flag2=4) P0=0xf5;delay(8);P0=0xf0;delay(2); if(flag2=5) P0=0xf5; if(flag1=-)/后退时,分6挡,其中0挡是停止挡,是避免小车停止这一功能另写一个子函数而进行的结合;另外5个挡才是真正通过占空比来进行后退调速的 if(flag2=0) P0=0xf0; if(flag2=1) P

18、0=0xfa;delay(2);P0=0xf0;delay(8); if(flag2=2) P0=0xfa;delay(4);P0=0xf0;delay(6); if(flag2=3) P0=0xfa;delay(6);P0=0xf0;delay(4); if(flag2=4) P0=0xfa;delay(8);P0=0xf0;delay(2); if(flag2=5) P0=0xfa; if(flag1=)/右转功能,通过控制左右轮速度的不同而进行右转 P0=0xf4;delay(7);P0=0xf1;delay(3); if(flag1=o) P0=0xf4;/原地打转功能,通过一边轮转,

19、一边轮不转来实现 void int0() interrupt 0 /中断函数 EX0=0; TH0=0; TL0=0; TR0=1; while(jieshou=0); TR0=0; lowtime=TH0*256+TL0; TH0=0; TL0=0; TR0=1; while(jieshou=1); TR0=0; hightime=TH0*256+TL0; if(lowtime8460 & lowtime3910 & hightime5100) if(shibie()=1) if(a2=0x45) flag1=+;flag2=3; /开启直流电机 if(a2=0x47) flag1=-;fl

20、ag2=0;/关闭直流电机 if(a2=0x09) flag1=+;flag2=flag2+1;if(flag2=6) flag2=1; /前进 if(a2=0x15) flag1=-;flag2=flag2+1;if(flag2=6) flag2=1;/后退 if(a2=0x40) flag1=; /右转 if(a2=0x16) flag1=o; /原地打转 zhishi();/指示灯闪烁 EX0=1;第四部分:说明和注意事项1、 本制作中,单片机的晶振为12Mhz的,若使用其他频率的晶振,要对程序里红外解码的有关部分进行数值上的修改,否则单片机不能正确识别和解码。2、 一体化红外接收头容易受到干扰,故应该让接收头远离电机(电机需要大电流,在加减速时会造成很大的干扰)和单片机。实际制作中,可以用硬棒把接收头架起来。3、 红外遥控的距离有限,大概为7-8米左右,故应当注意遥控的距离。4、 本制作中使用的车体是四驱的,即含有四个独立电机。其中车体一边的两电机并联接入驱动模块中使用,其效果如同两驱的一样。所以也适用于只有两个独立电机的车体。5、 本制作中,电机驱动使用的是双H桥直流电机驱动成品模块,其说明图如下(读者可以自己使用L298来制作):电机A、B的正反转控制电机A、B的使能控制

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1