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

上传人:b****5 文档编号:7721075 上传时间:2023-01-26 格式:DOCX 页数:50 大小:24.37KB
下载 相关 举报
PWM调速+循迹智能小车程序.docx_第1页
第1页 / 共50页
PWM调速+循迹智能小车程序.docx_第2页
第2页 / 共50页
PWM调速+循迹智能小车程序.docx_第3页
第3页 / 共50页
PWM调速+循迹智能小车程序.docx_第4页
第4页 / 共50页
PWM调速+循迹智能小车程序.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

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

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

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

PWM调速+循迹智能小车程序

//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K的上拉电阻。

/*晶振采用12M,产生的PWM的频率约为100Hz*/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbiten1=P3^4;/*L298的EnableA*/

sbiten2=P3^5;/*L298的EnableB*/

sbits1=P1^0;/*L298的Input1*/

sbits2=P1^1;/*L298的Input2*/

sbits3=P1^3;/*L298的Input3*/

sbits4=P1^2;/*L298的Input4*/

sbitR=P2^0;

sbitC=P2^1;

sbitL=P2^2;

sbitkey=P1^4;

uchart=0;/*中断计数器*/

ucharm1=0;/*电机1速度值*/

ucharm2=0;/*电机2速度值*/

uchartmp1,tmp2;/*电机当前速度值*/

/*电机控制函数index-电机号(1,2);speed-电机速度(0-100)*/

voidmotor(ucharindex,charspeed)

{

if(speed<=100)

{

if(index==1)/*电机1的处理*/

{

m1=abs(speed);/*取速度的绝对值*/

s1=1;

s2=0;

}

if(index==2)/*电机2的处理*/

{

m2=abs(speed);/*电机2的速度控制*/

s3=1;

s4=0;

}

}

}

voidBack(void)

{

s1=0;

s2=1;

s3=1;

s4=0;

}

voidGO(void)

{

s1=1;

s2=0;

s3=1;

s4=0;

}

voidTL(void)

{

s1=1;

s2=0;

s3=0;

s4=1;

}

voidTR(void)

{

s1=0;

s2=1;

s3=1;

s4=0;

}

voidSTOP(void)

{

s1=1;

s2=1;

s3=1;

s4=1;

}

/*

voiddelay(uintj)/*简易延时函数*/

{

for(j;j>0;j--);

}*/

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidmain()

{

uchari=0,j=0;

TMOD=0x02;/*设定T0的工作模式为2,8位自动重置定时器,每过几个机器周期,计数器加一*/

TH0=0x9B;/*装入定时器的初值,计数100次溢出*/

TL0=0x9B;/*装入时间常数*/

EA=1;/*开中断*/

ET0=1;/*定时器0允许中断*/

TR0=1;/*启动定时器0*/

while

(1)

{

if(key==1)

{

/*电机实际控制演示*/

if(i<=100)//正转加速

{

motor(1,i);

motor(2,i);

delay(5000);

i++;

}

else

{

GO();

}

}

else

{

EA=0;

while

(1)

{

if((L|C|R)==0)

STOP();

if(L&R)

GO();

if(L==0)

{

while(C)

{

TL();

}

}

if(R==0)

{

while(C)

{

TR();

}

}

}

}

}

}

voidtimer0()interrupt1/*T0中断服务程序*/

{

if(t==0)/*1个PWM周期完成后才会接受新数值*/

{tmp1=m1;

tmp2=m2;

}

if(t

if(t

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

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

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1