飞思卡尔智能车循迹小车详细程序
循迹小车三路的程序

if(ct<=sd)
PWM2=1;
else
PWM2=0;
}
//*********************第二部分 子函数定义 End*********************
//**********第三部分 小车直线前进,左转,右转函数定义 Start********
void advance(int ct1,int sd1,int ct2,int sd2)//小车直线前进函数
TMOD=0x11;//中断模式设置
TH0=(65536-1000)/256;//定时器1 初始化
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-1000)/256;//定时器2 初始化
TL1=(65536-1000)%256;
EA=1;
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//**********第三部分 小车直线前进,左转,右转函数定义 End********
//**********第4 部分 主函数 Start********************************
main()
{
#include<reg52.h>
//*********************第一部分 Start***************************************
sbit IN1=P2^2;//以下是点击驱动芯片L298 管脚位声明
{
forward_turn1();
智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用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;}}。
自动循迹小车程序(包括LCD显示模块)

#include<reg51.h>#define uchar unsigned char#define uint unsigned intunsigned char NUM=0 ;sbit LSEN1=P2^0;sbit LSEN2=P2^1;sbit MSEN1=P2^2;sbit RSEN1=P2^3;sbit RSEN2=P2^4;//**传感器***/sbit IN1=P1^0;sbit IN2=P1^1;sbit IN3=P1^2;sbit IN4=P1^3;sbit ENA=P1^4;sbit ENB=P1^5;void qianjin();void turn_left();void turn_right();//******************直行******************// void qianjin(){IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;}//***************左转函数***************// void turn_left(){IN1=0;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;}//***************右转函数***************// void turn_right(){IN1=1;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;}//***************循迹函数*****************//void xunji(){uchar flag;if((RSEN1==1)&&(RSEN2==1)&&(MSEN1==0)&&(LSEN1==1)&&(LSEN2==1)) { flag=0; }//*******直行*******//elseif((RSEN2==0)&&(RSEN1==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1)) { flag=1;} //***左偏1,小右转***//elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==1)) { flag=2; } //***右偏1,小左转***//elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==1)) { flag=3; } //***右偏2,大左转***//elseif((RSEN2==1)&&(RSEN1==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1)) { flag=4;} //***左偏2,大右转***//elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==1)) { flag=5; } //***右偏3,中左转***//elseif((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1)) { flag=6; } //***左偏3,中右转***//elseif((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==0)) { flag=7; }elseif((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==0)) { flag=8; }elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==0)) { flag=9;}elseif((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==0)){ flag=10;}elseif((RSEN1==0)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==0)) { flag=11;}elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==0)) { flag=12;}switch (flag){ case 0:qianjin();break;case 1:turn_right();break;case 2:turn_left();break;case 3:turn_left();break;case 4:turn_right();break;case 5:turn_left();break;case 6:turn_right();break;case 7:turn_right();break;case 8:turn_right();break;case 9:turn_left();break;case 10:turn_left();break;case 11:qianjin();break;case 12:qianjin();break;default: break; }}//****************主程序****************// void main(){qianjin();while(1){xunji(); //*********寻迹**********// }}。
循迹小车程序(三路循迹)

#include "reg51.h"typedef unsigned int uint;typedef unsigned char uchar;sbit p2_0 = P2^0; //开关sbit p2_1 = P2^1; //红外检测sbit p2_2 = P2^2;sbit p2_3 = P2^3;sbit p1_0 = P1^0; //电机驱动sbit p1_1 = P1^1;sbit p1_2 = P1^2;sbit p1_3 = P1^3;sbit pwm1 = P1^4; //pwm调速sbit pwm2 = P1^5;unsigned char timer1;/******************************************************************** ************ 函数名 : Time1Config* 函数功能 : 设置定时器* 输入 : 无* 输出 : 无********************************************************************* **********/void Time1Config(){TMOD|= 0x10; //设置定时计数器工作方式1为定时器//--定时器赋初始值,12MHZ下定时0.5ms--//TH1 = 0xFE;TL1 = 0x0C;ET1 = 1; //开启定时器1中断EA = 1;TR1 = 1; //开启定时器}/************************************************ 延时函数总共延时1ms乘以count************************************************/ void DelayX1ms(uint count){uint j;while(count--!=0){for(j=0;j<72;j++);}}/************************************************ 电机转动函数定义************************************************/ void ZhiXing( ){p1_0=0;p1_1=0;p1_2=0;p1_3=0;DelayX1ms(10);p1_0=0;p1_1=1;p1_2=0;p1_3=1;DelayX1ms(15);}void ZuoZhuan( ){pwm1=0;pwm2=0;DelayX1ms(10); p1_0=0;p1_1=1;p1_2=1;p1_3=0;DelayX1ms(20); }void YouZhuan( ){pwm1=0;pwm2=0;DelayX1ms(10);p1_0=1;p1_1=0;p1_2=0;p1_3=1;DelayX1ms(20); }void HouTui( ){p1_0=0;p1_1=0;p1_2=0;p1_3=0;DelayX1ms(6); p1_0=1;p1_1=0;p1_2=1;p1_3=0;DelayX1ms(20);}/************************************************ 主函数************************************************/ void main( ){Time1Config();while(1){if( p2_1==0 && p2_2==0 && p2_3==1){YouZhuan( );}else if(p2_1==1 && p2_2==0 && p2_3==0){ZuoZhuan( );}else{ZhiXing( );}}}/******************************************************************** ************ 函数名 : Time1* 函数功能 : 定时器1的中断函数* 输入 : 无* 输出 : 无********************************************************************* **********/void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断{timer1++;if(timer1>100) //PWM周期为100*0.5ms{timer1=0;}if(timer1 < 85) //改变30这个值可以改变直流电机的速度{pwm1=1;pwm2=1;}else{pwm1=0;pwm2=0;}TH1 = 0xFE; //重新赋初值TL1 = 0x0C;}。
循迹小车程序代码

//(在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延时
智能循迹小车程序

智能小车程序(共三个)第一个:#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;}。
光电循迹小车使用手册

在此界面中,用户可以在菜单工具栏中的“文件”、“工具”、“帮助”等菜单进行操作;同时,也可以操作菜单工具栏下方的选项:“赛道设计”、“赛车设计”、“仿真模拟”、“结果回放”,进入相应的操作子界面进行进一步的操作。
赛道设计:在赛道设计子界面中,可以进行赛道的设计操作,如新建及修改赛道、赛道基本参数设定等。
图1.3赛道设计界面
赛道主视窗及全局视窗可即时显示出正在设计的赛道的形状,供用户设计时参考,当坐标停留在主视窗内时,左下角状态栏会有当前鼠标点的坐标显示,方便用户设计赛道时地定位。用户可以通过赛道编辑来实现赛道地设计,右下角的数据列表还有当前赛道地数据信息显示,这样使赛道设计更加方便、直观。
图1.4赛车设计界面
赛车设计包括:赛车基本参数设置、电机参数设置、舵机参数设置、添加并设置传感器参数四个方面。获得并设置准确的各种参数,是一个好的赛车模型的基础。
图1.5仿真界面
仿真开始之后,系统提供了5块区域显示赛车行驶过程中的各种状态参数:
1)主视窗
显示局部区域的赛车运行姿态,用于细节观察。
2)全局视窗
显示全局信息,用于观察赛车运行全局状态。
智能车的角度控制是通过单片机输出pwm信号对舵机进行控制的舵机内部有一个基准电路能产生周期为20ms宽度为15ms的基准光电循迹小车使用手册信号当pwm信号输入到舵机时舵机内部产生一个直流偏置电压此电压与电位器的电压比较将获得电压差输出最后电压差的正负输出到电机驱动芯片决定舵机的正反转
光电循迹小车使用手册
#define Left2 0//宏定义,左转
#define Right2 3//宏定义,右转
sbit ControlPort = P0^0; //舵机信号端口
自动循迹智能小车制作(飞思卡尔智能车制作)

自动循迹智能小车制作目录摘要................................................................. 错误!未定义书签。
1 设计要求 (3)2 方案的选择与比较 (3)2.1 主控芯片选择 (3)2.2 电源的选择 (3)2.3 寻迹方案 (4)2.3 电机驱动方案 (4)3 最终方案 (5)4各功能模块的实现 (6)4.1 微控制器模块的设计 (6)4.2电源模块原理图 (6)4.3 TCRT5000红外检测模块 (6)4.4 系统PCB图 (7)4.5 系统程序流程图 (8)5 性能测试 (9)6 性能评价及总结 (10)7 附录 (11)附录1:元件清单 (11)附录2 系统原理图 (12)附录3系统程序 (13)8参考文献 (19)1 设计要求设计一自动寻迹小车,其实现功能如下:1.使其能够检测到轨迹的路线,并按照预订轨迹运行;2.要求在小车冲出预定路线后能够自动回到预定轨迹上;3.小车能够按多种不同的轨迹运行。
2 方案的选择与比较2.1 主控芯片选择方案1:采用51系列单片机,该系列单片机结构简单,但是能实现很多功能。
与其它单片机相比较价格便宜。
端口电流较大,可以达到20mA,驱动能力强。
方案2:采用msp430系列单片机,该系列单片机片上资源丰富,功能强大,但是端口灌电流和拉电流较小,驱动能力不强。
它主要运用在需要低功耗的地方。
本系统主要是进行寻迹运行的检测以及电机的控制,经过对比分析,我们选用AT89S52单片机作为主控芯片来驱动电机,进而控制电机转速。
2.2 电源的选择方案1:采用9V蓄电池为直流电机供电,将9V电压降压、稳压后给单片机系统和其他芯片供电。
蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。
虽然蓄电池的体积过于庞大,在小型电动车上使用极为不方便。
方案2:采用9V南孚干电池直接个电机驱动芯片L298N供电,并将9V经过7805稳压及电容滤波后给单片机供电。
飞思卡尔智能车程序代码

#define flag 1;
extern uchar cflag;
extern int i,j,m,n;
extern byte cs[40][60];
/*-----------------------*/
/*-------初始化----------*/
void InputInit(){
#pragma TRAP_PROC
void IRQ_ISR()
{
TIE_C1I=1; ;
//DDRB=0XFF;
//PORTB=0XF0;
//while(1);
i=0;
j=0;
}
#pragma CODE_SEG DEFAULT
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
TIE_C1I=0 ; //channel 0 interrupt DISable
TIOS_IOS1=0 ; //channel 0 input capture
TCTL4_EDG1A=1;
TCTL4_EDG1B=0;
}
/*-----------------------*/
/*--中断初始化--------------------*/
void init_IRQ() {
INTCR_IRQE=1; // IRQ select edge sensitive only
INTCR_IRQEN=1; // external IRQ enable
}
/*------ADT初始化--------------*/
void ADCInit(void)
void linenihe(void);
循迹小车程序

1.#include<intrins.h>2.#include<reg51.h>3.#include<1602.h>4.unsigned char code xiaoche[] = {"xiaoche"};5.unsigned char code mm[] = {"mm"};6.unsigned char code distance[]={"distance"};7.unsigned char code time[]={"time"};8.unsigned char zkbz=0 ; /*占空比*/9.unsigned char zkby=0 ;10.unsigned char t=0; /* 定时器中断计数器 */11.unsigned int juli=0; /*距离*/12.unsigned char a=0;13.unsigned char sl=0; /*时间秒*/14.unsigned char sh=0; /*时间秒*/15.unsigned char fl=0; /*时间分*/16.unsigned char fh=0; /*时间分*/17.unsigned int dis=0; /*实际距离*/18.bit flag=0; /*标志位*/19.sbit gm=P2^3; /*光敏*/20.21./********************************************************22.控制口定义23.*********************************************************/24.sbit en1 =P1^1; /* L298的Enable A */25.sbit s1 =P1^0; /* L298的Input 1 */26.sbit s2 =P1^2; /* L298的Input 2 */27.sbit en2 =P1^4; /* L298的Enable A */28.sbit s3 =P1^3; /* L298的Input 1 */29.sbit s4 =P1^5; /* L298的Input 2 */30.sbit Guandian0=P2^0;31.sbit Guandian1=P2^1;32.sbit Guandian2=P2^2;33.34.35./*******************************************************36.外部中断计算路程37.********************************************************/38.void service_int0() interrupt 039.{40. EX0=0;41.if(flag==0)juli++;42.else juli--;43. dis=juli*5;44. DispOneChar(9,1,dis/10000);45. DispOneChar(11,1,dis/1000%10);46. DispOneChar(12,1,dis/100%10);47. EX0=1;48. }49.50./*************************************************************51.定时器0服务程序52.*************************************************************/53.54.void timer0() interrupt 1 /* T0中断服务程序 */55.{56.if(t<zkbz) en1=1; else en1=0; /* 产生电机1的PWM信号 */57.if(t<zkby) en2=1; else en2=0;/* 产生电机1的PWM信号 */58. t++;59.if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */60.}61.62./*************************************************************63.定时器1服务程序64.*************************************************************/65.void timer1() interrupt 366.{67. unsigned char cnt;68. TH1=(65536-50000)/256;69. TL1=(65536-50000)%256;70. cnt++;71.if(cnt>=20)72. {73. cnt=0;74. ++sl;75.if(sl==10)76. {77. sl=0;78. ++sh;79.if(sh==6)80. {81. sh=0;82. ++fl;83.if(fl==10)84. {85. fl=0;86. ++fh;87. }88. }89. }90. }91. }92.93./*************************************************************94.循迹程序95.*************************************************************/96.void xunji(void)97.{98.switch(a)99. {100.case 0x02:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=40;zkby=40;break; 101.case 0x01:flag=0;s1=0;s2=1;s3=1;s4=0;zkbz=70;zkby=15;break; 102.case 0x04:flag=0;s1=1;s2=0;s3=0;s4=1;zkbz=15;zkby=70;break; 103.case 0x03:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=65;zkby=15;break; 104.case 0x06:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=15;zkby=75;break; 105.case 0x00:flag=1;s1=1;s2=0;s3=1;s4=0;zkbz=30;zkby=30;break; 106.default:break;107. }108. Delay5Ms();109. }110.111.112./**************************************************************113.内部资源初始化114.*******************************************************************/ 115.void Init(void)116.{117. TMOD=0x12; /* 设定T0的工作模式为2,设定T0的工作模式为1 */118. TH0=0xB6; /* 装入定时器的初值 */119. TL0=0xB6;120. TH1=(65536-50000)/256;121. TL1=(65536-50000)%256;122. IT0=1;123. IP=0x03;124. EA=1; /* 开总中断 */125. ET0=1; /* 定时器0允许中断 */126. ET1=1; /* 定时器1允许中断 */127. TR1=1; /* 启动定时器1 */128. TR0=1; /* 启动定时器0 */129. EX0=1; /*开中断0*/130. }131.132.133.void main(void)134.{135. Init(); /*系统初始化*/ 136. LcdReset(); /*液晶初始化*/ 137. DisplayListChar(0,0,"time",4) ;138. DispOneChar(7,0,':');139. DisplayListChar(0,1,"distance",8) ;140. DispOneChar(10,1,':');141.142. zkbz=40;143. zkby=40;144. s1=0;s2=1;s3=0;s4=1;145.146.do{ /*循迹*/ 147. a=P2;148. a=a&0x07;149. xunji();150. }while(a!=0x07);151.152. zkbz=40; /*避障*/ 153. zkby=40;154. s1=0;s2=1;s3=0;s4=1; //前155. delay(20000);156. s1=0;s2=1;s3=1;s4=0; //左157. delay(65000);158. s1=0;s2=1;s3=0;s4=1; //前159. delay(60000);160. s1=1;s2=0;s3=0;s4=1; //右161. delay(50000);162. s1=0;s2=1;s3=0;s4=1; //前163. delay(60000);164./* s1=1;s2=0;s3=0;s4=1; //右165. delay(60000);166. s1=0;s2=1;s3=0;s4=1; //前167. delay(60000);168. s1=0;s2=1;s3=1;s4=0; //左169. delay(60000);*/170. s1=0;s2=1;s3=0;s4=1; //前171.172.do/*趋光*/173. {174. a=P2;175. a=a&0x07;176.if(!gm)177. {178. zkbz=60;zkby=0;}179.else180. {zkbz=0;zkby=70;}181. delay(10000);182. }while(a==0);183.184. s1=s2=s3=s4=0;185. s1=0;s2=1;s3=0;s4=1;186. delay(20000);187.188. EA=0;189.do{s1=s2=s3=s4=0;190. DispOneChar(5,0,fh+0x30);191. DispOneChar(6,0,fl+0x30);192. DispOneChar(8,0,sh+0x30);193. DispOneChar(9,0,sl+0x30);}while(1); 194.}。
循迹小车程序

{
youzhuan3();
delay(40);//右转弯3 PWM3
//zhengzhuan();
}
///// // //////////左转有2种情况//////////// /////////
delay(40); //n越大转的越慢,决定停的时间
}
void main()
{
while(1)
{
////////////////////特殊情况//////////////////
while(led2==1&&led3==1&&led4==0&&led5==1&&led6==1)// 11011
{
while(led2==1&&led3==0&&led4==1&&led5==1&&led6==1) // 10111
{
zuozhuan1();
delay(20);//左转弯1 ~PWM1
//zhengzhuan();
}
while(led2==0&&led3==1&&led4==1&&led5==1&&led6==1) // 01111
delay(40); //n越大转的越慢,决定停的时间
}
///// // //////////左转有四种情况//////////// /////////
void zuozhuan1()//左转弯1 ~PWM1
智能_循迹小车详细制作过程

2.2.1道路识别模块..................................................................3
三、光电管与摄像头结合寻线:兼顾了光电寻线的抗干扰能力强和摄像头寻线前瞻性远、信息量大的特点。
难点:光电管与摄像头之间的配合,两者切换的条件。
2.2具体方案
2.2.1道路识别模块
使用了CMOS摄像头和单排七对红外发射接受二极管。根据比赛环境的不同
可灵活选择各个方案。
在光电管与摄像头结合寻线模式里,使用光电管检测的信息作为整幅图像处理的第一行,在采集的图像干扰过多或信息量过少时切换到光电管循线的模式。
6.2调试过程.................................................................................24
6.3主要技术参数说明.................................................................25第七章结论..........................................................................................27附录A参考书目.......................................................................................I
4.1整体介绍....................................................................................9
循迹小车(程序)

附录程序目录一、前言------------------------------------------------------------二、小车功能------------------------------------------------------三、元器件选择--------------------------------------------------四、 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();
}
循迹小车_完整程序

程序# include <reg51.h>//********驱动芯片L298管脚位声明*****sbit IN1= P1^0;sbit PWM1= P1^1;sbit IN2= P1^2;sbit IN3= P1^3;sbit PWM2= P1^4;sbit IN4= P1^5;//********传感器TCRT5000管脚位声明****sbit XL= P1^6; //左侧第一个传感器sbit XR= P1^7; //右侧第一个传感器sbit YL= P2^0; //左侧第二个传感器sbit YR= P2^1; //右侧第二个传感器//********用于定时计数的两个全局变量位声明****** int count1=0;int count2=0;//********左边电机前进*******void forward_turn1(){IN1=0;IN2=0;}//*********左边电机后退******void reverse_tuen1(){IN1=1;IN2=0;}//*********右边电机前进*******void forward_turn2(){IN3=0;IN4=1;}//**********右边电机后退********void reverse_turn2(){IN3=1;IN4=0;}//***********左边电机速度控制函数******void speed1(int ct,int sd){if(ct<=sd)PWM1=1;elsePWM1=0;}//************右边电机速度控制函数******viod speed2(int ct,int sd){if (ct<=sd)PWM2=1;elsePWM2=0;//*************小车直线前进函数*********void advance (int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**********小车左转********void left_turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//************小车右转*********viod riht_ turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**************主函数**********main(){TMOD=ox11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;EA=1;ET1=1;TR1=1;while(1){if(XL==0&&XR==0&&YL==0&&YR==0) //传感器未检测到直线,小车直行{advance(count1,500,count2,500);}if(XL==1&&XR==0&&YL==0&&YR==0) //左边内侧传感器检测到黑线,小左转 {Left_turn1(count1,200,count2,500);}if(XL==0&&XR==0&&YL==1&&YR==0) //左边外侧传感器检测到黑线,大左转{Left_turn1(count1,200,count2,700);}if(XL==0&&XR==1&&YL==0&&YR==0) //右边内侧传感器检测到黑线,小右转{right_turn1(count1,500,count2,200);}if(XL==0&&XR==0&&YL==0&&YR=1) //右边外侧传感器检测到黑线,大右转{right_turn1(count1,700,count2,200);}if(XL==1&&XR==0&&YL==1&&YR=0) //左侧两个传感器均检测到黑线,中左转{Left_turn1(count1,200,count2,600);}if(XL==0&&XR==1&&YL==0&&YR=1) //右侧两个传感器均检测到黑线,中右转{right_turn1(count1,600,count2,200);}}}//******中断服务程序*******viod time0() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if (count1>=1000)count1=0}viod time1() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if (count2>=1000)count2=0}#include<reg52.h>//驱动芯片L298管脚声明sbit IN1=P2^1;sbit IN2=P2^2;sbit IN3=P2^4;sbit IN4=P2^5;sbit PWM1=P2^0;sbit PWM2=P2^3;//传感器管脚位声明sbit L1=P3^0;//左侧第一个对管sbit L2=P3^1;//左侧第二个对管sbit R1=P3^3;//右侧第一个对管sbit R2=P2^2;//右侧第二个对管//定时器全局变量int count1=0;int count2=0;//左电机前进void forward_turn1(){IN1=1;IN2=0;}//左电机后退void back_turn1(){IN1=0;IN2=1;}//右电机前进void forward_turn2(){IN3=0;IN4=1;}//右电机后退void back_turn2(){IN3=1;IN4=0;}//左电机速度控制void speed1(int ct,int sd) {if(ct<=sd)PWM1=1;elsePWM1=0;}//右电机速度控制void speed2(int ct,int sd){if(ct<=sd)PWM2=1;elsePWM2=0;}//小车直线前进void advance(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//小车左转void left_turn(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//小车右转void right_turn(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//主函数main(){TMOD=0X11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TMOD=0X11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;while(1){if(L1==0&&R1==0&&L2==0&&R2==0)//小车未检测到黑线{advande(count1,500,count2,500)}if(L1==1&&R1==0&&L2==0&&R2==0)//左边内侧检测到黑线,小左转{left_turn(count1,200,count2,500)}if(L1==0&&R1==0&&L2=1&&R2==0)//左边外侧检测到黑线,大左转{left_turn(count1,200,count2,700)}if(L1==0&&R1==1&&L2=0&&R2==0)//右边内侧检测到黑线,小右转{right_turn(count1,500,count2,200)}if(L1==0&&R1==0&&L2=0&&R2==1)//右边外侧检测到黑线,大右转{right_turn(count1,700,count2,200)}if(L1==1&&R1==0&&L2=1&&R2==0)//左边两侧检测到黑线,中左转{left_turn(count1,200,count2,600)}if(L1==0&&R1==1&&L2=0&&R2==0)//右边两侧检测到黑线,中右转{left_turn(count1,600,count2,200)}if(L1==1&&R1==1&&L2=1&&R2==1)//右边外侧检测到黑线,小右转{IN1=0;IN2=0;IN3=0;IN4=0;}}}//中断服务程序void time0() interrrupt1; {TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if(count1>=1000)count1=0;}void time1() interrrupt1; {TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if(count2>=1000)count2=0;}。
智能循迹小车详细源代码程序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)

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 {
智能循迹小车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.转弯 , 调头速度 - c orrect_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<reg52.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 》20-- 》200-- 》500#define midrright5ucharDuty_left,Duty_right,i=0,j=0; //左右占空比标志,取 1--100 sbit IN仁 P2A0;sbit IN2=P2A1;sbit IN3=P2A2;sbit IN4=P2A3;sbit ENA=P1A0;sbitENB=P1A1;// 循迹口五组红外对管,依次对应从左往右第 1,2,3,4,5 五组 sbitleft1 =P1A6;sbit left2 =P1A5;sbit mid3 =P1A4;sbit right4=P1A3;sbit right5=P1A2;void line_left();void line_right();voidline_straight()reentrant;// ------------------------{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;}delay(check_right);// 左边遇到黑线时,左边出了黑线之后,继续延时一段时间,判断右边是否遇到黑线,// 若遇到黑线,执行 line_right() 函数if(right5==m1){line_right();goto label2;}if((mid3==m1)||(left2==m1)||(right4==m1)){line_straight();} else{while(left2==m0){turn_left();}if(midl==m1) line_straight();}label2: ;}// -------------------------------------------void detect_infrared() // 循迹,红外检测{if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1){correct_left();}elseif(right4==m1){correct_right();}elseline_straight();}// ------------------------void main(void)// 主程序部分{init();while(1) // 循环检测红外对管采集的电平信号{detect_infrared();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//if(OUT2==0 && OUT3==0 && OUT4==1 && OUT5==0 && OUT6==0 && OUT7==0)//qian==0
m=50;
//else
//m=20;
/*if(OUT2==0 && OUT3==1 && OUT4==0 && OUT5==0 && OUT6==0 && OUT7==0)//qian==0
{
pwm=15;
}
}
void zhuan5()
{
if( OUT2==0 && OUT1==0 && OUT3==0 && OUT4==0 && OUT5==1 && OUT6==0 && OUT7==0/**/)
{
pwm=14;
}
}
void zhuan6()
{if(OUT1==0 && OUT2==0 && OUT3==0 && OUT4==0 && OUT5==0&& OUT6==1 && OUT7==0/**/)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Init()
{
OUT1=1;
OUT2=1;
OUT3=1;
OUT4=1;
OUT5=1;
OUT6=1;
OUT7=1;
TMOD=0x11;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
t=0;
}
void T1_time() interrupt 3
{
TH1=(65536-100)/256;
TL1=(65536-100)%256;
//EA=0;
tim=tim+1;
if(tim>m)// 10
ENA=1;
else
ENA=0;
/*if(tim<zkb2)// 190
pwm2=0;
else pwm2=1;
{
pwm=13;
}
}
void zhuan7()
{
if(OUT1==0 && OUT2==0 && OUT3==0 && OUT4==0 && OUT5==0&& OUT6==0 && OUT7==1/**/)
{
pwm=12;
}
}
void zhengzhuan()
{
IN1=1;
IN2=0;
}
void jiansu()
{
pwm=18;
}
}
void zhuan2()
{
if(OUT1==0 &&OUT5==0 && /**/OUT4==0 && OUT2==1 && OUT3==0 && OUT6==0 && OUT3==0)
{
pwm=17;
}
}
void zhuan3()
{if(OUT1==0 && OUT2==0 && OUT3==1 && OUT4==0 && OUT5==0&& OUT6==0 && OUT7==0/**/)
m=75;
if(OUT2==0 && OUT3==0 && OUT4==0 && OUT5==1 && OUT6==0 && OUT7==0)//qian==0
m=75;
if(OUT2==1 && OUT3==0 && OUT4==0 && OUT5==0 && OUT6==0 && OUT7==0)//qian==0
{
pwm=16;
}
}
void zhuan4()
{
if( /*OUT1==1 && OUT2==0 && OUT3==0 && OUT4==0 && OUT5==0)||*/ ( OUT1==0 && OUT2==0 && OUT3==0 && OUT4==1 && OUT5==0 && OUT6==0 && OUT7==0
sbit OUT3=P1^3;
sbit OUT4=P1^4;
sbit OUT5=P1^5;
sbit OUT6=P1^6;
sbit OUT7=P1^7;
sbit qian=P2^0;
uchar t=0;
uchar zk=0;
uint pwm=0;
uchar tim=0;
uchar m=180;
void delayms(uint xms)
)||(OUT1==1 && OUT2==1 && OUT3==1&&OUT4==1 && OUT5==0&& OUT6==0 && OUT7==0)||(
OUT1==0 && OUT2==0 &&OUT3==1 && OUT4==1 && OUT5==1&& OUT6==1 && OUT7==1))
TH1=(65536-100)/256;
TL1=(65536-100)%256;
EA=1;
TR0=1;
ET0=1;
TR1=1;
ET1=1;
}
void zhuan1()
{
if(OUT1==1 && OUT2==0 && OUT3==0 && OUT4==0 &&/**/ OUT5==0 && OUT6==0 && OUT7==0)
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit ENA=P0^5;
sbit IN1=^0;
sbit IN2=P0^4;
sbit duoji=P1^0;
sbit OUT1=P1^1;
sbit OUT2=P1^2;
{
//IN1=0;
m=100; //IN2=0;
}
} */
void main()
{
delayms(2000);
Init();
while(1)
{
zhengzhuan();
//tingzhuan();
jiansu();
//jiasu();
zhuan1();
zhuan2();
zhuan3();
zhuan4();
if(tim<m)
ENA=0;
else */
if(tim==250)
tim=0;
//EA=1;
}
zhuan5();
zhuan6();
zhuan7();
}
}
void T0_time() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(t==0)zk=pwm;
if(t<=zk)
duoji=1;
else
duoji=0;
t++;
if(t==20)
m=85;
if(OUT2==0 && OUT3==0 && OUT4==0 && OUT5==0 && OUT6==1 &&OUT7==0)//qian==0
m=85;*/}
/* void jiasu()
{
if(qian==1)
m=30;
}
void tingzhuan()
{
if(OUT1==0 && OUT2==0 && OUT3==0 && OUT4==0 && OUT5==0&& OUT6==0 && OUT7==0)