PWM调速循迹智能小车程序精编.docx

上传人:b****6 文档编号:13094005 上传时间:2023-06-11 格式:DOCX 页数:14 大小:35.01KB
下载 相关 举报
PWM调速循迹智能小车程序精编.docx_第1页
第1页 / 共14页
PWM调速循迹智能小车程序精编.docx_第2页
第2页 / 共14页
PWM调速循迹智能小车程序精编.docx_第3页
第3页 / 共14页
PWM调速循迹智能小车程序精编.docx_第4页
第4页 / 共14页
PWM调速循迹智能小车程序精编.docx_第5页
第5页 / 共14页
PWM调速循迹智能小车程序精编.docx_第6页
第6页 / 共14页
PWM调速循迹智能小车程序精编.docx_第7页
第7页 / 共14页
PWM调速循迹智能小车程序精编.docx_第8页
第8页 / 共14页
PWM调速循迹智能小车程序精编.docx_第9页
第9页 / 共14页
PWM调速循迹智能小车程序精编.docx_第10页
第10页 / 共14页
PWM调速循迹智能小车程序精编.docx_第11页
第11页 / 共14页
PWM调速循迹智能小车程序精编.docx_第12页
第12页 / 共14页
PWM调速循迹智能小车程序精编.docx_第13页
第13页 / 共14页
PWM调速循迹智能小车程序精编.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

PWM调速循迹智能小车程序精编.docx

《PWM调速循迹智能小车程序精编.docx》由会员分享,可在线阅读,更多相关《PWM调速循迹智能小车程序精编.docx(14页珍藏版)》请在冰点文库上搜索。

PWM调速循迹智能小车程序精编.docx

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2