版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE8摘要(关键词:智能车AT89S52单片机金属感应器霍尔元件1602LCD)智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能电动车就是其中的一个体现。本次设计的简易智能电动车,采用AT89S52单片机作为小车的检测和控制核心;采用金属感应器TL—Q5MC来检测路上感应到的铁片,从而把反馈到的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,并且单片机选择的工作模式不同也可控制小车顺着S形铁片行驶;采用霍尔元件A44E检测小车行驶速度;采用1602LCD实时显示小车行驶的时间,小车停止行驶后,轮流显示小车行驶时间、行驶距离、平均速度以及各速度区行驶的时间。本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。目录1设计任务………………31。1要求………………32方案比较与选择………………………42。1路面检测模块……………………42.2LCD显示模块………………………52.3测速模块…………52.4控速模块…………62.5模式选择模块……………………73程序框图………………74系统的具体设计与实现………………94。1路面检测模块……………………94.2LCD显示模块………………………94.3测速模块…………94.4控速模块…………94。5复位电路模块……………………94.6模式选择模块……………………95最小系统图……………106最终PCB板图…………127系统程序………………138致谢……………………469参考文献……………4710附录…………………481.设计任务:设计并制作了一个智能电动车,其行驶路线满足所需的要求。1.1要求:1。1.1基本要求:(1)分区控制:如(图1)所示:(图1)车辆从起跑线出发(出发前,车体不得超出起跑线)。在第一个路程C~D区(3~6米)以低速行驶,通过时间不低于10s;第二个路程D~E区(2米)以高速行驶,通过时间不得多于4秒;第三个路程E~F区(3~6米)以低速行驶,通过时间不低于10s。(2)小车能自动记录、显示行驶时间、行驶距离以及行驶速度,还能记录每段所走的时间,从而判断是否符合课程设计要求。(记录显示装置要求安装在车上).1.1.2发挥部分:S型控制:如(图2)所示:(图2)车辆沿着S形铁片行驶,自动转弯,自动寻找正确方向和铁片.当离开S型铁片跑道或者感应不到铁片一段时间的时候,小车自动停止,并记录行驶时间,路程,平均速度并通过LCD显示出来。2。方案比较与选择:根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图3)所示:(图3)2.1路面检测模块:采用铁片感应器TL-Q5MC来检测路面上的铁片从而给单片机中断脉冲。原理图接线如(图4)所示:(图4)2。2LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。2.3测速模块:2。3。1方案1:采用采用霍尔开关元器件A44E检测轮子上的小磁铁从而给单片机中断脉冲,达到测量速度的作用.霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便.霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。2。3.2方案2:采用红外传感器进行测速.但无论是反射式红外传感器还是对射式红外传感器,他们对都对外围环境要求较高,易受外部环境的影响,稳定性不高,且价格较为昂贵。通过对方案1、方案2的比较其优缺点,综合多方面因素决定选用方案1,其原理图接线如(图5)所示:(图5)2。4控速模块:2.4.1方案1:使用功率三极管作为功率放大器的输出控制直流电机。线性型驱动的电路结构和原理简单,成本低,加速能力强,但功率损耗大,特别是低速大转距运行时,通过电阻R的电流大,发热厉害,损耗大,对于小车的长时间运行不利。2.4。2方案2:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。2。4.3方案3:采用由双极性管组成的H桥电路。用单片机控制晶体管使之工作在占空比可调的开关状态,精确调整电机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高;H桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很高,是一种广泛采用的调速技术。综合3种方案的优缺点,决定选择方案3,其电路原理图如(图6)所示:(图6)2.5模式选择模块:模式选择模块通过一个74LS00与非门和两个不带锁按钮来控制单片机单片机的两个中断口,从而按动按钮来选择小车走动的路型、来选择小车的速度是快速、中速、慢速;走完路程小车停止后还可以通过按钮选择想要在LCD上想看的信息,比如总时间、走过各段路程的时间、平均速度、总路程等.小车走动的模式选择有:(1)直线型:满足设计任务的基本要求,能稳定的走完全程。之后按顺序循环不断的显示走完全程所用的时间、走完高速区所用的时间和走完低速区所用的时间这三个时间;或者可以通过两个按钮以及LCD显示的菜单选择所要看的内容如平均速度、全程距离以及那三个时间。(2)S型:满足设计任务的发挥部分的要求,小车能自动的感应到在前面或在后面铁片,即第一次转弯后若感应到的是错误的方向,则小车会后退自动调整方向,沿着S型的铁片走。当走完S型铁片后的一定时间里,小车自动停止。之后自动进入菜单由我们自己选择要看的内容时间、平均速度和所走的距离。(3)自动型:小车先以一定的速度走完全程,之后再以一定的速度倒退回起点,再调整速度在一定的时间内走完全程。走完后LCD显示的内容与直线型显示的内容一样。3。程序框图:单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图7)所示。(图7)4.系统的具体设计与实现:4.1路面检测模块:应用一个金属感应器,安装在车盘下,离地略小于或约四毫米。当金属传感器检测到铁片时将对单片机发送中断信号,单片机运行中断,改变输给电机驱动信号的电压占空比来控制小车的速度.4.2LCD显示模块:采用1602LCD,由单片机的总线模式连接。为节约电源,LCD的背光用单片机进行控制.4.3测速模块:通过霍尔元件感应磁铁来产生脉冲(当霍尔元件在离磁场较近时输出会是高电平,其它时候是低电平),一个车轮均匀放四个小磁铁,计算一秒所得的脉冲数,从而计算出一秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当前路程.4。4控速模块:考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。4.5复位电路模块:单片机的复位电路通过手动来实现,复位电路图如(图8)所示。(图8)4。6模式选择模块:两个中断口使用和感应铁片、感应速度所使用的中断口一样,通过一个与非门和按钮控制.原理图如(图9)所示:(图9)5.最小系统图:该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如(图10)所示:(图12)6.最终PCB板图:该最小系统的最终PCB板图(包括LCD接口以及其他的外部扩展电路部分,考虑到最小系统的简洁以及容易看懂,外部扩展电路不在最小系统图上显示。)分别如(图11)、(图12)所示:(图11)(图12)7.系统程序:按照预定的功能,系统实现预定的功能的程序如下所示:#include〈intrins.h〉ﻩ ﻩﻩﻩ#include<AT89X52.h>/********************************************************************************\**ﻩﻩﻩ宏定义区ﻩﻩﻩﻩﻩﻩ ﻩﻩ**\********************************************************************************//*-————-------—------—--—-—LCD模块———----—----—--——----———--———-—----—*/#defineLCD_RWﻩﻩﻩP2_6ﻩﻩﻩ //读写控制端#defineLCD_RSﻩﻩﻩP2_7ﻩ ﻩﻩﻩ//数据命令选择端#defineLCD_E ﻩP2_5ﻩﻩ ﻩ //执行使能端#defineLCD_DataﻩﻩﻩP1ﻩﻩﻩﻩﻩ//P1口#defineWriteﻩﻩﻩ 0x00ﻩﻩﻩﻩ //低电平写入#defineReadﻩ ﻩ 0x01ﻩﻩﻩﻩﻩ//高电平读出#defineData ﻩﻩ0x01 ﻩﻩﻩ//高电平选择数据#defineCmd ﻩ0x00ﻩﻩﻩ //低电平选择命令#defineEnableﻩ ﻩ0x00ﻩﻩﻩﻩﻩ//跃变到低电平时执行命令#defineDisableﻩﻩ 0x01#defineTrue ﻩ 0x01#defineFalseﻩ ﻩﻩ0x00#defineLCD_Initﻩﻩﻩ0x38ﻩﻩﻩﻩﻩ//初始化模式ﻩﻩﻩﻩﻩ ﻩ#defineLCD_DispCtrﻩﻩ0x0Cﻩ ﻩﻩ //开显示及光标设置#defineLCD_CloseCtrﻩﻩ0x08ﻩ ﻩﻩﻩ//关显示#defineLCD_CLS ﻩ0x01ﻩﻩﻩ ﻩ//清屏幕#defineLCD_EnterSetﻩﻩ0x06ﻩﻩﻩ ﻩ//显示光标#defineBusy ﻩﻩP1_7ﻩﻩﻩﻩ //忙信号/*--———---------——-----——---测速/测距/测时模块--—--—-—--——-—--——--——-—-—-—-—-*/#defineCircleLengthﻩﻩ0.132 ﻩ //小车转一轮的长度为.132m/*-—------—-—----—-—-—-—---————控速模块——-—-——----———------—--——-—--——-*/#defineP03ﻩﻩﻩﻩP0_3ﻩﻩﻩﻩﻩ//后电机#defineP04ﻩﻩ ﻩP0_4ﻩﻩﻩﻩﻩ//后电机#defineP01ﻩﻩ P0_1ﻩﻩ ﻩﻩ//前电机#defineP02 ﻩ P0_2ﻩﻩ ﻩ//前电机#defineP31 ﻩﻩﻩP0_5ﻩﻩﻩ//控制液晶背光#defineP33 ﻩ ﻩP3_3/*------———-—--—-——---————-----—菜单选择模块ﻩ-----———--—-——------—-—-——*/#defineLine ﻩﻩﻩ0x00 ﻩ ﻩﻩ//0代表直线模式#defineCurveﻩﻩﻩﻩ0x01 ﻩ ﻩﻩ//1代表S型模式#defineNormalﻩﻩﻩ0x00ﻩﻩ //0代表正常速度#defineLow ﻩ ﻩ0x01ﻩ ﻩﻩ//1代表低速#defineHighﻩﻩﻩ 0x02ﻩﻩﻩ ﻩ//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; ﻩﻩﻩ bit IsT1INT;ﻩ ﻩﻩ ﻩﻩﻩﻩ//判断T1是否已经响应中断shortIsT0INT2=1;charThx[5]={0xf4,0xf4,0xc5,0xf4,0xff};ﻩﻩ ﻩ//3ms,3ms,15ms,3mscharTlx[5]={0x48,0x48,0x68,0x48,0xff};ﻩﻩ charThx0=0xd8;charTlx0=0xf0;charThx1=0xb1;ﻩﻩﻩﻩ ﻩﻩﻩﻩ//20mscharTlx1=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;ﻩﻩﻩﻩﻩﻩﻩﻩ//模式和速度是否选择完毕标志bitﻩIsSelectingMode;ﻩﻩﻩﻩﻩﻩﻩﻩ//模式选择标志bitﻩIsSelectingSpeed;ﻩﻩﻩﻩﻩ ﻩ//速度选择标志bitModeSelected; ﻩﻩﻩ ﻩ //已经被选择的模式标志charSelectedMode=10;ﻩﻩﻩﻩﻩ //模式选择是否完毕标志bitNext;ﻩﻩﻩ ﻩﻩﻩﻩﻩﻩ//Next键标志bitSpeedSelected;ﻩﻩﻩﻩﻩ ﻩ //已经被选中的速度方案标志charSelectedSpeed;ﻩﻩﻩ ﻩﻩﻩ//速度选择是否完毕标志bitChoosingDisplay;ﻩﻩﻩﻩﻩﻩﻩ //人工选择菜单开始标志bitSelectedShow;ﻩ ﻩﻩﻩﻩﻩ //显示选择标志bitﻩSelectedReturn;ﻩﻩﻩﻩﻩﻩﻩﻩ//返回选择标志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; ﻩﻩ ﻩﻩﻩ //开始模式和速度选择ﻩﻩ/*-—---—--—-———-—----—---—--—模式选择-—-----——---——----——-—------*/ﻩDisplayString(0x0,0,"ChooseTheMode"); DisplayString(0x0,1,”youwant.");ﻩDelay(50);ﻩWriteCmd(LCD_CLS);ﻩﻩIsSelectingMode=True;ﻩwhile(1) {ﻩ ﻩﻩﻩ ﻩ ﻩﻩﻩﻩWriteCmd(LCD_CLS);ﻩﻩDisplayString(0x0,0,”LineMode”);ﻩﻩDisplayString(0x0,1,"NextYes");ﻩﻩDelay(300);ﻩ ﻩﻩ ﻩﻩﻩ//延时消除抖动ﻩﻩwhile(1)ﻩ ﻩﻩﻩﻩﻩﻩ//不断检测中断,直到按确定键或是NEXT键ﻩﻩ{ﻩﻩﻩif(Next==True)ﻩﻩﻩﻩ ﻩ//如果按Next键则直接跳出ﻩﻩﻩﻩbreak;ﻩﻩﻩif(ModeSelected==True)ﻩﻩ ﻩﻩ//如果按确定键则设置模式为Line并跳出ﻩﻩﻩ{ ﻩﻩﻩﻩSelectedMode=Line;ﻩ ﻩﻩbreak;ﻩﻩ } ﻩﻩﻩﻩﻩﻩ ﻩ//如果什么键都没有按下,那么一直显示等待ﻩﻩ}ﻩ if(ModeSelected==True)ﻩﻩﻩﻩﻩﻩ//按下了确定键,退出模式选择ﻩ ﻩ{ ﻩﻩIsSelectingMode=False; ﻩﻩbreak;ﻩﻩ} if(Next==True)ﻩ ﻩﻩﻩ//按下了Next键,显示下一个菜单项ﻩﻩ{ ﻩ Next=False;ﻩ ﻩWriteCmd(LCD_CLS);ﻩﻩﻩDisplayString(0x0,0,"CurveMode");ﻩﻩﻩDisplayString(0x0,1,”NextYes");ﻩﻩﻩﻩﻩﻩ ﻩﻩDelay(300);ﻩﻩﻩﻩﻩﻩﻩ//延时消除抖动ﻩ ﻩwhile(1)ﻩﻩﻩﻩﻩﻩ //不断检测中断,直到按确定键或是Next键ﻩﻩ{ﻩﻩ ﻩif(Next==True)ﻩ ﻩﻩﻩ//如果再一次按下Next键,则跳出ﻩﻩﻩ ﻩbreak;ﻩﻩ ﻩif(ModeSelected==True)ﻩ ﻩ//如果按下确定键,则设置模式为Curve,并跳出 ﻩﻩﻩ{ﻩﻩﻩﻩ SelectedMode=Curve;ﻩﻩﻩﻩﻩbreak;ﻩ ﻩ}ﻩ ﻩ}ﻩﻩ} ﻩﻩif(ModeSelected==True)ﻩﻩ ﻩﻩ//按下了确定键,退出模式选择 { ﻩﻩIsSelectingMode=False;ﻩﻩﻩbreak;ﻩﻩ}ﻩﻩif(Next==True)ﻩﻩ ﻩ //再一次按下了Next键,则循环模式选择ﻩ {ﻩﻩﻩNext=False;ﻩﻩﻩWriteCmd(LCD_CLS);ﻩﻩﻩDisplayString(0x0,0,"AutoMode");ﻩ ﻩDisplayString(0x0,1,"NextYes");ﻩﻩ Delay(300); ﻩ //延时消除抖动ﻩ ﻩwhile(1)ﻩﻩ {ﻩﻩﻩﻩif(Next==True) ﻩﻩ ﻩbreak; ﻩ if(ModeSelected==True)ﻩ ﻩﻩ{ﻩﻩﻩﻩﻩAutoMode=1;ﻩ ﻩﻩﻩbreak;ﻩﻩ ﻩﻩ}ﻩﻩﻩ}ﻩﻩ}ﻩ if(ModeSelected==True)ﻩﻩ{ ﻩIsSelectingMode=False; ﻩ break;ﻩﻩ}ﻩﻩif(Next==True) ﻩ{ﻩﻩﻩNext=False;ﻩﻩﻩcontinue; ﻩ}ﻩ}ﻩ Delay(50);ﻩWriteCmd(LCD_CLS);ﻩﻩ/*-——-——-—-—---------———--—-速度选择--—----------—-—-------—-----—-—-*/ 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(0x0,1,"Curve”);ﻩ Delay(50);ﻩﻩWriteCmd(LCD_CLS);ﻩ} if(AutoMode==1)ﻩ{ﻩﻩDisplayString(0x0,0,"ChoosenModeis”);ﻩﻩDisplayString(0x0,1,"AutoMode");ﻩﻩDelay(50); ﻩWriteCmd(LCD_CLS);ﻩ} ﻩﻩﻩif(SelectedMode==Line)ﻩ{ﻩ if(SelectedSpeed==Normal) ﻩ{ ﻩ DisplayString(0x0,0,"ChoosenSpeedis”); ﻩﻩDisplayString(0x0,1,"Normal");ﻩ Delay(50); ﻩﻩWriteCmd(LCD_CLS);ﻩ }ﻩﻩﻩif(SelectedSpeed==Low) ﻩ{ﻩﻩﻩDisplayString(0x0,0,”ChoosenSpeedis");ﻩﻩ DisplayString(0x0,1,”Low"); ﻩ Delay(50);ﻩ ﻩWriteCmd(LCD_CLS);ﻩ }ﻩ ﻩif(SelectedSpeed==High)ﻩﻩ{ ﻩﻩDisplayString(0x0,0,”ChoosenSpeedis");ﻩﻩ DisplayString(0x0,1,"High"); ﻩﻩDelay(50);ﻩ ﻩWriteCmd(LCD_CLS);ﻩ }ﻩ}ﻩINTInit();ﻩﻩﻩﻩﻩﻩﻩﻩﻩﻩ //初始化所有中断ﻩDisplayString(0x0,0,"LeftTimesToGo");ﻩwhile(ReadyToGo--){ﻩ DisplaySingleChar(0x7,1,ReadyToGo+0x30);ﻩﻩDisplaySingleChar(0x09,1,'s');ﻩﻩDelay(300); ﻩﻩ}ﻩWriteCmd(LCD_CLS); DisplayString(0x05,0,"Go!!!”);ﻩDelay(100);ﻩWriteCmd(LCD_CLS);ﻩDisplayString(0x0,0,"Living..."); DisplayString(0x0,1,"Designedby202");ﻩ if(SelectedMode==Line&&AutoMode==0)ﻩ flag=Area0; else flag=1;ﻩ while(flag〈5) {ﻩﻩif(AutoMode==1)ﻩﻩﻩﻩﻩﻩﻩﻩ //自动模式ﻩ{ﻩﻩﻩswitch(PassLineID)ﻩ {ﻩﻩﻩcase0:{ ﻩﻩﻩﻩ ﻩif(IsT0INT==1)ﻩ ﻩﻩﻩﻩﻩ{P01=P02=P04=0;P03=1;} ﻩ ﻩﻩ else ﻩﻩﻩ ﻩ {P01=P02=P03=P04=0;} ﻩ ﻩ}break;ﻩﻩﻩcase1:{ﻩ ﻩP01=P02=P03=0;P04=1;ﻩﻩﻩ}break;ﻩﻩﻩcase2:{ﻩﻩﻩﻩ P01=P02=P04=0;P03=1;ﻩﻩﻩﻩ}break; ﻩﻩdefault:break;ﻩﻩ}ﻩ }ﻩelse {ﻩﻩ ﻩ if(SelectedMode==Line)ﻩﻩﻩﻩﻩﻩ//直线模式ﻩﻩ{ ﻩﻩﻩflag=Area0;ﻩﻩﻩﻩif(IsT0INT==1) ﻩﻩ ﻩ{P03=1;P04=0;P01=P02=0;}ﻩﻩelseﻩﻩﻩ {P03=0;P04=0;P01=P02=0;}ﻩ }ﻩﻩﻩelseﻩﻩﻩﻩﻩﻩ ﻩﻩ {ﻩﻩﻩﻩﻩﻩﻩ ﻩ //S型模式ﻩﻩﻩif((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0)ﻩﻩﻩ{ﻩﻩﻩ if(Backid==1) ﻩﻩﻩﻩ{P01=1;P02=0;P03=0;P04=1;} ﻩﻩﻩelseﻩﻩﻩ ﻩ{P01=0;P02=1;P03=0;P04=1;}ﻩ ﻩﻩBack=1; ﻩ}ﻩﻩﻩ ﻩelse ﻩﻩ{ﻩﻩ ﻩﻩif(Round==0)ﻩ ﻩ{ﻩﻩﻩﻩ ﻩif(IsT0INT2==1) ﻩﻩﻩﻩﻩ{P01=0;P02=0;P03=1;P04=0;}ﻩﻩﻩﻩﻩelse ﻩ ﻩﻩﻩ{P01=0;P02=0;P03=0;P04=0;}ﻩﻩﻩﻩ}ﻩﻩﻩ elseﻩﻩﻩ {ﻩﻩﻩﻩﻩ if(P33==0) ﻩ ﻩﻩﻩ{ ﻩﻩﻩﻩﻩ if(IsT0INT2==1)ﻩﻩﻩﻩﻩﻩﻩ ﻩ{P01=0;P02=0;P03=1;P04=0;}ﻩﻩﻩﻩﻩﻩﻩﻩelseﻩ ﻩﻩ ﻩ ﻩ{P01=0;P02=0;P03=0;P04=0;}ﻩﻩ ﻩﻩ}ﻩﻩﻩﻩﻩelseﻩ{ ﻩﻩﻩEX1=1; ﻩﻩ ﻩﻩﻩif(Round%2) ﻩﻩﻩ{ﻩ ﻩﻩﻩﻩﻩ if(IsT0INT2==1) ﻩﻩﻩ ﻩﻩ{P01=1;P02=0;P03=1;P04=0;Backid=1;}ﻩﻩﻩﻩﻩ elseﻩﻩﻩﻩﻩﻩﻩ{P01=1;P02=0;P03=0;P04=0;} ﻩ ﻩﻩﻩﻩﻩ}ﻩﻩ ﻩﻩelseﻩﻩﻩﻩ ﻩ {ﻩ ﻩﻩ ﻩﻩﻩ if(IsT0INT2==1) ﻩﻩﻩ{P01=0;P02=1;P03=1;P04=0;Backid=0;}ﻩﻩﻩ ﻩ ﻩﻩﻩelseﻩ ﻩﻩﻩﻩﻩﻩ{P01=0;P02=1;P03=0;P04=0;} ﻩﻩﻩﻩ }ﻩﻩﻩ }ﻩﻩﻩﻩﻩ}ﻩﻩ} ﻩ}ﻩﻩﻩ ﻩ} ﻩﻩif(IsT1INT==1)ﻩﻩ{ﻩﻩ IsT1INT=0;ﻩﻩﻩComputeTime();ﻩﻩﻩComputeSpeedANDDistance();ﻩﻩ}ﻩ}ﻩﻩ//补中断路程,加上最后一次中断缺失的路程ﻩComputeSpeedANDDistance();ﻩP04=1;P03=0;P01=P02=0;Delay(90);ﻩP03=0;P04=0; ﻩﻩﻩﻩﻩ ﻩﻩﻩ//行程结束,小车停止ﻩP31=1;ﻩﻩ ﻩ ﻩﻩﻩﻩﻩ //行程结束,背光开ﻩET0=0x0;ﻩﻩﻩﻩﻩ ﻩﻩ//关T0中断 ET1=0x0;ﻩﻩﻩﻩ ﻩﻩﻩ ﻩ//关T1中断ﻩEX1=0x01; ﻩﻩﻩﻩﻩﻩ ﻩﻩ //开INT1中断ﻩRunning=False; ﻩAutoDisplay=True; ﻩﻩ //默认情况下直线模式会自动显示各个区域经过的时间ﻩWriteCmd(LCD_CLS); ﻩif(SelectedMode==Line)ﻩ ﻩﻩﻩ ﻩ//直线模式才显示 {ﻩﻩwhile(1) {ﻩﻩﻩif(GoToChoosingDisplay==True)ﻩﻩﻩﻩbreak;ﻩﻩﻩDelay(200);ﻩﻩﻩWriteCmd(LCD_CLS);ﻩﻩﻩDelay(200); ﻩ DisplayString(0,0,”LowSpeedArea1”); ﻩ DisplayString(0,1,”Costed"); ﻩ DisplaySingleChar(0x0C,1,'s’); ﻩLowSpeedArea1PassTime=LowSpeedArea1EndTime—LowSpeedArea1StartTime; ﻩﻩDisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);ﻩﻩ if(LowSpeedArea1PassTime>9)ﻩﻩ//通过第一个低速区的时间超过sﻩﻩﻩﻩDisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);ﻩﻩﻩ ﻩﻩﻩif(GoToChoosingDisplay==True)ﻩﻩﻩﻩbreak;ﻩﻩ Delay(200);ﻩﻩﻩWriteCmd(LCD_CLS);ﻩﻩ Delay(200); ﻩDisplayString(0,0,"HighSpeedArea");ﻩﻩ DisplayString(0,1,"Costed");ﻩﻩﻩDisplaySingleChar(0x0C,1,'s’); ﻩﻩHighSpeedAreaPassTime=HighSpeedAreaEndTime—LowSpeedArea1EndTime; ﻩﻩDisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);ﻩ ﻩif(HighSpeedAreaPassTime〉9) ﻩﻩ//通过高速区的时间超过sﻩ ﻩ DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);ﻩﻩ ﻩif(GoToChoosingDisplay==True)ﻩ break;ﻩ ﻩDelay(200);ﻩ WriteCmd(LCD_CLS); ﻩDelay(200); ﻩﻩDisplayString(0,0,"LowSpeedArea2”); ﻩﻩDisplayString(0,1,"Costed");ﻩﻩﻩDisplaySingleChar(0x0C,1,’s’);ﻩﻩﻩLowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime; ﻩﻩDisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30); ﻩif(LowSpeedArea2PassTime>9)ﻩﻩﻩ//通过第二个低速区的时间超过s ﻩﻩDisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);ﻩﻩﻩ}ﻩ} AutoDisplay=False;ﻩ/*—----——---菜单选择你想要看的内容-—总时间、总路程以及平均速度——-——------——-*/ﻩChoosingDisplay=True; ﻩﻩ ﻩﻩ ﻩ WriteCmd(LCD_CLS);ﻩ/*首先显示主菜单,然后显示第一个选项*/ﻩDisplayString(0x0,0,"NowChoosewhat");ﻩDisplayString(0x0,1,”youwanttosee");ﻩDelay(100);ﻩwhile(1)ﻩ{ ﻩﻩWriteCmd(LCD_CLS);ﻩ DisplayString(0x0,0,”CostedTime");ﻩ DisplayString(0x0,1,"NextShow"); ﻩDelay(250);ﻩﻩﻩﻩﻩﻩﻩ ﻩﻩ//延时消除抖动/*—---------—-—--—-——-----—--—-----第一次按键-—---———-—----——-—----——--—-——---——--—*/ﻩﻩﻩ /*不断检测确定键和Next键*/ﻩﻩwhile(1)ﻩﻩ{ﻩﻩﻩif(Next==True)ﻩﻩﻩ break;ﻩﻩﻩif(SelectedShow==True) ﻩ ﻩbreak;ﻩ } ﻩ/*按下了确定键,显示第一个选项的内容*/ﻩﻩif(SelectedShow==True)ﻩﻩﻩ{ﻩﻩﻩSelectedShow=False; ﻩ SelectedReturn=False;ﻩﻩﻩSelected=False;ﻩ ﻩWriteCmd(LCD_CLS);ﻩﻩﻩDisplayString(0,0,”CostedTimeis");ﻩﻩﻩ ﻩﻩ DisplayTime();ﻩﻩﻩDisplayString(0x0A,1,"s");ﻩﻩﻩReturnSelection=True;ﻩ ﻩ//按下了确定键,那么这个时候开启返回键的功能 ﻩﻩAVGSpeedShow=False;ﻩﻩﻩ Delay(250);ﻩ ﻩﻩﻩ //延时消除抖动ﻩﻩ}ﻩ /**按下了Next键,则显示第二个选项*/ ﻩif(Next==True)ﻩ ﻩﻩ ﻩ//按下Next键,显示AVGSpeed菜单项ﻩﻩ{ﻩﻩ Next=False;ﻩﻩﻩWriteCmd(LCD_CLS);ﻩﻩﻩDisplayString(0x0,0,”AVGSpeed");ﻩ ﻩDisplayString(0x0,1,"NextShow");ﻩ ﻩﻩ ﻩﻩReturnMain=False;ﻩﻩﻩReturnSelection=False;ﻩﻩﻩ//按下了Next键,那么这个时候关闭返回键的功能ﻩﻩﻩAVGSpeedShow=True; ﻩﻩﻩﻩ//表明AVGSpeed选项已经显示过了 ﻩDelay(250);ﻩﻩﻩﻩﻩ //延时消除抖动ﻩﻩ}ﻩ/*—----—-—--—---—---—-—---—--—第二次按键————--——-------—-—--—---———-—-—---—*/ﻩﻩ/*显示第一个选项的内容后又不断检测返回键(确定键)和Next键*/ﻩﻩwhile(1)ﻩﻩ{ ﻩif(Next==True)ﻩﻩ ﻩbreak; ﻩif(Selected==True) ﻩ ﻩbreak;ﻩ }ﻩﻩﻩﻩﻩﻩif(Next==True)ﻩ ﻩﻩ{ﻩﻩﻩNext=False;ﻩﻩﻩReturnMain=False;ﻩ ﻩReturnSelection=False;ﻩ //按下了Next键,那么这个时候关闭返回键的功能 ﻩﻩﻩif(AVGSpeedShow==False) //还没有显示AVGSpeed选项,显示它ﻩﻩﻩ{ﻩﻩﻩ ﻩﻩ //即第一次选择了确定键ﻩﻩﻩﻩWriteCmd(LCD_CLS);ﻩﻩ ﻩDisplayString(0x0,0,"AVGSpeed"); ﻩﻩﻩDisplayString(0x0,1,"NextShow”);ﻩﻩﻩﻩTotalDistanceShow=False;ﻩ//显示了AVGSpeed,则表明TotalDistance还没有显示ﻩ ﻩﻩﻩﻩﻩﻩDelay(250);ﻩ ﻩﻩ//延时消除抖动ﻩﻩﻩ ﻩﻩ ﻩﻩﻩﻩ }ﻩﻩﻩﻩif(AVGSpeedShow==True) ﻩﻩ//已经显示过AVGSpeed选项了,则显示下一个选项 ﻩﻩ{ﻩﻩﻩﻩﻩﻩﻩ//即第一次选择了Next键ﻩﻩﻩ WriteCmd(LCD_CLS);ﻩ ﻩﻩDisplayString(0x0,0,"TotalDistance");ﻩﻩﻩ DisplayString(0x0,1,"NextShow");ﻩﻩﻩﻩTotalDistanceShow=True;ﻩﻩﻩﻩ//表明显示了TotalDistance选项ﻩ ﻩﻩﻩDelay(250); ﻩ ﻩﻩﻩ//延时消除抖动ﻩﻩﻩ}ﻩﻩ}ﻩﻩ if(Selected==True) ﻩﻩ ﻩ//按下了确定键或返回键 ﻩ{ﻩﻩ SelectedShow=False;ﻩﻩﻩSelectedReturn=False;ﻩ ﻩSelected=False;ﻩﻩﻩif(ReturnSelection==True)//第一次选择了确定键,故这次按下的是返回键 ﻩﻩﻩReturnMain=True;ﻩﻩ if(ReturnSelection==False)ﻩﻩﻩ{ﻩﻩﻩ WriteCmd(LCD_CLS); ﻩﻩ DisplayString(0,0,”TheAVGSpeedis");ﻩﻩ ﻩﻩﻩ ﻩﻩDisplayAVGSpeed();ﻩﻩﻩﻩDisplayString(0x0A,1,"m/s”); ﻩﻩﻩReturnSelection=True; ﻩ //按下了确定键,那么这个时候开启返回键的功能ﻩ ﻩﻩﻩ ﻩﻩDelay(250);ﻩﻩ ﻩ//延时消除抖动ﻩﻩ ﻩ ﻩﻩ} ﻩﻩTotalDistanceShow=False; ﻩﻩ ﻩﻩﻩ}ﻩﻩif(ReturnMain==True) ﻩﻩ ﻩ//按下了返回键,返回主菜单 {ﻩﻩﻩReturnMain=False;ﻩﻩﻩcontinue; ﻩ}ﻩ ﻩ ﻩﻩﻩ/*--—-—--—--——-—-——-----—------—-———--第三次按键-—-——--—-——--———------——------—---—---*/ﻩﻩ/*如果没有返回主菜单,则继续检测Next键和确定键*/ﻩﻩwhile(1) {ﻩﻩ ﻩ if(Next==True)ﻩﻩ ﻩbreak;ﻩﻩﻩif(SelectedShow==True) ﻩ ﻩbreak;ﻩﻩ} ﻩﻩﻩ/*按下Next键,显示下一个选项*/ ﻩif(Next==True) ﻩ{ﻩﻩﻩNext=False; ﻩﻩReturnMain=False;ﻩﻩﻩReturnSelection=False;ﻩ //按下了Next键,那么这个时候关闭返回键的功能ﻩﻩ ﻩif(TotalDistanceShow==True)ﻩﻩﻩﻩReturnMain=True;ﻩ ﻩif(TotalDistanceShow==False)ﻩﻩ//还没有显示TotalDistance选项,显示它ﻩﻩﻩ{ﻩ ﻩﻩﻩﻩﻩﻩ ﻩﻩﻩWriteCmd(LCD_CLS); ﻩﻩﻩDisplayString(0x0,0,"TotalDistance”);ﻩﻩﻩ DisplayString(0x0,1,"NextShow");ﻩ ﻩﻩTotalDistanceShow=True;ﻩﻩﻩ ﻩ ﻩﻩﻩﻩﻩﻩ Delay(250);ﻩﻩﻩ ﻩﻩ//延时消除抖动 ﻩﻩﻩﻩﻩﻩ ﻩ}ﻩﻩﻩ}ﻩﻩif(Selected==True) ﻩﻩ ﻩ //按下了确定键或返回键ﻩ {ﻩﻩ SelectedShow=False;ﻩﻩﻩSelectedReturn=False; ﻩﻩSelected=False; ﻩ if(ReturnSelection==True) ﻩ//按下的是返回键ﻩ ﻩﻩReturnMain=True; ﻩﻩif(ReturnSelection==False)ﻩ ﻩﻩﻩﻩ{ ﻩﻩﻩif(TotalDistanceShow==False)ﻩﻩ//表明AVGSpeed选项的内容还没有显示 ﻩﻩ {ﻩﻩﻩﻩﻩWriteCmd(LCD_CLS); ﻩﻩ ﻩDisplayString(0,0,”TheAVGSpeedis”);ﻩﻩﻩﻩﻩﻩﻩ ﻩ DisplayAVGSpeed();ﻩ ﻩﻩﻩDisplayString(0x0A,1,”m/s");ﻩﻩﻩﻩﻩReturnSelection=True;ﻩﻩﻩﻩﻩ Delay(250); ﻩﻩﻩﻩ//延时消除抖动ﻩﻩ ﻩ}ﻩ ﻩﻩif(TotalDistanceShow==True) ﻩﻩﻩ{ﻩ ﻩ ﻩWriteCmd(LCD_CLS);ﻩﻩﻩ ﻩDisplayString(0,0,"TotalDistance”);ﻩﻩ ﻩﻩDisplayDistance();ﻩ ﻩﻩ DisplayString(0x0A,1,"m");ﻩﻩﻩ ﻩReturnSelection=True;ﻩﻩ//按下了确定键,那么这个时候开启返回键的功能 ﻩ ﻩDelay(250);ﻩﻩﻩ ﻩ//延时消除抖动 ﻩﻩﻩ}ﻩﻩﻩ}ﻩﻩ}ﻩ if(ReturnMain==True) ﻩﻩﻩﻩ//按下了返回键,返回主菜单ﻩﻩ{ﻩﻩﻩReturnMain=False;ﻩﻩﻩcontinue;ﻩ ﻩ } /*---—-----—--—-----—--——-——-——-第四次按键—-—--—--—--—-——-————----—---—--—-—*/ﻩﻩwhile(1)ﻩﻩ{ ﻩ ﻩﻩif(Next==True)ﻩﻩﻩﻩbreak;ﻩﻩﻩif(SelectedShow==True) ﻩ break;ﻩﻩ} ﻩﻩ if(Next==True) ﻩﻩﻩﻩ ﻩ//所有菜单项已经显示完毕,返回主菜单ﻩﻩ{ ﻩﻩNext=False;ﻩﻩ ReturnMain=False;ﻩﻩ ReturnSelection=False;ﻩﻩﻩ ﻩ if(TotalDistanceShow==False)ﻩﻩﻩﻩﻩ{ﻩﻩﻩ ﻩ ﻩﻩ ﻩﻩWriteCmd(LCD_CLS);ﻩﻩﻩﻩDisplayString(0x0,0,"TotalDistance");ﻩﻩﻩ DisplayString(0x0,1,”NextShow”); ﻩ ﻩTotalDistanceShow=True; ﻩ ﻩﻩﻩﻩﻩ ﻩﻩDelay(250);ﻩ ﻩﻩﻩ//延时消除抖动ﻩﻩﻩﻩﻩﻩﻩﻩﻩﻩ}ﻩﻩﻩ} ﻩif(SelectedShow==True)ﻩﻩ{ﻩﻩﻩSelectedShow=False;ﻩﻩﻩSelectedReturn=False;ﻩﻩﻩSelected=False;ﻩﻩﻩif(ReturnSelection==True)ﻩ //按下的是返回键ﻩﻩﻩﻩReturnMain=True;ﻩﻩﻩif(ReturnSelection==False)ﻩ ﻩﻩ{ﻩﻩ ﻩif(TotalDistanceShow==True)ﻩﻩﻩﻩ{ﻩﻩ ﻩﻩWriteCmd(LCD_CLS);ﻩﻩﻩﻩﻩDisplayString(0,0,”TotalDistance");ﻩﻩﻩﻩﻩDisplayDistance(); ﻩﻩﻩﻩDisplayString(0x0A,1,"m");ﻩ ﻩﻩﻩReturnSelection=True;//按下了确定键,那么这个时候开启返回键的功能ﻩﻩﻩﻩﻩDelay(250);ﻩﻩﻩﻩﻩ//延时消除抖动ﻩ ﻩﻩ}ﻩﻩﻩ}ﻩﻩﻩﻩﻩ}ﻩﻩﻩﻩif(ReturnMain==True) ﻩﻩ ﻩﻩ//按下了返回键,返回主菜单ﻩﻩ{ﻩﻩﻩReturnMain=False; ﻩﻩcontinue;ﻩﻩﻩﻩﻩﻩ} /*——--—--—---—---—---—————-—------—第五次按键--—---—-——----——-—-—-——-----—-—----*/ﻩﻩwhile(1)ﻩﻩ{ﻩﻩﻩﻩﻩ if(Next==True)ﻩﻩﻩﻩbreak; ﻩﻩif(SelectedShow==True)ﻩﻩ ﻩbreak; ﻩ}ﻩﻩif(Next==True)ﻩﻩﻩﻩ ﻩ//所有菜单项已经显示完毕,返回主菜单ﻩﻩ{ﻩﻩ Next=False;ﻩ ReturnMain=False; ﻩﻩReturnSelection=False;ﻩ ﻩif(TotalDistanceShow==True)ﻩﻩ //最后一个选项已经显示完毕,返回主菜单ﻩﻩ {ﻩﻩﻩﻩReturnMain=True;ﻩﻩﻩ}ﻩﻩ ﻩﻩ}ﻩﻩﻩif(SelectedShow==True)ﻩﻩ{ ﻩSelectedShow=False;ﻩﻩﻩSelectedReturn=False;ﻩﻩﻩSelected=False; ﻩif(ReturnSelection==True)ﻩﻩ//按下的是返回键 ﻩ ReturnMain=True;ﻩﻩ if(ReturnSelection==False) ﻩ ﻩﻩﻩ{ﻩﻩﻩﻩif(TotalDistanceShow==True)ﻩﻩﻩ { ﻩﻩ ﻩWriteCmd(LCD_CLS);ﻩ ﻩﻩﻩDisplayString(0,0,”TotalDistance");ﻩ ﻩﻩ DisplayDistance();ﻩﻩﻩ DisplayString(0x0A,1,"m");ﻩﻩﻩ ﻩReturnSelection=True;ﻩﻩ//按下了确定键,那么这个时候开启返回键的功能 ﻩ ﻩ Delay(250);ﻩﻩﻩﻩﻩ//延时消除抖动ﻩﻩﻩ }ﻩﻩ } ﻩﻩﻩﻩ} /*--——---——-----—----—--———---—---——--第六次按键-------——--—-—-——-—-—-----—-—-——-——*/ﻩ ﻩﻩwhile(1)ﻩﻩ{ﻩﻩ ﻩ if(Next==True)ﻩ ﻩﻩbreak;ﻩﻩﻩif(SelectedShow==True) ﻩ break;ﻩﻩ}ﻩ if(Next==True)ﻩﻩ{ﻩﻩ Next=False;ﻩﻩﻩReturnMain=False;ﻩﻩﻩReturnSelection=False;ﻩﻩﻩﻩﻩ}ﻩﻩif(SelectedShow==True) {ﻩ SelectedShow=False;ﻩﻩ SelectedReturn=False;ﻩﻩﻩSelected=False;ﻩﻩ}ﻩﻩcontinue;ﻩﻩ}ﻩwhile(1);}/****************************************************************************************\**ﻩﻩﻩﻩ ﻩﻩﻩLCD驱动模块ﻩﻩﻩﻩﻩﻩﻩﻩ**\****************************************************************************************//*-—----—---—-—-—-—-——-———-—------—LCD初始化函数—---—-------———-------—-----—--*/voidLCDInit(void){//三次显示模式设置ﻩLCD_Data=0;ﻩLCD_E=Disable;ﻩDelay(5); WriteCmd(LCD_Init);ﻩDelay(5); WriteCmd(LCD_Init);ﻩDelay(5);ﻩWriteCmd(LCD_Init);ﻩWriteCmd(LCD_Init); ﻩ ﻩﻩﻩ//初始化 WriteCmd(LCD_CloseCtr);ﻩﻩﻩ ﻩﻩ //关显示ﻩWriteCmd(LCD_CLS);ﻩ ﻩﻩﻩ ﻩ//清屏幕ﻩWriteCmd(LCD_EnterSet);ﻩ ﻩﻩﻩﻩ//光标移动设置ﻩWriteCmd(LCD_DispCtr);ﻩ ﻩ ﻩﻩ//显示开以及光标设置ﻩ}/*--——-—-—--------—---—-—---——--LCD模式设置函数---—--—-—-—---—-—-—-—-—-—--———---——*\ﻩﻩSetWriteCmd()ﻩ ﻩ 设置LCD为写命令模式 SetReadCmd()ﻩﻩﻩﻩ设置LCD为读命令模式ﻩSetWriteData() ﻩ 设置LCD为写数据模式ﻩ\*——-—-———----—--———----—--——----—-—-—--—--——---——---—--—--—---—----—--—-—--————*/voidSetWriteCmd(void){ﻩLCD_RW=Write;ﻩLCD_RS=Cmd;}voidSetReadCmd(void){ﻩLCD_RW=Read;ﻩLCD_RS=Cmd;}voidSetWriteData(void){ﻩLCD_RW=Write;ﻩLCD_RS=Data;}/*-——-——-—---—————--—--———---———---LCD功能执行函数—-———-—---—----—-----—-—----—----——--—*\ ﻩWriteCmd()ﻩ ﻩﻩﻩ写命令ﻩWriteData()ﻩﻩﻩﻩﻩ写数据ﻩExecuteCmd()ﻩﻩ ﻩﻩ执行命令ﻩSetXY()ﻩ ﻩﻩ显示定位ﻩDisplaySingleChar()ﻩ ﻩ显示单个字符ﻩDisplayString()ﻩﻩ ﻩ显示一串字符ﻩIsBusy()ﻩﻩﻩﻩﻩﻩ忙标志检测\*-—--———---—--—--—----——----—--——------——------———-----—-——---—-——---——--—-----—*/voidWriteCmd(charcmd){ﻩwhile(IsBusy());ﻩLCD_Data=cmd;ﻩ SetWriteCmd(); ExecuteCmd();}voidWriteData(charddata){ﻩwhile(IsBusy());ﻩLCD_Data=ddata;ﻩSetWriteData(); ﻩExecuteCmd();}voidExecuteCmd(void){ LCD_E=Enable;ﻩLCD_E=Disable;}voidSetXY(charx,chary){ﻩif(y) ﻩx|=0x40;ﻩx|=0x80;ﻩDelay(5); WriteCmd(x);}voidDisplaySingleChar(charx,chary,charcchar){ﻩSetXY(x,y); WriteData(cchar);ﻩ}voidDisplayString(charx,chary,char*str){ while(*str)ﻩ{ﻩﻩDelay(5);ﻩ DisplaySingleChar(x++,y,*str); ﻩstr++;ﻩ}}bitIsBusy(void){ LCD_Data=0xFF;ﻩSetReadCmd(); ExecuteCmd();ﻩreturn(bit)(P1&0x8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物标志物在药物临床试验中的生物标志物研究价值
- 生物制品稳定性试验效率提升方法
- 生物制剂治疗哮喘的肺功能终点指标选择
- 生物制剂失应答后IBD的黏膜愈合评估标准
- 生物3D打印与器官芯片的协同构建策略
- 顺丰速运快递员绩效考核与激励机制含答案
- 生活方式调整的指导方案
- 采购协调员笔试考试题库含答案
- 工艺安全知识竞赛试题集
- 云计算架构师考试重点题及答案
- 2025-2026学年教科版小学科学新教材三年级上册期末复习卷及答案
- 中投公司高级职位招聘面试技巧与求职策略
- 2026中国大唐集团资本控股有限公司高校毕业生招聘考试历年真题汇编附答案解析
- 2025福建三明市农业科学研究院招聘专业技术人员3人笔试考试备考题库及答案解析
- 统编版(部编版)小学语文四年级上册期末测试卷( 含答案)
- 养老金赠予合同范本
- 抵押车非本人协议书
- 仓库安全风险辨识清单
- 安全阀校验质量手册
- 人民币发展史演示文稿
- 公司入场安全须知中英文对照
评论
0/150
提交评论