1、根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图2)所示:LCD显示模块测速模块AT89S51控速模块路面检测555定时器 (图2)2.1 路面检测模块: 路面黑线检测模块采用反射式红外发射-接收器,在车底的前部和中部安装了两个反射式红外传感器.2.2 LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。2.3 测速模块:采用采用霍尔开关元器件A44E检测轮子上
2、的小磁铁从而给单片机中断脉冲,达到测量速度的作用。霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。其原理图接线如(图3)所示:(图3)2.4 控速模块:采用由双极性管组成的H桥电路。用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高;H桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很高,是一种
3、广泛采用的调速技术。其电路原理图如(图4)所示:(图4)3. 程序框图:单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图7)所示。全速行驶开始第3条黑线限速模块设定速度第4条黑线第5条黑线第6条黑线刹车停10s,交替显示路程,时间停止,交替显示往返时间,路程全速倒车第10条黑线第11条黑线第9条黑线第8条黑线 (图5)4系统的具体设计与实现:4.1 路面检测模块:路面黑线检测模块采用反射式红外发射-接收器,在车底的前部和中部安装了两个反射式红外传感器.原理图如图6. 图6 4.2 LCD显示模块:为节约电源,LCD的背光用单片机进行控制。4.3 测速模块:通过霍尔元件感应磁铁来产
4、生脉冲(当霍尔元件在离磁场较近时输出会是高电平,其它时候是低电平),一个车轮均匀放四个小磁铁,计算一秒所得的脉冲数,从而计算出一秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当前路程。4.4 控速模块:考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。4.5 复位电路模块:单片机的复位电路通过手动来实现,复位电路图如(图7)所示。(图7)4.6 脉冲产生模块:脉冲产生电路采用555定时器.原理图如图.(图8)5最小系统图: 该系统主要用到的是单片机,所以主要的部分是最小系统图,该最
5、小系统图如图9. (图9)6系统程序:按照预定的功能,系统实现预定的功能的程序如下所示:#include AT89X52.h/* 宏定义区 */*- 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 Enabl
6、e 0x00 /跃变到低电平时执行命令#define Disable 0x01 #define True 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 /小车转一轮的长
7、度为.132m/*- 控速模块 -*/#define P03 P0_3 /后电机#define P04 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 SetWrite
8、Cmd(void); /设置写命令模式void SetReadCmd(void); /设置读命令模式void 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
9、 *str); /显示一段字符串void Delay(unsigned int time); /延时主程序void DelayUs(unsigned int time); /延时子程序bit IsBusy(void); /判断忙标志函数void DisplayTime(void); /显示时间void DisplayAVGSpeed(void); /显示平均速度void DisplayDistance(void); /显示路程/*- 测速/测距/测时模块 -*/ void INTInit(void); /所有中断初始化void SpeedINT(void); /测速中断void Compute
10、Time(void);void ComputeSpeedANDDistance(void); /计算速度和距离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; cha
11、r Time1INTCount=0; /T1中断时间计时float PassTime=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;s
12、hort Back0=0;bit Backid;bit Stop=0;char Area0=0;char Area1=0; /区域变量char LowSpeedArea1StartTime;char LowSpeedArea1EndTime;char HighSpeedAreaEndTime;char LowSpeedArea2EndTime;char LowSpeedArea1PassTime=0; /第一个低速区通过时间char HighSpeedAreaPassTime=0; /高速区通过时间char LowSpeedArea2PassTime=0; /第二个低速区通过时间char Re
13、adyToGo=4; /倒计时char flag;bit Roundid=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 SelectedR
14、eturn; /返回选择标志bit Selected; /确定/返回键选择标志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;flo
15、at SecondDistance;float ThirdDistance;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,
16、1,Designed By 202 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, Now Choose a DisplayString(0x0,1, kind of Speed Delay(50); WriteCmd(LCD_CLS)
17、; IsSelectingSpeed=True; 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
18、; /30ms Thx3=0xf4;Tlx3=0x48; /3ms SelectedSpeed=Normal; /如果什么键都没有按下,那么一直显示等待 if (SpeedSelected=True) /按下了确定键,退出速度选择 IsSelectingSpeed=False; break; if (Next=True) Next=False; WriteCmd(LCD_CLS); DisplayString(0x0,0, Low Speed DisplayString(0x0,1, Delay(300); /延时消除抖动 while(1) if (Next=True) /如果再一次按下Next键,则跳出 break; if (SpeedSelected=True) /如果按下确定键,则设置速度为Low,并跳出 SelectedSpeed=Low; /这里没有速度设置,因为默认速度就是Low if (SpeedSelected=True) /按下了确定键,退出速度选择 High Speed if (Next=True) /如果再一次按下Next键,则跳出
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1