ImageVerifierCode 换一换
格式:DOCX , 页数:50 ,大小:24.37KB ,
资源ID:7721075      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7721075.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PWM调速+循迹智能小车程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、PWM调速+循迹智能小车程序/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 *

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

3、(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) /* 电机实际控制演示 */

4、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信号

5、 */ 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 /跃变到低电平时

6、执行命令#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

7、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初始化void

8、SetWriteCmd(void); /设置写命令模式voidSetReadCmd(void); /设置读命令模式voidSetWriteData(void); /设置写数据模式voidWriteCmd(charcmd); /写命令voidWriteData(charddata); /写数据voidExecuteCmd(void); /执行命令voidSetXY(charx,chary); /定位显示地址voidDisplaySingleChar(charx,chary,charcchar); /显示单个字符voidDisplayString(charx,chary,char*str); /显

9、示一段字符串voidDelay(unsignedinttime); /延时主程序voidDelayUs(unsignedinttime); /延时子程序bit IsBusy(void); /判断忙标志函数voidDisplayTime(void); /显示时间voidDisplayAVGSpeed(void); /显示平均速度voidDisplayDistance(void); /显示路程/*- 测速/测距/测时模块-*/voidINTInit(void); /所有中断初始化voidSpeedINT(void); /测速中断voidComputeTime(void);voidComputeSp

10、eedANDDistance(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中断时间计

11、时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 S

12、top=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

13、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 Ch

14、oosingDisplay; /人工选择菜单开始标志bit SelectedShow; /显示选择标志bit SelectedReturn; /返回选择标志bit Selected; /确定/返回键选择标志bit ReturnSelection; /返回键启用标志bit AVGSpeedShow; /平均速度显示标志bit TotalDistanceShow; /总路程显示标志bit ReturnMain; /返回主菜单标志bit AutoDisplay; /自动显示标志bit GoToChoosingDisplay; /人工选择标志bit AutoMode=0;char PassLineID

15、=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(); /初始化

16、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(LC

17、D_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(ModeSelecte

18、d=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) /如果按下确定键,则设置模式为Cur

19、ve,并跳出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;br

20、eak;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)

21、;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;

22、/如果什么键都没有按下,那么一直显示等待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,并跳出

23、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) /如果按下确定键,则设置速度为Hig

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

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