PWM调速+循迹智能小车程序Word文档格式.docx
《PWM调速+循迹智能小车程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《PWM调速+循迹智能小车程序Word文档格式.docx(50页珍藏版)》请在冰豆网上搜索。
![PWM调速+循迹智能小车程序Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/21/682f660c-6f82-441a-a9e4-f6c7d12afca2/682f660c-6f82-441a-a9e4-f6c7d12afca21.gif)
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;
voidTL(void)
s3=0;
s4=1;
voidTR(void)
voidSTOP(void)
/*
voiddelay(uintj)/*简易延时函数*/
{
for(j;
j>
0;
j--);
}*/
voiddelay(uintz)
uintx,y;
for(x=z;
x>
x--)
for(y=110;
y>
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();
}
EA=0;
{
if((L|C|R)==0)
STOP();
if(L&
R)
GO();
if(L==0)
{
while(C)
{
TL();
}
}
if(R==0)
{
TR();
}
}
voidtimer0()interrupt1/*T0中断服务程序*/
if(t==0)/*1个PWM周期完成后才会接受新数值*/
{tmp1=m1;
tmp2=m2;
if(t<
tmp1)en1=1;
elseen1=0;
/*产生电机1的PWM信号*/
tmp2)en2=1;
elseen2=0;
/*产生电机2的PWM信号*/
t++;
if(t>
=100)t=0;
/*1个PWM信号由100次中断产生*/
intrins.h>
AT89X52.h>
/******************************************************************************
**\
**宏定义区
**
\******************************************************************************
**/
/*-------------------------------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);
//开总中断
EX0=1;
//开INT0中断
IT0=1;
//INTO边沿触发
EX1=1;
//开INT1中断
IT1=1;
//INT1边沿触发
SelectedAll=False;
//开始模式和速度选择
/*------------------------------模式选择---------------------------------*/
ChooseTheMode"
youwant."
Delay(50);
IsSelectingMode=True;
LineMode"
NextYes"
//延时消除抖动
while
(1)//不断检测中断,直到按确定键或是
NEXT键
if(Next==True)//如果按Next键则直接跳出
break;
if(ModeSelected==True)//如果按确定键则设置模式为
Line并跳出
SelectedMode=Line;
}//如果什么键都没有按下,那么一直
显示等待
if(ModeSelected==True)//按下了确定键,退出模式选择
IsSelectingMode=False;
if(Next==True)//按下了Next键,显示下一个菜单项
Next=False;
CurveMode"
Next键
if(Next==True)//如果再一次按下Next键,则跳出
if(ModeSelected==True)//如果按下确定键,则设置模式为
Curve,并跳出
SelectedMode=Curve;
if(Next==True)//再一次按下了Next键,则循环模式
选择
AutoMode"
if(Next==True)
if(ModeSelected==True)
AutoMode=1;
continue;
/*------------------------------速度选择---------------------------------*/
if(SelectedMode==Line&
&
AutoMode==0)
NowChoosea"
kindofSpeed"
IsSelectingSpeed=True;
NormalSpeed"
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;
}//如果什么键都没有按下,那么一
直显示等待
if(SpeedSelected==True)//按下了确定键,退出速度选择
IsSelectingSpeed=False;
LowSpeed"
if(SpeedSelected==True)//如果按下确定键,则设置速度为
Low,并跳出
SelectedSpeed=Low;
//这里没有速度设置,因为默认
速度就是Low
HighSpeed"
if(SpeedSelected==True)//如果按下确定键,则设置速度为Hig