89c52的单片机自动往返电动小汽车设计报告Word文件下载.docx
《89c52的单片机自动往返电动小汽车设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《89c52的单片机自动往返电动小汽车设计报告Word文件下载.docx(50页珍藏版)》请在冰豆网上搜索。
采用由双极性管组成的H桥电路。
用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高;
H桥电路保证了可以简单地实现转速和方向的控制;
电子开关的速度很快,稳定性也很高,是一种广泛采用的调速技术。
其电路原理图如(图4)所示:
(图4)
3.程序框图:
单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图7)所示。
(图5)
第11条黑线
全速倒车
第10条黑线
刹车
限速模块
4.系统的具体设计与实现:
4.1路面检测模块:
路面黑线检测模块采用反射式红外发射--接收器,在车底的前部和中部安装了两个反射式红外传感器.原理图如图6.
图6
4.2LCD显示模块:
为节约电源,LCD的背光用单片机进行控制。
4.3测速模块:
通过霍尔元件感应磁铁来产生脉冲(当霍尔元件在离磁场较近时输出会是高电平,其它时候是低电平),一个车轮均匀放四个小磁铁,计算一秒所得的脉冲数,从而计算出一秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当前路程。
4.4控速模块:
考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。
4.5复位电路模块:
单片机的复位电路通过手动来实现,复位电路图如(图7)所示。
(图7)
4.6脉冲产生模块:
脉冲产生电路采用555定时器.原理图如图.
(图8)
5.最小系统图:
该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如图9.
(图9)
6.系统程序:
按照预定的功能,系统实现预定的功能的程序如下所示:
#include<
intrins.h>
AT89X52.h>
/********************************************************************************\
**宏定义区**
\********************************************************************************/
/*-------------------------------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;
}//如果什么键都没有按下,那么一直显示等待
}
if(SpeedSelected==True)//按下了确定键,退出速度选择
{
IsSelectingSpeed=False;
break;
if(Next==True)
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0,"
LowSpeed"
DisplayString(0x0,1,"
Delay(300);
while
(1)
{
if(Next==True)//如果再一次按下Next键,则跳出
break;
if(SpeedSelected==True)//如果按下确定键,则设置速度为Low,并跳出
{
SelectedSpeed=Low;
//这里没有速度设置,因为默认速度就是Low
}
}
if(SpeedSelected==True)//按下了确定键,退出速度选择
HighSpeed"
//延时消除抖动
if(Next==True)//如果再一次按下Next键,则跳出
if(SpeedSelected==True)//如果按下确定键,则设置速度为High,并跳出
{
Thx[0]=0xe0;
Tlx[0]=0xc0;
//8ms
Thx[1]=0xe0;
Tlx[1]=0xc0;
Thx[2]=0x63;
Tlx[2]=0xc0;
//40ms
Thx[3]=0xec;
Tlx[3]=0x78;
//5ms
SelectedSpeed=High;
if(Next==True)//再一次按下了Next键,则循环速度选择
continue;
}
}
SelectedAll=True;
//标志模式选择和速度选择完毕
Running=True;
Delay(50);
/*-------------------------显示所选择的模式和速度方案-------------------------*/
if(SelectedMode==Line)
{
ChoosenModeis"
Line"
if(SelectedMode==Curve)
DisplayString