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

合集下载

pwm调速循迹避障小车的总结与体会

pwm调速循迹避障小车的总结与体会

PWM调速循迹避障小车是一种基于单片机控制系统的智能小车,具有很高的实用价值和教学意义。

在实际应用中,PWM调速循迹避障小车可以应用于智能家居、智能物流等领域,为人们的生活和工作带来便利。

在设计和制造PWM调速循迹避障小车的过程中,我们经历了许多挑战和收获了许多成果。

在此,我将共享我对PWM调速循迹避障小车的总结与体会。

一、总结1. PWM调速原理PWM即脉冲宽度调制,是一种用来调节模拟电路的技术。

在PWM 调速循迹避障小车中,我们通过改变电机工作周期内的通电时间来控制电机的转速,从而实现小车的速度调节。

2. 循迹原理循迹是指小车根据预设的路径行驶,通常使用红外线传感器、摄像头等设备来实现。

在PWM调速循迹避障小车中,我们利用红外线传感器来检测小车周围的环境,根据检测结果来调整小车的行驶方向,实现循迹功能。

3. 避障原理避障是指小车在行驶过程中遇到障碍物时,能够及时停车或绕行,避免发生碰撞。

在PWM调速循迹避障小车中,我们通过超声波传感器等设备来检测前方障碍物的距离,根据检测结果来控制小车的行驶,实现避障功能。

4. 控制系统PWM调速循迹避障小车的控制系统由单片机、传感器、驱动电路和执行机构等部分组成。

通过单片机对传感器检测结果的分析和处理,再通过驱动电路和执行机构的协调工作,实现对小车的调速、循迹和避障控制。

二、体会1. 技术挑战在设计和制造PWM调速循迹避障小车的过程中,我们遇到了许多技术挑战,比如传感器的精度和稳定性、控制算法的优化等。

通过不断的尝试和改进,我们最终克服了这些挑战,成功实现了小车的功能。

2. 团队合作制造PWM调速循迹避障小车是一个涉及多个领域知识的复杂任务,需要团队成员之间的合作和协调。

在这个过程中,我们学会了有效的交流和合作,培养了团队精神,提高了解决问题的能力。

3. 实践意义通过制造PWM调速循迹避障小车,我们不仅加深了对相关知识的理解,还锻炼了动手能力和解决实际问题的能力。

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。

pwm调速控制小车循迹壁障c程序

pwm调速控制小车循迹壁障c程序

pwm调速控制小车循迹壁障c程序#include< reg51.h >#define uchar unsigned char#define uint unsigned int#define MOTOR_C P1 //P1口作为电机的控制口。

//#define SIGNAL P3 //P3口的低两位为循迹传感器输入口。

#define SHELVES 10 //速度总档数。

#define BACK 0xfa //后退。

#define FORWARD 0xf5 //前进。

sbit senserr = P3^2; //(右)循迹。

sbit senserl = P3^3; //(左)循迹。

sbit hwf = P3^0; //(前)红外壁障传感器入口。

sbit hwb = P3^1; //(后)红外壁障传感器入口。

sbit PWM_R = P1^0; //右电机PWM输入口。

sbit PWM_L = P1^2; //左电机PWM输入口。

sbit PWM_HR = P1^1; //(后退)右电机。

sbit PWM_HL = P1^3; //(后退)左电机。

void timer0_init( void ); //定时器0初始化函数。

void timer1_init( void ); //定时器1初始化函数。

void right( void ); //前进右转弯函数。

void left( void ); //前进左转弯函数。

void forward( void ); //前进函数。

void hright(void); //后退右转函数。

void hleft(void); //后退左转函数。

void back(void); //后退函数。

uchar percent_l = 0; //(前进)左轮占空比。

uchar percent_r = 0; //(前进)右轮占空比。

uchar percent_hl = 0; //(后退)左轮占空比。

51单片机智能小车按键调速前进程序源代码、电路原理图和电路器件表

51单片机智能小车按键调速前进程序源代码、电路原理图和电路器件表

51单片机智能小车按键调速前进程序源代码、电路原理图、电路器件表智能小车PWM调速是通过设置pwmval_left_init的和pwmval_right_init这2个变量的值来实现的,需要通过修改程序代码中这2个变量的值,这2个变量的值设置好后,在程序运行的过程中是不能修改的。

而智能小车的按键调速通过按键达到修改这2个变量的值,从而达到对智能小车调速的目的。

每按下K3按键一次,变量pwmval_left_init和pwmval_right_init减1,智能小车减速。

每按下K4按键一次,变量pwmval_left_init和pwmval_right_init加1,智能小车加速。

具体实现方法见下文的程序源代码。

下文主要提供了智能小车按键调速前进完整程序原代码、电路原理图以及电路器件表。

智能小车核心板原理图STC15W4K56S4智能小车核心板器件(BOM)表实物图060306030603PIN插针PIN2x1406030603直插LQFP7x7-48 STC15W4K56S4智能小车核心板正面STC15W4K56S4智能小车核心板背面智能小车驱动板原理图51单片机(STC15W4K56S4)智能小车驱动板器件(BOM)表实物图直插直插直插直插直插直插直插直插直插直插PIN与PIN之间的间隔2.54mm插电池盒PIN与PIN间隔2.54mm,插电机3PIN插针,针与针间隔2.54mm插舵机红色插针和黑色插针3.3V红色插针、GND黑色插针PIN红色插针和黑色插针5V PIN红色插针和黑色插针VINPIN与PIN之间的间隔2.54mm 插MQ2模块针与针间隔2.54mm插GP2Y1014AU模块针与针间隔2.54mm语音播报实验时,串口4插语音播报模块针与针间隔2.54mmIO扩展用,没有必要不要焊接针与针间隔2.54mm插DHT11模块用4PIN插针,针与针间隔2.54mm用杜邦线连接超声波模块针与针间隔2.54mm插蓝牙模块(要原厂原装的)用8PIN插针,针与针间隔2.54mm杜邦线连接红外循迹避障模块用4PIN插针,针与针间隔2.54mm用杜邦线连接测速模块针与针间隔2.54mm插5V的LCD1602液晶MPU6050不要焊接。

PWM调速循迹智能小车程序精编

PWM调速循迹智能小车程序精编

P W M调速循迹智能小车程序精编Lele was written in 202132m/*-------------------------------- 控速模块-----------------------------------*/#defineP03 P0_3 . ");DisplayString(0x0,1,"DesignedBy202");Delay(300);WriteCmd(LCD_CLS);EA=1; ");Delay(50);WriteCmd(LCD_CLS);IsSelectingMode=True;while(1){WriteCmd(LCD_CLS);DisplayString(0x0,0," LineMode ");DisplayString(0x0,1,"Next Yes");Delay(300); . ");DisplayString(0x0,1,"Designedby202");if(SelectedMode==Line&&AutoMode==0)flag=Area0;elseflag=1;while(flag<5){if(AutoMode==1) ;DisplaySingleChar(0x07,1,PassTime2); DisplaySingleChar(0x08,1,PassTime3);}else{DisplaySingleChar(0x04,1,PassTime1); DisplaySingleChar(0x05,1,PassTime2); DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,PassTime3); DisplaySingleChar(0x08,1,PassTime4);}}/*------------------------------------ 显示平均速度----------------------------------------*/ voidDisplayAVGSpeed(void){intSpeed1=0x30; ;DisplaySingleChar(0x07,1,Speed2); DisplaySingleChar(0x08,1,Speed3);}/*------------------------------------- 显示路程----------------------------------------*/ voidDisplayDistance(void){intDistance1=0x30;intDistance2=0x30;intDistance3=0x30;intDistance4=0x30;if((int)(Distance*100)<100){Distance1+=0;Distance2+=(int)(Distance*100)/10;Distance3+=(int)(Distance*100)%10;}elseif((int)(Distance*100)>100&&(int)(Distance*100)<1000){Distance1+=(int)(Distance*100)/100;Distance2+=(int)(Distance*100)/10%10;Distance3+=(int)(Distance*100)%10;}else{Distance1+=(int)(Distance*100)/1000; Distance2+=(int)(Distance*100)/100%10; Distance3+=(int)(Distance*100)/10%10; Distance4+=(int)(Distance*100)%10;}if((int)(Distance*100)<1000){DisplaySingleChar(0x05,1,Distance1); DisplaySingleChar(0x06,1,'.'); DisplaySingleChar(0x07,1,Distance2); DisplaySingleChar(0x08,1,Distance3); }else{DisplaySingleChar(0x04,1,Distance1); DisplaySingleChar(0x05,1,Distance2); DisplaySingleChar(0x06,1,'.'); DisplaySingleChar(0x07,1,Distance3); DisplaySingleChar(0x08,1,Distance4); }}/*------------------------------------- 中断初始化-------------------------------------*/voidINTInit(void){EA=1; //开总中断IT0=1; //INTO边沿触发PX0=1; //INTO优先级为高级EX1=1; //开INT1中断IT1=1; //INT1边沿触发PX1=1; //INT1优先级为高级Clock0_Init(); //初始化时钟中断TMOD=0x11; //T0/T1定时方式1ET0=0x01; //开T0中断ET1=0x01; //开T1中断}voidClock0_Init(void){TR0=0x01; //启动T0TH0=Thx0; //定时初值TL0=Tlx0;}voidClock1_Init(void){TR1=0x01; //启动T1TH1=0x3C; //定时初值-50ms中断一次TL1=0x0B0;}/************************************************** *****************************************\** 中断处理程序**\************************************************** *****************************************//*----------------------------------- 外部中断0----------------------------------------*\外部中断0有两个功能(1)作为菜单选择的Next键(2)作为测速的计数器\*-----------------------------------------------------------------------------------------*/ voidSpeedINT(void)interrupt0 //中断INT0{if(SelectedAll==False) //如果模式和速度还没有选择完毕,则此中断作为Next键Next=True;if(Running==True) //如果模式和速度已经选择完毕,则此中断作为测速中断SpeedCount++;if(ChoosingDisplay==True) //如果是在选择要显示的内容Next=True;}/*----------------------------------- 外部中断----------------------------*\外部中断1有两个功能(1)作为菜单选择的确定键/返回键(2)控速\*-----------------------------------------------------------------------------------------*/ voidCtrSpeedINT(void)interrupt2 //中断INT1{if(SelectedAll==False) //如果模式和速度还没有选择完毕,则此中断作为确定键{if(IsSelectingMode==True) //模式选择标志ModeSelected=True;if(IsSelectingSpeed==True) //速度选择标志SpeedSelected=True;}if(Running==True) //如果模式和速度选择已经完毕,则此中断作为控速中断{if(Area0==0) //经过第一条铁线(即起跑线),开始计时,开始测速{EX0=1;Clock1_Init();P31=0; //过起跑线,背光灭}if(Area0==1)LowSpeedArea1StartTime=PassTime; //读取进入第一个低速区的时刻if(Area0==2)LowSpeedArea1EndTime=PassTime;//读取离开第一个低速区的时刻,也就是进入高速区的时刻if(Area0==3)HighSpeedAreaEndTime=PassTime;//读取离开高速区的时刻,也就是进入第二个低速区的时刻if(Area0==4)LowSpeedArea2EndTime=PassTime; //读取离开第二个低速去的时刻if(AutoMode==1) //自动模式{PassLine++;switch(PassLine){case5 :PassLineID=1;break;case10:PassLineID=2;break;default:PassLineID=PassLineID;break;}else{if(SelectedMode==Line) //直线模式{Thx0=Thx[Area0++];Tlx0=Tlx[Area1++];if(Area0==5)EX1=0;}else //S型模式{Nocurve++;Round++;if(Roundid==1&&Round==2){Round++;Roundid=0;}Back=0;Back0=0;EX1=0;}}IE1=0;if(AutoDisplay==True){GoToChoosingDisplay=True;}if(ChoosingDisplay==True){SelectedShow=True;SelectedReturn=True;Selected=True;}}/*-------------------------------------- T0中断----------------------------------------*\T0中断用来输出方波以控制速度\*-----------------------------------------------------------------------------------------*/voidTime0INT(void)interrupt1 //T0中断{if(AutoMode==1){IsT0INT*=-1;switch(PassLine){ case2 :PrepareDistance=Distance;break;case3 :FirstDistance=Distance-PrepareDistance;break; case4 :SecondDistance=Distance-PrepareDistance-FirstDistance;break;case5 :ThirdDistance=Distance-PrepareDistance-FirstDistance-SecondDistance;break;default:break;}switch(PassLineID){case0 :{if(IsT0INT==1){TR0=0x01;TH0=0xec;TL0=0x78;} //5mselse{TR0=0x01;TH0=0xb1;TL0=0xe0;} //20ms}break;case1 :{if(PassLine==5){FirstHigh=(int)(65536-20*FirstDistance/(15*Count*Rate-FirstDistance)*1000);SecondHigh=(int)(65536-20*SecondDistance/(15*Rate-SecondDistance)*1000);ThirdHigh=(int)(65536-20*FirstDistance/(15*Count*Rate-FirstDistance)*1000);TR0=0x01;TH0=0xf4;TL0=0x48;}}break;case2 :{AutoMode=0;SelectedMode=Line;Area0=Area1=0;PassTime =0;Distance=0;TR0=0x01;TH0=0xf4;TL0=0x48;Thx[0]=Thx[1]=((FirstHigh &0xf0)>>8);Tlx[0]=Tlx[1]=(FirstHigh&0x0f);Thx[2]=Thx[2]=((SecondHigh&0xf0)>>8);Tlx[2]=Tlx[2]= (SecondHigh&0x0f);Thx[3]=Thx[3]=((ThirdHigh &0xf0)>>8);Tlx[3]=Tlx[3]=(ThirdHigh&0x0f);Thx[4]=Thx[4]=0xff;Tlx[4]=Tlx[4]=0xff;}break;default:break;}}else{if(SelectedMode==Line) {IsT0INT*=-1;if(Area0<5){if(IsT0INT==1)Clock0_Init();else{TR0=0x01; //启动T0TH0=Thx1; //定时初值TL0=Tlx1;}}elseIsT0INT=-1;else{IsT0INT2*=-1;if(IsT0INT2==1){TR0=0x01;TH0=0xd8;TL0=0xf0;} //10ms else{TR0=0x01;TH0=0xb1;TL0=0xe0;} //20ms Back++;if(Back>=90)Back0=70;if((Nocurve<2)&&(Back0>0)&&Back!=0) {if(Back0<=65)Roundid=1;Back0--;}if((Nocurve>2)&&Back>=450){Stop=1;IsT0INT2=-1;}if(Stop==1)flag=6;}TF0=0;}/*----------------------------------- T1中断----------------------------------------*\T1中断用来定时\*-----------------------------------------------------------------------------------------*/voidTime1INT(void)interrupt3 //T1中断{Clock1_Init();Time1INTCount++;if(Time1INTCount==10) //500ms扫描一次{IsT1INT=1;if(Area0>5)P03=0;Time1INTCount=0;}TF1=0;}。

智能循迹小车程序

智能循迹小车程序

智能小车程序(共三个)第一个:#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++)P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}第二个:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit moto1=P1^5;sbit moto2=P1^6;sbit moto3=P2^0;sbit moto4=P2^1;sbit en1=P1^7;sbit en2=P2^2;//*循迹口七个红外传感器*///////////////sbit left1=P1^0;//*左边传感器*//sbit left2=P1^1;sbit left3=P1^2;sbit mid=P1^3;//*黑线位置*//sbit right1=P1^4;sbit right2=P2^3;sbit right3=P2^4;//*右边传感器*//////////////// sbit hled=P0^0;sbit bled=P0^1;sbit lled=P0^2;sbit rled=P0^3;sbit bizhang=P2^5;uchar pro_head;uchar pro_back;uchar i;uchar j; //前后占空比标志void delay(uint z){uchar i;while(z--){for(i=0;i<121;i++);}}/********初始化定时器,中断************/ void init(){TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;TR0=1;en1=1;en2=1;}void time0(void) interrupt 1{i++;j++;if(i<=pro_back){en1=1;}else{en1=0;}if(i==40){en1=~en1;i=0;}if(j<=pro_head){en2=1;}else{en2=0;}if(j==40){en2=~en2;j=0;}TH0=(65536-100)/256;TL0=(65536-100)%256;}void qianjin()//*直行*///////////////////// {pro_back=15;pro_head=5;moto1=0;moto2=0;moto4=0;lled=1;rled=1;bled=1;}void turn_right1()//*右转1函数*//{pro_back=10;pro_head=15;moto1=0;moto2=1;moto3=1;moto4=0;}。

智能小车速度控制程序

智能小车速度控制程序
Right_moto_go ; //右电机往前走
}
//右转
void rightrun(void)
{
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往前走
}
//停转
void stoprun(void)
{
Left_moto_Stop ; //左电机往前走
Right_moto_Stop ; //右电机往前走
//外部0中断用于计算左轮的脉冲
void intersvr1(void) interrupt 0 using 1
{
count1++;
}
/************************************************************************/
//前速前进
void run(void)
#include<AT89x51.H>
#define Left_1_led P3_4//P3_2接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
#define Left_2_led P3_5//P3_3接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
#define Right_1_led P3_6//P3_4接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
P1_4 P1_5 接IN5 IN6 当 P1_4=1,P1_5=0; 时右上电机正转右上电机接驱动板子输出端(蓝色端子OUT5 OUT6)
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=1; 时右上电机反转
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=0; 时右上电机停转

智能寻迹避障小车电机调速控制程序设计

智能寻迹避障小车电机调速控制程序设计
VCCBAT RX1 10K INPUT2 INPUT3 OUTPUT2 OUTPUT3 C14 104 OUTPUT4 GND GND M2 DC C2 GND IC3 INPUT1 OUTPUT1 C15 104 M1 DC 104 VCCBAT RM1 跳线
INPUT4 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RESET P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 XLA1 XLA2 Gnd IC1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 STC89C52 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 Vcc P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 EA ALE PSEN P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 VCCBAT ENA ENB GND GND L293D
1.1.3 单片机的定时器原理
例如,如要求计数值为1000,则初值为: 根据:X=M-N X=M-1000 =8192-1000 =1C18H =11100000 1 1000B 即赋初值时,TH0=0xE0,TL0=0x18。
1.1.3 单片机的定时器原理
TMOD 0 0
M0 M1 C/T GATE 振荡器
1.1.3 单片机的定时器原理
7 0
T1
P3.5(T1)
7 0 7 0
T0
P3.4(T0)
7 0
TH1
TL1
TH0
TL0
微 处 理 器

PWM调速 循迹__智能小车程序文件

PWM调速 循迹__智能小车程序文件

//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K 的上拉电阻。

/* 晶振采用12M,产生的PWM的频率约为100Hz */#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit en1=P3^4; /* L298的Enable A */sbit en2=P3^5; /* L298的Enable B */sbit s1=P1^0; /* L298的Input 1 */sbit s2=P1^1; /* L298的Input 2 */sbit s3=P1^3; /* L298的Input 3 */sbit s4=P1^2; /* L298的Input 4 */sbit R=P2^0;sbit C=P2^1;sbit L=P2^2;sbit key=P1^4;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++;}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();}}}}}}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 Thx[5]={0xf4,0xf4,0xc5,0xf4,0xff}; //3ms,3ms,15ms,3ms char Tlx[5]={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并跳出{Thx[0]=0xec;Tlx[0]=0x78; //5msThx[1]=0xf0;Tlx[1]=0x60; //4msThx[2]=0x8a;Tlx[2]=0xd0; //30msThx[3]=0xf4;Tlx[3]=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,并跳出{Thx[0]=0xe0;Tlx[0]=0xc0;//8msThx[1]=0xe0;Tlx[1]=0xc0; //8msThx[2]=0x63;Tlx[2]=0xc0; //40msThx[3]=0xec;Tlx[3]=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;}else{P01=P02=P03=P04=0;}}break;case1 :{P01=P02=P03=0;P04=1;}break;case2 :{P01=P02=P04=0;P03=1;}break;default:break;}}else{if(SelectedMode==Line) //直线模式{flag=Area0;if(IsT0INT==1){P03=1;P04=0;P01=P02=0;}else{P03=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;}else{P01=0;P02=1;P03=0;P04=1;}Back=1;}else{if(Round==0){if(IsT0INT2==1){P01=0;P02=0;P03=1;P04=0;}else{P01=0;P02=0;P03=0;P04=0;}}else{if(P33==0){if(IsT0INT2==1){P01=0;P02=0;P03=1;P04=0;}else{P01=0;P02=0;P03=0;P04=0;}}else{EX1=1;if(Round%2){if(IsT0INT2==1){P01=1;P02=0;P03=1;P04=0;Backid=1;}else{P01=1;P02=0;P03=0;P04=0;}}else{if(IsT0INT2==1){P01=0;P02=1;P03=1;P04=0;Backid=0;}else{P01=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) //通过高速区的时间超过s DisplaySingleChar(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(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");DisplayDistance();DisplayString(0x0A,1,"m");ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能Delay(250); //延时消除抖动}}}if(ReturnMain==True) //按下了返回键,返回主菜单{ReturnMain=False;continue;}/*------------------------------------第四次按键--------------------------------------*/while(1){if(Next==True)break;if(SelectedShow==True)break;}if(Next==True) //所有菜单项已经显示完毕,返回主菜单{Next=False;ReturnMain=False;ReturnSelection=False;if(TotalDistanceShow==False){WriteCmd(LCD_CLS);DisplayString(0x0,0,"TotalDistance");DisplayString(0x0,1,"Next Show");TotalDistanceShow=True;Delay(250); //延时消除抖动}}if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection==True) //按下的是返回键ReturnMain=True;if(ReturnSelection==False){if(TotalDistanceShow==True){WriteCmd(LCD_CLS);DisplayString(0,0,"TotalDistance");DisplayDistance();DisplayString(0x0A,1,"m");ReturnSelection=True;//按下了确定键,那么这个时候开启返回键的功能Delay(250); //延时消除抖动}}}if(ReturnMain==True) //按下了返回键,返回主菜单{ReturnMain=False;continue;}/*------------------------------------第五次按键--------------------------------------*/while(1){if(Next==True)break;if(SelectedShow==True)break;}if(Next==True) //所有菜单项已经显示完毕,返回主菜单{Next=False;ReturnMain=False;ReturnSelection=False;if(TotalDistanceShow==True) //最后一个选项已经显示完毕,返回主菜单{ReturnMain=True;}}if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection==True) //按下的是返回键ReturnMain=True;if(ReturnSelection==False){if(TotalDistanceShow==True){WriteCmd(LCD_CLS);DisplayString(0,0,"TotalDistance");DisplayDistance();DisplayString(0x0A,1,"m");ReturnSelection=True; //按下了确定键,那么这个时候开启返回键的功能Delay(250); //延时消除抖动}}}/*------------------------------------第六次按键--------------------------------------*/while(1){if(Next==True)break;if(SelectedShow==True)break;}if(Next==True){Next=False;ReturnMain=False;ReturnSelection=False;}if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;}continue;}while(1);}/****************************************************************************** **********\** LCD驱动模块 **\****************************************************************************** **********//*--------------------------------- LCD初始化函数--------------------------------------*/voidLCDInit(void){//三次显示模式设置LCD_Data=0;LCD_E=Disable;Delay(5);WriteCmd(LCD_Init);Delay(5);WriteCmd(LCD_Init);Delay(5);WriteCmd(LCD_Init);WriteCmd(LCD_Init); //初始化WriteCmd(LCD_CloseCtr); //关显示WriteCmd(LCD_CLS); //清屏幕WriteCmd(LCD_EnterSet); //光标移动设置WriteCmd(LCD_DispCtr); //显示开以及光标设置}/*--------------------------------- LCD模式设置函数--------------------------------------*\SetWriteCmd() 设置LCD为写命令模式SetReadCmd() 设置LCD为读命令模式SetWriteData() 设置LCD为写数据模式\*----------------------------------------------------------------------------------------*/voidSetWriteCmd(void){LCD_RW=Write;LCD_RS=Cmd;}voidSetReadCmd(void){LCD_RW=Read;LCD_RS=Cmd;}voidSetWriteData(void){LCD_RW=Write;LCD_RS=Data;}/*--------------------------------- LCD功能执行函数--------------------------------------*\WriteCmd() 写命令WriteData() 写数据ExecuteCmd() 执行命令SetXY() 显示定位DisplaySingleChar() 显示单个字符DisplayString() 显示一串字符IsBusy() 忙标志检测\*----------------------------------------------------------------------------------------*/voidWriteCmd(charcmd){while(IsBusy());LCD_Data=cmd;SetWriteCmd();ExecuteCmd();}voidWriteData(charddata){while(IsBusy());LCD_Data=ddata;SetWriteData();ExecuteCmd();}voidExecuteCmd(void){LCD_E=Enable;LCD_E=Disable;}voidSetXY(charx,chary){if(y)x|=0x40;x|=0x80;Delay(5);WriteCmd(x);}voidDisplaySingleChar(charx,chary,charcchar){SetXY(x,y);WriteData(cchar);}voidDisplayString(charx,chary,char*str){while(*str){Delay(5);DisplaySingleChar(x++,y,*str);str++;}}bitIsBusy(void){LCD_Data=0xFF;SetReadCmd();ExecuteCmd();return(bit)(P1&0x80);}/*------------------------------------- 延时函数-------------------------------------*/voidDelay(unsignedinttime){unsignedinttimeCounter=0;for(timeCounter=time;timeCounter>0;timeCounter--)DelayUs(255);}voidDelayUs(unsignedinttime){unsignedinttimeCounter=0;for(timeCounter=0;timeCounter<time;timeCounter++)_nop_();}/****************************************************************************** *************\** LCD显示模块**\****************************************************************************** *************/voidComputeTime(void){if(Area0<5)PassTime+=0.5;}voidComputeSpeedANDDistance(void){Speed=SpeedCount/4*CircleLength; //计算瞬时速度Distance+=Speed; //计算距离SpeedCount=0;}/*------------------------------------- 显示时间----------------------------------------*/voidDisplayTime(void){charPassTime1=0x30;charPassTime2=0x30;charPassTime3=0x30;charPassTime4=0x30;if((int)PassTime*100<100) //时间未够1s{PassTime1+=0;PassTime2+=(int)(PassTime*100)/10;PassTime3+=(int)(PassTime*100)%10;}elseif((int)(PassTime*100)>100 &&(int)(PassTime*100)<1000)//够1s而未够10s {PassTime1+=(int)(PassTime*100)/100;PassTime2+=(int)(PassTime*100)/10%10;PassTime3+=(int)(PassTime*100)%10;}else{PassTime1+=(int)(PassTime*100)/1000;PassTime2+=(int)(PassTime*100)/100%10;PassTime3+=(int)(PassTime*100)/10%10;PassTime4+=(int)(PassTime*100)%10;}if((int)(PassTime*100)<1000){DisplaySingleChar(0x05,1,PassTime1);DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,PassTime2);DisplaySingleChar(0x08,1,PassTime3);}else{DisplaySingleChar(0x04,1,PassTime1);DisplaySingleChar(0x05,1,PassTime2);DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,PassTime3);DisplaySingleChar(0x08,1,PassTime4);}}/*------------------------------------ 显示平均速度----------------------------------------*/voidDisplayAVGSpeed(void){intSpeed1=0x30; //初始化为0的ASCII码intSpeed2=0x30;intSpeed3=0x30;if((int)(Distance/PassTime*100)<100){Speed1+=0;Speed2+=(int)(Distance/PassTime*100)/10;Speed3+=(int)(Distance/PassTime*100)%10;}else{Speed1+=(int)(Distance/PassTime*100)/100;Speed2+=(int)(Distance/PassTime*100)/10%10;Speed3+=(int)(Distance/PassTime*100)%10;}DisplaySingleChar(0x05,1,Speed1);DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,Speed2);DisplaySingleChar(0x08,1,Speed3);}/*------------------------------------- 显示路程----------------------------------------*/voidDisplayDistance(void){intDistance1=0x30;intDistance2=0x30;intDistance3=0x30;intDistance4=0x30;if((int)(Distance*100)<100){Distance1+=0;Distance2+=(int)(Distance*100)/10;Distance3+=(int)(Distance*100)%10;}elseif((int)(Distance*100)>100 &&(int)(Distance*100)<1000){Distance1+=(int)(Distance*100)/100;Distance2+=(int)(Distance*100)/10%10;Distance3+=(int)(Distance*100)%10;}else{Distance1+=(int)(Distance*100)/1000;Distance2+=(int)(Distance*100)/100%10;Distance3+=(int)(Distance*100)/10%10;Distance4+=(int)(Distance*100)%10;}。

智能小车的PWM键盘控制电机程序

智能小车的PWM键盘控制电机程序

智能小车的PWM键盘控制电机程序这个是从一个制作成功的智能小车里面提取出来的 全部的制作资料下载:51hei/bbs/dpj-19526-1.html 下面是程序预览:#includesbit P00=P0; //循迹口sbit P01=P0 ;sbit P02=P0 ; sbit P04=P0 ; //电机1左轮sbit P05=P0 ; sbit P06=P0 ; //电机2sbit P07=P0 ;unsigned int i=0,j=0;void main(){ while(1) { P04=1;P05=1;P06=1; P07=1; TMOD=0X01; EA=1; ET0=1;if(P00==0&&P01==1&&P02==0) // 小车直走定时0.002ms{TH0=0XFF; //定时0.01msTL0=0xFe;TR0=1;}if(P00==0&&P01==0&&P02==1) //小车右转定时0.005ms { TH0=0XFF; TL0=0Xfb; TR0=1; } if(P00==1&&P01==0&&P02==0) //小车左转定时0.005ms { TH0=0XFF; TL0=0XFb; TR0=1; } if(P00==1&&P01==1&&P02==1) //全部检测到黑线时车停{ TH0=0XFF; TL0=0Xfb; TR0=1; }}} xiong() interrupt 1{ if(P00==0&&P01==1&&P02==0) //小车直线快走定时0.002ms { TH0=0XFF; TL0=0xFe; P04=0;//电机1左轮P05=1;P06=1; //电机2 右转P07=0; } if(P00==0&&P01==0&&P02==1) //小车右转定时0.005ms { TH0=0XFF; TL0=0Xfb; P04=1;//电机1 左轮P05=1; P06=1; //电机2P07=0;i=1; } if(P00==0&&P01==0&&P02==0&&i==1) // 特别{TH0=0XFF; TL0=0Xfb; P04=1; P05=1; P06=1; P07=0; j=0; } if(P00==1&&P01==0&&P02==0) //小车左转定时0.005ms { TH0=0XFF; TL0=0XFb; P04=0;//电机1 P05=1; P06=1; //电机2 P07=1; j=1; } if(P00==0&&P01==0&&P02==0&&j==1) // 特别{ TH0=0XFF;。

基于单片机的调速寻迹小车

基于单片机的调速寻迹小车
电机驱动模块:将PWM信号转 换为适当的电压以驱动电机
光电传感器或红外传感器: 用于检测寻迹路径,并将检 测到的信号传递给51单片机
小车底盘和电机:用于实际 运动和执行PWM调速
基于51单片机的PWM调速寻迹小车
二、PWM调速原 理
PWM调速的原理是基 于调节电压的平均值 。通过改变脉冲宽度 ,我们可以改变电压 的平均值,从而控制 电机的转速。例如, 较宽的脉冲会产生较 高的平均电压,导致 电机以更高的速度旋 转
-
THE END
感谢您的观看
THANK 迹小车
三、软件实现
为了实现PWM调速和寻迹功能,我们需要编写相应的软件代码。以下是一个简化的伪代码 示例
这个示例代码使用了简单的占空比调节来实现PWM调速。在实际应用中,我们可能需要使 用更复杂的算法来优化速度和转向控制。此外,根据实际硬件配置和电机类型,可能还需 要调整PWM模块和电机驱动模块的参数以达到最佳性能
模拟信号的电压值
基于51单片机的PWM调速寻迹小车
一、硬件配置
首先,我们需要为51单片机连接适当的硬件以实现PWM控制和寻迹功能。以下是一个基本 的硬件配置列表
51单片机:作为主控制器,负责处理PWM信号和控制逻辑 PWM驱动模块:用于生成可调脉宽的PWM信号,以控制小车的速度
基于51单片机的PWM调速寻迹小车
xxxxxxxxx
基于51单片机的 PWM调速寻迹小车
xxxxxx:xxx
xxxxxxxxx
-
目录
CONTENTS
1
一、硬件配置
2
二、PWM调速原理
3
三、软件实现
2
基于51单片机的PWM调速寻迹小车
1
在本文中,我们将探讨 如何使用51单片机(MCU) 来控制PWM调速以实现寻

51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图、电路器件表从控制电路角度划分,智能小车电路板分为核心板和驱动板。

核心板上的处理器的芯片型号是:STC15W4K56S4,这是一款51单片机。

驱动板上有电源电路、电机驱动电路以及一些功能模块接口。

智能小车前进只要控制智能小车四个轮子向前转动就可以了。

智能小车四个轮子由四个直流减速电机驱动。

直流减速电机驱动芯片采用L293D,一片电机驱动芯片L293D可以驱动两个直流减速电机,智能小车用到4个直流减速电机,需要用到两片L293D电机驱动芯片。

但有时候我们需要控制智能小车的速度,不希望智能小车全速前进。

比如在“智能小车循迹实验”中,如果智能小车速度过快,来不及反应做出方向的调整,智能小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。

那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。

智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。

在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。

不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。

这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。

这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。

智能小车PWM调速前进程序如下:首先,定义了2个变量,这2个变量用于设置智能小车的速度。

unsigned char pwmval_left_init=6; //调节此值可以调节小车的速度。

unsigned char pwmval_right_init=6; //调节此值可以调节小车的速度。

通过以下函数初始化定时器0,每1毫秒中断一次。

void Timer0_Init(void) //定时器0初始化{TMOD=0x01;TH0=0xf8;TL0=0xcd;TR0=1;ET0=1;EA=1;}下面我们看定时器0的中断处理函数。

智能小车系统设计(循迹-超声波-遥控)

智能小车系统设计(循迹-超声波-遥控)

智能小车系统设计(循迹-超声波-遥控)智能小车系统是一种通过各种传感器来控制小车行进的系统。

本文将介绍一种基于循迹、超声波和遥控的智能小车系统设计。

系统设计硬件设计本系统采用Arduino开发板和小车底盘作为硬件,以循迹模块、超声波模块和遥控器模块作为传感器,可以实现小车的智能行驶。

1.小车底盘:本系统采用智能小车底盘,主要包括两个直流电机和两个轮子,可以控制小车行进的方向和速度。

此外,小车底盘还需配有4片AA电池进行供电。

2.循迹模块:循迹模块是通过红外线传感器检测黑色轨道上的反光点实现的。

根据反光点的位置,循迹模块会控制小车的方向,使小车始终在轨道上行驶。

3.超声波模块:超声波模块可以检测小车前方的障碍物距离和方向。

如果检测到前方有障碍物,则系统会控制小车减速或停止,避免碰撞。

4.遥控器模块:遥控器模块可以通过无线信号控制小车的方向和速度,可以让小车在没有循迹和超声波控制的情况下自由行驶。

软件设计本系统的软件设计采用Arduino的开发环境进行编写,主要包括循迹控制、超声波控制和遥控控制三个部分。

1.循迹控制:循迹控制部分主要是通过循迹模块检测反光点的位置,控制小车的方向和速度。

如果小车偏离轨道,循迹控制部分会自动调整小车的方向,使其回到轨道上行驶。

2.超声波控制:超声波控制部分主要是通过超声波模块检测前方障碍物的距离和方向,如果距离过近,则超声波控制部分会控制小车减速或停止,并发出声音提示。

3.遥控控制:遥控控制部分是通过遥控器发出信号控制小车行驶。

使用者可以通过遥控器控制小车的方向和速度,可以实现小车的自由行驶。

实现效果循迹效果本系统的循迹效果非常稳定,可以实现小车在黑色轨道上高速行驶。

在循迹模块检测到偏离轨道时,系统能够及时作出调整,使小车回到轨道上行驶。

超声波效果超声波模块能够准确地检测到前方障碍物的距离和方向。

如果距离过近,则系统能够及时控制小车减速或停止,避免碰撞。

遥控效果遥控器模块可以实现小车的自由行驶。

PWM的调速原理与应用—小车调速

PWM的调速原理与应用—小车调速

17-2. P89V51RD2的PWM功能模块结构与应用 的 功能模块结构与应用
P89V51RD2的几个重要寄存器
CMOD-PCA计数器方式寄存器 - 计数器方式寄存器 CCON-PCON计数器控制寄存器 - 计数器控制寄存器 CCAPMn-PCA模块比较 捕获寄存器(n=1、2、3、4、5) - 模块比较/捕获寄存器 模块比较 捕获寄存器( 、 、 、 、 )
11
置位CCON寄存器的中断标志位 寄存器的中断标志位CCFn。 置位 寄存器的中断标志位 。 脚翻转。 使CEXn脚翻转。 脚翻转
电子发烧友 电子技术论坛SiChuan Engineering Technical College-1959
00:fosc/6 : 01:fosc/12 : 10:定时器0溢出 :定时器 溢出 11:ECI/P1.2脚的外部时钟 : 脚的外部时钟
ECF:PCA使能计数溢出中断:ECF=1时,使能寄存器 : 使能计数溢出中断: 位的中断。 使能计数溢出中断 时 使能寄存器CCON CF位的中断。ECF=0时, 位的中断 时 禁止该功N能 禁止该功 能。
CMOD-PCA计数器方式寄存器 - 计数器方式寄存器
位 符号 D7 CIDL D6 WDTE D5 D4 D3 D2 CPS1 D1 CPS0 D0 ECF
CIDL:计数器空闲控制:CIDL=0时,空闲模式下 :计数器空闲控制: 计数器继续工作。 时 空闲模式下PCA计数器继续工作。CIDL=1时, 计数器继续工作 = 时 空闲模式下PCA计数器禁能。 计数器禁能。 空闲模式下 计数器禁能 WDTE:看门狗定时器使能:WDTE=0时,禁止模块 的看门狗定时器功能。WDTE=1 :看门狗定时器使能: 的看门狗定时器功能。 时 禁止模块4的看门狗定时器功能 时使能看门狗定时器。 时使能看门狗定时器。 CPS1、CPS0 :PCA计数脉冲选择。 、 计数脉冲选择。 计数脉冲选择

智能小车PWM调速

智能小车PWM调速

智能小车 PWM调速1、 PWM原理2、调制器设计思想3、具体实现设计一、 PWM(脉冲宽度调制Pulse Width Modulation)原理:脉冲宽度调制波通常由一列占空比不同的矩形脉冲构成,其占空比与信号的瞬时采样值成比例。

图1所示为脉冲宽度调制系统的原理框图和波形图。

该系统有一个比较器和一个周期为Ts的锯齿波发生器组成。

语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。

因此,从图1中可以看出,比较器输出一列下降沿调制的脉冲宽度调制波。

通过图1b的分析可以看出,生成的矩形脉冲的宽度取决于脉冲下降沿时刻t k时的语音信号幅度值。

因而,采样值之间的时间间隔是非均匀的。

在系统的输入端插入一个采样保持电路可以得到均匀的采样信号,但是对于实际中tk-kTs<<Ts的情况,均匀采样和非均匀采样差异非常小。

如果假定采样为均匀采样,第k个矩形脉冲可以表示为:(1)其中,x{t}是离散化的语音信号;Ts是采样周期;是未调制宽度;m是调制指数。

然而,如果对矩形脉冲作如下近似:脉冲幅度为A,中心在t = k Ts处,在相邻脉冲间变化缓慢,则脉冲宽度调制波xp(t)可以表示为:(2)其中,。

无需作频谱分析,由式(2)可以看出脉冲宽度信号由语音信号x(t)加上一个直流成分以及相位调制波构成。

当时,相位调制部分引起的信号交迭可以忽略,因此,脉冲宽度调制波可以直接通过低通滤波器进行解调。

二、数字脉冲宽度调制器的实现:实现数字脉冲宽度调制器的基本思想参看图2。

图中,在时钟脉冲的作用下,循环计数器的5位输出逐次增大。

5位数字调制信号用一个寄存器来控制,不断于循环计数器的输出进行比较,当调制信号大于循环计数器的输出时,比较器输出高电平,否则输出低电平。

循环计数器循环一个周期后,向寄存器发出一个使能信号EN,寄存器送入下一组数据。

在每一个计数器计数周期,由于输入的调制信号的大小不同,比较器输出端输出的高电平个数不一样,因而产生出占空比不同的脉冲宽度调制波。

带PWM调速的小车循迹程序

带PWM调速的小车循迹程序

//ICC-A VR application builder : 2010-9-21 10:22:14// Target : M16// Crystal: 8.0000Mhz#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intuint discrepancy=0;//function declarationvoid port_init(void);void motor(uchar index, uchar speed); //input PWM wave(PWM波输入)void sensor_state(void); //get the running condition (运行情况)void revise_to_line(void ); /0=run forward,1=left,2=right,3=sever left,4=sever rightvoid delayms(uint MS) ;//call this routine to initialize all peripherals【调用这个程序初始化所有的外围设备】void init_devices0(void){//stop errant interrupts until set upCLI(); //disable all interrupts【禁用所有中断】timer0_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x02; //timer interrupt sources【定时器中断源】SEI(); //re-enable interrupts【重设中断】//all peripherals are now initialized【现在所有外设的初始化】}//initialize T/C1【初始化T / C1】void timer1_init(void){TCCR1B = 0x00;//停止定时器TIMSK |= 0x00;//中断允许TCNT1H = 0x00;TCNT1L = 0x00;//初始值OCR1AH = 0x00;OCR1AL = 0xF0;//匹配A值OCR1BH = 0x00;OCR1BL = 0xF0;//匹配B值ICR1H = 0xFF;ICR1L = 0xFF;//输入捕捉匹配值TCCR1A = 0xA1;TCCR1B = 0x01;//启动定时器}//call this routine to initialize all peripherals【调用这个程序初始化所有的外围设备】void init_devices1(void){CLI(); //禁止所有中断timer1_init( );MCUCR = 0x00;MCUCSR = 0x80;//禁止JTAGGICR = 0x00;SEI();//开全局中断}//PWM 调速,通过改变占空比,周期性地开闭使能端,调节电机的有效电压。

智能小车设计PWM与循迹

智能小车设计PWM与循迹

智能小车设计PWM与循迹一、教学内容本节课的教学内容选自《智能小车设计与实践》教材的第四章,主要涉及PWM(脉冲宽度调制)技术与循迹算法在智能小车中的应用。

具体内容包括PWM技术的原理及其在智能小车速度控制中的应用,循迹算法的原理及其在智能小车行驶中的实现。

二、教学目标1. 让学生了解并掌握PWM技术的原理及其在智能小车速度控制中的应用。

2. 让学生了解并掌握循迹算法的原理及其在智能小车行驶中的实现。

3. 培养学生动手实践的能力,提高他们解决实际问题的能力。

三、教学难点与重点重点:PWM技术的原理及其在智能小车速度控制中的应用,循迹算法的原理及其在智能小车行驶中的实现。

难点:PWM技术的原理及其在智能小车速度控制中的应用,循迹算法的原理及其在智能小车行驶中的实现。

四、教具与学具准备教具:智能小车、编程器、实验板。

学具:教材《智能小车设计与实践》、笔记本电脑、实验器材。

五、教学过程1. 实践情景引入:让学生观察智能小车在直线行驶和转弯时的表现,引发学生对PWM技术和循迹算法的兴趣。

2. 知识讲解:讲解PWM技术的原理及其在智能小车速度控制中的应用,循迹算法的原理及其在智能小车行驶中的实现。

3. 例题讲解:通过示例代码,讲解如何使用编程器调整智能小车的PWM信号,实现速度控制;如何使用循迹算法,使智能小车按照预设的路径行驶。

4. 随堂练习:让学生分组进行实践,使用编程器调整智能小车的PWM信号,实现速度控制;使用循迹算法,使智能小车按照预设的路径行驶。

六、板书设计板书内容主要包括PWM技术的原理及其在智能小车速度控制中的应用,循迹算法的原理及其在智能小车行驶中的实现。

七、作业设计1. 请简述PWM技术的原理及其在智能小车速度控制中的应用。

2. 请简述循迹算法的原理及其在智能小车行驶中的实现。

3. 请编写一段代码,实现智能小车按照预设的路径行驶。

八、课后反思及拓展延伸课后反思:本节课学生掌握了PWM技术的原理及其在智能小车速度控制中的应用,循迹算法的原理及其在智能小车行驶中的实现。

pwm调速循迹避障小车的总结与体会 -回复

pwm调速循迹避障小车的总结与体会 -回复

pwm调速循迹避障小车的总结与体会-回复[pwm调速循迹避障小车的总结与体会]在完成PWM调速循迹避障小车的项目过程中,我收获了很多经验和体会。

经过激烈的思考与实践,我认为这个项目是一个很好的技术综合实践,既考察了理论知识的掌握,也锻炼了实际实施的能力。

首先,通过这个项目,我进一步深入了解了PWM调速的原理和实现方法。

PWM调速是通过改变电机驱动的占空比来控制电机的转速,利用这个方法实现循迹与避障功能。

在实践过程中,我熟悉了PWM调速的具体操作步骤,掌握了如何设置占空比和周期等参数,通过调整这些参数来达到控制电机转速的目的。

这让我对电机的控制有了更深入的理解,也提高了我的动手实验能力。

其次,实现循迹与避障功能也是这个项目的重要部分。

通过安装红外传感器和超声波传感器,我成功实现了小车在遇到障碍物时自动停下来,并通过循迹模块控制小车沿着黑线行驶的功能。

这个过程中,我不仅学习了传感器的原理和使用方法,还学会了如何将传感器的输出信号与控制电机的输入信号进行连接,实现自动控制。

这对我的电子电路设计和嵌入式系统开发能力有了很大的提升。

另外,软件编程也是这个项目中不可或缺的一环。

通过使用Arduino开发板和相应的编程语言,我成功编写了控制小车运动的程序。

在编程过程中,我学习了如何使用Arduino编程语言进行控制逻辑的设计,实现不同传感器数据的处理和判断,并通过控制引脚发送PWM信号给电机驱动模块。

这让我对嵌入式软件开发的理解更加深入,也培养了我的代码编写能力。

在项目执行的过程中,我还遇到了一些挑战和问题。

例如,在调试过程中,我发现小车的运动方向和速度有时候不够稳定,经过多次尝试和调整,才解决了这个问题。

另外,红外传感器和超声波传感器的精度也影响了小车的循迹和避障效果,需要进行反复调试和校准。

这些挑战让我更深刻地认识到技术实践中的问题解决能力的重要性,也提高了我的调试和故障排除能力。

通过完成这个项目,我不仅提高了自己的技术水平,还培养了团队合作和沟通能力。

可以用PWM实现小车变速

可以用PWM实现小车变速

可以用PWM实现小车变速,但有一点要提醒一下,就是频率不要太高,我调试的时候,频率高时电动机会发出刺耳的声音,具体程序如下:#include < reg51.h >#include < intrins.h >sbit K1 =P2^0 ; //按K1,PWM值增加键sbit K2 =P2^1 ; //按K2,PWM值减少键sbit K3 =P2^2 ; //按K2,正反转unsigned char PWM="0x80",f=0x05; //赋初值bit k="0";/**************************************************延时程序/*************************************************/void delayms(unsigned char ms){unsigned char i ;while(ms--){for(i = 0 ; i < 240 ; i++) ;}}/***************************************************主程序****************************************************/void main(void){P1=0x00;TMOD="0x11" ; //计时器1,0的计时方式就均为为 1TH0=0x00 ; //周期TL0=0x00 ; //频率调节TH1=PWM ; //脉宽调节TL1=PWM ;EA="1";ET0=1;ET1=1;TR0=1 ;while(1){if(K3==0) k=~k; //实现正反转 while(K3==0);if(k==0) f="0x05";if(k==1) f="0x0a";while(K1==0&&PWM!=0xff) //加减速度{PWM++ ;delayms(10);}while(K2==0&&PWM!=0x00){PWM-- ;delayms(10);}}}/**************************************************定时器T0频率调节***************************************************/ void timer0() interrupt 1{TR1=0 ;TH0=0x00 ;TL0=0x00 ;TH1=PWM ;TL1=PWM;TR1=1 ;P1=0x00 ;}/***************************************************定时器T1,脉宽调节***************************************************/ void timer1() interrupt 3{TR1=0 ;P1=f ;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

32m/*-------------------------------- 控速模块-----------------------------------*/ #defineP03 P0_3 . ");DisplayString(0x0,1,"DesignedBy202");Delay(300);WriteCmd(LCD_CLS);EA=1; ");Delay(50);WriteCmd(LCD_CLS);IsSelectingMode=True;while(1){WriteCmd(LCD_CLS);DisplayString(0x0,0," LineMode ");DisplayString(0x0,1,"Next Yes");Delay(300); . ");DisplayString(0x0,1,"Designedby202");if(SelectedMode==Line&&AutoMode==0)flag=Area0;elseflag=1;while(flag<5){if(AutoMode==1) ;DisplaySingleChar(0x07,1,PassTime2);DisplaySingleChar(0x08,1,PassTime3);}else{DisplaySingleChar(0x04,1,PassTime1);DisplaySingleChar(0x05,1,PassTime2);DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,PassTime3);DisplaySingleChar(0x08,1,PassTime4);}}/*------------------------------------ 显示平均速度----------------------------------------*/voidDisplayAVGSpeed(void){intSpeed1=0x30; ;DisplaySingleChar(0x07,1,Speed2);DisplaySingleChar(0x08,1,Speed3);}/*------------------------------------- 显示路程----------------------------------------*/voidDisplayDistance(void){intDistance1=0x30;intDistance2=0x30;intDistance3=0x30;intDistance4=0x30;if((int)(Distance*100)<100){Distance1+=0;Distance2+=(int)(Distance*100)/10;Distance3+=(int)(Distance*100)%10;}elseif((int)(Distance*100)>100 &&(int)(Distance*100)<1000){Distance1+=(int)(Distance*100)/100;Distance2+=(int)(Distance*100)/10%10;Distance3+=(int)(Distance*100)%10;}else{Distance1+=(int)(Distance*100)/1000;Distance2+=(int)(Distance*100)/100%10;Distance3+=(int)(Distance*100)/10%10;Distance4+=(int)(Distance*100)%10;}if((int)(Distance*100)<1000){DisplaySingleChar(0x05,1,Distance1);DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,Distance2);DisplaySingleChar(0x08,1,Distance3);}else{DisplaySingleChar(0x04,1,Distance1);DisplaySingleChar(0x05,1,Distance2);DisplaySingleChar(0x06,1,'.');DisplaySingleChar(0x07,1,Distance3);DisplaySingleChar(0x08,1,Distance4);}}/*------------------------------------- 中断初始化-------------------------------------*/voidINTInit(void){EA=1; //开总中断IT0=1; //INTO边沿触发PX0=1; //INTO优先级为高级EX1=1; //开INT1中断IT1=1; //INT1边沿触发PX1=1; //INT1优先级为高级Clock0_Init(); //初始化时钟中断TMOD=0x11; //T0/T1定时方式1ET0=0x01; //开T0中断ET1=0x01; //开T1中断}voidClock0_Init(void){TR0=0x01; //启动T0TH0=Thx0; //定时初值TL0=Tlx0;}voidClock1_Init(void){TR1=0x01; //启动T1TH1=0x3C; //定时初值-50ms中断一次TL1=0x0B0;}/*******************************************************************************************\** 中断处理程序**\*******************************************************************************************//*----------------------------------- 外部中断0----------------------------------------*\外部中断0有两个功能(1)作为菜单选择的Next键(2)作为测速的计数器\*-----------------------------------------------------------------------------------------*/voidSpeedINT(void)interrupt0 //中断INT0{if(SelectedAll==False) //如果模式和速度还没有选择完毕,则此中断作为Next键Next=True;if(Running==True) //如果模式和速度已经选择完毕,则此中断作为测速中断SpeedCount++;if(ChoosingDisplay==True) //如果是在选择要显示的内容Next=True;}/*----------------------------------- 外部中断----------------------------*\外部中断1有两个功能(1)作为菜单选择的确定键/返回键(2)控速\*-----------------------------------------------------------------------------------------*/voidCtrSpeedINT(void)interrupt2 //中断INT1{if(SelectedAll==False) //如果模式和速度还没有选择完毕,则此中断作为确定键{if(IsSelectingMode==True) //模式选择标志ModeSelected=True;if(IsSelectingSpeed==True) //速度选择标志SpeedSelected=True;}if(Running==True) //如果模式和速度选择已经完毕,则此中断作为控速中断{if(Area0==0) //经过第一条铁线(即起跑线),开始计时,开始测速{EX0=1;Clock1_Init();P31=0; //过起跑线,背光灭}if(Area0==1)LowSpeedArea1StartTime=PassTime; //读取进入第一个低速区的时刻if(Area0==2)LowSpeedArea1EndTime=PassTime;//读取离开第一个低速区的时刻,也就是进入高速区的时刻if(Area0==3)HighSpeedAreaEndTime=PassTime;//读取离开高速区的时刻,也就是进入第二个低速区的时刻if(Area0==4)LowSpeedArea2EndTime=PassTime; //读取离开第二个低速去的时刻if(AutoMode==1) //自动模式{PassLine++;switch(PassLine)case5 :PassLineID=1;break;case10:PassLineID=2;break;default:PassLineID=PassLineID;break;}}else{if(SelectedMode==Line) //直线模式{Thx0=Thx[Area0++];Tlx0=Tlx[Area1++];if(Area0==5)EX1=0;}else //S型模式{Nocurve++;Round++;if(Roundid==1&&Round==2){Round++;Roundid=0;}Back=0;Back0=0;EX1=0;}}IE1=0;}if(AutoDisplay==True){GoToChoosingDisplay=True;}if(ChoosingDisplay==True){SelectedShow=True;SelectedReturn=True;Selected=True;}}/*-------------------------------------- T0中断----------------------------------------*\ T0中断用来输出方波以控制速度\*-----------------------------------------------------------------------------------------*/voidTime0INT(void)interrupt1 //T0中断if(AutoMode==1){IsT0INT*=-1;switch(PassLine){ case2 :PrepareDistance=Distance;break;case3 :FirstDistance=Distance-PrepareDistance;break;case4 :SecondDistance=Distance-PrepareDistance-FirstDistance;break;case5 :ThirdDistance=Distance-PrepareDistance-FirstDistance-SecondDistance;break; default:break;}switch(PassLineID){case0 :{if(IsT0INT==1){TR0=0x01;TH0=0xec;TL0=0x78;} //5mselse{TR0=0x01;TH0=0xb1;TL0=0xe0;} //20ms}break;case1 :{if(PassLine==5){FirstHigh=(int)(65536-20*FirstDistance/(15*Count*Rate-FirstDistance)*1000); SecondHigh=(int)(65536-20*SecondDistance/(15*Rate-SecondDistance)*1000); ThirdHigh=(int)(65536-20*FirstDistance/(15*Count*Rate-FirstDistance)*1000);TR0=0x01;TH0=0xf4;TL0=0x48;}}break;case2 :{AutoMode=0;SelectedMode=Line;Area0=Area1=0;PassTime=0;Distance=0;TR0=0x01;TH0=0xf4;TL0=0x48;Thx[0]=Thx[1]=((FirstHigh &0xf0)>>8);Tlx[0]=Tlx[1]=(FirstHigh&0x0f);Thx[2]=Thx[2]=((SecondHigh&0xf0)>>8);Tlx[2]=Tlx[2]=(SecondHigh&0x0f);Thx[3]=Thx[3]=((ThirdHigh &0xf0)>>8);Tlx[3]=Tlx[3]=(ThirdHigh&0x0f);Thx[4]=Thx[4]=0xff;Tlx[4]=Tlx[4]=0xff;}break;default:break;}}else{if(SelectedMode==Line)IsT0INT*=-1;if(Area0<5){if(IsT0INT==1)Clock0_Init();else{TR0=0x01; //启动T0TH0=Thx1; //定时初值TL0=Tlx1;}}elseIsT0INT=-1;}else{IsT0INT2*=-1;if(IsT0INT2==1){TR0=0x01;TH0=0xd8;TL0=0xf0;} //10mselse{TR0=0x01;TH0=0xb1;TL0=0xe0;} //20msBack++;if(Back>=90)Back0=70;if((Nocurve<2)&&(Back0>0)&&Back!=0){if(Back0<=65)Roundid=1;Back0--;}if((Nocurve>2)&&Back>=450){Stop=1;IsT0INT2=-1;}if(Stop==1)flag=6;}}TF0=0;}/*----------------------------------- T1中断----------------------------------------*\T1中断用来定时\*-----------------------------------------------------------------------------------------*/voidTime1INT(void)interrupt3 //T1中断{Clock1_Init();Time1INTCount++;if(Time1INTCount==10) //500ms扫描一次{IsT1INT=1;if(Area0>5)P03=0;Time1INTCount=0;}TF1=0;}。

相关文档
最新文档