t++;
if(t>=100)t=0;/*1个PWM信号由100次中断产生*/
}
#include
#include
/******************************************************************************
**\
**宏定义区
**
\******************************************************************************
**/
/*-------------------------------LCD模块------------------------------------*/
#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//忙信号
/*--------------------------测速/测距/测时模块-------------------------------*/
#defineCircleLength0.132//小车转一轮的长度为.132m
/*--------------------------------控速模块-----------------------------------*/
#defineP03P0_3//后电机
#defineP04P0_4//后电机
#defineP01P0_1//前电机
#defineP02P0_2//前电机
#defineP31P0_5//控制液晶背光
#defineP33P3_3
/*------------------------------菜单选择模块---------------------------------*/
#defineLine0x00//0代表直线模式
#defineCurve0x01//1代表S型模式
#defineNormal0x00//0代表正常速度
#defineLow0x01//1代表低速
#defineHigh0x02//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;
bitIsT1INT;//判断T1是否已经响应中断
shortIsT0INT2=1;
charThx[5]={0xf4,0xf4,0xc5,0xf4,0xff};//3ms,3ms,15ms,3ms
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;//时间的倍数
/******************************************************************************
**\
**全局函数实现区**
\******************************************************************************
**/
/*--------------------------------主函数------------------------------------*/
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)//如果按下确定键,则设置速度为Hig