智能循迹小车程序
- 格式:doc
- 大小:44.50 KB
- 文档页数:14
#include<reg52.h>#define uchar unsigned char#define uint unsigned int////电机驱动模块位定义////sbit M11=P0^0;//左轮sbit M12=P0^1;sbit M23=P0^2;//右轮sbit M24=P0^3;sbit ENA=P0^4;//左轮使能PWM输入改变dj1数值控制转速sbit ENB=P0^5;//右轮使能PWM输入改变dj2数值控制转速////占空比变量定义////unsigned char dj1=0;unsigned char dj2=0;uchar t=0;////红外对管位定义////sbit HW1=P1^0;//左前方sbit HW2=P1^1;//右前方sbit HW3=P1^2;//左后方sbit HW4=P1^3;//右后方////小车前进////void qianjin(){M11=1;//左轮M12=0;//M23=1;//右轮M24=0;//dj1=50;dj2=50;}////向左微调////void turnleft2(){M11=1;M12=0;M23=1;M24=0;dj1=7;//左轮dj2=50;//右轮}////向右微调////void turnright2(){M11=1;M12=0;M23=1;M24=0;dj1=50;dj2=7;}////向左大调////void left(){M11=0;M12=1;M23=1;M24=0;dj1=7;dj2=80;}////向右大调////void right(){M11=1;M12=0;M23=0;M24=1;dj1=80;dj2=7;}////循迹动作子函数////void xj(){if(HW1==0&&HW2==0&&HW3==0&&HW4==0)//前进逻辑{qianjin();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0)//左右微调{turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnright2();}if(HW1==1&&HW2==0&&HW3==1&&HW4==0)//左右大调{left();}if(HW1==0&&HW2==1&&HW3==0&&HW4==1){right();}}////初始化////void init(){TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;EA=1;ET0=1;TR0=1;}////定时器0中断////void timer0() interrupt 1 using 1{TH0=(65536-500)/256;TL0=(65536-500)%256;t++;if(t<dj1)ENA=1;else ENA=0;if(t<dj2)ENB=1;else ENB=0;if(t>=50){t=0;}}void main(){init();P1=0Xff;while(1){/////////////////循迹模式/////////////////////xj();}}。
智能循迹避障小车完整程序(亲测好使)/*******************************************//利用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;}}。
#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 "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;}。
智能寻迹小车总结报告08电本3袁坤朱昊汪武杰1.设计任务:设计并制作了一个智能电动车,通过车前方的感光模块引导小车沿黑色路径运行,并记录小车整个运动过程的时间。
(1)感光模块引导小车运动:小车黑色轨迹白色背景图1如图1,小车运行在以白色背景的黑色轨迹上。
小车在整个运行过程中沿黑色轨迹运动,当黑色轨迹向左转时,小车能够自动左转弯,左转弯灯亮;当黑色轨迹向右转时,小车能够自动右转弯,右转弯灯亮。
(2)小车能记录整个运行过程的时间:在小车开始运行时,单片机控制计时,当小车收到停止指令后,计时器停止计时,并通过小车上的数码管显示小车整个运行过程的时间。
2.程序框图寻迹小车的主程序如下3.系统的具体设计与实现根据设计任务要求,并且根据我们自己的需要而附加的功能,该电路的总体框图可分为几个基本的模块,框图如(图2)所示:红外传感模块3.1设计中选用红外传感器来准确检测黑色寻迹线。
共设置2个传感器,传感器检测到黑色的寻迹线时,输出逻辑电平1,检测不到黑色寻迹线时,输出逻辑电平0。
在小车正前方中间安装两个标号是1号和2号的传感器用于定位寻迹线中心线,如图。
实物图:由电路图可以看出,在整个运行过程中,红外线发射管一直工作,发出红外线,由于黑色对红外线的反射量很小,而白色背景对红外的反射量很大,这样经过红外接收管的电压值的不同,可以判断出小车的运行情况。
当小车在黑色轨迹上正常运行时,1号和2号传感器输出1,当小车右偏时,2号由输出1转变为0,此时单片机驱动电机模块,调控小车左右两轮的转速,调整车身向左转;当小车左偏时,1号由输出1转变为0,单片机调控小车车身向右转。
传感器部分是小车的“眼睛”,只有通过它的引导小车才能正常在轨道上运行。
在小车的调试过程中,遇到了一些问题。
第一,两个传感器中的红外管有时一直感光,有时感光很差;第二,在黑线上运行时,在一些弯路传感器可以判断出来,一些反应迟钝,并且恢复直行的时候,传感器却依然保持上一状态运行。
#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;}}}}。
arduino智能循迹⼩车代码(三个循迹模块)#include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = 11;int sum=0;void setup() {Serial.begin(9600);pinMode(leftMotor1, OUTPUT);pinMode(leftMotor2, OUTPUT);pinMode(rightMotor1, OUTPUT);pinMode(rightMotor2, OUTPUT);pinMode(A0, INPUT);pinMode(A1, INPUT);pinMode(A2, INPUT);}void loop() {tracing();}void tracing(){int data[4];data[0]=analogRead(A0);data[1]=analogRead(A1);data[2]=analogRead(A2);if(data[0]<210&&data[1]>500&&data[2]<210)//向前⾛{analogWrite(3,100);analogWrite(5,0);analogWrite(6,100);analogWrite(11,0);}if(data[0]>500 &&data[1]<210 && data[2]<210) // ⼩车偏左{analogWrite(3,0);analogWrite(5,0);analogWrite(6,120);analogWrite(11,0);}if(data[0]>500&&data[1]>500&&data[2]<210) //⼩车偏⼤左{analogWrite(3,0);analogWrite(5,120);analogWrite(6,120);analogWrite(11,0);}if(data[0]<210&&(data[1]-30)<210&&data[2]>500) //⼩车偏右{analogWrite(3,120);analogWrite(5,0);analogWrite(6,0);analogWrite(11,0);}if(data[0]<210&&data[1]>500&&data[2]>500) //⼩车偏⼤右{analogWrite(3,120);analogWrite(5,0);analogWrite(6,0);analogWrite(11,120);}if(data[0]>500&&data[1]>500&&data[2]>500) //左右都检测到⿊线是停⽌{analogWrite(3,0);analogWrite(5,0);analogWrite(6,0); analogWrite(11,0);}Serial.print(data[0]); Serial.print("---"); Serial.print(data[1]-30); Serial.print("---"); Serial.print(data[2]); Serial.print("---"); Serial.println(data[3]); }。
智能循迹小车,小车按中字笔画行驶/************“中”字笔画轨迹*************/#include<reg52.h>#include <intrins.h> //内部包含延时函数_nop_(); #define uchar unsigned char#define uint unsigned intunsigned 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输入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() //小车前进{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;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;}void init() //初始化{TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1 using 1 //定时器0中断{TH0=(65536-500)/256;TL0=(65536-500)%256;t++;if(t<dj1) ENA=1;else ENA=0;if(t<dj2) ENB=1;else ENB=0;if(t>=50){t=0;}}void main(){init();while(1){if(num1==0){if(HW1==0&&HW2==1&&HW3==1&&HW4==0){qianjin();}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==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=1;delay(50);}}}if(num1==1){if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0)num2=1;delay(50);qianjin();}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==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {stop();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();}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){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) {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(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();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=3;delay(50);qianjin();}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){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();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=4;delay(50);}}}if(num1==4){if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}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();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==1&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {num3=2;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==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();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();}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){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();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {stop();delay(100);num1=6;delay(50);}}if(num1==6){if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=6;delay(50);num3=3;delay(50);qianjin();}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){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();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==3&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=4;delay(10);stop();delay(100);qianjin();}if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(500);num1=7;delay(50);}}}if(num1==7){if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=7;delay(50);num3=4;delay(50);qianjin();}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){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();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==4&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=5;delay(10);stop();delay(100);qianjin();}if(num3==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=6;delay(10);stop();delay(100);qianjin();}if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(100);if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(90000);}}}}}。