智能循迹小车程序

合集下载

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

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

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;}}。

智能寻迹小车及程序

智能寻迹小车及程序

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

循迹小车程序代码

循迹小车程序代码

//(在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;}。

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

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

#include<reg52.h>#define uchar unsigned char#define 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--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/****************************速度设定:通过改变参数a,b 来来改变两路pwm的占空比数值越大占空比越小*******************************************/void pwm0(unsigned int a){CCAP0L=a;CCAP0H=a;}void pwm1(unsigned 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;}delay(i){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;pwm0(45);pwm1(40);DelayMs(1000);}turnleft0() {pwm0(130);pwm1(30);DelayMs(1000); }turnright0() {pwm0(30);pwm1(130);DelayMs(1000); }turnleft1() {pwm0(0Xff); pwm1(0);DelayMs(1000); }turnright1() {pwm0(0);pwm1(0Xff);DelayMs(1000);}stop(){INT11=1;INT22=1;INT33=1;INT44=1;}void turnleft2(){INT11=1;INT22=0;INT33=0;INT44=1;pwm0(0);pwm1(30);}void turnright2(){INT11=0;INT22=1;INT33=1;INT44=0;pwm0(30);pwm1(0);}/*************************主函数***********************************/ main(){while(1){pwm_Init();DelayMs(20);while(1){if(IO5==1) turnright2();else{INT11=1;INT22=1;INT33=1;INT44=1;}/*if(IO3==0&&IO2==0&&IO1==0&&IO4==0) former(); if(IO3==0&&IO2==0&&IO1==0&&IO4==1) turnright1(); if(IO3==0&&IO2==0&&IO1==1&&IO4==0) turnright0(); if(IO3==0&&IO2==0&&IO1==1&&IO4==1) turnleft2(); if(IO3==0&&IO2==1&&IO1==0&&IO4==0) turnleft0(); if(IO3==0&&IO2==1&&IO1==0&&IO4==1) turnright1(); if(IO3==0&&IO2==1&&IO1==1&&IO4==0) former();if(IO3==0&&IO2==1&&IO1==1&&IO4==1) turnleft2(); if(IO3==1&&IO2==0&&IO1==0&&IO4==0) turnleft1(); if(IO3==1&&IO2==0&&IO1==1&&IO4==0) turnleft0(); if(IO3==1&&IO2==0&&IO1==0&&IO4==1) former();if(IO3==1&&IO2==0&&IO1==1&&IO4==1) turnright1(); if(IO3==1&&IO2==1&&IO1==0&&IO4==0) turnright2(); if(IO3==1&&IO2==1&&IO1==0&&IO4==1) turnleft1(); if(IO3==1&&IO2==1&&IO1==1&&IO4==0) turnright2(); if(IO3==1&&IO2==1&&IO1==1&&IO4==1) former;*/}}}。

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

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

智能寻迹避障小车寻迹系统设计文档编制序号:[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;}}}}。

智能小车的循迹避障行驶说明书

智能小车的循迹避障行驶说明书

智能小车的循迹避障行驶目录摘要 (III)Abstract (IV)第一章绪论 (1)1.1 课题背景 (1)1.2 研究目的及意义 (1)1.3 本设计完成的工作 (2)第二章总体设计方案 (3)2.1 方案选择及论证 (4)4446662.2 最终方案 (7)第三章硬件设计 (8)3.1 主控器STC89C52 (8)3.2 单片机复位电路设计 (10)3.3 单片机时钟电路设计 (10)3.4 避障模块 (10)3.5 电源设计 (11)3.6 电机驱动模块 (12)3.7 红外循迹模块 (13)3.8 小车车体总体设计 (15)第四章软件设计 (16)4.1 主程序流程图 (16)第五章系统的安装与调试 (18)5.1 系统的安装 (18)5.2 电路的调试 (19) (20)205.3 测试结果与分析 (20)结论 (21)参考文献 (22)致谢........................................................ 错误!未定义书签。

附录1 整机电路原理图.. (22)附录2 部分源程序 (23)智能小车的循迹避障行驶摘要在现代化的生产生活中,智能机器人已经渐渐普及到国防、工业、交通、生活等各个领域。

为了使生产更加有效率更加安全,使生活更加方便、轻松,智能机器人起到了越来越重要的作用。

智能小车属于智能机器人的一种,同样能给生产生活带来极大的便利。

它能够自己判断路面情况,并将各种信息反馈给单片机。

所用到的学科有自动控制原理、传感器技术、计算机和信息技术等多门学科。

智能车能够在一定程度上解放人的双手、减小工作强度从而改善人们的生活,提高生产的质量和效率。

能够自动循迹和避绕障碍物行驶则是智能小车需要的最基本的功能。

小车之所以能够自动避开障碍物并进行循迹是因为它可以感测引导线和行进路上的障碍物,因此这里采用超声波测距模块和红外传感器来实现这些功能。

本文先介绍了选题的背景及发展前景,描述了智能车在生产和生活中发展和应用的情况;接着对硬件部分所用器件的原理和特点进行了介绍;然后对软件设计和机械部分进行说明;在文章的最后就整个过程的体会及智能机器人的发展进行了总结和展望。

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

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

#include<reg52.h>#define uchar unsigned char#define 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--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/****************************速度设定:通过改变参数a,b 来来改变两路pwm的占空比数值越大占空比越小*******************************************/ void pwm0(unsigned int a){CCAP0L=a;CCAP0H=a;}void pwm1(unsigned 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;}delay(i){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;pwm0(45);pwm1(40);DelayMs(1000);}turnleft0()pwm0(130);pwm1(30);DelayMs(1000); }turnright0() {pwm0(30);pwm1(130);DelayMs(1000); }turnleft1() {pwm0(0Xff);pwm1(0);DelayMs(1000); }turnright1() {pwm0(0);pwm1(0Xff);DelayMs(1000); }stop(){INT11=1;INT22=1;INT33=1;INT44=1;}void turnleft2(){INT11=1;INT22=0;INT33=0;INT44=1;pwm0(0);pwm1(30);}void turnright2(){INT11=0;INT22=1;INT33=1;INT44=0;pwm0(30);pwm1(0);}/*************************主函数***********************************/ main(){while(1){pwm_Init();DelayMs(20);while(1){if(IO5==1) turnright2();else{INT11=1;INT22=1;INT33=1;INT44=1;}/*if(IO3==0&&IO2==0&&IO1==0&&IO4==0) former();if(IO3==0&&IO2==0&&IO1==0&&IO4==1) turnright1(); if(IO3==0&&IO2==0&&IO1==1&&IO4==0) turnright0(); if(IO3==0&&IO2==0&&IO1==1&&IO4==1) turnleft2(); if(IO3==0&&IO2==1&&IO1==0&&IO4==0) turnleft0(); if(IO3==0&&IO2==1&&IO1==0&&IO4==1) turnright1(); if(IO3==0&&IO2==1&&IO1==1&&IO4==0) former();if(IO3==0&&IO2==1&&IO1==1&&IO4==1) turnleft2(); if(IO3==1&&IO2==0&&IO1==0&&IO4==0) turnleft1(); if(IO3==1&&IO2==0&&IO1==1&&IO4==0) turnleft0(); if(IO3==1&&IO2==0&&IO1==0&&IO4==1) former();if(IO3==1&&IO2==0&&IO1==1&&IO4==1) turnright1(); if(IO3==1&&IO2==1&&IO1==0&&IO4==0) turnright2(); if(IO3==1&&IO2==1&&IO1==0&&IO4==1) turnleft1(); if(IO3==1&&IO2==1&&IO1==1&&IO4==0) turnright2(); if(IO3==1&&IO2==1&&IO1==1&&IO4==1) former;*/ }}}。

循迹小车(程序)

循迹小车(程序)

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

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

智能循迹小车程序

智能循迹小车程序
{
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;
{
turnright2();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==1)
{
turnleft2();
}
if(HW1==1&&HW2==1&&HW3==1&&HW4==0)
{
turnright2();
}
if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
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()//小车前进
{
turnright2();
}

智能循迹小车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;}}。

智能循迹小车详细源代码程序MSPID

智能循迹小车详细源代码程序MSPID

巡线车程序(完整版)1 #ifndef _Macro.h_2 #define _Macro.h_3 #include <msp430x14x.h>4 #include <intrinsics.h>5 #define uchar unsigned char6 #define uint unsigned int7 #define one 11.118 #define LMAX 19999 #define RMAX 399910 #define CPU_F ((double)8000000)11 #define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))1213 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))14 #define PC 20 // 比例放大系数15 #define IC 0 //积分放大系数16 #define DC 85 //大系数17 #define LEFTOUT TACCR118 #define RIGHTOUT TACCR219 #define SensorIn P5IN20 #define F 5000//5000hz21 #define Period (8000000/F)22 #define EnableLeftPos P3OUT|=BIT123 #define UnenableLeftPos P3OUT&=~BIT12425 #define EnableLeftNeg P3OUT|=BIT026 #define UnenableLeftNeg P3OUT&=~BIT02728 #define EnableRightPos P3OUT|=BIT229 #define UnenableRightPos P3OUT&=~BIT23031 #define EnableRightNeg P3OUT|=BIT332 #define UnenableRightNeg P3OUT&=~BIT33334 #define Basic_Left 100//百分之八十35 #define Basic_Right 100//Basic_Left36 #define MAX (100)37 #define MIN (-100)38 #define foreward 139 #define backward 040 #define max_speed 10041 #define min_speed -10042 #define key 0434445 #define left_1 146 #define left_2 247 #define left_3 348 #define left_4 449 #define left_5 550 #define left_6 651 #define left_7 7//右直角5253 #define right_1 -154 #define right_2 -255 #define right_3 -356 #define right_4 -457 #define right_5 -558 #define right_6 -659 #define right_7 -7//左直角60 #endif[cpp]view plaincopy61 #include "Macro.h"62 #include "sensor.h"63 void Motorstop()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)//反转72 {73 EnableLeftNeg;74 UnenableLeftPos;75 }76 else if(direction==foreward)//正转77 {78 EnableLeftPos;79 UnenableLeftNeg;80 }81 LEFTOUT=Period/100*speed;82 }83 void MotorRight(int speed,int direction)84 {85 if(speed>max_speed)speed=max_speed;8687 if(direction==backward)//反转88 {89 EnableRightNeg;90 UnenableRightPos;91 }92 else if(direction==foreward)//正转93 {94 EnableRightPos;95 UnenableRightNeg;96 }97 RIGHTOUT=Period/100*speed;98 }99 void MotorDrive(int PIDout)100 {101 int speedleft,speedright;102 speedleft=Basic_Left PIDout;103 speedright=Basic_Right-PIDout;104105 if(speedleft<0)106 MotorLeft(speedleft,backward);//反转107 else MotorLeft(speedleft,foreward);//正转108109 if(speedright<0)110 MotorRight(speedright,backward);//反转111 else MotorRight(speedright,foreward);//正转112 }113 void Rangle(float angle)114 {115 // TBCTL|=TBCLR;116 TBCCR1=LMAX (unsigned int)(angle*one);117 }[cpp]view plaincopy118 //下面是小车的程序。

智能循迹小车详细源代码程序(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 {

智能循迹小车程序代码(4路)

智能循迹小车程序代码(4路)

智能循迹小车程序代码(4路)/************************************************************** **************硬件连接P1_4接驱动模块ENA使能端输入PWM信号调节速度P1_5接驱动模块ENB使能端输入PWM信号调节速度P1_0 P1_1接IN1 IN2 当 P1_0=1,P1_1=0; 时左电机正转驱动蓝色输出端OUT1 OUT2接左电机P1_0 P1_1接IN1 IN2 当 P1_0=0,P1_1=1; 时左电机反转P1_2 P1_3接IN3 IN4 当 P1_2=1,P1_3=0; 时右电机正转驱动蓝色输出端OUT3 OUT4接右电机P1_2 P1_3接IN3 IN4 当 P1_2=0,P1_3=1; 时右电机反转P1_0接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1P1_1接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2P1_2接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3P1_3接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4八路寻迹传感器有信号(白线为0 没有信号黑线为1*************************************************************** *************/#include#define Right_moto_pwm P1_4 //接驱动模块ENA使能端输入PWM信号调节速度#define Left_moto_pwm P1_5 //接驱动模块ENB使能端输入PWM信号调节速度#define Left_1_led P2_0 //四路寻迹模块接口第一路#define Left_2_led P2_1 //四路寻迹模块接口第二路#define Right_1_led P2_2 //四路寻迹模块接口第三路#define Right_2_led P2_3 //四路寻迹模块接口第四路#define Left_moto_go {P1_0=0,P1_1=1;} //左电机前进#define Left_moto_back {P1_0=1,P1_1=0;} //左电机后退#define Left_moto_stop {P1_0=1,P1_1=1;} //左电机停转#define Right_moto_go {P1_2=0,P1_3=1;} //右电机前转#define Right_moto_back {P1_2=1,P1_3=0;} //右电机后退#define Right_moto_stop {P1_2=1,P1_3=1;} //右电机停转#define uchar unsigned char#define uint unsigned intuchar pwm_val_left =0;uchar push_val_left =0; //左电机占空比N/10uchar pwm_val_right =0;uchar push_val_right=0; //右电机占空比N/10bit Right_moto_stp=1;bit Left_moto_stp =1;/************************************************************** **********/void run(void) //前进函数{push_val_left =13; //PWM 调节参数1-20 1为最慢20是最快改这个值可以改变其速度push_val_right =15; //PWM 调节参数1-20 1为最慢20是最快改这个值可以改变其速度Left_moto_go ; //左电机前进Right_moto_go ; //右电机前进}/************************************************************** **********/void left(void) //左转函数{push_val_left =8;push_val_right =9;Right_moto_go; //右电机继续Left_moto_stop; //左电机停走}/************************************************************** **********/void right(void) //右转函数{push_val_left =8;push_val_right =9;Right_moto_stop; //右电机停走Left_moto_go; //左电机继续}void Delayms(uint x){uchar i;while(x--)for(i=0;i<120;i++);}void stop(void){Right_moto_stop; //右电机停走Left_moto_stop; //左电机停走Delayms(3000);run();Delayms(100);}/*************************PWM调制电机转速********************************/void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比{if(Left_moto_stp){if(pwm_val_left<=push_val_left)Left_moto_pwm=1;elseLeft_moto_pwm=0; if(pwm_val_left>=20)pwm_val_left=0;}elseLeft_moto_pwm=0;}void pwm_out_right_moto(void) //右电机调速,调节push_val_left的值改变电机转速,占空比{if(Right_moto_stp){if(pwm_val_right<=push_val_right)Right_moto_pwm=1;elseRight_moto_pwm=0;if(pwm_val_right>=20)pwm_val_right=0;}elseRight_moto_pwm=0;}/***************************************************/void xunji(){switch(P2&0x0f){case 0x00: // 全部没有压线直走run(); break;case 0x01: // 右压线左转left(); break;case 0x02: // 右压线左转left(); break;case 0x04: // 左压线转右right(); break; case 0x08: // 左压线右转right();break;case 0x0f:stop();break;default:run(); break;}}/***********TIMER0中断服务子函数产生PWM信号**********/ void timer0()interrupt 1 using 2{TH0=0XF8; //2Ms定时TL0=0X30;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto();}/***************************************************/void main(void){TMOD=0X01;TH0= 0XF8; //2ms定时TL0= 0X30;TR0= 1;ET0= 1;EA = 1;while(1) /*无限循环*/ {xunji(); }}。

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

智能循迹小车程序 Document number:BGCG-0857-BTDO-0089-2022
#include<>
#define uchar unsigned char
#define uint unsigned int
//D0-D7:f,b,a,e,d,h,c,g 共阴依次编码
//74LS04反相器驱动数码管
uchar code table[10] =
{0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7}; uchar i = 0; //用于0-3数码管轮流显示uint j = 0; //计时的次数
uint time=0; //计时
uint pwm=16; //占空比
uint speed; //调制PWM波的当前的值
sbit R=P3^2; //右边传感器 P3^2
sbit L=P3^3; //左边传感器 P3^3
//电机驱动口定义
sbit ENB=P1^0; //前轮电机停止控制使能
sbit ENA=P1^1; //后轮控制调速控制端口
sbit IN1=P1^2; //前轮
sbit IN2=P1^3; //前轮
sbit IN3=P1^4; //后轮
sbit IN4=P1^5; //后轮
void Init()
{
TMOD = 0x12; //定时器0用方式2,定时器1用方式1 TH0=(256-200)/256; //pwm
TL0=(256-200)/256;
TH1 = 0x0F8; //定时2ms
TL1 = 0x30;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
}
void tim0(void) interrupt 1 //产生PWM
{
speed ++;
if(speed <= pwm) //pwm 就相当于占100的比例{
ENA = 1;
}
else if(speed < 100)
{
ENA = 0;
}
else
speed = 0;
}
void time1() interrupt 3 //定时2ms
{
TH1 = 0x0F8;
TL1 = 0x30;
i =(i+1) % 4; //0-3循环
j++;
if(i == 0) //显示最低位数码管{
P0 = 0x00; //段选清零防止乱码
P0 = table[time%10]; //送段码信号
}
if(i == 1)
{
P0 = 0x00;
P0 = table[time/ 10% 10];
}
if(i == 2)
{
P0 = 0x00;
P0 = table[time/ 100% 10];
}
if(i == 3)
{
P0 = 0x00;
P0 = table[time/ 1000% 10];
}
P2 = ( 0x10 << i ); //送位选信号
if(j == 500)
{
time ++; //500次为1秒
j = 0;
}
}
void forward() //前进
{
IN2=1;
IN1=0;
}
void back() //后退
{
IN2=0;
IN1=1;
}
void left() //左转
{
ENB=1; //打开使能
IN3=1;
IN4=0;
}
void right() //右转
{
ENB=1; //打开使能
IN3=0;
IN4=1;
}
void stop() //停止
{
IN2=0;
IN1=0;
IN3=0;
IN4=0;
}
void main()
{
Init(); //定时器初始化
while(1)
{
if(R==0 && L==1) //右传感器检测到黑线{
right(); //右转
forward();
while(R==0 && L==1);
}
if(R==1 && L==0) //左传感器检测到黑线
{
left();
forward();
while(R==1 && L==0);
}
if(R==0 && L==0) //都检测到黑线则停止
{
stop();
j = 0; //定时器仍在工作,计数时间清空
}
else //都没有检测到黑线
{
ENB = 0; //关闭转向控制
forward();
}
}
}。

相关文档
最新文档