搜索
您的当前位置:首页正文

基于51单片机智能小车循迹程序

来源:小奈知识网


基于51序

单片机智能小车循迹程

#include #include #define uint unsigned int #define uchar unsigned char

/**********************************/ 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(iQ_ENA=1;

else Q_ENA=0; if(i>100) {Q_ENA=1;i=0;} if(jif(j>100 ) {Q_ENB=1;j=0;} if(k100) {H_ENA=1;k=0;} if(m100) {H_ENB=1;m=0;}

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(); };

}; }

因篇幅问题不能全部显示,请点此查看更多更全内容

Top