PWM调速+循迹__智能小车程序.doc_第1页
PWM调速+循迹__智能小车程序.doc_第2页
PWM调速+循迹__智能小车程序.doc_第3页
PWM调速+循迹__智能小车程序.doc_第4页
PWM调速+循迹__智能小车程序.doc_第5页
免费预览已结束,剩余30页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K的上拉电阻。 /* 晶振采用12M,产生的PWM的频率约为100Hz */ #include #include #define uchar unsigned char #define uint unsigned int sbit en1=P34; /* L298的Enable A */ sbit en2=P35; /* L298的Enable B */ sbit s1=P10; /* L298的Input 1 */ sbit s2=P11; /* L298的Input 2 */ sbit s3=P13; /* L298的Input 3 */ sbit s4=P12; /* L298的Input 4 */sbit R=P20;sbit C=P21;sbit L=P22;sbit key=P14;uchar t=0; /* 中断计数器 */ uchar m1=0; /* 电机1速度值 */ uchar m2=0; /* 电机2速度值 */ uchar tmp1,tmp2; /* 电机当前速度值 */ /* 电机控制函数 index-电机号(1,2); speed-电机速度(0-100) */ void motor(uchar index, char speed) if(speed0;j-); */void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void main() uchar i=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+; elseGO(); elseEA=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(); void timer0() interrupt 1 /* T0中断服务程序 */ if(t=0) /* 1个PWM周期完成后才会接受新数值 */ tmp1=m1; tmp2=m2; if(ttmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */ if(t=100) t=0; /* 1个PWM信号由100次中断产生 */ #include#include/* 宏定义区*/*- LCD模块-*/#defineLCD_RW P2_6 /读写控制端#defineLCD_RS P2_7 /数据命令选择端#defineLCD_E P2_5 /执行使能端#defineLCD_Data P1 /P1口#defineWrite 0x00 /低电平写入#defineRead 0x01 /高电平读出#defineData 0x01 /高电平选择数据#defineCmd 0x00 /低电平选择命令#defineEnable 0x00 /跃变到低电平时执行命令#defineDisable 0x01#defineTrue 0x01#defineFalse 0x00#defineLCD_Init 0x38 /初始化模式#defineLCD_DispCtr 0x0C /开显示及光标设置#defineLCD_CloseCtr 0x08 /关显示#defineLCD_CLS 0x01 /清屏幕#defineLCD_EnterSet 0x06 /显示光标#defineBusy P1_7 /忙信号/*- 测速/测距/测时模块-*/#defineCircleLength 0.132 /小车转一轮的长度为.132m/*- 控速模块-*/#defineP03 P0_3 /后电机#defineP04 P0_4 /后电机#defineP01 P0_1 /前电机#defineP02 P0_2 /前电机#defineP31 P0_5 /控制液晶背光#defineP33 P3_3/*- 菜单选择模块-*/#defineLine 0x00 /0代表直线模式#defineCurve 0x01 /1代表S型模式#defineNormal 0x00 /0 代表正常速度#defineLow 0x01 /1 代表低速#defineHigh 0x02 /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); /延时子程序bit IsBusy(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);/* 全局变量区*/float SpeedCount=0; /测速计数脉冲float Speed=0.0;float Distance=0.0;char Time1INTCount=0; /T1中断时间计时float PassTime=0.00; /小车行走的时间short IsT0INT=1;bit IsT1INT; /判断T1是否已经响应中断short IsT0INT2=1;char Thx5=0xf4,0xf4,0xc5,0xf4,0xff; /3ms,3ms,15ms,3mschar Tlx5=0x48,0x48,0x68,0x48,0xff;char Thx0=0xd8;char Tlx0=0xf0;char Thx1=0xb1; /20mschar Tlx1=0xe0;short Round=0;short Back=0;short Back0=0;bit Backid;bit Stop=0;char Area0=0;char Area1=0; /区域变量char LowSpeedArea1StartTime;char LowSpeedArea1EndTime;char HighSpeedAreaEndTime;char LowSpeedArea2EndTime;char LowSpeedArea1PassTime=0; /第一个低速区通过时间char HighSpeedAreaPassTime=0; /高速区通过时间char LowSpeedArea2PassTime=0; /第二个低速区通过时间char ReadyToGo=4; /倒计时char flag;bit Roundid=0;char Nocurve=0;char ChangeFlag;char Mode;bit Running;bit SelectedAll; /模式和速度是否选择完毕标志bit IsSelectingMode; /模式选择标志bit IsSelectingSpeed; /速度选择标志bit ModeSelected; /已经被选择的模式标志char SelectedMode=10; /模式选择是否完毕标志bit Next; /Next键标志bit SpeedSelected; /已经被选中的速度方案标志char SelectedSpeed; /速度选择是否完毕标志bit ChoosingDisplay; /人工选择菜单开始标志bit SelectedShow; /显示选择标志bit SelectedReturn; /返回选择标志bit Selected; /确定/返回键选择标志bit ReturnSelection; /返回键启用标志bit AVGSpeedShow; /平均速度显示标志bit TotalDistanceShow; /总路程显示标志bit ReturnMain; /返回主菜单标志bit AutoDisplay; /自动显示标志bit GoToChoosingDisplay; /人工选择标志bit AutoMode=0;char PassLineID=0;char PassLine=0;float PrepareDistance;float FirstDistance;float SecondDistance;float ThirdDistance;int FirstHigh;int SecondHigh;int ThirdHigh;float Rate=1.25; /5ms时的速度float Count=4; /时间的倍数/* 全局函数实现区 */*- 主函数-*/voidmain()P01=0;P02=0;P03=0;P04=0;P31=1; /单片机复位,背光开Delay(40); /延时等待LCD启动LCDInit(); /初始化LCDDisplayString(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,Next Yes);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,Next Yes);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,Next Yes);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,Next Yes);Delay(300); /延时消除抖动while(1)if(Next=True) /如果按Next键则直接跳出break;if(SpeedSelected=True) /如果按确定键则设置速度为Normal并跳出Thx0=0xec;Tlx0=0x78; /5msThx1=0xf0;Tlx1=0x60; /4msThx2=0x8a;Tlx2=0xd0; /30msThx3=0xf4;Tlx3=0x48; /3msSelectedSpeed=Normal;break; /如果什么键都没有按下,那么一直显示等待if(SpeedSelected=True) /按下了确定键,退出速度选择IsSelectingSpeed=False;break;if(Next=True)Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0, Low Speed );DisplayString(0x0,1,Next Yes);Delay(300); /延时消除抖动while(1)if(Next=True) /如果再一次按下Next键,则跳出break;if(SpeedSelected=True) /如果按下确定键,则设置速度为Low,并跳出SelectedSpeed=Low; /这里没有速度设置,因为默认速度就是Lowbreak;if(SpeedSelected=True) /按下了确定键,退出速度选择IsSelectingSpeed=False;break;if(Next=True)Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0, High Speed );DisplayString(0x0,1,Next Yes);Delay(300); /延时消除抖动while(1)if(Next=True) /如果再一次按下Next键,则跳出break;if(SpeedSelected=True) /如果按下确定键,则设置速度为High,并跳出Thx0=0xe0;Tlx0=0xc0;/8msThx1=0xe0;Tlx1=0xc0; /8msThx2=0x63;Tlx2=0xc0; /40msThx3=0xec;Tlx3=0x78; /5msSelectedSpeed=High;break;if(SpeedSelected=True) /按下了确定键,退出速度选择IsSelectingSpeed=False;break;if(Next=True) /再一次按下了Next键,则循环速度选择Next=False;continue;SelectedAll=True; /标志模式选择和速度选择完毕Running=True;Delay(50);WriteCmd(LCD_CLS);/*- 显示所选择的模式和速度方案-*/if(SelectedMode=Line)DisplayString(0x0,0,ChoosenModeis);DisplayString(0x0,1, Line );Delay(50);WriteCmd(LCD_CLS);if(SelectedMode=Curve)DisplayString(0x0,0,ChoosenModeis);DisplayString(0x0,1, Curve );Delay(50);WriteCmd(LCD_CLS);if(AutoMode=1)DisplayString(0x0,0,ChoosenModeis);DisplayString(0x0,1, AutoMode );Delay(50);WriteCmd(LCD_CLS);if(SelectedMode=Line)if(SelectedSpeed=Normal)DisplayString(0x0,0,ChoosenSpeedis);DisplayString(0x0,1, Normal );Delay(50);WriteCmd(LCD_CLS);if(SelectedSpeed=Low)DisplayString(0x0,0,ChoosenSpeedis);DisplayString(0x0,1, Low );Delay(50);WriteCmd(LCD_CLS);if(SelectedSpeed=High)DisplayString(0x0,0,ChoosenSpeedis);DisplayString(0x0,1, High );Delay(50);WriteCmd(LCD_CLS);INTInit(); /初始化所有中断DisplayString(0x0,0,LeftTimesToGo);while(ReadyToGo-)DisplaySingleChar(0x7,1,ReadyToGo+0x30);DisplaySingleChar(0x09,1,s);Delay(300);WriteCmd(LCD_CLS);DisplayString(0x05,0,Go!);Delay(100);WriteCmd(LCD_CLS);DisplayString(0x0,0, Living. );DisplayString(0x0,1,Designedby202);if(SelectedMode=Line&AutoMode=0)flag=Area0;elseflag=1;while(flag5)if(AutoMode=1) /自动模式switch(PassLineID)case0 :if(IsT0INT=1)P01=P02=P04=0;P03=1;elseP01=P02=P03=P04=0;break;case1 :P01=P02=P03=0;P04=1;break;case2 :P01=P02=P04=0;P03=1;break;default:break;elseif(SelectedMode=Line) /直线模式flag=Area0;if(IsT0INT=1)P03=1;P04=0;P01=P02=0;elseP03=0;P04=0;P01=P02=0;else /S型模式if(Nocurve0)&Back!=0)if(Backid=1)P01=1;P02=0;P03=0;P04=1;elseP01=0;P02=1;P03=0;P04=1;Back=1;elseif(Round=0)if(IsT0INT2=1)P01=0;P02=0;P03=1;P04=0;elseP01=0;P02=0;P03=0;P04=0;elseif(P33=0)if(IsT0INT2=1)P01=0;P02=0;P03=1;P04=0;elseP01=0;P02=0;P03=0;P04=0;elseEX1=1;if(Round%2)if(IsT0INT2=1)P01=1;P02=0;P03=1;P04=0;Backid=1;elseP01=1;P02=0;P03=0;P04=0;elseif(IsT0INT2=1)P01=0;P02=1;P03=1;P04=0;Backid=0;elseP01=0;P02=1;P03=0;P04=0;if(IsT1INT=1)IsT1INT=0;ComputeTime();ComputeSpeedANDDistance();/补中断路程,加上最后一次中断缺失的路程ComputeSpeedANDDistance();P04=1;P03=0;P01=P02=0;Delay(90);P03=0;P04=0; /行程结束,小车停止P31=1; /行程结束,背光开ET0=0x0; /关T0中断ET1=0x0; /关T1中断EX1=0x01; /开INT1中断Running=False;AutoDisplay=True; /默认情况下直线模式会自动显示各个区域经过的时间WriteCmd(LCD_CLS);if(SelectedMode=Line) /直线模式才显示while(1)if(GoToChoosingDisplay=True)break;Delay(200);WriteCmd(LCD_CLS);Delay(200);DisplayString(0,0,LowSpeedArea1);DisplayString(0,1,Costed);DisplaySingleChar(0x0C,1,s);LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime;DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);if(LowSpeedArea1PassTime9) /通过第一个低速区的时间超过sDisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);if(GoToChoosingDisplay=True)break;Delay(200);WriteCmd(LCD_CLS);Delay(200);DisplayString(0,0,HighSpeedArea);DisplayString(0,1,Costed);DisplaySingleChar(0x0C,1,s);HighSpeedAreaPassTime=HighSpeedAreaEndTime-LowSpeedArea1EndTime;DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);if(HighSpeedAreaPassTime9) /通过高速区的时间超过sDisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);if(GoToChoosingDisplay=True)break;Delay(200);WriteCmd(LCD_CLS);Delay(200);DisplayString(0,0,LowSpeedArea2);DisplayString(0,1,Costed);DisplaySingleChar(0x0C,1,s);LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime;DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);if(LowSpeedArea2PassTime9) /通过第二个低速区的时间超过sDisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);AutoDisplay=False;/*- 菜单选择你想要看的内容-总时间、总路程以及平均速度-*/ChoosingDisplay=True;WriteCmd(LCD_CLS);/*首先显示主菜单,然后显示第一个选项*/DisplayString(0x0,0,NowChoosewhat);DisplayString(0x0,1,youwanttosee);Delay(100);while(1)WriteCmd(LCD_CLS);DisplayString(0x0,0, CostedTime );DisplayString(0x0,1,Next Show);Delay(250); /延时消除抖动/*-第一次按键-*/*不断检测确定键和Next键*/while(1)if(Next=True)break;if(SelectedShow=True)break;/*按下了确定键,显示第一个选项的内容*/if(SelectedShow=True)SelectedShow=False;SelectedReturn=False;Selected=False;WriteCmd(LCD_CLS);DisplayString(0,0,CostedTimeis);DisplayTime();DisplayString(0x0A,1,s);ReturnSelection=True; /按下了确定键,那么这个时候开启返回键的功能AVGSpeedShow=False;Delay(250); /延时消除抖动/*按下了Next键,则显示第二个选项*/if(Next=True) /按下Next键,显示AVGSpeed菜单项Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0, AVGSpeed );DisplayString(0x0,1,Next Show);ReturnMain=False;ReturnSelection=False; /按下了Next键,那么这个时候关闭返回键的功能AVGSpeedShow=True; /表明AVGSpeed选项已经显示过了Delay(250); /延时消除抖动/*-第二次按键-*/*显示第一个选项的内容后又不断检测返回键(确定键)和Next键*/while(1)if(Next=True)break;if(Selected=True)break;if(Next=True)Next=False;ReturnMain=False;ReturnSelection=False; /按下了Next键,那么这个时候关闭返回键的功能if(AVGSpeedShow=False) /还没有显示AVGSpeed选项,显示它 /即第一次选择了确定键WriteCmd(LCD_CLS);DisplayString(0x0,0, AVGSpeed );DisplayString(0x0,1,Next Show);TotalDistanceShow=False; /显示了AVGSpeed,则表明TotalDistance还没有显示Delay(250); /延时消除抖动if(AVGSpeedShow=True) /已经显示过AVGSpeed选项了,则显示下一个选项 /即第一次选择了Next键WriteCmd(LCD_CLS);DisplayString(0x0,0,TotalDistance);DisplayString(0x0,1,Next Show);TotalDistanceShow=True; /表明显示了TotalDistance选项Delay(250); /延时消除抖动if(Selected=True) /按下了确定键或返回键SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection=True) /第一次选择了确定键,故这次按下的是返回键ReturnMain=True;if(ReturnSelection=False)WriteCmd(LCD_CLS);DisplayString(0,0,TheAVGSpeedis);DisplayAVGSpeed();DisplayString(0x0A,1,m/s);ReturnSelection=True; /按下了确定键,那么这个时候开启返回键的功能Delay(250); /延时消除抖动TotalDistanceShow=False;if(ReturnMain=True) /按下了返回键,返回主菜单ReturnMain=False;continue;/*-第三次按键-*/*如果没有返回主菜单,则继续检测Next键和确定键*/while(1)if(Next=True)break;if(SelectedShow=True)break;/*按下Next键,显示下一个选项*/if(Next=True)Next=False;ReturnMain=False;ReturnSelection=False; /按下了Next键,那么这个时候关闭返回键的功能if(TotalDistanceShow=True)ReturnMain=True;if(TotalDistanceShow=False) /还没有显示TotalDistance选项,显示它WriteCmd(LCD_CLS);DisplayString(0x0,0,TotalDistance);DisplayString(0x0,1,Next Show);TotalDistanceShow=True;Delay(250); /延时消除抖动if(Selected=True) /按下了确定键或返回键SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection=True) /按下的是返回键ReturnMain=True;if(ReturnSelection=False)if(TotalDistanceShow=False) /表明AVGSpeed选项的内容还没有显示WriteCmd(LCD_CLS);DisplayString(0,0,TheAVGSpeedis);DisplayAVGSpeed();DisplayString(0x0A,1,m/s);ReturnSelection=True;Delay(250); /延时消除抖动if(TotalDistanceShow=True)WriteCmd(LCD_CLS);DisplayString(0,0,TotalDistance)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论