《基于单片机智能小车循迹程序》由会员分享,可在线阅读,更多相关《基于单片机智能小车循迹程序(20页珍藏版)》请在金锄头文库上搜索。
1、基于单片机智能小车循迹程序 作者: 日期:#include #include #define uint unsigned int#define uchar unsigned char/*/ uchar led_data9=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80; uchar circle=0,cir_comp=0,cir_count=0;/设定圈数,实际圈数 uchar turn_count=0; bit end=0; /圈数跑完标志/*/sbit xg0=P10;/左寻轨对管sbit xg1=P11;/中间寻轨对管sbit xg2=P12;
2、/右寻轨对管sbit xz=P13;/感应挡板对管/*/sbit Q_IN1=P20; /车前左轮控制 sbit Q_IN2=P21;sbit Q_IN3=P22; /车前右轮控制sbit Q_IN4=P23; sbit H_IN1=P24; /车尾左轮控制sbit H_IN2=P25;sbit H_IN3=P26; /车尾右轮控制sbit H_IN4=P27;sbit Q_ENA=P30; /车前左轮使能,PWMsbit Q_ENB=P31; /车前右轮使能,sbit H_ENA=P36; /车尾左轮使能,sbit H_ENB=P37; /车尾右轮使能,/*/#define stra_q_l
3、 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 /停
4、止延时#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-) for(x=0; x250;x+); ; /*/
5、void delay(uint ct)/ 延时函数 uint t; t=ct; 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_
6、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 tu
7、rn_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
8、=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_IN
9、1=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(corr
10、ect_l_time);/*/void xunji() if(xg1=1) turn_count+;over();delay(over_time);if(turn_count=1)straight(); delay(black_time);elseif(turn_count=2)houtui(); delay(hou_time); turn_left();elseif(turn_count=3)houtui(); delay(hou_time); turn_right();elseif(turn_count=4)houtui(); delay(hou_time); turn_right();elseif(turn_count=5)straight(); delay(black_time);elseif(turn_count=6)houtui(); delay(hou_time); turn_right();elseif(turn_count=7)houtui(); delay(hou_time); turn_right(); straight(); delay(back_time); turn_left();elseif(turn_count=8)straight(); delay(black_time);elseif(turn_count=9)