欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

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

    • 资源ID:34305816       资源大小:113KB        全文页数:28页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    如有侵权,请联系网站删除,仅供学习与交流PWM调速+循迹_智能小车程序【精品文档】第 28 页PWM调速+循迹_智能小车程序/T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K的上拉电阻。 /* 晶振采用12M,产生的PWM的频率约为100Hz */ #include<reg51.h> #include<math.h> #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(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; void Back(void)s1=0;s2=1;s3=1;s4=0;void GO(void)s1=1;s2=0;s3=1;s4=0;void TL(void)s1=1;s2=0;s3=0;s4=1;void TR(void)s1=0;s2=1;s3=1;s4=0;void STOP(void)s1=1;s2=1;s3=1;s4=1;void delay(uint j) /* 简易延时函数 */ for(j;j>0;j-); void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;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(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */ if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */ t+; if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */ #include<intrins.h>#include<AT89X52.h>* 宏定义区/*- 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(flag<5)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(Nocurve<2)&&Round!=0&&(Back0>0)&&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(LowSpeedArea1PassTime>9) /通过第一个低速区的时间超过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(HighSpeedAreaPassTime>9) /通过高速区的时间超过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(LowSpeedArea2PassTime>9) /通过第二个低速区的时间超过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(AVGS

    注意事项

    本文(PWM调速+循迹__智能小车程序.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开