1、89c52的单片机自动往返电动小汽车设计报告1. 设计任务:设计并制作了一个自动往返小汽车,其行驶路线满足所需的要求。1.1 要求:1.1.1 基本要求:(1)分区控制:如(图1)所示:(图1) 车辆从起跑线出发(出发前,车体不得超出起跑线)。在第一个路程CD区(36米)以低速行驶,通过时间不低于10s;第二个路程DE区(2米)以高速行驶,通过时间不得多于4秒;第三个路程EF区(36米)以低速行驶,通过时间不低于8s。 (1)自动记录、显示一次往返时间(记录显示装置要求安装在车上)。(2)自动记录、显示行驶距离(记录显示装置要求安装在车上)。(3)其它特色与创新。2. 方案设计:LCD显示模块
2、测速模块AT89S51路面检测控速模块555定时器根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图2)所示: (图2)2.1 路面检测模块: 路面黑线检测模块采用反射式红外发射-接收器,在车底的前部和中部安装了两个反射式红外传感器.2.2 LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。2.3 测速模块:采用采用霍尔开关元器件A44E检测轮子上的小磁铁从而给
3、单片机中断脉冲,达到测量速度的作用。霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。其原理图接线如(图3)所示:(图3)2.4 控速模块:采用由双极性管组成的H桥电路。用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高;H桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很高,是一种广泛采用的调速
4、技术。其电路原理图如(图4)所示:(图4)3. 程序框图:单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图7)所示。 (图5)第11条黑线全速倒车第10条黑线刹车限速模块刹车4系统的具体设计与实现:4.1 路面检测模块:路面黑线检测模块采用反射式红外发射-接收器,在车底的前部和中部安装了两个反射式红外传感器.原理图如图6. 图6 4.2 LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约电源,LCD的背光用单片机进行控制。4.3 测速模块:通过霍尔元件感应磁铁来产生脉冲(当霍尔元件在离磁场较近时输出会是高电平,其它时候是低电平),一个车轮均匀放四个小磁铁,计算一秒
5、所得的脉冲数,从而计算出一秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当前路程。4.4 控速模块:考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。4.5 复位电路模块:单片机的复位电路通过手动来实现,复位电路图如(图7)所示。(图7)4.6 脉冲产生模块:脉冲产生电路采用555定时器.原理图如图.(图8)5最小系统图: 该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如图9. (图9)6系统程序:按照预定的功能,系统实现预定的功能的程序如下所示:#includ
6、e #include /* 宏定义区 */*- LCD模块 -*/#define LCD_RW P2_6 /读写控制端#define LCD_RS P2_7 /数据命令选择端#define LCD_E P2_5 /执行使能端#define LCD_Data P1 /P1口#define Write 0x00 /低电平写入#define Read 0x01 /高电平读出#define Data 0x01 /高电平选择数据#define Cmd 0x00 /低电平选择命令#define Enable 0x00 /跃变到低电平时执行命令#define Disable 0x01 #define Tru
7、e 0x01#define False 0x00#define LCD_Init 0x38 /初始化模式 #define LCD_DispCtr 0x0C /开显示及光标设置#define LCD_CloseCtr 0x08 /关显示#define LCD_CLS 0x01 /清屏幕#define LCD_EnterSet 0x06 /显示光标 #define Busy P1_7 /忙信号/*- 测速/测距/测时模块 -*/#define CircleLength 0.132 /小车转一轮的长度为.132m/*- 控速模块 -*/#define P03 P0_3 /后电机#define P04
8、 P0_4 /后电机#define P01 P0_1 /前电机#define P02 P0_2 /前电机#define P31 P0_5 /控制液晶背光#define P33 P3_3/*- 菜单选择模块 -*/#define Normal 0x00 /0 代表正常速度#define Low 0x01 /1 代表低速#define High 0x02 /2 代表高速/* 全局函数声明区 */*- LCD模块 -*/void LCDInit(void); /LCD初始化void SetWriteCmd(void); /设置写命令模式void SetReadCmd(void); /设置读命令模式v
9、oid SetWriteData(void); /设置写数据模式void WriteCmd(char cmd); /写命令void WriteData(char ddata); /写数据void ExecuteCmd(void); /执行命令void SetXY(char x,char y); /定位显示地址void DisplaySingleChar(char x,char y,char cchar); /显示单个字符void DisplayString(char x,char y,char *str); /显示一段字符串void Delay(unsigned int time); /延时主
10、程序void DelayUs(unsigned int time); /延时子程序bit IsBusy(void); /判断忙标志函数void DisplayTime(void); /显示时间void DisplayAVGSpeed(void); /显示平均速度void DisplayDistance(void); /显示路程/*- 测速/测距/测时模块 -*/ void INTInit(void); /所有中断初始化void SpeedINT(void); /测速中断void ComputeTime(void);void ComputeSpeedANDDistance(void); /计算速
11、度和距离/*- 控速模块 -*/void CtrSpeedINT(void); /控速中断void Time0INT(void); void Time1INT(void); /控速单位时间中断void Clock0_Init(void); /时钟中断初始化void Clock1_Init(void); /时钟中断初始化void CtrSpeed(void);/* 全局变量区 */float SpeedCount = 0; /测速计数脉冲float Speed = 0.0; float Distance = 0.0; char Time1INTCount=0; /T1中断时间计时float Pa
12、ssTime=0.00; /小车行走的时间short IsT0INT=1; bit IsT1INT; /判断T1是否已经响应中断short IsT0INT2=1;char Thx5=0xf4,0xf4,0xc5,0xf4,0xff; /3ms,3ms,15ms,3mschar Tlx5=0x48,0x48,0x68,0x48,0xff; char Thx0=0xd8;char Tlx0=0xf0;char Thx1=0xb1; /20mschar Tlx1=0xe0;short Round=0;short Back=0;short Back0=0;bit Backid;bit Stop=0;c
13、har Area0=0;char Area1=0; /区域变量char LowSpeedArea1StartTime;char LowSpeedArea1EndTime;char HighSpeedAreaEndTime;char LowSpeedArea2EndTime;char LowSpeedArea1PassTime=0; /第一个低速区通过时间char HighSpeedAreaPassTime=0; /高速区通过时间char LowSpeedArea2PassTime=0; /第二个低速区通过时间char ReadyToGo=4; /倒计时char flag;bit Roundid
14、=0;char Nocurve=0; char ChangeFlag;char Mode; bit Running;bit SelectedAll; /速度是否选择完毕标志bit IsSelectingSpeed; /速度选择标志bit Next; /Next键标志bit SpeedSelected; /已经被选中的速度方案标志char SelectedSpeed; /速度选择是否完毕标志bit ChoosingDisplay; /人工选择菜单开始标志bit SelectedShow; /显示选择标志bit SelectedReturn; /返回选择标志bit Selected; /确定/返回
15、键选择标志bit ReturnSelection; /返回键启用标志bit AVGSpeedShow; /平均速度显示标志bit TotalDistanceShow; /总路程显示标志bit ReturnMain; /返回主菜单标志bit AutoDisplay; /自动显示标志bit GoToChoosingDisplay; /人工选择标志bit AutoMode=0;char PassLineID=0;char PassLine=0;float PrepareDistance;float FirstDistance;float SecondDistance;float ThirdDista
16、nce;int FirstHigh;int SecondHigh;int ThirdHigh;float Rate=1.25; /5ms时的速度float Count=4; /时间的倍数/* 全局函数实现区 */*- 主函数 -*/void main() P01=0; P02=0; P03=0; P04=0; P31=1; /单片机复位,背光开 Delay(40); /延时等待LCD启动 LCDInit(); /初始化LCD DisplayString(0x0,0, Starting. ); DisplayString(0x0,1,Designed By 202); Delay(300); W
17、riteCmd(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, Now Choose a ); DisplayString(0x0,1, kind of Speed ); Delay(50); WriteCmd(LCD_CLS); IsSelectingSpeed=True;
18、while(1) WriteCmd(LCD_CLS); DisplayString(0x0,0, Normal Speed ); DisplayString(0x0,1,Next Yes); Delay(300); /延时消除抖动 while(1) if (Next=True) /如果按Next键则直接跳出 break; if (SpeedSelected=True) /如果按确定键则设置速度为Normal并跳出 Thx0=0xec;Tlx0=0x78; /5ms Thx1=0xf0;Tlx1=0x60; /4ms Thx2=0x8a;Tlx2=0xd0; /30ms Thx3=0xf4;Tl
19、x3=0x48; /3ms SelectedSpeed=Normal; break; /如果什么键都没有按下,那么一直显示等待 if (SpeedSelected=True) /按下了确定键,退出速度选择 IsSelectingSpeed=False; break; if (Next=True) Next=False; WriteCmd(LCD_CLS); DisplayString(0x0,0, Low Speed ); DisplayString(0x0,1,Next Yes); Delay(300); /延时消除抖动 while(1) if (Next=True) /如果再一次按下Nex
20、t键,则跳出 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, High Speed ); DisplayString(0x0,1,Next Yes); Delay(300
21、); /延时消除抖动 while(1) if (Next=True) /如果再一次按下Next键,则跳出 break; if (SpeedSelected=True) /如果按下确定键,则设置速度为High,并跳出 Thx0=0xe0;Tlx0=0xc0; /8ms Thx1=0xe0;Tlx1=0xc0; /8ms Thx2=0x63;Tlx2=0xc0; /40ms Thx3=0xec;Tlx3=0x78; /5ms SelectedSpeed=High; break; if (SpeedSelected=True) /按下了确定键,退出速度选择 IsSelectingSpeed=Fals
22、e; break; if (Next=True) /再一次按下了Next键,则循环速度选择 Next=False; continue; SelectedAll=True; /标志模式选择和速度选择完毕 Running=True; Delay(50); WriteCmd(LCD_CLS); /*- 显示所选择的模式和速度方案 -*/ if (SelectedMode=Line) DisplayString(0x0,0,Choosen Mode is ); DisplayString(0x0,1, Line ); Delay(50); WriteCmd(LCD_CLS); if (SelectedMode=Curve) DisplayString(0x0,0,Choosen Mode is ); DisplayString
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1