本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 1 10/26/1211:54:52 AM
摘摘摘摘 要要要要
(关键词:(关键词:(关键词:(关键词:智能车 AT89S52 单片机 金属感应器 霍尔元件 1602LCD)
智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个
环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能电动车
就是其中的一个体现。本次
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的简易智能电动车,采用 AT89S52 单片机作为小车的
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
和控制核心;采用金属感应器 TL-Q5MC 来检测路上感应到的铁片,从而把反馈到
的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,
并且单片机选择的工作模式不同也可控制小车顺着 S 形铁片行驶;采用霍尔元件 A44E
检测小车行驶速度;采用 1602LCD 实时显示小车行驶的时间,小车停止行驶后,轮流
显示小车行驶时间、行驶距离、平均速度以及各速度区行驶的时间。本设计结构简单,
较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。
目目目目 录录录录
1 设计任务………………………………………………………………………………3
1.1 要求………………………………………………………………………………3
2
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
比较与选择………………………………………………………………………4
2.1 路面检测模块……………………………………………………………………4
2.2 LCD 显示模块………………………………………………………………………5
2.3 测速模块…………………………………………………………………………5
2.4 控速模块…………………………………………………………………………6
2.5 模式选择模块……………………………………………………………………7
3 程序框图………………………………………………………………………………7
4 系统的具体设计与实现………………………………………………………………9
4.1 路面检测模块……………………………………………………………………9
4.2 LCD 显示模块………………………………………………………………………9
4.3 测速模块…………………………………………………………………………9
4.4 控速模块…………………………………………………………………………9
4.5 复位电路模块……………………………………………………………………9
4.6 模式选择模块……………………………………………………………………9
5 最小系统图……………………………………………………………………………10
6 最终 PCB 板图…………………………………………………………………………12
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 2 10/26/1211:54:52 AM
7 系统程序………………………………………………………………………………13
8 致谢……………………………………………………………………………………46
9 参考文献……………………………………………………………………………47
10 附录…………………………………………………………………………………48
1.1.1.1. 设计任务:设计任务:设计任务:设计任务:
设计并制作了一个智能电动车,其行驶路线满足所需的要求。
1.11.11.11.1 要求:要求:要求:要求:
1.1.1 基本要求:
(1)分区控制:
如(图 1)所示:
(图 1)
车辆从起跑线出发(出发前,车体不得超出起跑线)。在第一个路程 C~DC~DC~DC~D区(3333~6666
米)以低速行驶,通过时间不低于 10s10s10s10s;第二个路程 DDDD~EEEE区(2222米)以高速行驶,通过
时间不得多于 4444秒;第三个路程 E~FE~FE~FE~F区(3333~6666米)以低速行驶,通过时间不低于 10s10s10s10s。
(2)小车能自动记录、显示行驶时间、行驶距离以及行驶速度,还能记录每段所走
的时间,从而判断是否符合课程设计要求。(记录显示装置要求安装在车上)。
1.1.2 发挥部分:
SSSS型控制:如(图 2222)所示:
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 3 10/26/1211:54:52 AM
(图 2222)
车辆沿着 SSSS形铁片行驶,自动转弯,自动寻找正确方向和铁片。当离开 SSSS型铁片跑
道或者感应不到铁片一段时间的时候,小车自动停止,并记录行驶时间,路程,平均速
度并通过 LCDLCDLCDLCD显示出来。
2.2.2.2. 方案比较与选择:方案比较与选择:方案比较与选择:方案比较与选择:
根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可
分为几个基本的模块,框图如(图 3)所示:
(图 3)
2.12.12.12.1 路面检测模块:路面检测模块:路面检测模块:路面检测模块:
采用铁片感应器 TL-Q5MC 来检测路面上的铁片从而给单片机中断脉冲。原理图接线
如(图 4)所示:
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 4 10/26/1211:54:52 AM
(图 4)
2.22.22.22.2 LCDLCDLCDLCD 显示模块:显示模块:显示模块:显示模块:
采用 1602LCD,由单片机的总线模式连接。为节约电源电量并且不影响 LCD 的功能,
LCD 的背光用单片机进行控制,使 LCD 的背光在小车行驶的过程中不亮,因为我们不必
看其显示;在其它我们需要看显示的内容的时候 LCD 背光亮。
2.32.32.32.3 测速模块:测速模块:测速模块:测速模块:
2.3.1 方案 1:
采用采用霍尔开关元器件 A44E 检测轮子上的小磁铁从而给单片机中断脉冲,达到测
量速度的作用。霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求
简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。霍尔开关只对
一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件
安装在固定轴上,通过对脉冲的计数进行车速测量。
2.3.2 方案 2:
采用红外传感器进行测速。但无论是反射式红外传感器还是对射式红外传感器,他们对都
对外围环境要求较高,易受外部环境的影响,稳定性不高,且价格较为昂贵。
通过对方案 1111、方案 2222的比较其优缺点,综合多方面因素决定选用方案 1111,其原理图接线如(图
5555)所示:
(图 5)
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 5 10/26/1211:54:52 AM
2.42.42.42.4 控速模块:控速模块:控速模块:控速模块:
2.4.1 方案 1:
使用功率三极管作为功率放大器的输出控制直流电机。线性型驱动的电路结构和原
理简单,成本低,加速能力强,但功率损耗大,特别是低速大转距运行时,通过电阻R
的电流大,发热厉害,损耗大,对于小车的长时间运行不利。
2.4.2 方案 2:
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此
方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不
高。
2.4.3 方案 3:
采用由双极性管组成的 H 桥电路。用单片机控制晶体管使之工作在占空比可调的开
关状态,精确调整电机转速。这种电路由于工作在管子的饱和截止模式下,效率非常高;
H 桥电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也很
高,是一种广泛采用的调速技术。
综合 3 种方案的优缺点,决定选择方案 3,其电路原理图如(图 6)所示:
(图 6)
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 6 10/26/1211:54:52 AM
2.52.52.52.5 模式选择模块:模式选择模块:模式选择模块:模式选择模块:
模式选择模块通过一个 74LS00 与非门和两个不带锁按钮来控制单片机单片机的两
个中断口,从而按动按钮来选择小车走动的路型、来选择小车的速度是快速、中速、慢
速;走完路程小车停止后还可以通过按钮选择想要在 LCD 上想看的信息,比如总时间、
走过各段路程的时间、平均速度、总路程等。
小车走动的模式选择有:
(1) 直线型:满足设计任务的基本要求,能稳定的走完全程。之后按顺序循环不
断的显示走完全程所用的时间、走完高速区所用的时间和走完低速区所用的时间这三个
时间;或者可以通过两个按钮以及 LCD 显示的菜单选择所要看的内容如平均速度、全程
距离以及那三个时间。
(2) S 型:满足设计任务的发挥部分的要求,小车能自动的感应到在前面或在后
面铁片,即第一次转弯后若感应到的是错误的方向,则小车会后退自动调整方向,沿着
S 型的铁片走。当走完 S 型铁片后的一定时间里,小车自动停止。之后自动进入菜单由
我们自己选择要看的内容时间、平均速度和所走的距离。
(3)自动型:小车先以一定的速度走完全程,之后再以一定的速度倒退回起点,再
调整速度在一定的时间内走完全程。走完后 LCD 显示的内容与直线型显示的内容一样。
3.3.3.3. 程序框图:程序框图:程序框图:程序框图:
单片机主程序框图、速度感应程序框图和铁片感应程序框图分别如(图 7)所示。
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 7 10/26/1211:54:52 AM
(图 7)
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 8 10/26/1211:54:52 AM
4444.系统的具体设计与实现:.系统的具体设计与实现:.系统的具体设计与实现:.系统的具体设计与实现:
4.14.14.14.1 路面检测模块:路面检测模块:路面检测模块:路面检测模块:
应用一个金属感应器,安装在车盘下,离地略小于或约四毫米。当金属传感器检测
到铁片时将对单片机发送中断信号,单片机运行中断,改变输给电机驱动信号的电压占
空比来控制小车的速度。
4.24.24.24.2 LCDLCDLCDLCD 显示模块:显示模块:显示模块:显示模块:
采用 1602LCD,由单片机的总线模式连接。为节约电源,LCD 的背光用单片机进行控
制。
4.34.34.34.3 测速模块:测速模块:测速模块:测速模块:
通过霍尔元件感应磁铁来产生脉冲((((当霍尔元件在离磁场较近时输出会是高电平,其
它时候是低电平)))),一个车轮均匀放四个小磁铁,计算一秒所得的脉冲数,从而计算出一
秒小车轮子转动圈数,再测量出小车车轮周长即可计算出小车当前速度,累加可得到当
前路程。
4.44.44.44.4 控速模块:控速模块:控速模块:控速模块:
考虑到元器件的缺少以及我们所用的电路的驱动电机的电路原理图和和小车自带的
电路的电机驱动原理图一样,所以暂时使用小车自带的电机驱动电路图。
4.54.54.54.5 复位电路模块:复位电路模块:复位电路模块:复位电路模块:
单片机的复位电路通过手动来实现,复位电路图如(图 8)所示。
22uVCC
200
1K
RST
(图 8)
4.64.64.64.6 模式选择模块:模式选择模块:模式选择模块:模式选择模块:
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 9 10/26/1211:54:52 AM
两个中断口使用和感应铁片、感应速度所使用的中断口一样,通过一个与非门和按
钮控制。原理图如(图 9)所示:
(图 9)
5555.最小系统图:.最小系统图:.最小系统图:.最小系统图:
该系统主要用到的是单片机,所以主要的部分是最小系统图,该最小系统图如(图
10)所示:
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 10 10/26/1211:54:52 AM
(图 12)
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 11 10/26/1211:54:52 AM
6.6.6.6. 最终最终最终最终PCBPCBPCBPCB板图:板图:板图:板图:
该最小系统的最终 PCB 板图(包括 LCD 接口以及其他的外部扩展电路部分,考虑到
最小系统的简洁以及容易看懂,外部扩展电路不在最小系统图上显示。)分别如(图 11)、
(图 12)所示:
(图 11)
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 12 10/26/1211:54:52 AM
(图 12)
7777.系统程序:.系统程序:.系统程序:.系统程序:
按照预定的功能,系统实现预定的功能的程序如下所示:
#include
#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 //低电平选择命令
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 13 10/26/1211:54:52 AM
#define Enable 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 //小车转一轮的长度为.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 Line 0x00 //0代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
直线模式
#define Curve 0x01 //1代表S型模式
#define Normal 0x00 //0 代表正常速度
#define Low 0x01 //1 代表低速
#define High 0x02 //2 代表高速
/*********************************************************************************\
** 全局函数声明区 **
\*********************************************************************************/
/*------------------------------- LCD模块 -------------------------------------*/
void LCDInit(void); //LCD初始化
void SetWriteCmd(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 *str); //显示一段字符串
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 14 10/26/1211:54:52 AM
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 ComputeTime(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;
char Time1INTCount=0; //T1中断时间计时
float PassTime=0.00; //小车行走的时间
short IsT0INT=1;
bit IsT1INT; //判断T1是否已经响应中断
short IsT0INT2=1;
char Thx[5]={0xf4,0xf4,0xc5,0xf4,0xff}; //3ms,3ms,15ms,3ms
char Tlx[5]={0x48,0x48,0x68,0x48,0xff};
char Thx0=0xd8;
char Tlx0=0xf0;
char Thx1=0xb1; //20ms
char Tlx1=0xe0;
short Round=0;
short Back=0;
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 15 10/26/1211:54:52 AM
short 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 ReadyToGo=4; //倒计时
char flag;
bit Roundid=0;
char Nocurve=0;
char ChangeFlag;
char Mode;
bit Running;
bit SelectedAll; //模式和速度是否选择完毕标志
bit IsSelectingMode; //模式选择标志
bit IsSelectingSpeed; //速度选择标志
bit ModeSelected; //已经被选择的模式标志
char SelectedMode=10; //模式选择是否完毕标志
bit Next; //Next键标志
bit SpeedSelected; //已经被选中的速度方案标志
char SelectedSpeed; //速度选择是否完毕标志
bit ChoosingDisplay; //人工选择菜单开始标志
bit SelectedShow; //显示选择标志
bit SelectedReturn; //返回选择标志
bit Selected; //确定/返回键选择标志
bit ReturnSelection; //返回键启用标志
bit AVGSpeedShow; //平均速度显示标志
bit TotalDistanceShow; //总路程显示标志
bit ReturnMain; //返回主菜单标志
bit AutoDisplay; //自动显示标志
bit GoToChoosingDisplay; //人工选择标志
bit AutoMode=0;
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 16 10/26/1211:54:52 AM
char PassLineID=0;
char PassLine=0;
float PrepareDistance;
float FirstDistance;
float 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,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; //开始模式和速度选择
/*------------------------------ 模式选择 ---------------------------------*/
DisplayString(0x0,0,"Choose The Mode ");
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 17 10/26/1211:54:52 AM
DisplayString(0x0,1,"you want. ");
Delay(50);
WriteCmd(LCD_CLS);
IsSelectingMode=True;
while(1)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Line Mode ");
DisplayString(0x0,1,"Next Yes");
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," Curve Mode ");
DisplayString(0x0,1,"Next Yes");
Delay(300); //延时消除抖动
while(1) //不断检测中断,直到按确定键或是Next键
{
if (Next==True) //如果再一次按下Next键,则跳出
break;
if (ModeSelected==True) //如果按下确定键,则设置模式为Curve,并跳出
{
SelectedMode=Curve;
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 18 10/26/1211:54:52 AM
break;
}
}
}
if (ModeSelected==True) //按下了确定键,退出模式选择
{
IsSelectingMode=False;
break;
}
if (Next==True) //再一次按下了Next键,则循环模式选择
{
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0," AutoMode ");
DisplayString(0x0,1,"Next Yes");
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;
}
}
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 19 10/26/1211:54:52 AM
Delay(50);
WriteCmd(LCD_CLS);
/*------------------------------ 速度选择 ---------------------------------*/
if (SelectedMode==Line && AutoMode==0)
{
DisplayString(0x0,0," Now Choose a ");
DisplayString(0x0,1," kind of Speed ");
Delay(50);
WriteCmd(LCD_CLS);
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并跳出
{
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;
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 20 10/26/1211:54:52 AM
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Low Speed ");
DisplayString(0x0,1,"Next Yes");
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," High Speed ");
DisplayString(0x0,1,"Next Yes");
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;
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 21 10/26/1211:54:52 AM
}
}
}
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,"Choosen Mode is ");
DisplayString(0x0,1," Line ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedMode==Curve)
{
DisplayString(0x0,0,"Choosen Mode is ");
DisplayString(0x0,1," Curve ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (AutoMode==1)
{
DisplayString(0x0,0,"Choosen Mode is ");
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 22 10/26/1211:54:52 AM
DisplayString(0x0,1," AutoMode ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedMode==Line)
{
if (SelectedSpeed==Normal)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," Normal ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedSpeed==Low)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," Low ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedSpeed==High)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," High ");
Delay(50);
WriteCmd(LCD_CLS);
}
}
INTInit(); //初始化所有中断
DisplayString(0x0,0,"Left Times To Go");
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... ");
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 23 10/26/1211:54:52 AM
DisplayString(0x0,1,"Designed by 202");
if (SelectedMode==Line&&AutoMode==0)
flag=Area0;
else
flag=1;
while(flag<5)
{
if(AutoMode==1) //自动模式
{
switch(PassLineID)
{
case 0 :{
if(IsT0INT==1)
{P01=P02=P04=0;P03=1;}
else
{P01=P02=P03=P04=0;}
}break;
case 1 :{
P01=P02=P03=0;P04=1;
}break;
case 2 :{
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;}
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 24 10/26/1211:54:52 AM
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;}
}
}
}
}
}
}
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 25 10/26/1211:54:52 AM
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 ");
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 26 10/26/1211:54:52 AM
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,"Now Choose what ");
DisplayString(0x0,1,"you want to see ");
Delay(100);
while(1)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Costed Time ");
DisplayString(0x0,1,"Next Show");
Delay(250); //延时消除抖动
/*------------------------------------第一次按键--------------------------------------*/
本文由惜忆泪情整理
单片机教程网:http://www.ipbb.cn 27 10/26/1211:54:52 AM
/*不断检测确定键和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,"Costed Time is");
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,"Next Show");
ReturnMain=False;
ReturnSel