PWM调速循迹智能小车程序精编.docx
《PWM调速循迹智能小车程序精编.docx》由会员分享,可在线阅读,更多相关《PWM调速循迹智能小车程序精编.docx(14页珍藏版)》请在冰点文库上搜索。
![PWM调速循迹智能小车程序精编.docx](https://file1.bingdoc.com/fileroot1/2023-6/11/539705c6-e8c9-4ae1-a90b-72023364cedb/539705c6-e8c9-4ae1-a90b-72023364cedb1.gif)
PWM调速循迹智能小车程序精编
Documentnumber:
WTT-LKK-GBB-08921-EIGG-22986
PWM调速循迹智能小车程序精编
32m
/*--------------------------------控速模块-----------------------------------*/
#defineP03P0_3.");
DisplayString(0x0,1,"DesignedBy202");
Delay(300);
WriteCmd(LCD_CLS);
EA=1;");
Delay(50);
WriteCmd(LCD_CLS);
IsSelectingMode=True;
while
(1)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0,"LineMode");
DisplayString(0x0,1,"NextYes");
Delay(300);.");
DisplayString(0x0,1,"Designedby202");
if(SelectedMode==Line&&AutoMode==0)
flag=Area0;
else
flag=1;
while(flag<5)
{
if(AutoMode==1);
DisplaySingleChar(0x07,1,PassTime2);
DisplaySingleChar(0x08,1,PassTime3);
}
else
{
DisplaySingleChar(0x04,1,PassTime1);
DisplaySingleChar(0x05,1,PassTime2);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,PassTime3);
DisplaySingleChar(0x08,1,PassTime4);
}
}
/*------------------------------------显示平均速度----------------------------------------*/
voidDisplayAVGSpeed(void)
{
intSpeed1=0x30;;
DisplaySingleChar(0x07,1,Speed2);
DisplaySingleChar(0x08,1,Speed3);
}
/*-------------------------------------显示路程----------------------------------------*/
voidDisplayDistance(void)
{
intDistance1=0x30;
intDistance2=0x30;
intDistance3=0x30;
intDistance4=0x30;
if((int)(Distance*100)<100)
{
Distance1+=0;
Distance2+=(int)(Distance*100)/10;
Distance3+=(int)(Distance*100)%10;
}
elseif((int)(Distance*100)>100&&(int)(Distance*100)<1000)
{
Distance1+=(int)(Distance*100)/100;
Distance2+=(int)(Distance*100)/10%10;
Distance3+=(int)(Distance*100)%10;
}
else
{
Distance1+=(int)(Distance*100)/1000;
Distance2+=(int)(Distance*100)/100%10;
Distance3+=(int)(Distance*100)/10%10;
Distance4+=(int)(Distance*100)%10;
}
if((int)(Distance*100)<1000)
{
DisplaySingleChar(0x05,1,Distance1);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,Distance2);
DisplaySingleChar(0x08,1,Distance3);
}
else
{
DisplaySingleChar(0x04,1,Distance1);
DisplaySingleChar(0x05,1,Distance2);
DisplaySingleChar(0x06,1,'.');
DisplaySingleChar(0x07,1,Distance3);
DisplaySingleChar(0x08,1,Distance4);
}
}
/*-------------------------------------中断初始化-------------------------------------*/
voidINTInit(void)
{
EA=1;//开总中断
IT0=1;//INTO边沿触发
PX0=1;//INTO优先级为高级
EX1=1;//开INT1中断
IT1=1;//INT1边沿触发
PX1=1;//INT1优先级为高级
Clock0_Init();//初始化时钟中断
TMOD=0x11;//T0/T1定时方式1
ET0=0x01;//开T0中断
ET1=0x01;//开T1中断
}
voidClock0_Init(void)
{
TR0=0x01;//启动T0
TH0=Thx0;//定时初值
TL0=Tlx0;
}
voidClock1_Init(void)
{
TR1=0x01;//启动T1
TH1=0x3C;//定时初值-50ms中断一次
TL1=0x0B0;
}
/******************************************************************************
*************\
**中断处理程序
**
\******************************************************************************
*************/
/*-----------------------------------外部中断0----------------------------------------*\
外部中断0有两个功能
(1)作为菜单选择的Next键
(2)作为测速的计数器
\*-----------------------------------------------------------------------------------------*/
voidSpeedINT(void)interrupt0//中断INT0
{
if(SelectedAll==False)//如果模式和速度还没有选择完毕,则此中断作为
Next键
Next=True;
if(Running==True)//如果模式和速度已经选择完毕,则此中断作为
测速中断
SpeedCount++;
if(ChoosingDisplay==True)//如果是在选择要显示的内容
Next=True;
}
/*-----------------------------------外部中断----------------------------*\
外部中断1有两个功能
(1)作为菜单选择的确定键/返回键
(2)控速
\*-----------------------------------------------------------------------------------------*/
voidCtrSpeedINT(void)interrupt2//中断INT1
{
if(SelectedAll==False)//如果模式和速度还没有选择完毕,则此中断
作为确定键
{
if(IsSelectingMode==True)//模式选择标志
ModeSelected=True;
if(IsSelectingSpeed==True)//速度选择标志
SpeedSelected=True;
}
if(Running==True)//如果模式和速度选择已经完毕,则此中断作为
控速中断
{
if(Area0==0)//经过第一条铁线(即起跑线),开始计时,开始
测速
{
EX0=1;
Clock1_Init();
P31=0;//过起跑线,背光灭
}
if(Area0==1)
LowSpeedArea1StartTime=PassTime;//读取进入第一个低速区的时刻
if(Area0==2)
LowSpeedArea1EndTime=PassTime;//读取离开第一个低速区的时刻,也就是进
入高速区的时刻
if(Area0==3)
HighSpeedAreaEndTime=PassTime;//读取离开高速区的时刻,也就是进入第二
个低速区的时刻
if(Area0==4)
LowSpeedArea2EndTime=PassTime;//读取离开第二个低速去的时刻
if(AutoMode==1)//自动模式
{
PassLine++;
switch(PassLine)
{
case5:
PassLineID=1;break;
case10:
PassLineID=2;break;
default:
PassLineID=PassLineID;break;
}
}
else
{
if(SelectedMode==Line)//直线模式
{
Thx0=Thx[Area0++];
Tlx0=Tlx[Area1++];
if(Area0==5)
EX1=0;
}
else//S型模式
{
Nocurve++;
Round++;
if(Roundid==1&&Round==2)
{Round++;Roundid=0;}
Back=0;
Back0=0;
EX1=0;
}
}
IE1=0;
}
if(AutoDisplay==True)
{
GoToChoosingDisplay=True;
}
if(ChoosingDisplay==True)
{
SelectedShow=True;
SelectedReturn=True;
Selected=True;
}
}
/*--------------------------------------T0中断----------------------------------------*\
T0中断用来输出方波以控制速度
\*-----------------------------------------------------------------------------------------*/
voidTime0INT(void)interrupt1//T0中断
{
if(AutoMode==1)
{
IsT0INT*=-1;
switch(PassLine)
{case2:
PrepareDistance=Distance;break;
case3:
FirstDistance=Distance-PrepareDistance;break;
case4:
SecondDistance=Distance-PrepareDistance-FirstDistance;break;
case5:
ThirdDistance=Distance-PrepareDistance-FirstDistance-SecondDistance;break;
default:
break;
}
switch(PassLineID)
{
case0:
{
if(IsT0INT==1)
{TR0=0x01;TH0=0xec;TL0=0x78;}//5ms
else
{TR0=0x01;TH0=0xb1;TL0=0xe0;}//20ms
}break;
case1:
{
if(PassLine==5)
{
FirstHigh=(int)(65536-20*FirstDistance/(15*Count*Rate-FirstDistance)*1000);
SecondHigh=(int)(65536-20*SecondDistance/(15*Rate-SecondDistance)*1000);
ThirdHigh=(int)(65536-20*FirstDistance/(15*Count*Rate-FirstDistance)*1000);
TR0=0x01;TH0=0xf4;TL0=0x48;
}
}break;
case2:
{
AutoMode=0;SelectedMode=Line;Area0=Area1=0;PassTime=0;Distance=0;
TR0=0x01;TH0=0xf4;TL0=0x48;
Thx[0]=Thx[1]=((FirstHigh&
0xf0)>>8);Tlx[0]=Tlx[1]=(FirstHigh&0x0f);
Thx[2]=Thx[2]=((SecondHigh&0xf0)>>8);Tlx[2]=Tlx[2]=(SecondHigh&0x0f);
Thx[3]=Thx[3]=((ThirdHigh&
0xf0)>>8);Tlx[3]=Tlx[3]=(ThirdHigh&0x0f);
Thx[4]=Thx[4]=0xff;Tlx[4]=Tlx[4]=0xff;
}break;
default:
break;
}
}
else
{
if(SelectedMode==Line)
{
IsT0INT*=-1;
if(Area0<5)
{
if(IsT0INT==1)
Clock0_Init();
else
{
TR0=0x01;//启动T0
TH0=Thx1;//定时初值
TL0=Tlx1;
}
}
else
IsT0INT=-1;
}
else
{
IsT0INT2*=-1;
if(IsT0INT2==1)
{TR0=0x01;TH0=0xd8;TL0=0xf0;}//10ms
else
{TR0=0x01;TH0=0xb1;TL0=0xe0;}//20ms
Back++;
if(Back>=90)
Back0=70;
if((Nocurve<2)&&(Back0>0)&&Back!
=0)
{
if(Back0<=65)
Roundid=1;
Back0--;
}
if((Nocurve>2)&&Back>=450)
{Stop=1;IsT0INT2=-1;}
if(Stop==1)
flag=6;
}
}
TF0=0;
}
/*-----------------------------------T1中断----------------------------------------*\
T1中断用来定时
\*-----------------------------------------------------------------------------------------*/
voidTime1INT(void)interrupt3//T1中断
{
Clock1_Init();
Time1INTCount++;
if(Time1INTCount==10)//500ms扫描一次
{
IsT1INT=1;
if(Area0>5)
P03=0;
Time1INTCount=0;
}
TF1=0;
}