基于STC89C52单片机的智能小车的设计与实现.docx
《基于STC89C52单片机的智能小车的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的智能小车的设计与实现.docx(19页珍藏版)》请在冰豆网上搜索。
基于STC89C52单片机的智能小车的设计与实现
本课题是基于STC89C52单片机的智能小车的设计与实现,小车完成的主要功能利用红外对管检测黑线,并以单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹的功能。
其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。
除了能自主循迹外还能够利用超声波传感器检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车。
此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。
引言
当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。
现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。
作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:
一是电子装置占汽车整车(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。
无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:
亚洲广播电视联盟亚太地区机器人大赛(ABUROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于机电一体化的兴趣与强化机电一体化的相关知识。
但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为自动化专业的学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。
为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法。
一、实验目的:
通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。
进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
二、设计方案:
利用红外对管检测黑线与超声波模块检测障碍物,并以单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。
其中小车驱动由L298N驱动电路完成,速度由单片机输出的PWM波控制。
三、报告内容安排:
本技术报告主要分为两个部分。
第一部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第二部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。
硬件电路的设计
1.主控系统
采用STC89C52单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在一于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势---控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
2.电机驱动模块
智能小车采用四轮驱动,左右两边各用两个电机驱动,调制两边两个轮子的转速起停从而达到控制转向的目的。
电机的开关通过驱动板电机使能端的开关来实现,从而完成了对小车的行径的调整。
电源驱动模块,为ST公司原装全新的L298N芯片,采用SMT工艺稳定性高,采用高质量铝电解电容,使电路稳定工作。
可以直接驱动4路3-24V直流电机,集成LM2596稳压芯片(输入最低只要6V),采用DCtoDC方式最大电流可以达2A,可以给5V单片机电路系统,路由器,舵机,传感器供电,集成ULN2003驱动IC,可以再驱动四个直流电机开与关。
3.循迹模块
采用四只红外对管,置于小车车身前轨道的两侧,根据四只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,原理表明,只要合理安装好四只光电开关的位置就可以很好的实现循迹的功能。
4.避障模块
采用IO口TRIG触发测距,给至少10US的高电平信号;模块自动发送8个40KHz的方波,自动检测是否有信号返回;有信号返回,通过IO口ECH0输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2
此次设计利用三个超声波传感器检测道路上的障碍的距离,控制电动小车自动前行和转向。
5.机械系统
由于玩具汽车的直流电机功率较小使得电机负担较重,所以要在直流电机和轮车轴之间加装了三级减速齿轮。
力求使小车的机械系统稳定、灵活、简单。
将电池放置在车体的电机前后位置,降低车体重心,提高稳定性。
6.电源模块
采用7.4V可充电锂电池给单片机与电机供电,使系统稳定运行。
软件系统的实现
小车转弯规则:
此次设计的小车是利用差速转弯,当小车需要向右转弯时,小车的左边两个驱动轮向前行进,右边两个驱动轮倒退。
当小车需要向左转弯时,小车的右边两个驱动轮向前行进,左边两个驱动轮倒退。
小车程序:
#include
#include
sfrT2MOD=0xc9;
bitflag=0;
bitSW;
sbitRight_moto_en=P2^4;
sbitLeft_moto_en=P2^5;
sbitin1=P1^0;
sbitin2=P1^1;
sbitin3=P1^2;
sbitin4=P1^3;
sbitin5=P1^4;
sbitin6=P1^5;
sbitin7=P1^6;
sbitin8=P1^7;
sbitint0=P3^2;
sbitled0=P3^1;//中
sbitled1=P3^3;//右
sbitled2=P3^4;//左
sbitTX1=P3^5;//中
sbitTX2=P3^6;//右
sbitTX3=P3^7;//左
unsignedchartimer,num,csb,CS,HM;
unsignedinttime,S_M,S_R,S_L,S_S;
voidRight_moto_go()
{in1=0;in2=1;in3=0;in4=1;}
voidRight_moto_back()
{in1=1;in2=0;in3=1;in4=0;}
voidLeft_moto_go()
{in5=0;in6=1;in7=0;in8=1;}
voidLeft_moto_back()
{in5=1;in6=0;in7=1;in8=0;}
unsignedcharpwm_val_right=0;
unsignedcharpush_val_right=0;
unsignedcharpwm_val_left=0;
unsignedcharpush_val_left=0;
bitRight_moto=1;
bitLeft_moto=1;
voiddelay(unsignedintk)
{
unsignedintx,y;
for(x=0;xfor(y=0;y<2000;y++);
}
voidline_moto(unsignedchara)
{
push_val_left=a;
push_val_right=a;
Left_moto_go();
Right_moto_go();
led0=1;
led1=1;
led2=1;
}
voidright_moto(unsignedchara)
{
push_val_left=a;
push_val_right=a;
Right_moto_back();
Left_moto_go();
led0=1;
led1=0;
led2=1;
}
voidleft_moto(unsignedchara)
{
push_val_left=a;
push_val_right=a;
Right_moto_go();
Left_moto_back();
led0=1;
led1=1;
led2=0;
}
/*
voidback_moto(unsignedchara)
{
push_val_left=a;
push_val_right=a;
Right_moto_back();
Left_moto_back();
led0=0;
led1=1;
led2=1;
}
*/
voidpwm_out_left_moto()
{
if(Left_moto)
{
if(pwm_val_left<=push_val_left)
Left_moto_en=1;
else
Left_moto_en=0;
if(pwm_val_left>=10)
pwm_val_left=0;
}
elseLeft_moto_en=0;
}
voidpwm_out_right_moto()
{
if(Right_moto)
{
if(pwm_val_right<=push_val_right)
Right_moto_en=1;
else
Right_moto_en=0;
if(pwm_val_right>=10)
pwm_val_right=0;
}
elseRight_moto_en=0;
}
voidtime0()interrupt1
{
TH0=0XF8;
TL0=0X30;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
voidintr0()interrupt0
{
TR1=1;
while(!
int0);
TR1=0;
time=TH1*256+TL1;
TH1=0;
TL1=0;
if(csb==1)S_M=(time*1.9)/100;
if(csb==2)S_R=(time*1.9)/100;
if(csb==0)S_L=(time*1.9)/100;
if(S_R<=8||S_L<=8)
{
if(S_R<=8)S_S=S_S|0x04;
elseS_S=S_S|0x02;
}
else
{
if(S_M<=8)S_S=0x1f;
elseS_S=0x00;
}
}
/********************************************************/
voidtimer1()interrupt3
{
flag=1;
}
/********************************************************/
voidtimer2()interrupt5
{
TF2=0;
if(csb==0)
{
timer++;
if(timer>=50)
{
timer=0;
TX1=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX1=0;
csb=1;
}
}
if(csb==1)
{
timer++;
if(timer>=50)
{
timer=0;
TX2=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX2=0;
csb=2;
}
}
if(csb==2)
{
timer++;
if(timer>=50)
{
timer=0;
TX3=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX3=0;
csb=0;
}
}
}
voidINIT()
{
TMOD=0X11;
T2MOD=0;
T2CON=0;
TH0=0XF8;
TL0=0X30;
TH1=0;
TL1=0;
RCAP2H=0xf8;
RCAP2L=0x30;
TH2=RCAP2H;
TL2=RCAP2L;
ET0=1;
ET1=1;
ET2=1;
TR0=1;
IT0=1;
EX0=1;
EA=1;
S_S=0x00;
TR2=0;
SW=0;
CS=3;
}
voidmain()
{
INIT();
while
(1)
{
if(!
SW)HM=P2&0x0F;
elseHM=S_S;
switch(HM)
{
case0x00:
//00000000
line_moto(CS);
delay(6);
break;
case0x01:
//00000001
case0x02:
//00000010
right_moto
(2);
delay(6);
break;
case0x07:
//00000111
case0x03:
//00000011
right_moto(3);
delay(6);
break;
case0x04:
//00000100
case0x08:
//00001000
left_moto
(2);
delay(6);
break;
case0x0e:
//00001110
case0x0C:
//00001100
left_moto(3);
delay(6);
break;
case0x0f:
//00001111
//Right_moto=0;
//Left_moto=0;
Right_moto=0;
Left_moto=0;
SW=~SW;
TR2=SW;
if(!
SW)CS=3;
elseCS=2;
Right_moto=1;
Left_moto=1;
break;
case0x1f:
//00011111
if(S_R<=8)left_moto
(2);
elseright_moto
(2);
delay(6);
break;
}
}
}
结论
根据本次设计要求,我们阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了51系列单片机的工作原理及其使用方法,并独自设计智能小车的整个项目。
虽然条件艰苦,但经过不懈钻研和努力,购买到了所有所需的元器件,并系统的进行了多项试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,本系统能够基本满足设计要求,能够较快较平稳的是小车沿引导线行驶,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。
通过本次课题设计,不仅是对课本所学知识的考查,更是对我们的自学能力和收集资料能力以及动手能力的考验。
本次课程设计使我们对一个项目的整体设计有了初步认识,还认识了几种传感器,并能独立设计出其接口电路。
本次课程设计使我意识到了实验的重要性,在硬件制作和软件调试的过程中,出现了很多问题,最终都是通过实验的方法来解决的。
还有以前对程序只是一个很模糊的概念,通过这次的课题设计使我对程序完全有了一个新的认识,并能使用C熟练的进行编程了。
通过本次课题设计,极大的锻炼了我们的思考和分析问题的能力,并对单片机有了一个更深的认识。
总之,在课题设计的过程中,无论是对于学习方法还是理论知识,都有了新的认识,受益匪浅,这将激励我们在今后再接再厉,不断完善自己的理论知识,提高实践运作能力。
参考文献
1. 单片机原理与应用 张毅刚 主编 高等教育出版社
2. C程序设计 谭浩强 著 清华大学出版社
3. 《单片机C程序设计》马忠梅,北京航空航天大学出版社
4. 数字电子技术基础(第五版) 阎 石主编 高等教育出版社
5. 模拟电子技术基础(第四版) 华成英主编 高等教育出版社