基于51单片机制作超声波避障小车+舵机控制

基于51单片机制作超声波避障小车+舵机`

补充一下,主控芯片用的stc89c52,避障小车没有使用PWM波驱动电机,直接将电源降压给电机供电。

#include          
#define uint unsigned int           
#define uchar unsigned char
#define left_qian IN3=0,IN4=1 //左前进 
#define right_qian IN1=0,IN2=1   //右前进
#define left_hou  IN3=1,IN4=0// 左后退
#define right_hou IN1=1,IN2=0  //右后退
#define enable {ENA=1,ENB=1;}  //电机使能
#define disable {ENA=0,ENB=0;} 
uint s=40,pwm_zkb=0,time; 
uchar num=3;
uchar i=1,t=0;
uchar distance[4]={0,0,0,0};  //distance[1] 右距离distance[2]正前距离 distance[3] 左距离              
sbit trig=P0^0;            
sbit echo=P0^1;           
sbit IN1=P1^1;
sbit ENA=P1^0;
sbit IN2=P1^2;
sbit ENB=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;
sbit PWM=P0^3;
  /********************************************函数声明**********************/
  int juli();            //测距函数
  void delay(uint z);          //延迟函数
  void init();                      //初始化
  void delayms(unsigned int ms);
  void delay1(void)   //延迟20us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=1;a>0;a--);
}
void culibijiso()
{         
   if(distance[1]<=5 &&distance[2]<=5 && distance[3]<=5  )
   {
	      enable;          //先后退后右转
	     left_hou;
	     right_hou;
	     delay(1000);
	       enable;
	     left_qian;
	     right_hou;
	     delay(200);   
	     }
   else
   {
     if(distance[1]<=15 || distance[2]<=15 || distance[3]<=15)
    {
     if(distance[1]>=distance[2])
     {
	        if(distance[2]>=distance[3])  //左有障碍物 右转
	        {
		          enable;
		        left_qian;
		        right_hou;
		        delay(800);
		}
	        else        
	        {
		         if(distance[2]<=5)   //先后退后左转
		         { 
			         enable;
			        left_hou;
			        right_hou;
			        delay(800);
			        left_hou;
			        right_qian;
			        delay(200);
			 }
		       else       //右转
		       {
			          enable;
			         left_qian;
			         right_hou;
			         delay(800);
			}
		}
     }
  else
  {
       if(distance[1]>=distance[3])  //左有障碍物 右转
       {
	         enable;
	         left_qian;
	         right_hou;
	         delay(800);       
	}
       else         //左转
       {
	         enable;
	         left_hou;
	         right_qian;
	         delay(800);
	}
   }
  }
    
else    //直行
{
	       enable;
	     left_qian;
	     right_qian;
}
}
   
}
 void main()
 {       
 	init();
  	disable;
	   while(1)      
	  { 
		    if(t==150) //70ms为一个周期检测一次
		   {
			    t=0;
			    s=juli();
			    if(s>20)
			    {
			     enable;
			     left_qian;
			     right_qian; 
		             }
		    else
		    {
		     disable;
		     for(num=2;num<5;num++)
		     {  
			      pwm_zkb=0;
	
	
	
			 delay(1000);
			  distance[i]=juli();       
			   i++;
			  pwm_zkb=0;
			 
			
			}      
		        num=3;
		       delay(300);
		       i=1;
		       culibijiso();
		      
		       disable;     t=0;       
		    }
		  }
		    
	}
}
		 
	
	 void init()
	 {            
	  TMOD=0X11;           //选择定时器1和定时器0
	 TH0=0;      
	 TL0=0;
	 TH1=(65536-461)/256;        //t1赋初值
	 TL1=(65536-461)%256;  
	 EA=1;            //开总中断
	 ET1=1;            //开定时器1中断
	 TR1=1;            //打开定时器1
 }
void time1() interrupt 3
 {
 TH1=(65536-461)/256;
 TL1=(65536-461)%256;
 t++;
 if(pwm_zkb<num)
 {
   PWM=1;
 }
 else
 {
   PWM=0;
 }
  
 pwm_zkb++;
 if(pwm_zkb==40)
 {
  pwm_zkb=0;
 }
 }
int  juli()
 {
  	int ss;
        trig=1;
        delay1();                                      //延时20us
        trig=0;
        while(echo==0);          //等待回音
        TR0=1;                       // 开定时器0
        while(echo==1);          //当为高电平时等待
        TR0=0;                       //关闭定时器0
        time=TH0*256+TL0;          //读取脉冲长度
        ss=(time*1.72)/100;          //计算距离 单位为cm
        TH0=0;                             //重新赋初值
        TL0=0;
        return ss; 
  }
 void delay(uint z)
 {
	  uint i,k;
	 for(i=z;i>0;i--)
	 {
	      for(k=100;k>0;k--);
	 }
}


你可能感兴趣的:(51单片机,单片机,c语言)