基于单片机的简易智能电动车设计课程设计.docx
《基于单片机的简易智能电动车设计课程设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的简易智能电动车设计课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于单片机的简易智能电动车设计课程设计
《单片机应用技术》
课程设计报告
题目:
基于单片机的简易智能电动车设计
课程设计任务书
设计名称:
基于单片机的简易智能电动车设计
设计要求:
制作一个简易的智能电动车,它能实现的功能是:
从起跑线出发,沿引导线到达B点。
在此期间检测到铺设在白纸下的薄铁片,并同时发出声光指示信息,实时存储、显示在“直道区”检测到的薄铁片数目。
电动车到达B点以后进入“弯道区”,沿圆弧引导线到达C点,能够检测C点下正方形薄铁片,并在C点处停车5秒,停车期间发出断续的声光信息。
之后继续行驶,在光源的引导下,利用超声传感器传来的信号通过障碍区进入停车区并到达车库。
最后,电动车完成上述任务后能够立即停车,全程行驶时间小于90秒。
并附加其他功能。
基于单片机的智能电动车设计
摘要
智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
智能电动车就是其中的一个体现。
本设计以单片机作为主控芯片,控制两个步进电机的正反转,实现了小车的不同方向运动。
利用红外对管做成的红外传感器来检测路面信息,完成了小车的巡线功能。
避障与寻光均采用红外对管来实现。
采用LCD1602液晶显示屏来显示时间与路程等信息。
关键词:
巡线避障寻光显示
Abstract
Thenewsmartasamoderninvention,isthefuturedirectionofdevelopment,hecanfollowthepatternsetinadvanceinanenvironmentwheretheoperationautomatically,withouthumanmanagement,etc.canbeappliedtotheuseofscientificexploration.Smartelectriccarisoneofexpression.
Thedesignofamicrocontrollerasthemasterchip,thetwosteppermotorreversingcontrolandachievethecar'sdifferentdirection.UsingInfraredEmittingDiodemadeofinfraredsensorstodetectroadsurfaceinformation,completedthecar'stransmissionlinefunctions.Obstacleavoidanceandinfraredsearchlighttubesareusedtoachieve.ByLCD1602LCDtodisplayinformationsuchastimeanddistance.
Keyword:
SearchonlineAvoidobjectSearchlightShowInformation
八总结与体会........................................................................................................................................23
第一章总体概括
具体的系统方框图如下所示:
图1系统框图
第二章方案的论证与比较
2.1主控芯片的选择
方案一:
采用单个单片机作为主控芯片。
由于AT89S52具有32个I/O口,能满足小车各部分对I/O口的需求,另外只用一个单片机可以很好的控制小车。
方案二:
采用双单片机作为主控芯片。
利用两块AT89S52分别对小车的各部分进行监测和控制,虽然减轻了单个单片机的负担,提高了系统的工作效率,但是存在很多的I/O的资源浪费,并且两个单片机不容易控制,所以不采用该方案。
使用方案一
2.2智能巡线设备的选择
方案一:
采用普通发光二极管及光敏电阻组成的发射接收方案。
该方案在实际使用时,容易受到外界光源的干扰,有时甚至检测不到。
主要是因为可见光的反射效果跟地表的平坦程度、地表材料的反射情况都有直接关系。
虽然可采取超高亮度发光二极管降低一定的干扰,但这又增加额外的功率损耗。
方案二:
采用反射式红外对管,虽然易受环境的影响,识别的可靠程度不高,但是由于其结构简单,体积小巧,易于安装,完全能用多个该传感器构成高精度的控制辐射网络提高识别的可靠性、准确性,考虑到实际应用环境,因此我们采用方案二。
2.3显示设备的选择
方案一:
采用传统数码管作为显示设备。
传统数码管具有低能耗、低损耗、低压、长寿命、耐老化、防晒、防潮、防火、防高(低)温的特点;对外界环境要求低,易于维护;同时其精度比较高,精确可靠,操作简单,程序编写容易,资源占用少。
本设计要求显示的内容较多,如果利用传统数码管来显示,则需要好几块数码管,这样占用单片机很多的I/O口,并且不够美观,也不易区分各块数码管显示的是什么内容。
所以,该方案不被采用。
方案二:
采用液晶显示屏(LCD)显示时间和路程。
液晶显示器具有功耗低、无辐射危险、平面直角显示以及影像稳定等,可视面积大,画面效果好,也可以显示汉字,分辨率高,抗干扰能力强,显示内容多等特点。
因此,只要用一块液晶显示器就可以显示设计要求的全部内容。
此外,液晶显示器与单片机连接电路较简单,且占用的I/O口较少。
基于以上分析,我们采用该方案,用LCD1602进行显示。
2.4声光信号设备的选择
本设计要求小车在直道上检测到金属时发出声光指示信息,在发声方面,我们使用蜂鸣器代替扬声器,因为扬声器功耗比较大,体积也较大,而本设计对声音信号要求不高,所以我们使用功耗与体积都较小的蜂鸣器。
在发光方面,我们选择普通的发光二极管。
第三章电路设计
3.1单元电路设计
3.1.1寻光电路的设计
该单元电路主要是实现小车寻光入库,考虑到光源是放在车库里,而且光源离地面有一定的高度,为了使小车能够精确驶入库中,我们采用三个光敏传感器。
用金属支架将三个光敏传感器固定在车的中间部分,并使光敏传感器尽可能与光源保持水平,这三个传感器组成一个120度的扇形,相邻两个之间的角度为60度。
其中一路如图所示:
图2寻光电路图
其他两个电路与此电路相同。
接收管未接收到光源发出的红外光时,接收管不导通,正向输入的电压大于基准电压,通过电压比较器进行比较输出高电平,接收管接收到光源发出的红外光后,接收管导通,正向输入的电压将会小于基准电压,通过电压比较器进行比较输出低电平。
单片机可直接对接收到的信号进行判断是否检测到光源,并通过对检测到的信号进行处理来决定小车的运动方向。
3.1.2红外检测电路设计
该设计采用红外对管构成的红外传感器,具体电路如图所示:
图3红外对管电路
我们在小车的前端底部安装三对相同的红外对管,用来检测地面信号,每个红外对管都有一个发射管和一个接收管,发射管发射红外线到地面,如果遇到黑线则光信号会被吸收,否则会被反射回来。
检测到黑线接收管不导通,输出高电平,否则输出低电平。
单片机根据接收到的高低电平来决定小车如何行驶。
另外在小车的正前端安装一对红外对管,用来检测前方是否有障碍物。
探测原理与检测地面的原理相同,当小车前端的红外对管发射出的红外光线被反射回来时,说明前方有障碍物,此时小车会进行相应的反应。
3.1.3金属探测电路的设计
此部分电路的功能是检测轨道上的铝钱币,在此我们使用的金属传感器是电感接近式开关。
该传感器由LC高频振荡器和放大处理电路组成,利用金属物体在接近这个能产生电磁场的振荡感应头时,使物体内部产生涡流。
这个涡流反作用于接近开关,使接近开关振荡能力衰减,内部电路的参数发生变化,由此识别出有无金属物体接近,进而控制开关的通或断。
其工作原理图如下所示:
图4接近式开关原理图
当小车遇到铝钱币时,控制开关将会发生变化,输出电压为零伏,否则输出的是1.12V。
由于两者都属于低电平,在此我们再次使用电压比较器,使两种不同情况下,分别输出高低电平,并将其传给单片机。
单片机根据接收到的信号判断是否有铝钱币。
3.2电机驱动电路设计
本设计使用的步进电机是四项六线式,用L297和L298N驱动芯片驱动,其中一个的驱动电路如图所示(另外一个于此相同):
单片机AT89S52通过I/O口向L297的17和18脚发送驱动控制信号,从而控制步进电机的速度及正反转。
图5.步进电机驱动电路
第四章软件设计
主程序流程图
图6
第五章调试结果
5.1小车利用红外对管能够成功进行巡线、避障:
①:
小车的电机驱动脉冲在1500左右,小车可以在躲避障碍物时候,准确的转外实现延时并且寻光功能。
②:
小车的电机驱动脉冲在1500左右,是小车的性能达到最优,正在巡线转弯的车体抖动达到最小值。
③:
小车的避障的红外对管与地面的距离在4cm以及角度在85°左右,能够准确实现避障,且车体转弯达到90°
5.2小车利用红外对管寻光进入车库:
①:
当小车驶出障碍区,加以脉冲在1800左右,可以使其在寻光过程中,避免车身旋转角度过大。
②:
小车的寻光的红外对管(车身左侧)与地面的距离在6cm以及角度在95°左右,能够准确实现寻光,和车身180度旋转,倒入车库
5.3小车的显示模块:
①:
小车的总路程、总时间、被检测的金属数目以及被检测金属与其实位置的距离,适时显示小车行驶的路程和时间
第六章参考文献
[1]戴佳戴卫恒.51单片机C语言应用程序设计实例精讲[M]北京:
电子工业出版社2005.
[2]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品汇编[M]北京:
北京理工大学出版社2008.
[3]黄智伟.全国大学生电子设计竞赛制作实训[M]北京:
北京航空航天大学出版社2005.
[4]黄智伟.全国大学生电子设计竞赛系统设计[M]北京:
北京航空航天大学出版社2006.
[5]赵广林.常用电子元器件设别/检测/选用一读通[M]北京:
电子工业出版社2008.
[6]康华光.电子技术基础模拟部分(第五版)[M]北京:
高等教育出版社2004.
[7]AT89S51Preliminary,AtmlelComporation2001.
[8]AT89S52,AtmlelComporation2001.
[9]李叶紫.MCS51单片机应用教程[M]北京:
清华大学出版社2004.
[10]张毅刚.单片机原理及应用[M]北京:
高等教育出版社2004.
第七章附录
程序:
#include"xiaoche.h"
#include"lcd1602.h"
//unsignedints=10;
//unsignedints2,i2=1,j2=1,k2=1;
unsignedintjj=0;
unsignedintkk=0;
unsignedintd[5]={0};
voidDelay(unsignedintt)//延时1
{
while(t--);
}
voidgo(void)//直行
{cwright=1;
cwleft=1;
m=2;
step_mode=0;
}
voidback()//后直行
{
m=2;
cwright=0;
cwleft=0;
step_mode=0;
}
voidtleft()//左拐
{//cwleft=0;
//cwright=1;
m=0;
step_mode=0;
}
voidtleft_1(void)
{
m=4;
cwleft=0;
cwright=1;
step_mode=0;
}
voidtright()//右拐
{//cwleft=1;
//cwright=0;
m=1;
step_mode=0;
}
voidtright_1(void)
{
m=5;
cwleft=1;
cwright=0;
step_mode=0;
}
voidsearchline(void)//巡线+金属探测
{
unsignedints=10;
unsignedinti,j,k,z;
kk=1;
while
(1)
{
i=s_L;
j=s_M;
k=s_R;
z=js;
s=z*8+i*4+j*2+k;
switch(s)
{case7:
shengguang();break;
case5:
shengguang();break;
case2:
go();shengguang();break;
case4:
tright();shengguang();break;
case6:
tright();shengguang();break;
case1:
tleft();shengguang();break;
case3:
tleft();shengguang();break;
//case0:
go();shengguang();break;
case15:
case13:
case10:
go();break;
case12:
tright();break;
case14:
tright();break;
case9:
tleft();break;
case11:
tleft();break;
case8:
go();break;
}
if(s==0){Stop_0(5);break;}
//go();shengguang();
//if(s==8){break;}
Display();
//if(ii==1){a=d[0];}
//if(ii==2){d2=a;}
//if(ii==3){d3=a;}
//if(ii==4){
//{Stop_0(10);}
//Display();
//stop();shengguang();
//Delay1ms(1000);
//break;
}
}
voidsearchlight()
{unsignedints1,i1=1,j1=1,k1=1;
unsignedints2,i2=0,j2=0,k2=0;
while
(1)
{
i1=left2;
j1=forest3;
k1=right1;
s1=i1*4+j1*2+k1;
i2=s_L;
j2=s_M;
k2=s_R;
s2=4*i2+2*j2+k2;
switch(s1)
{case7:
go();break;
case5:
go();break;
case2:
case4:
tleft();break;
case6:
tleft();break;
case1:
tright();break;
case3:
tright();break;
//case0:
go();break;
}Display();
if(s1==0){break;}//go();
if(s2==7){break;}
}
}//金属探测
voidshengguang()
{unsignedinti=0;
ii++;
d[ii]=a;
light=1;
alrm=1;
for(i=0;i<5;i++)
{
alrm=!
alrm;
light=!
light;
Delay(10000);
}
alrm=1;
light=1;
}
voidinit()
{
TMOD=0x11;//T0,T1都使用16位定时器,不受外部外部引脚电平控制
TH0=0xfc;
TL0=0x17;
TH1=0x3c;
TL1=0xb0;//定时50ms
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
voidtime()interrupt3using1
{
TH1=0x3c;
TL1=0xb0;
TCount++;
if(TCount==20)
{
TCount=0;
second++;
if(second==90)
{
stop();
}
}
}
voidDelay1ms(Wordn)//延时2
{
Worda;
for(;n>0;n--)
for(a=0;a<120;a++)
;
}
voidStop_0(Wordn)//停车1
{
while(n--)
{
Display();
stop();
Delay1ms(500);
alrm=!
alrm;
light=!
light;
Delay(1000);
}
alrm=1;
light=1;
}
voidstop(void)//停车2
{
m=3;
step_mode=0;
}
voidstep()interrupt1
{
if(!
step_mode){step_time=3000;step_mode=1;}
if(jj)step_time=1800;
if(kk)step_time=1500;
TH0=(Byte)((65535-step_time)/256);
TL0=(Byte)((65535-step_time)%256);
if(m==0){moto_clkl=~moto_clkl;c++;}
if(m==1){moto_clkr=~moto_clkr;c++;}
if(m==2){moto_clkl=~moto_clkl;moto_clkr=~moto_clkr;c++;}
if(m==3);
if(m==4){moto_clkl=~moto_clkl;moto_clkr=~moto_clkr;c++;}
if(m==5){moto_clkl=~moto_clkl;moto_clkr=~moto_clkr;c++;}
//if(step_time>1000)step_time-=200;
//c++;b++;
if(c==37){a+=1;c=0;}
}
voidDisplay1()
{Lcd_Init();
Lcd_DisplayString(0,0,"Time:
");
Lcd_DisplayOneChar(7,0,'s');
Lcd_DisplayString(9,0,"Num:
");
Lcd_DisplayString(0,1,"D1:
");
Lcd_DisplayString(7,1,"cm");
Lcd_DisplayOneChar(13,0,ii+0x30);
Lcd_DisplayOneChar(6,0,second%10+0x30);
Lcd_DisplayOneChar(5,0,second/10+0x30);
Lcd_DisplayOneChar(4,1,d[1]/100+0x30);
Lcd_DisplayOneChar(5,1,d[1]%100/10+0x30);
Lcd_DisplayOneChar(6,1,d[1]%10+0x30);
}
voidDisplay2()
{Lcd_Init();
Lcd_DisplayString(0,0,"Time:
");
Lcd_DisplayOneChar(7,0,'s');
Lcd_DisplayString(9,0,"Num:
");
Lcd_DisplayString(0,1,"D2:
");
Lcd_DisplayString(7,1,"cm");
Lcd_DisplayOneChar(13,0,ii+0x30);
Lcd_DisplayOneChar(6,0,second%10+0x30);
Lcd_DisplayOneChar(5,0,second/10+0x30);
Lcd_DisplayOneChar(4,1,d[2]/100+0x30);
Lcd_DisplayOneChar(5,1,d[2]%100/10+0x30);
Lcd_DisplayOneChar(6,1,d[2]%10+0x30);
}
voidDisplay3()
{Lcd_Init();
Lcd_DisplayString(0,0,"Time:
");
Lcd_DisplayOneChar(7,0,'s');
Lcd_DisplayString(9,0,"Num:
");
Lcd_DisplayString(0,1,"D3:
");
Lcd_DisplayString(7,1,"cm");
Lcd_DisplayOneChar(13,0,ii+0x30);
Lcd_DisplayOneChar(6,0,second%10+0x30);
Lcd_DisplayOneChar(5,0,second/10+0x30);
Lcd_DisplayOneChar(4,1,d[3]/100+0x30);
Lcd_DisplayOneChar(5,1,d[3]%100/10+0x30);
Lcd_DisplayOneChar(6,1,d[3]%10+0x30);
}
voidDisplay4()
{
Lcd_Init();
Lcd_DisplayString(0,0,"Over!
Thankyou!
");
}
voidDisplay()
{//init();
Lcd_DisplayOneChar(13,0,ii+0x30);
Lcd_DisplayOneChar(6,0,second%10+0x30);
Lcd_DisplayOneChar(5,0,second/10+0x30);
Lcd_DisplayOneChar(4,1,a/100+0x30);
Lcd_DisplayOneChar(5,1,a%100/10+0x30);
Lcd_DisplayOneChar(6,1,a%10+0x30);
}
main()
{//unsignedints2,i2=1,j2=1,k2=1;
//step_intset();
Lcd_Ini