PWM调速+循迹智能小车程序.docx
- 文档编号:7536773
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:50
- 大小:24.37KB
PWM调速+循迹智能小车程序.docx
《PWM调速+循迹智能小车程序.docx》由会员分享,可在线阅读,更多相关《PWM调速+循迹智能小车程序.docx(50页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PWM 调速 智能 小车 程序