x循迹小车+电路+程序Word格式文档下载.docx
《x循迹小车+电路+程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《x循迹小车+电路+程序Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
7系统程序………………………………………………………………………………13
8致谢……………………………………………………………………………………46
9参考文献……………………………………………………………………………47
10附录…………………………………………………………………………………48
1.设计任务:
设计并制作了一个智能电动车,其行驶路线满足所需的要求。
1.1要求:
1.1.1基本要求:
1)分区控制:
如<
图1)所示:
图1)
车辆从起跑线出发<
出发前,车体不得超出起跑线)。
在第一个路程C~D区<
3~6M)以低速行驶,通过时间不低于10s;
第二个路程D~E区<
2M)以高速行驶,通过时间不得多于4秒;
第三个路程E~F区<
3~6M)以低速行驶,通过时间不低于10s。
p1EanqFDPw
<
2)小车能自动记录、显示行驶时间、行驶距离以及行驶速度,还能记录每段所走的时间,从而判断是否符合课程设计要求。
记录显示装置要求安装在车上)。
DXDiTa9E3d
1.1.2发挥部分:
S型控制:
图2)所示:
图2)
车辆沿着S形铁片行驶,自动转弯,自动寻找正确方向和铁片。
当离开S型铁片跑道或者感应不到铁片一段时间的时候,小车自动停止,并记录行驶时间,路程,平均速度并通过LCD显示出来。
RTCrpUDGiT
2.方案比较与选择:
根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如<
图3)所示:
5PCzVD7HxA
图3)
2.1路面检测模块:
采用铁片感应器TL-Q5MC来检测路面上的铁片从而给单片机中断脉冲。
原理图接线如<
图4)所示:
图4)
2.2LCD显示模块:
采用1602LCD,由单片机的总线模式连接。
为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;
在其它我们需要看显示的内容的时候LCD背光亮。
jLBHrnAILg
2.3测速模块:
2.3.1方案1:
采用采用霍尔开关元器件A44E检测轮子上的小磁铁从而给单片机中断脉冲,达到测量速度的作用。
霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。
霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。
xHAQX74J0X
2.3.2方案2:
采用红外传感器进行测速。
但无论是反射式红外传感器还是对射式红外传感器,他们对都对外围环境要求较高,易受外部环境的影响,稳定性不高,且价格较为昂贵。
LDAYtRyKfE
通过对方案1、方案2的比较其优缺点,综合多方面因素决定选用方案1,其原理图接线如<
图5)所示:
图5)
2.4控速模块:
2.4.1方案1:
使用功率三极管作为功率放大器的输出控制直流电机。
线性型驱动的电路结构和原理简单,成本低,加速能力强,但功率损耗大,特别是低速大转距运行时,通过电阻R的电流大,发热厉害,损耗大,对于小车的长时间运行不利。
Zzz6ZB2Ltk
2.4.2方案2:
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。
dvzfvkwMI1
2.4.3方案3:
采用由双极性管组成的H桥电路。
用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高;
H桥电路保证了可以简单地实现转速和方向的控制;
电子开关的速度很快,稳定性也很高,是一种广泛采用的调速技术。
rqyn14ZNXI
综合3种方案的优缺点,决定选择方案3,其电路原理图如<
图6)所示:
图6)
2.5模式选择模块:
模式选择模块通过一个74LS00与非门和两个不带锁按钮来控制单片机单片机的两个中断口,从而按动按钮来选择小车走动的路型、来选择小车的速度是快速、中速、慢速;
走完路程小车停止后还可以通过按钮选择想要在LCD上想看的信息,比如总时间、走过各段路程的时间、平均速度、总路程等。
EmxvxOtOco
小车走动的模式选择有:
1)直线型:
满足设计任务的基本要求,能稳定的走完全程。
之后按顺序循环不断的显示走完全程所用的时间、走完高速区所用的时间和走完低速区所用的时间这三个时间;
或者可以通过两个按钮以及LCD显示的菜单选择所要看的内容如平均速度、全程距离以及那三个时间。
SixE2yXPq5
2)S型:
满足设计任务的发挥部分的要求,小车能自动的感应到在前面或在后面铁片,即第一次转弯后若感应到的是错误的方向,则小车会后退自动调整方向,沿着S型的铁片走。
当走完S型铁片后的一定时间里,小车自动停止。
之后自动进入菜单由我们自己选择要看的内容时间、平均速度和所走的距离。
6ewMyirQFL
3)自动型:
小车先以一定的速度走完全程,之后再以一定的速度倒退回起点,再调整速度在一定的时间内走完全程。
走完后LCD显示的内容与直线型显示的内容一样。
kavU42VRUs
3.程序框图:
单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如<
图7)所示。
(图7>
4.系统的具体设计与实现:
4.1路面检测模块:
应用一个金属感应器,安装在车盘下,离地略小于或约四毫M。
当金属传感器检测到铁片时将对单片机发送中断信号,单片机运行中断,改变输给电机驱动信号的电压占空比来控制小车的速度。
y6v3ALoS89
4.2LCD显示模块:
为节约电源,LCD的背光用单片机进行控制。
4.3测速模块:
通过霍尔元件感应磁铁来产生脉冲(当霍尔元件在离磁场较近时输出会是高电平,其它时候是低电平>
,一个车轮均匀放四个小磁铁,计算一秒所得的脉冲数,从而计算出一秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当前路程。
M2ub6vSTnP
4.4控速模块:
考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。
0YujCfmUCw
4.5复位电路模块:
单片机的复位电路通过手动来实现,复位电路图如<
图8)所示。
图8)
4.6模式选择模块:
两个中断口使用和感应铁片、感应速度所使用的中断口一样,通过一个与非门和按钮控制。
原理图如<
图9)所示:
eUts8ZQVRd
图9)
5.最小系统图:
该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如<
图10)所示:
图12)
6.最终PCB板图:
该最小系统的最终PCB板图<
包括LCD接口以及其他的外部扩展电路部分,考虑到最小系统的简洁以及容易看懂,外部扩展电路不在最小系统图上显示。
)分别如<
图11)、<
图12)所示:
sQsAEJkW5T
图11)
7.系统程序:
按照预定的功能,系统实现预定的功能的程序如下所示:
#include<
intrins.h>
AT89X52.h>
/********************************************************************************\GMsIasNXkA
**宏定义区**
\********************************************************************************/TIrRGchYzg
/*-------------------------------LCD模块------------------------------------*/7EqZcWLZNX
#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//忙信号
/*--------------------------测速/测距/测时模块-------------------------------*/lzq7IGf02E
#defineCircleLength0.132//小车转一轮的长度为.132m
/*--------------------------------控速模块-----------------------------------*/zvpgeqJ1hk
#defineP03P0_3//后电机
#defineP04P0_4//后电机
#defineP01P0_1//前电机
#defineP02P0_2//前电机
#defineP31P0_5//控制液晶背光
#defineP33P3_3
/*------------------------------菜单选择模块---------------------------------*/NrpoJac3v1
#defineLine0x00//0代表直线模式
#defineCurve0x01//1代表S型模式
#defineNormal0x00//0代表正常速度
#defineLow0x01//1代表低速
#defineHigh0x02//2代表高速
/*********************************************************************************\1nowfTG4KI
**全局函数声明区**
\*********************************************************************************/fjnFLDa5Zo
/*-------------------------------LCD模块-------------------------------------*/tfnNhnE6e5
voidLCDInit(void>
。
//LCD初始化
voidSetWriteCmd(void>
//设置写命令模式
voidSetReadCmd(void>
//设置读命令模式
voidSetWriteData(void>
//设置写数据模式
voidWriteCmd(charcmd>
//写命令
voidWriteData(charddata>
//写数据
voidExecuteCmd(void>
//执行命令
voidSetXY(charx,chary>
//定位显示地址
voidDisplaySingleChar(charx,chary,charcchar>
//显示单个字符HbmVN777sL
voidDisplayString(charx,chary,char*str>
//显示一段字符串V7l4jRB8Hs
voidDelay(unsignedinttime>
//延时主程序
voidDelayUs(unsignedinttime>
//延时子程序
bitIsBusy(void>
//判断忙标志函数
voidDisplayTime(void>
//显示时间
voidDisplayAVGSpeed(void>
//显示平均速度
voidDisplayDistance(void>
//显示路程
/*--------------------------测速/测距/测时模块-------------------------------*/83lcPA59W9
voidINTInit(void>
//所有中断初始化
voidSpeedINT(void>
//测速中断
voidComputeTime(void>
voidComputeSpeedANDDistance(void>
//计算速度和距离
/*--------------------------------控速模块-----------------------------------*/mZkklkzaaP
voidCtrSpeedINT(void>
//控速中断
voidTime0INT(void>
voidTime1INT(void>
//控速单位时间中断
voidClock0_Init(void>
//时钟中断初始化
voidClock1_Init(void>
//时钟中断初始化AVktR43bpw
voidCtrSpeed(void>
/********************************************************************************\ORjBnOwcEd
**全局变量区**
\********************************************************************************/2MiJTy0dTT
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,3msgIiSpiue7A
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。
//模式和速度是否选择完毕标志
bitIsSelectingMode。
//模式选择标志
bitIsSelectingSpeed。
//速度选择标志
bitModeSelected。
//已经被选择的模式标志
charSelectedMode=10。
//模式选择是否完毕标志
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。
//时间的倍数
/********************************************************************************\uEh0U1Yfmh
**全局函数实现区**
\********************************************************************************/IAg9qLsgBX
/*--------------------------------主函数------------------------------------*/WwghWvVhPE
voidmain(>
{
P01=0。
P02=0。
P03=0。
P04=0。
P31=1。
//单片机复位,背光开
Delay(40>
//延时等待LCD启动
LCDInit(>
//初始化LCD
DisplayString(0x0,0,"
Starting..."
>
DisplayString(0x0,