自动往返电动小汽车设计报告.docx
《自动往返电动小汽车设计报告.docx》由会员分享,可在线阅读,更多相关《自动往返电动小汽车设计报告.docx(51页珍藏版)》请在冰豆网上搜索。
自动往返电动小汽车设计报告
机电学院测控2010_1李菠1001040111
1设计任务………………………………………………………………………………1
1.1要求………………………………………………………………………………2
2方案设计………………………………………………………………………2
2.1路面检测模块………………………………………………………………………3
2.2LCD显示模块………………………………………………………………………3
2.3测速模块……………………………………………………………………………3
2.4控速模块……………………………………………………………………………4
3程序框图………………………………………………………………………………4
4系统的具体设计与实现………………………………………………………………6
4.1路面检测模块………………………………………………………………………6
4.2LCD显示模块………………………………………………………………………6
4.3测速模块……………………………………………………………………………6
4.4控速模块……………………………………………………………………………6
4.5复位电路模块………………………………………………………………………6
4.6脉冲产生模块………………………………………………………………………7
5最小系统图……………………………………………………………………………7
6系统程序………………………………………………………………………………9
7参考文献……………………………………………………………………………39
8附录…………………………………………………………………………………39
1.设计任务:
设计并制作了一个自动往返小汽车,其行驶路线满足所需的要求。
1.1要求:
1.1.1基本要求:
(1)分区控制:
如(图1)所示:
(图1)
车辆从起跑线出发(出发前,车体不得超出起跑线)。
在第一个路程C~D区(3~6米)以低速行驶,通过时间不低于10s;第二个路程D~E区(2米)以高速行驶,通过时间不得多于4秒;第三个路程E~F区(3~6米)以低速行驶,通过时间不低于8s。
1.1.2.发挥部分
(1)自动记录、显示一次往返时间(记录显示装置要求安装在车上)。
(2)自动记录、显示行驶距离(记录显示装置要求安装在车上)。
(3)其它特色与创新。
2.方案设计:
根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图2)所示:
LCD显示模块
测速模块
AT89S51
控速模块
路面检测
555定时器
(图2)
2.1路面检测模块:
路面黑线检测模块采用反射式红外发射--接收器,在车底的前部和中部安装了两个反射式红外传感器.
2.2LCD显示模块:
采用1602LCD,由单片机的总线模式连接。
为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。
2.3测速模块:
采用采用霍尔开关元器件A44E检测轮子上的小磁铁从而给单片机中断脉冲,达到测量速度的作用。
霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。
霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。
其原理图接线如(图3)所示:
(图3)
2.4控速模块:
采用由双极性管组成的H桥电路。
用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高;H桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很高,是一种广泛采用的调速技术。
其电路原理图如(图4)所示:
(图4)
3.程序框图:
单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图7)所示。
全速行驶
开始
第3条黑线
限速模块
设定速度
第4条黑线
全速行驶
第5条黑线
第6条黑线
限速模块
刹车
刹车
限速模块
停10s,交替显示路程,时间
停止,交替显示往返时间,路程
全速倒车
第10条黑线
刹车
限速模块
第11条黑线
刹车
限速模块
第9条黑线
刹车
第8条黑线
全速行驶
(图5)
4.系统的具体设计与实现:
4.1路面检测模块:
路面黑线检测模块采用反射式红外发射--接收器,在车底的前部和中部安装了两个反射式红外传感器.原理图如图6.
图6
4.2LCD显示模块:
采用1602LCD,由单片机的总线模式连接。
为节约电源,LCD的背光用单片机进行控制。
4.3测速模块:
通过霍尔元件感应磁铁来产生脉冲(当霍尔元件在离磁场较近时输出会是高电平,其它时候是低电平),一个车轮均匀放四个小磁铁,计算一秒所得的脉冲数,从而计算出一秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当前路程。
4.4控速模块:
考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。
4.5复位电路模块:
单片机的复位电路通过手动来实现,复位电路图如(图7)所示。
(图7)
4.6脉冲产生模块:
脉冲产生电路采用555定时器.原理图如图.
(图8)
5.最小系统图:
该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如图9.
(图9)
6.系统程序:
按照预定的功能,系统实现预定的功能的程序如下所示:
#include
#include
/********************************************************************************\
**宏定义区**
\********************************************************************************/
/*-------------------------------LCD模块------------------------------------*/
#defineLCD_RWP2_6//读写控制端
#defineLCD_RSP2_7//数据命令选择端
#defineLCD_EP2_5//执行使能端
#defineLCD_DataP1//P1口
#defineWrite0x00//低电平写入
#defineRead0x01//高电平读出
#defineData0x01//高电平选择数据
#defineCmd0x00//低电平选择命令
#defineEnable0x00//跃变到低电平时执行命令
#defineDisable0x01
#defineTrue0x01
#defineFalse0x00
#defineLCD_Init0x38//初始化模式
#defineLCD_DispCtr0x0C//开显示及光标设置
#defineLCD_CloseCtr0x08//关显示
#defineLCD_CLS0x01//清屏幕
#defineLCD_EnterSet0x06//显示光标
#defineBusyP1_7//忙信号
/*--------------------------测速/测距/测时模块-------------------------------*/
#defineCircleLength0.132//小车转一轮的长度为.132m
/*--------------------------------控速模块-----------------------------------*/
#defineP03P0_3//后电机
#defineP04P0_4//后电机
#defineP01P0_1//前电机
#defineP02P0_2//前电机
#defineP31P0_5//控制液晶背光
#defineP33P3_3
/*------------------------------菜单选择模块---------------------------------*/
#defineNormal0x00//0代表正常速度
#defineLow0x01//1代表低速
#defineHigh0x02//2代表高速
/*********************************************************************************\
**全局函数声明区**
\*********************************************************************************/
/*-------------------------------LCD模块-------------------------------------*/
voidLCDInit(void);//LCD初始化
voidSetWriteCmd(void);//设置写命令模式
voidSetReadCmd(void);//设置读命令模式
voidSetWriteData(void);//设置写数据模式
voidWriteCmd(charcmd);//写命令
voidWriteData(charddata);//写数据
voidExecuteCmd(void);//执行命令
voidSetXY(charx,chary);//定位显示地址
voidDisplaySingleChar(charx,chary,charcchar);//显示单个字符
voidDisplayString(charx,chary,char*str);//显示一段字符串
voidDelay(unsignedinttime);//延时主程序
voidDelayUs(unsignedinttime);//延时子程序
bitIsBusy(void);//判断忙标志函数
voidDisplayTime(void);//显示时间
voidDisplayAVGSpeed(void);//显示平均速度
voidDisplayDistance(void);//显示路程
/*--------------------------测速/测距/测时模块-------------------------------*/
voidINTInit(void);//所有中断初始化
voidSpeedINT(void);//测速中断
voidComputeTime(void);
voidComputeSpeedANDDistance(void);//计算速度和距离
/*--------------------------------控速模块-----------------------------------*/
voidCtrSpeedINT(void);//控速中断
voidTime0INT(void);
voidTime1INT(void);//控速单位时间中断
voidClock0_Init(void);//时钟中断初始化
voidClock1_Init(void);//时钟中断初始化
voidCtrSpeed(void);
/********************************************************************************\
**全局变量区**
\********************************************************************************/
floatSpeedCount=0;//测速计数脉冲
floatSpeed=0.0;
floatDistance=0.0;
charTime1INTCount=0;//T1中断时间计时
floatPassTime=0.00;//小车行走的时间
shortIsT0INT=1;
bitIsT1INT;//判断T1是否已经响应中断
shortIsT0INT2=1;
charThx[5]={0xf4,0xf4,0xc5,0xf4,0xff};//3ms,3ms,15ms,3ms
charTlx[5]={0x48,0x48,0x68,0x48,0xff};
charThx0=0xd8;
charTlx0=0xf0;
charThx1=0xb1;//20ms
charTlx1=0xe0;
shortRound=0;
shortBack=0;
shortBack0=0;
bitBackid;
bitStop=0;
charArea0=0;
charArea1=0;//区域变量
charLowSpeedArea1StartTime;
charLowSpeedArea1EndTime;
charHighSpeedAreaEndTime;
charLowSpeedArea2EndTime;
charLowSpeedArea1PassTime=0;//第一个低速区通过时间
charHighSpeedAreaPassTime=0;//高速区通过时间
charLowSpeedArea2PassTime=0;//第二个低速区通过时间
charReadyToGo=4;//倒计时
charflag;
bitRoundid=0;
charNocurve=0;
charChangeFlag;
charMode;
bitRunning;
bitSelectedAll;//速度是否选择完毕标志
bitIsSelectingSpeed;//速度选择标志
bitNext;//Next键标志
bitSpeedSelected;//已经被选中的速度方案标志
charSelectedSpeed;//速度选择是否完毕标志
bitChoosingDisplay;//人工选择菜单开始标志
bitSelectedShow;//显示选择标志
bitSelectedReturn;//返回选择标志
bitSelected;//确定/返回键选择标志
bitReturnSelection;//返回键启用标志
bitAVGSpeedShow;//平均速度显示标志
bitTotalDistanceShow;//总路程显示标志
bitReturnMain;//返回主菜单标志
bitAutoDisplay;//自动显示标志
bitGoToChoosingDisplay;//人工选择标志
bitAutoMode=0;
charPassLineID=0;
charPassLine=0;
floatPrepareDistance;
floatFirstDistance;
floatSecondDistance;
floatThirdDistance;
intFirstHigh;
intSecondHigh;
intThirdHigh;
floatRate=1.25;//5ms时的速度
floatCount=4;//时间的倍数
/********************************************************************************\
**全局函数实现区**
\********************************************************************************/
/*--------------------------------主函数------------------------------------*/
voidmain()
{
P01=0;
P02=0;
P03=0;
P04=0;
P31=1;//单片机复位,背光开
Delay(40);//延时等待LCD启动
LCDInit();//初始化LCD
DisplayString(0x0,0,"Starting...");
DisplayString(0x0,1,"DesignedBy202");
Delay(300);
WriteCmd(LCD_CLS);
EA=1;//开总中断
EX0=1;//开INT0中断
IT0=1;//INTO边沿触发
EX1=1;//开INT1中断
IT1=1;//INT1边沿触发
SelectedAll=False;//开始速度选择
/*------------------------------速度选择---------------------------------*/
if(SelectedMode==Line&&AutoMode==0)
{
DisplayString(0x0,0,"NowChoosea");
DisplayString(0x0,1,"kindofSpeed");
Delay(50);
WriteCmd(LCD_CLS);
IsSelectingSpeed=True;
while
(1)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0,"NormalSpeed");
DisplayString(0x0,1,"NextYes");
Delay(300);//延时消除抖动
while
(1)
{
if(Next==True)//如果按Next键则直接跳出
break;
if(SpeedSelected==True)//如果按确定键则设置速度为Normal并跳出
{
Thx[0]=0xec;Tlx[0]=0x78;//5ms
Thx[1]=0xf0;Tlx[1]=0x60;//4ms
Thx[2]=0x8a;Tlx[2]=0xd0;//30ms
Thx[3]=0xf4;Tlx[3]=0x48;//3ms
SelectedSpeed=Normal;
break;
}//如果什么键都没有按下,那么一直显示等待
}
if(SpeedSelected==True)//按下了确定键,退出速度选择
{
IsSelectingSpeed=False;
break;
}
if(Next==True)
{
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0,"LowSpeed");
DisplayString(0x0,1,"NextYes");
Delay(300);//延时消除抖动
while
(1)
{
if(Next==True)//如果再一次按下Next键,则跳出
break;
if(SpeedSelected==True)//如果按下确定键,则设置速度为Low,并跳出
{
SelectedSpeed=Low;//这里没有速度设置,因为默认速度就是Low
break;
}
}
}
if(SpeedSelected==True)//按下了确定键,退出速度选择
{
IsSelectingSpeed=False;
break;
}
if(Next==True)
{
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0,"HighSpeed");
DisplayString(0x0,1,"NextYes");
Delay(300);//延时消除抖动
while
(1)
{
if(Next==True)//如果再一次按下Next键,则跳出