智能循迹小车程序

合集下载

智能循迹小车变速转弯程序

智能循迹小车变速转弯程序

include<reg52.h>define uchar unsigned chardefine uint unsigned intuchar a;i;time_count=0;count=0;Dutycycle0=50;Dutycycle1=50;flag;uchar state;/定义电机控制位/sbit INT11=P0^0; //电机控制位;左电机左;芯片中的总开关sbit INT22=P0^1; // 右电机控制位;高电平有效sbit INT33=P0^2; //控制左电机;从而控制其中的车轮sbit INT44=P0^3;sbit funpwm0=P1^3; ///两个控制PWM的端口sbit funpwm1=P1^4;sbit IO4=P2^0; //ST188输出端口sbit IO1=P2^1;sbit IO2=P2^2;sbit IO3=P2^3;sbit IO5=P0^7;sfr CCON = 0xD8; // PCA控制寄存器sbit CCF0 = CCON^0; // PCA模块0中断标志sbit CCF1 = CCON^1; // PCA模块0中断标志sbit CR = CCON^6; // PCA计数器阵列溢出标志位sbit CF = CCON^7; // PCA计数器阵列运行控制位sfr CMOD = 0xD9; // PCA工作模式寄存器sfr CL = 0xE9; // PCA的16位计数器----低8位sfr CH = 0xF9; // PCA的16位计数器----高8位sfr CCAPM0 = 0xDA; // PCA模块0的输出脉冲频率sfr CCAP0L = 0xEA; // PCA捕获、比较寄存器——低位字节sfr CCAP0H = 0xFA; // PCA捕获、比较寄存器——高位字节sfr CCAPM1 = 0xDB; // PCA模块1的输出脉冲频率sfr CCAP1L = 0xEB; // 同上sfr CCAP1H = 0xFB; // 同上sfr PCAPWM0= 0xf2; // PCA模块0的PWM寄存器sfr PCAPWM1= 0xf3; // PCA模块1的PWM寄存器/------------------------------------------------uS延时函数;含有输入参数 unsigned char t;无返回值unsigned char 是定义无符号字符变量;其值的范围是0~255 这里使用晶振12M;精确延时请使用汇编;大致延时长度如下 T=tx2+5 uS------------------------------------------------/void DelayUs2x unsigned char t{while--t;}/------------------------------------------------mS延时函数;含有输入参数 unsigned char t;无返回值unsigned char 是定义无符号字符变量;其值的范围是0~255 这里使用晶振12M;精确延时请使用汇编------------------------------------------------/void DelayMs unsigned char t{while t--{//大致延时1mSDelayUs2x245;DelayUs2x245;}}/速度设定:通过改变参数a;b 来来改变两路pwm的占空比数值越大占空比越小/void pwm0unsigned int a{CCAP0L=a;CCAP0H=a;}void pwm1unsigned int b{CCAP1L=b;CCAP1H=b;}void pwm_Init{CL=0;CH=0;CMOD=0x00;CCAP0H=CCAP0L=0x00;CCAPM0=0x42;CCAP1H=CCAP1L=0x00;CCAPM1=0x42;CR=1;}delayi{int k;j;for j=1000;j>0;j--for k=200;k>0;k--i--;}former{INT11=1;INT22=0;INT33=1;INT44=0;pwm045;pwm140;DelayMs1000;}turnleft0{pwm0130;pwm130;DelayMs1000;}turnright0{pwm030;pwm1130;DelayMs1000;}turnleft1{pwm00Xff;pwm10;DelayMs1000; }turnright1{pwm00;pwm10Xff;DelayMs1000;}stop{INT11=1;INT22=1;INT33=1;INT44=1;}void turnleft2 {INT11=1;INT22=0;INT33=0;INT44=1;pwm00;pwm130;}void turnright2 {INT11=0;INT22=1;INT33=1;INT44=0;pwm030;pwm10;}/主函数/main{while1{pwm_Init;DelayMs20;while1{if IO5==1 turnright2;else{INT11=1;INT22=1;INT33=1;INT44=1;}/ifIO3==0&&IO2==0&&IO1==0&&IO4==0 former;ifIO3==0&&IO2==0&&IO1==0&&IO4==1 turnright1; ifIO3==0&&IO2==0&&IO1==1&&IO4==0 turnright0; ifIO3==0&&IO2==0&&IO1==1&&IO4==1 turnleft2; ifIO3==0&&IO2==1&&IO1==0&&IO4==0 turnleft0; ifIO3==0&&IO2==1&&IO1==0&&IO4==1 turnright1; ifIO3==0&&IO2==1&&IO1==1&&IO4==0 former;ifIO3==0&&IO2==1&&IO1==1&&IO4==1 turnleft2; ifIO3==1&&IO2==0&&IO1==0&&IO4==0 turnleft1; ifIO3==1&&IO2==0&&IO1==1&&IO4==0 turnleft0; ifIO3==1&&IO2==0&&IO1==0&&IO4==1 former;ifIO3==1&&IO2==0&&IO1==1&&IO4==1 turnright1; ifIO3==1&&IO2==1&&IO1==0&&IO4==0 turnright2; ifIO3==1&&IO2==1&&IO1==0&&IO4==1 turnleft1; ifIO3==1&&IO2==1&&IO1==1&&IO4==0 turnright2; ifIO3==1&&IO2==1&&IO1==1&&IO4==1 former;/ }}}。

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

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

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用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;}}。

循迹小车程序代码

循迹小车程序代码

//(在MAIN中接受铁片颜色判断传感器的信号来赋值) unsigned char Light_Flag=0;//进入光引导区的标志(1) unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时 unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数 /*============================全局变量定义区 ============================*/ /*------------------------------------------------*/ /*-----------------通用延迟程序-------------------*/ /*------------------------------------------------*/ void delay(unsigned int time) { 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]; } // time*0.5ms延时

智能寻迹小车以及程序

智能寻迹小车以及程序

寻迹小车在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。

笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。

整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。

总体方案整个电路系统分为检测、控制、驱动三个模块。

首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。

系统方案方框图如图1所示。

图1 智能小车寻迹系统框图传感检测单元小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。

笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。

红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。

在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。

传感器的选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。

ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 ST168检测电路ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。

ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。

笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。

R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。

智能循迹小车程序

智能循迹小车程序

智能小车程序(共三个)第一个:#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;}。

循迹小车(程序)

循迹小车(程序)

附录程序目录一、前言------------------------------------------------------------二、小车功能------------------------------------------------------三、元器件选择--------------------------------------------------四、I/O分配及硬件连接简图---------------------------------五、相关模块、算法---------------------------------------------六、系统框图------------------------------------------------------七、调试过程------------------------------------------------------八、小车图片资料---------------------------------------------------九、讲座所感------------------------------------------------------十、实习总结------------------------------------------------------一、前言感谢生产实习能给我们这次实现自己想法的机会,虽然实验条件异常简陋、资金投入非常有限,总体感觉我的队友们灰常灰常给力啊,我感觉我是抱到大腿了--王威,夏青、峰哥,团队气氛非常好,大家一起讨论,一起分工研究模块,最后一起解决问题调试程序,而且是不同的组合在不同阶段解决了不同的问题,大家精诚合作,各显身手,在奋战中给大三学年画上了圆满的句号。

之前我们本来商量是不是可以拿往年电子设计大赛的题目过来做,如果难度太大就算只实现一部分功能也算是成功完成了,结果研究一天后发现电子设计大赛的题目需要很长时间的知识积累啊,基本上都是准备一个月以上然后开工的,后来王威提议要不我们做个小车吧,超声波测距实现自动物体追踪,控制核心采用单片机,传感器采用广泛用于避障和测距的超声波传感器,前进和后退用普通伺服电机和电机驱动模块实现。

基于STM32的智能循迹避障小车

基于STM32的智能循迹避障小车

基于STM32的智能循迹避障小车【摘要】本文介绍了一款基于STM32的智能循迹避障小车。

在引言中,我们简要介绍了背景信息,并阐明了研究的意义和现状。

在我们详细讨论了STM32控制系统设计、循迹算法实现、避障算法设计、硬件设计和软件设计。

在结论中,我们分析了实验结果,讨论了该小车的优缺点,并展望了未来的发展方向。

通过本文的研究,我们验证了该智能小车在循迹和避障方面的性能,为智能移动机器人领域的研究提供了新的思路和方法。

【关键词】关键词:STM32、智能小车、循迹避障、控制系统、算法设计、硬件设计、实验结果、优缺点、未来展望1. 引言1.1 背景介绍智能循迹避障小车是一种基于STM32单片机的智能机器人,在现代社会中起着越来越重要的作用。

随着科技的发展,人们对智能机器人的需求也日益增长。

智能循迹避障小车不仅可以帮助人们完成一些重复性、繁琐的任务,还可以在一些特殊环境下代替人类进行工作,提高效率和安全性。

循迹功能使智能小车能够按照特定的路径行驶,可以应用于自动导航、自动驾驶等领域。

而避障功能则使智能小车具有避开障碍物的能力,适用于环境复杂、存在风险的场所。

通过将这两个功能结合起来,智能循迹避障小车可以更好地适应各种复杂环境,完成更多的任务。

本文旨在探讨基于STM32的智能循迹避障小车的设计与实现,通过研究其控制系统设计、循迹算法实现、避障算法设计、硬件设计和软件设计等方面,为智能机器人领域的发展做出一定的贡献。

1.2 研究意义智能循迹避障小车的研究旨在利用先进的STM32控制系统设计和算法实现,实现小车的智能循迹和避障功能,从而提高小车的自主导航能力和适应性。

研究意义主要包括以下几个方面:1. 提升科技水平:通过研究智能循迹避障小车,促进了在嵌入式系统领域的发展,推动了智能控制和算法设计的进步,增强了人工智能在实际应用中的影响力。

2. 提高生产效率:智能循迹避障小车可以应用于仓储物流、工业自动化等领域,可以替代人工完成重复、枯燥的任务,提高了生产效率和效益。

智能寻迹避障小车寻迹系统设计

智能寻迹避障小车寻迹系统设计

智能寻迹避障小车寻迹系统设计文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]第二章智能寻迹避障小车寻迹系统设计1.任务任务一:产生智能寻迹避障小车沿黑线转圈的控制程序;任务二:产生智能寻迹避障小车带状态显示沿黑线转圈的控制程序;2.要求(1)能控制智能寻迹避障小车沿黑线实现转圈功能;(2)行走过程中小车一直压着黑线走,不得冲出黑线圆圈之外或之内;(3)智能寻迹避障小车可以从小于90度的任意方向寻找到黑线圆圈;项目描述该项目的主要内容是:在智能寻迹避障小车电机控制系统之上扩展寻迹电路,然后运用C语言对系统进行编程,使智能寻迹避障小车实现沿黑线转圆圈的功能,并且在行走过程中小车一直压着黑线走,不得冲出黑线圆圈之外或之内;当人为将小车拿开,再从小于90度的任意方向放置小车,小车应能重新找回轨道,并沿黑线继续转圈。

通过该项目的学习与实践,可以让读者获得如下知识和技能:继续掌握单片机I/O端口的应用;掌握红外线收、发对管的工作原理与控制方法;掌握数码管的工作原理与控制方法;掌握单片机C语言的编程方法与技巧;能够编写出智能寻迹避障小车沿黑线实现转圈功能的控制函数;必备知识2.1.1 关于红外线传感器红外线定义:在光谱中波长自至400微米的一段称为红外线,红外线是不可见光线。

所有高于绝对零度(℃)的物质都可以产生红外线。

现代物理学称之为热射线。

医用红外线可分为两类:近红外线与远红外线。

红外线发射器:红外线发射管在LED封装行业中主要有三个常用的波段,如下850NM、875NM、940NM。

根据波长的特性运用的产品也有很大的差异,850NM波长的主要用于红外线监控设备,875NM主要用于医疗设备,940NM波段的主要用于红外线控制设备。

如:红外线遥控器、光电开关、光电计数设备等。

红外线对管应用:本项目中,小车的寻迹功能采用红外线收、发对管实现。

具体工作过程如下:两对红外线收、发对管安装在智能寻迹避障小车底盘正前方,红外发射管一直发射信号,接收管时刻准备接收信号。

智能红外循迹小车程序

智能红外循迹小车程序

#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit you_2=P2^0;//红外探测端口定义sbit you_1=P2^1;sbit zhong=P2^2;sbit zuo_1=P2^3;sbit zuo_2=P2^4;sbit CG=P0^1;sbit DC=P0^0;uchar code L_F[8]= {0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//左电机正转uchar code L_B[8]= {0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//左电机反转uchar code R_F[8]= {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//右电机正转uchar code R_B[8]= {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//右电机反转uchar code B_F[8]= {0x91,0x83,0xc2,0x46,0x64,0x2c,0x38,0x19};//左反右正uchar code F_B[8]= {0x19,0x38,0x2c,0x64,0x46,0xc2,0x83,0x91}; //左正右反uchar code duandian[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//断电unsigned char code qianjin[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//前进unsigned char h[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//uchar i;void delay(uint z){uint k ;uint j;for(k=0; k<z; k++)for(j=0; j<110; j++);}void QJ(unsigned int i){for(i=0;i<8;i++){P1=h[i]=qianjin[i];delay(13);}}void DD(){P1=0x00;delay(300);}void wtj(){while(1){if(P2==0xff){DD();delay(1000);break;}else{QJ(8);}}}void YG_1(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=F_B[i];delay(10);}}void ZG_1(){ unsigned char i;for(i=0;i<8;i++){P1=h[i]=B_F[i];delay(10);}}void byg(){while(1){if(P2==0xfb)break;else if(P2==0xf9)break;else if(P2==0xfd)break;/*if(P2^0==0)break;else if(P2^1==0)break;/*else if(P2^2==0)break;else if(P2^3==0)break;else if(P2^4==0)break;*/elseYG_1();}}void bzg(){while(1){if(P2==0xfb)break;else if(P2==0xf3)break;else if(P2==0xf7)break;/*if(P2^0==0)break;else if(P2^1==0)break;else if(P2^2==0)break;if(P2^3==0)break;else if(P2^4==0)break;*/elseZG_1();}}void YG_2(){//unsigned char i; //unsigned char g;if(P2==0xfa){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}} */}else if(P2==0xf2){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf6){//delay(4000);byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf4){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else ;}void ZG_2(){//unsigned char i; //unsigned char g;if(P2==0xeb){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/else if(P2==0xe9){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xed){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xe5){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else ;}void ZG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=R_F[i];delay(11);}}void YG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=L_F[i];delay(11);}}/*void HT(){unsigned char i;for(i=0;i<8;i++){P1=houtui[i];delay(55);}}*/void zd(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff){while(1){DD();}}else{DC=0;break;break;}}}}void zd1(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff)while(1){DD();}}else{DC=0;break;}}}}void hy(){unsigned char i;for(i=0;i<8;i++){P1=h[i];delay(10);}}void main(){DC=1;while(1){QJ(8);if(P2!=0xff){delay(9000);break;}}while(1){DC=1;if(CG==1){delay(9000);DC=1;while(1){switch(P2){case 0xfb:QJ(8);break;//11011case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011case 0xf7:ZG();break;//10111case 0xe7:ZG_1();break;//00111case 0xef:ZG_1();break;//01111case 0xe3:ZG_1();break; //00011case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001case 0xfd:YG();break;//11101case 0xfc:YG_1();break;//11100case 0xfe:YG_1();break;//11110case 0xf8:YG_1();break; //11000case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd1();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}else{switch(P2){case 0xfb:QJ(8);break;//11011 case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011 case 0xf7:ZG();break;//10111 case 0xe7:ZG_1();break;//00111 case 0xef:ZG_1();break;//01111 case 0xe3:ZG_1();break; //00011 case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001 case 0xfd:YG();break;//11101 case 0xfc:YG_1();break;//11100 case 0xfe:YG_1();break;//11110 case 0xf8:YG_1();break; //11000 case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}}。

单片机的智能循迹小车

单片机的智能循迹小车
多次测试:在实际环境中进行多次测试,以验证程序的稳定性和可靠性
调试方法
A
总之,基于 51单片机的 智能循迹小 车是一种简 单实用的智 能控制系统
B
通过合理的 硬件设计和 软件编程, 可以实现小 车的自动循
迹功能
C
在调试过程中, 需要逐步排查 问题,不断优 化程序,以提 高系统的性能
和稳定性
感/谢/聆/听
以及调试方法
1
原理
原理
1Байду номын сангаас
基于51单片机的智能循迹小车通过传感器检测小车与路径之间的距 离,将检测到的信号转换为电平信号,然后通过单片机进行处理
单片机根据接收到的信号控制电机驱动模块,从而控制小车的运动 方向和速度
2
3
通过不断调整小车的运动方向和速度,使得小车能够沿着指定的路 径进行运动
2
硬件组成
51单片机的智能 循迹小车
-
01
原理
02 硬件组成
03 软件设计 04 调试方法
51单片机的智能循迹小车
1
智能循迹小车是一种自动 控制系统,能够沿着指定
的路径进行运动
2
基于51单片机的智能循迹 小车是一种使用51单片机 作为主控制器的智能循迹
小车
3
下面将详细介绍基于51单 片机的智能循迹小车的原 理、硬件组成、软件设计
4
调试方法
调试方法
基于51单片机的智能循迹小车的调试方法主要包括以下几个步骤
硬件调试:检查硬件连接是否正确,确保电源、传感器、电机驱动模块等设备 能够正常工作
软件调试:通过调试器或仿真器对程序进行调试,检查程序是否存在语法错误 或逻辑错误
实际环境测试:将调试好的程序下载到单片机中,然后在实际环境中进行测试 。观察小车的运动情况,如果存在偏差或问题,需要对程序进行调整和优化

智能寻迹小车以及程序

智能寻迹小车以及程序

寻迹小车在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。

笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。

整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。

总体方案整个电路系统分为检测、控制、驱动三个模块。

首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。

系统方案方框图如图1所示。

图1 智能小车寻迹系统框图传感检测单元小车循迹原理该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。

笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。

红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。

在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。

传感器的选择市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。

ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:图2 ST168检测电路ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。

ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。

笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。

R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。

畅学智能循迹小车实战教程

畅学智能循迹小车实战教程

引言:智能循迹小车是一种结合了技术和的创新产品,它能够在预设的轨迹上行驶,具有较高的自主性和灵活性。

本文将为大家介绍畅学智能循迹小车的实战教程,包括制作、编程和实际应用等方面的内容。

通过学习本文,读者将能够了解智能循迹小车的原理和制作步骤,并掌握其编程和实际应用技巧。

概述:智能循迹小车是一种基于技术和的创新产品。

它通过搭载的传感器和编程控制,能够在预设的轨迹上自主行驶。

智能循迹小车的制作和编程过程涉及多个方面的知识,包括机械结构设计、电子电路连接、编程语言和算法等。

正文:一、制作智能循迹小车的机械结构1.确定小车的尺寸和外观设计2.选择合适的材料和制作工具3.制作小车底盘和轮子系统4.搭建传感器支架和控制装置5.确保机械结构的稳定性和可靠性二、连接电子电路,使小车能够感知环境1.选取合适的传感器和驱动模块2.连接传感器和控制模块的电路3.添加电源供应和保护电路4.调试电子电路的工作状态5.确保电子电路的可靠性和稳定性三、编程智能循迹小车的控制系统1.学习编程语言和算法知识2.设计控制系统的流程和逻辑3.编写控制小车移动的代码4.添加传感器数据的处理和判断逻辑5.调试控制系统的功能和性能四、实际操作:实现智能循迹小车在预设轨迹上行驶1.预先设置循迹轨迹和停止条件2.将编写好的控制代码到小车控制系统3.启动小车,观察其在轨迹上行驶的效果4.调试控制系统和传感器,确保小车的稳定性和准确性5.对小车进行优化和改进,提升其性能和功能五、其他应用领域和进一步研究1.探索其他技术和应用领域2.学习其他智能小车的制作和编程方法3.加深对技术和的理解和应用4.进一步研究和改进智能循迹小车的功能和性能5.将智能循迹小车应用于实际生活和工作中的场景总结:通过本文的介绍,我们了解了畅学智能循迹小车的实战教程。

制作智能循迹小车需要涉及机械结构设计、电子电路连接、编程和实际应用等多个方面的知识。

通过学习和实践,读者将能够掌握智能循迹小车的制作和编程技巧,并能够应用于实际生活和工作中。

智能寻迹小车调试程序

智能寻迹小车调试程序
hyou1 = 1;
hyou2 = 0;
}
void TurnRight()//右转
{Leabharlann qzuo1 = 1;qzuo2 = 0;
hzuo1 = 1;
hzuo2 = 0;
qyou1 = 0;
qyou2 = 0;
hyou1 = 0;
hyou2 = 0;
}
void Xiaoying()
{
qzuo1=qzuo2=qyou1=qyou2=hzuo1=hzuo2=hyou1=hyou2=0 ;
if(LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1)//直行超出范围后速度变化不明显
{ RUN(); delay(30) ;Xiaoying() ;}
if(LED1==1&&LED2==0&&LED3==0&&LED4==1&&LED5==1)//直行
{ RUN(); delay(30) ;Xiaoying() ;}
void delay(int i)
{
while(i--);
}
void RUN()//向前
{
qzuo1 = 1;
qzuo2 = 0;
hzuo1 = 1;
hzuo2 = 0;
qyou1 = 1;
qyou2 = 0;
hyou1 = 1;
hyou2 = 0;
}
void STOP()//停车
{
qzuo1 = 0;
voiddelayintvoidrun向前voidstop停车voidturnleft左转voidturnright右转voidxiaoyingvoidmainvoidifled11led21led30led41led51直行delay值越小速度越小范围在10120为最佳控制范围run

智能循迹小车C程序(完美-详尽)

智能循迹小车C程序(完美-详尽)

/* ------------------------------------------------- 小车运行主程序 -------------------------简介:@模块组成:红外对管检测模块 ------ 五组对管,五个信号采集端口直流电机驱动模块---- 驱动两个直流电机,另一个轮子用万向轮单片机最小系统------ 用于烧写程序,控制智能小车运动@ 功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。

这样小车便可在其上循迹运行。

@ 补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。

程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。

编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1. 假定:IN仁1,IN3=1 时电机正向转动,必须保证本条件2. 假定: 遇到白线输出0,遇到黑线输出1;如果实际电路是:遇到白线输出1,遇到黑线输出0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。

3. 说明1:直行 --------- 速度full_speed_left,full_speed_right.转弯, 调头速度 -- correct_speed_left,correct_speed_right.微小校正时 ------- 高速轮full_speed_left,full_speed_right;低速轮correct_speed.可以通过调节第六,七,八,九,十条程序,改变各个状态下的占空比( Duty cycle ) , 以求达到合适的转弯,直行速度4.lenth ---- length 检测到黑线到启动转动的时间间隔5. width ---- mid3 在黑线上到脱离黑线的时间差6. mid3 ----- 作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7. check_right 若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延------------------------------------ */ #include<STC12C5A60S2.h> #define uchar unsigned char #define uint unsigned int #define m0 1〃 黑线 ml,白线 m0 #define m1 0 #define full_speed_left 40 // 方 便 调 节 各 个 状 态 的 占 空 比 , 可 用 参 数 组:(30,35,6,25,30,68000,27000,500 );#define full_speed_right 45 //(40,45,6,25,30,68000,27000,500 ); #define correct_speed 6 // 校正时的低速轮的占空比 #define turn_speed_left 25 #define turn_speed_right 30 #define lenth 68000 // 测试数据:10000-- 》100-- 》500-- 》2000--80000--76000--68000 #define width 27000 //500-- 》10-->2000-- 》60000--30000--- 》27000 #define check_right 500 //2000-- #define midl left1 #define midr right5 》 20-- 》 200-- 》500uchar Duty_left,Duty_right,i=0,j=0; // 左右占空比标志,取 1--100sbit IN 仁 P2A 0; sbit IN2=P2A1; sbit IN3=P2A2; sbit IN4=P2A3; sbit ENA=P1A0; sbit ENB=P1A1; // 循迹口 五组红外对管,依次对应从左往右第 1,2,3,4,5 五组 sbit left1 =P1A6; sbit left2 =P1A5; sbit mid3 =P1A4; sbit right4=P1A3; sbit right5=P1A2; void line_left(); void line_right(); void line_straight()reentrant ; // ------------------------ void delay(long int Delay_time)// 延时函数{uint t=Delay_time;while(t--);}// -------------------------void init() // 定时器初始化{left1=m0; // 初始化left2=m0; // 白线位置mid3 =m1; // 黑线位置right4=m0;right5=m0;TMOD|=0x01;TH0=(65536-66)/256;TL0=(65536-66)%256;EA=1;ET0=1;TR0=1;ENA=1; // 使能端口,初始化ENB=1;}// ----------------------------void time0(void)interrupt 1 // 中断程序{i++; // 调速在中断中执行j++;if(i<=Duty_left)ENA=1;else ENA=0;if(i>100){ENA=1;i=0;}if(j<=Duty_right)ENB=1;else ENB=0;if(j>100){ENB=1;j=0;}TH0=(65536-66)/256; // 取约150HZ,12M 晶振,每次定时66us, 分100 次,这样开头定义的变量正好直接表示占空比的数值TL0=(65536-66)%256;}// ------------------------------void correct_left()// 向左校正,赋值{Duty_left =correct_speed;Duty_right=full_speed_right;IN1=1;IN2=0;IN3=1;IN4=0;}// ------------------------------void correct_right()// 向右校正,赋值{Duty_left =full_speed_left;Duty_right=correct_speed;IN1=1;IN2=0;IN3=1;IN4=0;}// --------------------------------void turn_left()// 左转,赋值{Duty_left =turn_speed_left; Duty_right=turn_speed_right; IN1=0; // 转弯时一个正转,一个反转,IN2=1;IN3=1;IN4=0;}// --------------------------------void turn_right()// 右转,赋值{Duty_left =turn_speed_left; Duty_right=turn_speed_right; IN1=1; // 转弯时一个正转,一个反转,IN2=0;IN3=0;IN4=1;}// ------------------------------void straight() // 直走,赋值{Duty_left =full_speed_left; Duty_right=full_speed_right; 这组值需要单独写程序取值IN1=1;IN2=0; // 左右电机占空比初始化,调节直线运动速度// 鉴于左右轮电机内部阻力不同,故占空比取不同值,IN3=1;IN4=0;}// ----------------------------------void line_straight()reentrant // 函数名后加reentrant 可以递归调用,// 一直走黑直线时{straight();if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1) // 防止校正时,小车冲出过大,导致2,4 号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(left2==m1){correct_left();if(right5==m1){line_right();goto label3;}else if(left1==m1){line_left();goto label3;}}elseif(right4==m1) // 防止校正时,小车冲出过大,导致2,4 号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(right4==m1){correct_right();if(right5==m1){ line_right(); goto label3;}else if(left1==m1){line_left();goto label3;}}else if((left1==m0)&&(left2==m0)&&(mid3==m0)&&(right4==m0)&&(right5==m0)){straight();//delay(lenth);while(right4==m0) // 本来应该是用mid3, 但是为了提高灵敏度,选择right4 ;向左时,可取left2 对管{turn_right();} if(mid3==m1){line_straight();}}label3: ; // 什么都不做}// -----------------------------------------------void line_right() // 右边有黑线时{straight();// 这里的直走是在不管红外检测结果的直行delay(lenth);if(mid3==m1){turn_right();// 执行向右转的赋值label:delay(width); // 由width 值决定转弯时mid3 经过黑线宽度时所需要的时间if(mid3==m0) while(right4==m0){}elsegoto label;}else if(mid3==m0){turn_right();while(right4==m0){}if(midr==m1){line_straight();}}}// -----------------------------------------void line_left() // 左边出现黑线时{while(left1==m1){if(right5==m1){line_right();goto label2;}}。

基于STM32的智能循迹避障小车

基于STM32的智能循迹避障小车

基于STM32的智能循迹避障小车1. 引言1.1 背景介绍智能循迹避障小车是一种集成了先进技术的智能机器人,它能够通过预先设定好的路径进行自动行驶,并且具备避障功能,能够根据环境的变化来及时调整行进方向,实现自主避让障碍物的能力。

这种智能小车在工业生产、仓储物流、智能家居等领域都有着广泛的应用前景。

在传统的循迹小车中,通常需要依靠外部传感器或者导航系统来确定行进路径,而智能循迹避障小车基于STM32单片机的设计更加智能化和灵活,可以通过搭载的传感器实时感知周围环境,从而做出即时的决策和调整。

通过对STM32单片机的深入研究和应用,我们可以更好地了解其在智能小车设计中的作用和优势,为后续的硬件设计、软件开发和系统测试奠定基础。

本文将重点介绍基于STM32的智能循迹避障小车的设计与实现,探讨其在智能机器人领域中的潜在应用和发展前景。

1.2 研究意义研究智能循迹避障小车的意义在于通过结合STM32等先进技术,实现小车的智能化和自主化,提高其在复杂环境下的适应性和灵活性。

通过对硬件设计、软件设计等方面的优化和改进,可以使智能循迹避障小车具有更加稳定和可靠的行驶性能,从而更好地满足人们对于智能机器人的需求。

研究智能循迹避障小车还可以推动机器人领域的发展和创新,促进人工智能与工业自动化的融合,为智能制造和智能交通等领域的发展提供技术支持和解决方案。

研究智能循迹避障小车具有重要的社会意义和科学意义,具有广泛的应用前景和市场潜力。

2. 正文2.1 硬件设计硬件设计部分是智能循迹避障小车项目中至关重要的组成部分。

在硬件设计过程中,需要考虑到小车的结构设计、传感器的选择、电机驱动模块、电源系统等方面。

小车的结构设计需要考虑到整体重量、车轮的直径和间距、底盘高度等因素。

一个稳定坚固的底盘结构可以保证小车在运动中不容易翻倒,提高了整体的稳定性。

传感器的选择也是一个关键的步骤。

在智能循迹避障小车中,常用的传感器有红外线传感器、超声波传感器和摄像头。

智能循迹小车详细源代码程序(MSP430,PID)

智能循迹小车详细源代码程序(MSP430,PID)
80 }
81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
turnright2();
}
if(HW1==0&&HW2==0&&HW3==1&&HW4==0)
{
turnright2();
}
if(HW1==0&&HW2==0&&HW3==0&&HW4==1)
{
turnright2();
}
if(num3==0&&HW1==1&&HW2==1&&HW3==1&&HW4==1)
IN8=1;
dj1=20;
dj2=7;
}
void right()
{
IN5=0;
IN6=1;
IN7=1;
IN8=0;
dj1=20;
dj2=25;
}
void left()
{
IN5=1;
IN6=0;
IN7=0;
IN8=1;
dj1=25;
dj2=20;
}
void stop()//小车后退
{
dj1=0;
dj2=0;
}
if(HW1==0&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==1&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==1&&HW2==0&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==0&&HW2==0&&HW3==1&&HW4==0)
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==0)
{
num2=4;
delay(50);
qianjin();
}
if(HW1==1&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==0&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
{
IN5=0;
IN6=1;
IN7=0;
IN8=1;
dj1=15;
dj2=15;
}
void turnleft2()//小车前进向左微调
{
IN5=0;
IN6=1;
IN7=0;
IN8=1;
dj1=7;
dj2=20;
}
void turnright2()//小车前进向右微调
{
IN5=0;
IN6=1;
IN7=0;
}
if(HW1==1&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==0&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==1&&HW2==0&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==0&&HW2==0&&HW3==1&&HW4==1)
}
if(HW1==0&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==1&&HW2==1&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==1&&HW2==0&&HW3==0&&HW4==0)
{
turnleft2();
}
if(HW1==0&&HW2==0&&HW3==1&&HW4==0)
{
turnright2();
}
if(HW1==0&&HW2==0&&HW3==1&&HW4==0)
{
turnright2();
}
if(HW1==0&&HW2==0&&HW3==0&&HW4==1)
{
turnright2();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==1)
{
turnleft2();
sbit ENB=P3^3;
sbit IN5=P2^4;//电机
sbit IN6=P2^5;
sbit IN7=P2^6;
sbit IN8=P2^7;
void delay(uint x)//延时1ms
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void qianjin()//小车前进
{
delay(500);
if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
{
stop();
delay(50);
num1=3;
delay(50);
}
}
}
if(num1==3)
{
if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
{
right();
delay(50);
num1=2;
delay(50);
}
}
}
if(num1==2)
{
if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
{
right();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==0)
{
num2=2;
delay(50);
qianjin();
智能循迹小车,小车按中字笔画行驶
/************“中”字笔画轨迹*************/
#include<reg52.h>
#include <intrins.h>//内部包含延时函数_nop_();
#define uchar unsigned char
#define uint unsigned int
{
num3=1;
delay(10);
stop();
delay(100);
qianjin();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==1)
{
turnleft2();
}
if(HW1==1&&HW2==1&&HW3==1&&HW4==0)
{
turnright2();
}
if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
delay(50);
num1=5;
delay(50);
}
}
}
if(num1==5)
{
if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
{
left();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==0)
{
num2=5;
delay(50);
qianjin();
unsigned char dj1=0;
unsigned char dj2=0;
uchar t=0;
uchar num1=0,num2=0,num3=0;
sbit HW1=P0^0;//红外对管位定义
sbit HW2=P0^1;
sbit HW3=P0^2;
sbit HW4=P0^3;
sbit ENA=P3^2;//PWM输入
}
if(HW1==1&&HW2==1&&HW3==1&&HW4==0)
{
turnright2();
}
if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
{
delay(500);
if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
相关文档
最新文档