基于单片机的红外遥控小车设计.docx
《基于单片机的红外遥控小车设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的红外遥控小车设计.docx(25页珍藏版)》请在冰点文库上搜索。
基于单片机的红外遥控小车设计
单片机系统设计实例
红外遥控小车
专业:
信息对抗技术
********
学号:
**********
********
1绪论
随着计算机、微电子、信息技术的快速进步,智能化技术的开发速度越来越快,,智能化程度越来越高,应用范围也越来越广,包括海洋开发、宇宙探测、工农业生产、军事、社会服务、娱乐等各个领域。
智能电动小车系统以迅猛发展的汽车电子为背景,涵盖了控制、模式识别、传感技术、电子、电气、计算机、机械等多个学科。
主要由路径识别、角度控制及车速控制等功能模块组成。
同时,当今机器人技术发展的如火如荼,其在国防等众多领域的应用广泛开展。
神五、神六升天、无人飞船等等无不得益于机器人技术的迅速发展。
一些发达国家已把机器人制作比赛作为创新教育的战略性手段,参加者多数为学生,目的在于通过大赛全面培养学生的动手能力、创造能力、合作能力和进取精神,同时也普及智能机器人的知识。
从某种意义上来说,机器人技术反映了一个国家综合技术实力的高低,而智能电动小车是机器人的雏形,它的控制系统的研制将有助于推动智能机器人控制系统的发展,同时为智能机器人的研制提供更有利的手段。
本次课设设计的红外遥控智能小车可以分为四大组成部分:
红外遥控部分、显示部分、执行部分、控制部分。
智能小车可以实现按遥控指示前行,后退,左转和右转。
该设计主要通过对系统硬件电路的设计,软件设计和程序的编写,然后通过后期软硬件调试达到设计初衷。
2系统分析
2.1系统框架
该系统以AT89C51单片机为核心的控制电路,采用模块化的设计方案,利用红外遥控器代替开关按键控制小的启动和停止,能够轻松自如的实现小车的启动停止、左转、右转和前进后退等功能。
系统控制框图如图2-1所示:
采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
2.2电机驱动模块
常用的电机驱动电路有采用功率三极管作为功率放大器的输出控制直流电机,其线性型驱动的电路结构和原理简单,加速能力强;采用由达林顿管组成的H型桥式电路,用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高,带负载能力强;采用集成H桥L298N电路驱动电机,使用方便可靠。
本次设计采用L298N作为电机驱动部分,其主要特点有:
工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A;内含两个H桥的高电压大电流全桥式驱动器,既可以驱动直流电机,也可以驱动步进电机;逻辑“0”输入电压高达1.5V,具有高抗噪性能。
其引脚排列如下图所示:
图2.2L298管脚排列图
现对L298各个引脚及其功能做一简要说明。
CURRENTSENSINGA(1脚)、CURRENTSENSINGB(15脚):
电流检测端,分别为两个H桥的电流反馈脚,不用时可以直接接地。
OUTPUT1(2脚)、OUTPUT2(3脚):
电桥A的输出端。
Vs驱动工作电压,典型值为9V或12V。
INPUT1(5脚)、INPUT2(7脚):
电桥A的输入控制端,与TTL电平兼容。
ENABLEA(6脚)、ENABLEB(11脚):
电桥A和电桥B的使能端。
高电平使能,低电平禁止输出。
GND(8脚):
接地。
Vss:
逻辑电源电压,典型值为5V。
INPUT3(10脚)、INPUT4(12脚):
电桥B的输入控制端。
OUTPUT3(13脚)、OUTPUT4(14脚):
电桥B的输出端。
2.3LCD显示模块
常用的数码显示器件主要有LED数码显示器和LCD液晶显示器。
LCD显示器具有低功耗、散热小、浅薄轻巧、显示锐利、屏幕调节方便等特点,同时又是现在市场的主流产品,价格较以往也有大幅的下降。
常用的有12864和1602考虑到价格和实用性最终选择了1602液晶屏,既可以满足产品需要价格也相对低廉。
图2.3LCD1602管脚排列图
各引脚功能说明如下:
Vss:
电源地。
Vcc:
电源正极。
RS:
寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W:
读写信号线,高电平时进行读操作,低电平时进行写操作。
E:
使能端,当E从高电平跳转到低电平时有效。
D0-D7:
8位双向数据线。
3系统硬件设计
3.1主控模块的电路设计
3.1.1AT89C51单片机的简介
51系列单片机的内部功能可由图3.1所示的框架来描述。
图3.151系列单片机内部组成功能图
1.中央处理器CPU
CPU又称微处理器,或中央处理器,是单片机的核心部件,它决定了单片机的主要功能特性。
CPU负责控制、指挥和调度整个系统单元协调工作,完成运算和控制输入输出功能。
CPU就像人的大脑一样,决定了单片机的运算能力和出理速度。
2.程序存储器ROM
ROM是只读存储器的简称,是一种只能读出事先所存数据的固态半导体存储器,用来存放用户程序,可分为EPROM、EEPROM、MaskROM、OTPROM和FlashROM等。
3.随机存储器RAM
RAM是随机存储器的简称,用来存放运行程序的地址和数据,由于RAM的制造工艺复杂,价格比ROM高得多。
当电源关闭时RAM不能保留数据。
如果需要保存数据,就必须把它们写入静态随机存取存储器(例如硬盘)。
RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM不会动消失,可以长时间断电保存。
4.可编程并行输入输出I/O口
可编程并行输出口通常作为独立的双向I/O口使用,既可作为输入方式,又可作为输出方式,通过软件设定实现。
I/O口是单片机的重要资源,也是衡量单片机功能的重要指标。
5.定时计数器T/C
定时/计数器用于单片机内部精确定时或对外部信号或脉冲计数,通常单片机内部有多个定时计数器。
6.中断系统
中断系统使技术安吉的重要组成部分。
实时控制中往往用到中断系统,计算机与外部设备传送数据及实现人机联系时要用到中断系统。
7.时钟电路
单片机通常需要外接石英晶振或其他振荡源提供时钟信号输入,也有的使用内部RC震荡器。
3.1.2AT89C51管脚功能
51系列单片机最常用的是40引脚集成电路芯片,由于单片机是一个芯片,体积较小,为了增其功能,许多引脚具有两个功能,其引脚功能如下图所示。
图3.2单片机引脚功能图
1.主电源引脚
Vcc(40脚):
接+5V电源;Vss(20脚):
接数字电路地。
2.外接晶体引脚
XTAL1(19脚):
接石英晶体一端;XTAL2(18脚):
接石英晶体另一端。
3.输入输出引脚
P0口(32-39脚):
P0.0-P0.7统称为P0口,是一组8位漏极开路型双向型I/O口,也是地址/数据复用总线。
P1口(1-8脚):
P1.0-P1.7统称为P1口,是一组带内部上拉电阻的8位准双向I/O口。
P2口(21-28脚):
P2.0-P2.7统称为P2口,是一组带上拉电阻的8位双向I/O口。
在接有片外存储器或扩展I/O口且寻址范围超过256B时,P2口用作8位地址总线。
P3口(10-17脚):
P3.0-P3.7统称为P3口,是一组带内部上拉电阻的8位双向I/O口。
除此之外,还可以将每一位用作第二功能。
4.控制信号引脚
RET/VPD(9脚):
该引脚为单片机的上电复位端或掉电保护段。
ALE(30脚):
地址锁存有效信号输出端,高电平有效。
EA/Vpp(31):
片外程序存储器选用段,低电平有效。
高电平时选用片内程序存储器。
3.2红外遥控模块的电路设计
3.2.1红外遥控的实现原理
红外遥控的实现主要是如何用程序去分析位0和位1。
位0和位1所不同之处就是在高电平脉冲后的低电平脉宽不一样,采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
解码的关键也是如何识别“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”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
根据码的格式,应该等待9ms的起始码和4.5ms的结束码完成后才能读码。
红外遥控系统主要分为调制、发射和接收三部分。
红外遥控芯片将红外码调制成合适的脉冲信号经红外发射二极管发射红外编码后由红外接收器把接收到的信号处理后输出给单片机。
红外遥控的流程图如图3-5所示。
红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
3.2.2红外发射器
该电路的主要控制器件为遥控器芯片HT6221。
HT6221是Holtek公司生产的多功能编码芯片,采用脉冲位置调制PPM(PulsePositionModulation)进行编码,利用脉冲的时间间隔来区分0和1。
1.12ms为0,2.24ms为1。
HT6221能编码16位地址码和8位数据码,最多能同时支持32个开关键。
HT6221键码的形成:
当一个键按下超过36ms,振荡器使芯片激活,如果这个按键按下且延迟大约108ms,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这个8位数据码的反码(9ms~18ms)组成,如果按键按下超过108ms仍未松开,接下来发射的代码将仅由起始码(9ms)和结束码(2.5ms)组成。
红外遥控发射器电路图如图3-6所示。
HT6221采用455KHZ的晶振,利用分频电路将红外码调制成38KHZ的脉冲信号通过红外发射二极管发出红外编码。
红外码共有32位(起始码、结束码、用户码数据码和数据反码)图3-6中D1是红外发射二极管,D2是按键指示灯,当有按键按下时D2点亮。
各个开关的功能分别为:
K1前进;K2后退;K3左转,K4右转,K5停止。
K6、K7、K8暂时无指定功能。
3.2.3红外接收器
红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。
内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。
红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。
交流信号进入带通滤波器,带通滤波器可以通过30KHZ到60KHZ的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。
注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。
该模块使用红外接收头1838,有三个引脚,包括供电脚,接地和信号输出脚。
其电路如图3-7所示。
瓷片电容104为去耦电容,滤除输出信号的干扰。
1端是解调信号的输出端,直接与单片机的P3.2口相连。
有红外编码信号发射时,经红外接头处理后,输出为检波整形后的方波信号,并直接提供给单片机,执行相应的操作来达到控制电机的目的。
3.3电机驱动模块的电路设计
该模块主要芯片L298,其可以同时控制两个电机的正反转,以及改变电机的转速,足以满足设计要求。
L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
L298芯片是一种高压、大电流双全桥式的驱动器。
其中SENSEA、SENSEB分别为两个H桥的电流反馈脚,不用时可以直接接地。
VCC,VS是接电源引脚,电压范围分别是4.5~7V、2.5~46V,设计中VCC端与单片机电源端共用5V工作电源,VS端接12V电源。
ENA,ENB为使能端,低电平禁止输出。
IN1,IN2,IN3,IN4为数据输入引脚,分别于单片机的P1.0、P1.1、P1.2、P1.3连接,从单片机内输入控制信号。
OUT1,OUT2、OUT3,OUT4为数据输出引脚,分别接电动机MG1和MG2。
通过调节IN1,IN2,IN3,IN4之间输入的高低电平的变化来实现电动机MG1和MG2的正反转动,从而实现小车的前进、后退、左转和右转等功能。
当IN1输入低电平时,电机MG1正转;当IN2输入低电平时,电机MG1反转;当IN3输入低电平时,电机MG2正转;当IN4输入低电平时,电机MG2反转。
高电平输入时,电机不工作。
D1~D8是保护二极管(IN5819),用于释放掉电机紧急制动停车时产生的反向尖峰电势,起到保护L298不被损坏的作用。
电机驱动模块的电路图如图3-8所示:
图3.6电机驱动电路原理图
3.4显示模块的电路设计
本系统采用14脚的1602型号的LCD显示器。
其电路原理图如图3.7所示,图中RP1是9个插针作为排阻封装的上拉电阻,主要是对器件1602注入电流,把不确定信号通过电路钳位在高电平,同时也起到限流的作用。
1602LCD显示器的D0~D8分别接在单片机的P0口,RS引脚高电平输入时输入数据,低电平输入时输入指令,接在单片机的P2.0口。
RW引脚低电平输入时向LCD写入指令或数据,高电平输入时从LCD读取信息,接在单片机的P2.1口。
E引脚使能信号,高电平输入时读取信息,高电平向低电平转换时执行指令,接在单片机的P2.2口。
图3.7LCD显示电路原理图
4系统软件设计
4.1程序代码
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitENA=P2^7;
sbitENB=P3^0;
sbitIN1=P2^3;
sbitIN2=P2^4;
sbitIN3=P2^5;
sbitIN4=P2^6;
ucharcycle=100;
ucharspeed=80;
ucharcodetab[]="LCD1602";//初始化
ucharcodetab0[]="SmartCar";//初始化
ucharcodetab1[]="GoAlong";//前进
ucharcodetab2[]="GoBack";//后退
ucharcodetab3[]="GoLeft";//左转
ucharcodetab4[]="GoRight";//右转
ucharcodetab5[]="Stop";
voidDelay(uintt)//延时函数
{
inti,j;
for(i=110;i>0;i--)
for(j=t;j>0;j--);
}
voidt0(void)interrupt1
{
if(cycle>100)
cycle=0;
if(speedENA=ENB=0;
else
ENA=ENB=1;
cycle++;
}
voidlcd_wcmd(ucharcmd)//写指令
{
RS=0;
RW=0;
E=0;
Delay(5);
E=1;
P0=cmd;
Delay(5);
E=0;
}
voidlcd_wdat(uchardat)//写数据
{
RS=1;
RW=0;
E=0;
Delay(5);
E=1;
P0=dat;
Delay(5);
E=0;
}
voidlcd_init()//LCD初始化
{lcd_wcmd(0x38);//8位总线,双行显示
Delay
(1);
lcd_wcmd(0x01);//清屏
Delay
(1);
lcd_wcmd(0x06);//数据读写屏幕画面不动
Delay
(1);
lcd_wcmd(0x0c);//开显示,无光标,不闪烁
Delay
(1);
}
voidmain()//主函数
{inti;
EA=1;
ET0=1;
TMOD=0X02;
TH0=0XA3;
TL0=0XA3;
TR0=1;
lcd_init();//初始化液晶
Delay(5);
P1=0XFF;
lcd_wcmd(0x80);//第一行内容
for(i=0;i<16;i++)
{lcd_wdat(tab0[i]);}
lcd_wcmd(0xC0);//第二行内容
i=0;
while(tab[i]!
='\0')
{lcd_wdat(tab[i]);
i++;
}
while
(1)
{i=0;
if(P1==0XFE)//前进
{lcd_wcmd(0x01);//清屏
lcd_wcmd(0x80);//在液晶的第一行写入
for(i=0;i<16;i++)
{
lcd_wdat(tab1[i]);//写入的内容
}
lcd_wcmd(0XC0);//第二行
i=0;
for(i=0;i<16;i++)
{
lcd_wdat(tab[i]);//第二行内容
}
IN1=0;//电机转动函数
IN2=1;
IN3=0;
IN4=1;
}
if(P1==0XFD)//后退
{
lcd_wcmd(0x01);//清屏
lcd_wcmd(0x80);//在液晶的第一行写入
i=0;
for(i=0;i<16;i++)
{
lcd_wdat(tab2[i]);//写入的内容
}
lcd_wcmd(0xC0);//第二行
i=0;
for(i=0;i<16;i++)
{
lcd_wdat(tab[i]);//第二行内容
}
IN1=1;//电机转动函数
IN2=0;
IN3=1;
IN4=0;
}
if(P1==0XFB)//左转
{lcd_wcmd(0x01);//清屏
lcd_wcmd(0x80);//在液晶的第一行写入
i=0;
for(i=0;i<15;i++)
{
lcd_wdat(tab3[i]);//写入的内容
}
lcd_wcmd(0x80+0x40);//第二行
i=0;
for(i=0;i<16;i++)
{
lcd_wdat(tab[i]);//第二行内容
}
IN1=0;//电机转动函数
IN2=0;
IN3=0;
IN4=1;}
if(P1==0XF7)//右转
{lcd_wcmd(0x01);//清屏
_wcmd(0x80);//在液晶的第一行写入
i=0;
for(i=0;i<15;i++)
{
lcd_wdat(tab4[i]);//写入的内容
}
lcd_wcmd(0xC0);//第二行
i=0;
for(i=0;i<16;i++)
{
lcd_wdat(tab[i]);//第二行内容
}
IN1=0;//电机转动函数
IN2=1;
IN3=0;
IN4=0;
}
if(P1==0XEF)//停止
{lcd_wcmd(0x01);//清屏
lcd_wcmd(0x80);//在液晶的第一行写入
i=0;
for(i=0;i<9;i++)
{
lcd_wdat(tab5[i]);//写入的内容
}
lcd_wcmd(0XC0);//第二行
i=0;
for(i=0;i<16;i++)
{lcd_wdat(tab[i]);//第二行内容}IN1=0;//电机转动函数
IN2=0;
IN3=0;
IN4=0;
}
}
}
4.2软件流程图
图4.1软件流程图
5调试与仿真
5.1在keil中进行调试
(1)创建“智能小车”项目,选择单片机型号为AT89C51,汇编源程序,保存为“智能小车.C”。
(2)将源程序添加到项目中。
(3)打开项目菜单,选择Optionsfortarget’target1’选项,点击output一项,在CreateHEXFile前打上对勾。
(4)编译源程序,如果有问题,则需要调试修改,若没有错误,则成功创建“智能小车.HEX”文件。
图1.3编译成功提示图
图5.1编译成功图
5.2在Proteus中进行仿真
打开Proteus软件,用左键单击单片机,在出现的对话框中,添加“智能小车.HEX”文件,开始仿真,效果如下图所示。
按下开始后,系统初始化如下图所示:
图5.2初始化
按下前进按钮,系统仿真结果如下图所示:
图5.3前进
按下左转按钮,仿真结果如下图所示:
图5.4右转
按下停止按钮,仿真结果如下图所示:
图5.5停止
6总结
不知不觉一个学期又要接近尾声,感觉时间过得好快,但也感觉过的很充实,这一学期真的学到了感兴趣的东西。
在大二的时候,我就了解过单片机这门课程,当时想要自学,在图书馆找了一本书,坐在那里,看了两个小时,本来信心满满,打算攻坚克难,在单片机的海洋里徜徉,谁知,这两个小时硬是把我学习的心情破坏了。
以后就再也没看过相关的书籍。
转眼间,大三了,这次想逃都逃不过了,就算不想学也要硬着头皮去上课。
还记得第一节课张老师给我们填了一个表,说您的教学方法与众不同,只要跟着您学习单片机,就一定能学会。
我当时半信半疑,信是因为您说的那么诚恳,疑是因为觉得这门课太难学了。
既然这么样都是学,那就跟着您学呗!
一学果然就停不下来了,