基于51序
单片机智能小车循迹程
#include /**********************************/ uchar 0xf8,0x80}; uchar circle=0,cir_comp=0,cir_count=0;//设定圈数,实际圈数 uchar turn_count=0; bit end=0; //圈数跑完标志 /*********************************/ sbit xg0=P1^0; //左寻轨对管 sbit xg1=P1^1; //中间寻轨对管 sbit xg2=P1^2; //右寻轨对管 sbit xz=P1^3; //感应挡板对管 /*********************************/ sbit Q_IN1=P2^0; //车前左轮控制 sbit Q_IN2=P2^1; sbit Q_IN3=P2^2; //车前右轮控制 sbit Q_IN4=P2^3; sbit H_IN1=P2^4; //车尾左轮控制 led_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, sbit H_IN2=P2^5; sbit H_IN3=P2^6; //车尾右轮控制 sbit H_IN4=P2^7; sbit Q_ENA=P3^0; //车前左轮使能,PWM sbit Q_ENB=P3^1; //车前右轮使能, sbit H_ENA=P3^6; //车尾左轮使能, sbit H_ENB=P3^7; //车尾右轮使能, /****************************************/ #define stra_q_l 100 //直线行走时,四个轮子占空比调试 #define stra_q_r 100 #define stra_h_l 100 #define stra_h_r 100 #define turn_q_l 100 //转弯时四个轮子的占空比调试 #define turn_q_r 100 #define turn_h_l 100 #define turn_h_r 100 #define turnr_time 2900//右转弯时的延时常数 #define turnl_time 3000 //左转弯时的延时常数 #define dt_time 5800 //原地掉头时延时常数 #define over_time 1000 //停止延时 #define back_time 2500 //走完环形,回到直道延时转弯 #define black_time 1500 //过黑线的时间 #define correct_l_time 700 //左矫正时间 #define correct_r_time 700 //右矫正时间 #define hou_time 200 /***************************************/ uchar q_duty_l,q_duty_r,h_duty_l,h_duty_r,//车前后左右轮占空比 i=0,j=0,k=0,m=0; /**************************************/ void delay_cir(uint n) { uchar x; while(n--) { }; } /***********************************/ void delay(uint ct) // 延时函数 { uint t; t=ct; for(x=0; x<250;x++); while(t--); } /***************************************/ void straight() { q_duty_l=stra_q_l; q_duty_r=stra_q_r; h_duty_l=stra_h_l; h_duty_r=stra_h_r; Q_IN1=1; Q_IN2=0; Q_IN3=1; Q_IN4=0; H_IN1=1; H_IN2=0; H_IN3=1; H_IN4=0; } /***************************************/ void houtui() { //直走 //后退 q_duty_l=stra_q_l; q_duty_r=stra_q_r; h_duty_l=stra_h_l; h_duty_r=stra_h_r; Q_IN1=0; Q_IN2=1; Q_IN3=0; Q_IN4=1; H_IN1=0; H_IN2=1; H_IN3=0; H_IN4=1; } /***************************************/ void turn_left() { q_duty_l=turn_q_l; q_duty_r=turn_q_r; h_duty_l=turn_h_l; h_duty_r=turn_h_r; //左转 Q_IN1=0; Q_IN2=1; H_IN1=0; H_IN2=1; Q_IN3=1; Q_IN4=0; H_IN3=1; H_IN4=0; //左轮反转 //右轮正转 delay(turnl_time); } /***********************************/ void turn_right() //右转 { q_duty_l=turn_q_l; q_duty_r=turn_q_r; h_duty_l=turn_q_l; h_duty_r=turn_q_r; Q_IN1=1; Q_IN2=0; H_IN1=1; H_IN2=0; Q_IN3=0; //左轮正转 //右轮反转 Q_IN4=1; H_IN3=0; H_IN4=1; delay(turnr_time); } /**************************************************/ void turn_round() //原地掉头 { q_duty_l=turn_q_l; q_duty_r=turn_q_r; h_duty_l=turn_h_l; h_duty_r=turn_h_r; Q_IN1=0; Q_IN2=1; H_IN1=0; H_IN2=1; Q_IN3=1; Q_IN4=0; H_IN3=1; H_IN4=0; //左轮反转 //右轮正转 delay(dt_time); } /******************************************************/ void over() { Q_IN1=0; Q_IN2=0; Q_IN3=0; Q_IN4=0; H_IN1=0; H_IN2=0; H_IN3=0; H_IN4=0; } /*****************************************************/ void correct_right() //左偏,向右矫正 { q_duty_l=turn_q_l; q_duty_r=turn_q_r; h_duty_l=turn_q_l; h_duty_r=turn_q_r; //小车停止 Q_IN1=1; Q_IN2=0; H_IN1=1; H_IN2=0; Q_IN3=0; Q_IN4=1; H_IN3=0; H_IN4=1; //左轮正转 //右轮反转 delay(correct_r_time); } void correct_left() { q_duty_l=turn_q_l; q_duty_r=turn_q_r; h_duty_l=turn_h_l; h_duty_r=turn_h_r; Q_IN1=0; Q_IN2=1; H_IN1=0; H_IN2=1; Q_IN3=1; Q_IN4=0; //右偏,向左矫正 //左轮反转 //右轮正转 H_IN3=1; H_IN4=0; delay(correct_l_time); } /*************************************/ void xunji() { if(xg1==1) { turn_count++; over(); delay(over_time); if(turn_count==1) {straight(); delay(black_time); } else if(turn_count==2) {houtui(); delay(hou_time); turn_left(); } else if(turn_count==3) {houtui(); delay(hou_time); turn_right(); } else if(turn_count==4) {houtui(); delay(hou_time); turn_right(); } else if(turn_count==5) {straight(); delay(black_time); } else if(turn_count==6) {houtui(); delay(hou_time); turn_right(); } else if(turn_count==7) {houtui(); delay(hou_time); turn_right(); straight(); delay(back_time); turn_left(); } else if(turn_count==8) {straight(); delay(black_time); } else if(turn_count==9) {houtui(); delay(100); turn_round(); } if(turn_count>=9) {turn_count=0; cir_count++; circle--; } if(cir_count==cir_comp) {end=1; over(); delay(500); } } else if((xg0==0)&&(xg1==0)&&(xg2==0)) {straight();} else if((xg0==1)&&(xg1==0)&&(xg2==0)) {over(); delay(over_time); houtui(); delay(hou_time); correct_right(); }//左偏,向右矫正 else if((xg0==0)&&(xg1==0)&&(xg2==1)) {over(); delay(over_time); houtui(); delay(hou_time); correct_left(); } //右偏,向左矫正 } /***********************************************/ void int0(void) interrupt 0 //中断圈数设定 { EX0=0; delay_cir(250); circle++; cir_comp++; if(circle>8) {circle=0; cir_comp=0; } P0=led_data[circle]; EX0=1; } /*************************************/ void time1(void) interrupt 3 //T1溢出中断,电机调速{ i++; j++; k++; m++; if(i else Q_ENA=0; if(i>100) {Q_ENA=1;i=0;} if(j P0=led_data[circle]; TH1=0XFF; TL1=0XF6; } /*************************************/ void main() { P0=led_data[circle]; P1=0xFF; P1=0XFF; //P1口做输入 P2=0X00; //P2口初始化,小车禁止 P3=0XFF; TMOD=0X11;//T0,T1,工作方式1 TH1=0XFF; //T1中断一次10US TL1=0XF6; TR1=1; EX0=1; ET1=1; EA=1; while(1) { while((xz==1)&&(end!=1)) //无挡板,扫描对管,前进 { xunji(); }; }; } 因篇幅问题不能全部显示,请点此查看更多更全内容