最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

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

来源:动视网 责编:小OO 时间:2025-09-30 14:25:18
文档

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

#include#include#defineuintunsignedint#defineucharunsignedchar/**********************************/ucharled_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};ucharcircle=0,cir_comp=0,cir_count=0;//设定圈数,实际圈数ucharturn_count=0;bitend=0;//圈数跑完标志/***
推荐度:
导读#include#include#defineuintunsignedint#defineucharunsignedchar/**********************************/ucharled_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};ucharcircle=0,cir_comp=0,cir_count=0;//设定圈数,实际圈数ucharturn_count=0;bitend=0;//圈数跑完标志/***
#include

#include

#define uint unsigned int

#define uchar unsigned char

/**********************************/

 uchar led_data[9]={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=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;  //车尾左轮控制

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--)

   {

    for(x=0; x<250;x++);

   

   };

 }

 /***********************************/

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_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     Q_ENA=1;

  else Q_ENA=0;

if(i>100)

  {Q_ENA=1;i=0;}

if(j     Q_ENB=1;

  else Q_ENB=0;

if(j>100 )

  {Q_ENB=1;j=0;}

if(k     H_ENA=1;

  else H_ENA=0;

if(k>100)    

  {H_ENA=1;k=0;}

if(m     H_ENB=1;

  else H_ENB=0;

if(m>100)

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

    

    };

                               

    

  };

}

文档

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

#include#include#defineuintunsignedint#defineucharunsignedchar/**********************************/ucharled_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};ucharcircle=0,cir_comp=0,cir_count=0;//设定圈数,实际圈数ucharturn_count=0;bitend=0;//圈数跑完标志/***
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top