内容发布更新时间 : 2024/12/28 13:24:18星期一 下面是文章的全部内容请认真阅读。
目录
1、引言
1.1智能小车的设计意义和作用………………………3 2、系统总体设计……………………………………………4 3、硬件设计
3.1循线模块……………………………………………5 4、软件设计
4.1软件调试平台………………………………………7 4.2系统软件流程………………………………………8 4.3系统软件程序………………………………………9 5、调试及性能分析………………………………………12 6、设计总结………………………………………………13 7、作品实物图……………………………………………14 8、参考文献………………………………………………15
1、引言
1.1智能小车的设计意义和作用
智能小车是移动式机器人的重要组成部分,介绍一种基于AT89S52单片机的智能小车。通过不断检测各个模块传感器的输入信号,根据内置的程序分别控制小车左右两个直流电机运转,实现小车自动识别路线,寻找光源,判断并避开障碍物,检测道路上的铁片、发出声光信息并计数显示,智能停车等功能。
作为20世纪自动化领域的重大成就,机器人已经和人类社会的生产、生活密不可分。因此为了使智能小车工作在最佳状态,进一步研究及完善其速度和方向的控制是非常有必要的。智能小车要实现自动寻迹功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。避障控制系统是基于自动导引小车(avg—auto-guide?vehicle)系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。使用传感器感知路线和障碍并作出判断和相应的执行动作。该智能小车可以作为机器人的典型代表.它可以分为三大组成部分:传感器检测部分,,执行部分,cpu。机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。考虑使用价廉物美的红外反射式传感器来充当。智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。
2、系统总体设计
AT89S52单片机作为总的控制核心,利用传感器,在循线信号、寻光信号、检测障碍物信号等的输入作用下,控制电机采取相应的动作,从而调整小车做合适的选择。同时,如果有检测到金属片的信号,则将该信号以声光的形式表现出来并令数码管计数显示。主要有循线、寻光、避障、金属检测、数码显示、电机驱动、电源、单片机控制等8大模块,如2-1图所示。
图2-1 功能模块图
3、硬件设计
3.1循线模块
循线模块,循迹是指小车在白纸地板上循黑线行走通常采取的方法是红外探测法,红外探测法即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,可以根据黑带和白纸对光线的发射系数不同,可以利用车底接收到的发射光的强弱来判断“道路”黑带。采用四个红外光电管分别置于移动智能小车前板底座的两侧,确保沿着黑线行驶。红外光电管由一个发射管和一个接收管组成,安装在同一面上。红外光电管的工作原理是由发射管发射出的红外线,经检测面反射后被接收管吸收,由于检测面颜色的不同,对红外线的吸收程度也不同,从而反映在接收管的阻值变化上。这种阻值变化通过外接通路就能转换成单片机能够识别的信号。由于红外光电管发出的是红外线,日光对小车的检测不会产生影响,因而其抗干扰性能好,从而实现小车的循迹功能。但红外探测器探测距离有限,一般最大不应超过3cm。循迹功能如3-1,3-2图所示。
图 3-1 循迹功能图 图3-2循迹功能图
本设计需要检测小车的运动状态,沿着路面黑线运动。采用发射取样式,单光束红外传感器接收信号,电路在5V电压下工作,根据该型号传感器红外发射管所需的工作降压(红外发射管的正向降压在1-1.3V)和工作电流(红外发射管的电流为2-10mA),选取负载电阻R=15千欧,红外发射管负载电阻R=220欧。
4、软件设计
4.1 软件调试平台
Keil for C51是美国Keil Software公司出品的C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,Keil C51软件还提供了丰富的库函数和功能强大的集成开发调试工具,生成的目标代码效率非常高,且容易理解。
C51开发中除了必要的硬件外,同样离不开软件,我们写的源程序要变为C51可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,但现在已极少使用手工汇编。Keil提供了包括C编译器、宏汇编、连接线、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision2)将这些部分组合在一起。如图4-1所示。
图4-1 Keil for C51开发平台
4.2系统软件流程
系统软件流程图如图4-2所示
图4-2系统流程图
4.3系统软件程序
#include
#define LED P1 //定义数据显示端口
sbit D1=P2^0; //定义前方左侧指示灯端口 sbit D2=P0^7; //定义前方侧右指示灯端口
sbit ZIR=P3^5; //定义前方左侧红外探头端口 sbit YIR=P3^6; //定义前方右侧红外探头端口 sbit QIR=P3^7; //定义前方正前方红外探头端口 sbit M1A=P0^0; //定义左侧电机驱动A端 sbit M1B=P0^1; //定义左侧电机驱动B端 sbit M2A=P0^2; //定义右侧电机驱动A端 sbit M2B=P0^3; //定义右侧电机驱动B端 sbit SB1=P0^4; //定义语音识别传感器端口 sbit MIC=P0^6; //定义蜂鸣器端口 void delay(unsigned int z) {
while(z--); SB1=!SB1; return; }
void car (unsigned char a) {
M1A=0; M2A=0; M1B=0; M2B=0; switch(a) {
case 1:{M1A=1;M2A=1;break;};
case 2:{M1B=1;M2B=1;D1=0;D2=0;break;}; case 3:{M1B=1;M2A=1;D2=0;break;}; case 4:{M1A=1;M2B=1;D1=0;break;}; } }
void main() {
car(1); while(1); {
D1=1; D2=1; LED=0x00; if(QIR==0) {
car(2);
delay(15000); car(1); }
if(YIR==0&&ZIR==1) {
car(3);