智障小车.c

思路:不加控制时让小车往一边偏着走,当传感器探测到偏到一定程度时加以回正,再继续;做到一个传感器走直线,顺便能把直角弯给拐了

    /****************************************************************************
     硬件连接
     P1_6 接驱动模块ENA  使能端,输入PWM信号调节速度
     P1_7 接驱动模块ENB  使能端,输入PWM信号调节速度

     P3_4 P3_5 接IN1  IN2    当 P3_4=1,P3_5=0; 时左电机正转  驱动蓝色输出端OUT1 OUT2接左电机
     P3_4 P3_5 接IN1  IN2    当 P3_4=0,P3_5=1; 时左电机反转
     P3_6 P3_7 接IN3  IN4     当 P3_6=1,P3_7=0; 时右电机正转     驱动蓝色输出端OUT3 OUT4接右电机
     P3_6 P3_7 接IN3  IN4     当 P3_6=0,P3_7=1; 时右电机反转


     关于单片机电源:本店驱动模块内带LDO稳压芯片,当电池输入最低的电压6V时候可以输出稳定的5V
     分别在针脚标+5 与GND 。这个电源可以作为单片机系统的供电电源。
    ****************************************************************************/

    #include<AT89x51.H>

    #define Left_moto_pwm     P1_6     //接驱动模块ENA   使能端,输入PWM信号调节速度
    #define Right_moto_pwm    P1_7     //接驱动模块ENB




    #define Left_moto_go      {P3_2=0,P3_3=1;} //P3_4 P3_5 接IN1  IN2    当 P3_4=0,P3_5=1; 时左电机前进
    #define Left_moto_back    {P3_2=1,P3_3=0;} //P3_4 P3_5 接IN1  IN2    当 P3_4=1,P3_5=0; 时左电机后退
    #define Right_moto_go     {P3_6=0,P3_7=1;} //P3_6 P3_7 接IN1  IN2     当 P3_6=0,P3_7=1; 时右电机前转
    #define Right_moto_back   {P3_6=1,P3_7=0;} //P3_6 P3_7 接IN1  IN2     当 P3_6=1,P3_7=0; 时右电机后退

    unsigned char pwm_val_left  =0;//变量定义
    unsigned char push_val_left =0;// 左电机占空比N/10
    unsigned char pwm_val_right =0;
    unsigned char push_val_right=0;// 右电机占空比N/10
    bit Right_moto_stop=1;
    bit Left_moto_stop =1;
    unsigned  int  time=0;
     int a=0;//模式2


/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
        void pwm_out_left_moto(void)
{
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
           Left_moto_pwm=1;
    else
           Left_moto_pwm=0;
    if(pwm_val_left>=22)
    pwm_val_left=0;
   }
   else  Left_moto_pwm=0;
}
/******************************************************************/
/*                    右电机调速                                  */
   void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
           Right_moto_pwm=1;
    else
           Right_moto_pwm=0;
    if(pwm_val_right>=22)
    pwm_val_right=0;
   }
   else    Right_moto_pwm=0;
}
/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
    void timer0()interrupt 1   using 2
{
     TH0=0XF8;    //1Ms定时
     TL0=0X30;
     time++;
     pwm_val_left++;
     pwm_val_right++;
     pwm_out_left_moto();
     pwm_out_right_moto();
 }
 /***************************************************/

    void main(void)
{

    TMOD=0X01;
    TH0= 0XF8;        //1ms定时
    TL0= 0X30;
    TR0= 1;
    ET0= 1;
    EA = 1;

    while(1)                            /*无限循环*/
    {



        //第一种障碍物//
      if(P0_3==0)//正朝前的有障碍
      {

       while(P0_7==1)
        {
        Left_moto_back;Right_moto_go;push_val_left =2;push_val_right =2; 
        }

       while(P0_2==0)
        {
            if(P0_7==0||P0_6==0||P0_4==0)//
        {
           Left_moto_back;Right_moto_back;push_val_left  =3;push_val_right =1;  
            }
            if(P0_4==1)      //
          {
         Left_moto_back;Right_moto_back;push_val_left  =1;push_val_right =3; 
            }
        }
    }

    if(P0_5==0)//正朝斜的有障碍
    {

      while(P0_7==1)
      {
      Left_moto_back;Right_moto_back;push_val_left  =2;push_val_right =2;    
      }
      while(P0_2==0)
      {
        if(P0_7==0||P0_6==0||P0_4==0)//
      {
        Left_moto_back;Right_moto_back; push_val_left  =3;push_val_right =1;
        }
        if(P0_4==1)      //
      {
      Left_moto_back;Right_moto_back;push_val_left  =1;push_val_right =3;
        }
    }

    }    

   if(P0_3==1)//正朝前无障碍
   { P0_0=0;
    Left_moto_back;Right_moto_back; 
    if(P0_2==0)//正边侧
    {


      if(P0_1==1)//无障碍物的时候输出高电平
    {
    push_val_left  =4; push_val_right =1; 
      }
      else       //有障碍物的时候输出低电平
    {
    push_val_left  =1;push_val_right =4;  
      }
    }
    else  //解决拐大弯的问题
    {
    push_val_left  =2;push_val_right =0;  
    }

  }

 }

}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值