89c52的单片机自动往返电动小汽车设计报告.docx

上传人:b****6 文档编号:4770631 上传时间:2022-12-08 格式:DOCX 页数:50 大小:289.46KB
下载 相关 举报
89c52的单片机自动往返电动小汽车设计报告.docx_第1页
第1页 / 共50页
89c52的单片机自动往返电动小汽车设计报告.docx_第2页
第2页 / 共50页
89c52的单片机自动往返电动小汽车设计报告.docx_第3页
第3页 / 共50页
89c52的单片机自动往返电动小汽车设计报告.docx_第4页
第4页 / 共50页
89c52的单片机自动往返电动小汽车设计报告.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

89c52的单片机自动往返电动小汽车设计报告.docx

《89c52的单片机自动往返电动小汽车设计报告.docx》由会员分享,可在线阅读,更多相关《89c52的单片机自动往返电动小汽车设计报告.docx(50页珍藏版)》请在冰豆网上搜索。

89c52的单片机自动往返电动小汽车设计报告.docx

89c52的单片机自动往返电动小汽车设计报告

 

1.设计任务:

设计并制作了一个自动往返小汽车,其行驶路线满足所需的要求。

1.1要求:

1.1.1基本要求:

(1)分区控制:

如(图1)所示:

(图1)

车辆从起跑线出发(出发前,车体不得超出起跑线)。

在第一个路程C~D区(3~6米)以低速行驶,通过时间不低于10s;第二个路程D~E区(2米)以高速行驶,通过时间不得多于4秒;第三个路程E~F区(3~6米)以低速行驶,通过时间不低于8s。

  

(1)自动记录、显示一次往返时间(记录显示装置要求安装在车上)。

  

(2)自动记录、显示行驶距离(记录显示装置要求安装在车上)。

  (3)其它特色与创新。

2.方案设计:

LCD显示模块

测速模块

AT89S51

路面检测

控速模块

555定时器

根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图2)所示:

 

(图2)

2.1路面检测模块:

路面黑线检测模块采用反射式红外发射--接收器,在车底的前部和中部安装了两个反射式红外传感器.

2.2LCD显示模块:

采用1602LCD,由单片机的总线模式连接。

为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。

2.3测速模块:

采用采用霍尔开关元器件A44E检测轮子上的小磁铁从而给单片机中断脉冲,达到测量速度的作用。

霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。

霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。

其原理图接线如(图3)所示:

(图3)

2.4控速模块:

采用由双极性管组成的H桥电路。

用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。

这种电路由于工作在管子的饱和截止模式下,效率非常高;H桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很高,是一种广泛采用的调速技术。

其电路原理图如(图4)所示:

(图4)

3.程序框图:

单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图7)所示。

 

 

 

(图5)

 

第11条黑线

全速倒车

第10条黑线

刹车

限速模块

刹车

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键,则跳出

break;

if(SpeedSelected==True)//如果按下确定键,则设置速度为High,并跳出

{

Thx[0]=0xe0;Tlx[0]=0xc0;//8ms

Thx[1]=0xe0;Tlx[1]=0xc0;//8ms

Thx[2]=0x63;Tlx[2]=0xc0;//40ms

Thx[3]=0xec;Tlx[3]=0x78;//5ms

SelectedSpeed=High;

break;

}

}

}

if(SpeedSelected==True)//按下了确定键,退出速度选择

{

IsSelectingSpeed=False;

break;

}

if(Next==True)//再一次按下了Next键,则循环速度选择

{

Next=False;

continue;

}

}

}

SelectedAll=True;//标志模式选择和速度选择完毕

Running=True;

Delay(50);

WriteCmd(LCD_CLS);

/*-------------------------显示所选择的模式和速度方案-------------------------*/

if(SelectedMode==Line)

{

DisplayString(0x0,0,"ChoosenModeis");

DisplayString(0x0,1,"Line");

Delay(50);

WriteCmd(LCD_CLS);

}

if(SelectedMode==Curve)

{

DisplayString(0x0,0,"ChoosenModeis");

DisplayString

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1