51智能小车写完程序车不动,程序哪里出了问题


#include <STC89C5xRC.H>
#ifndef _LED_H_
#define _LED_H_


sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_2=P3^2;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
 #define Left_1_led        P3_4     //????  
 #define Right_1_led       P3_5     //????    
 #define Left_moto_pwm      P1_6     //PWM???
 #define Right_moto_pwm      P1_7     //PWM???
 #define Left_moto_go      {P1_2=1,P1_3=0;}  //×óµç»úÏòǰ×ß
 #define Left_moto_back    {P1_2=0,P1_3=1;}     //×óµç»úÏòºó×ß
 #define Left_moto_Stop    {P1_2=0,P1_3=0;}   //×óµç»úÍ£Ö¹                    
 #define Right_moto_go     {P1_4=1,P1_5=0;}    //ÓÒµç»úÏòǰ×ß
 #define Right_moto_back   {P1_4=0,P1_5=1;}    //ÓÒµç»úÏòºó×ß
 #define Right_moto_Stop   {P1_4=0,P1_5=0;} //ÓÒµç»úÍ£Ö¹  

 
    sbit BUZZ=P2^3;

    unsigned char pwm_val_left  =0;//
    unsigned char push_val_left =0;// ??????N/20
    unsigned char pwm_val_right =0;
    unsigned char push_val_right=0;// ??????N/20
    bit Right_moto_stop=1;
    bit Left_moto_stop =1;
    unsigned  int  time=0;
    
    //ÑÓʱº¯Êý    
   void delay(unsigned int k)
{    
     unsigned int x,y;
     for(x=0;x<k;x++) 
       for(y=0;y<2000;y++);
}

//¼ÓËÙǰ½ø
     void  run(void)
{
     push_val_left=10;     
     push_val_right=10;
     Left_moto_go ;   //??????
     Right_moto_go ;  //??????
}

//ºóÍ˺¯Êý
     void  backrun(void)
{
     push_val_left=12;     
     push_val_right=12;
     Left_moto_back;   //??????
     Right_moto_back;  //??????
}

//×óת
     void  leftrun(void)
{     
     push_val_left=0;
     push_val_right=12;
     Left_moto_back  ;  //??????
     Right_moto_go  ;  //?????
}

//ÓÒת
     void  rightrun(void)
{ 
     push_val_left=12;
     push_val_right=0;
     Right_moto_back  ;   //??????
     Left_moto_go   ;  //?????    
}
//Í£Ö¹
     void  stop(void)
{ 
     push_val_left=15;
     push_val_right=15;
     Right_moto_Stop  ;   //??????
     Left_moto_Stop   ;  //?????    
}
/*×óµç»úµ÷ËÙ*/
        void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
           {
             Left_moto_pwm=1; 
//             Left_moto_pwm1=1; 
           }
    else 
           {
             Left_moto_pwm=0;
//             Left_moto_pwm1=0; 
           }
    if(pwm_val_left>=20)
           pwm_val_left=0;
   }
   else    
          {
           Left_moto_pwm=0;
//           Left_moto_pwm1=0; 
          }
}
/******************************************************************/
/*                    ÓÒµç»úµ÷ËÙ                                 */  
   void pwm_out_right_moto(void)
{ 
  if(Right_moto_stop)
   { 
    if(pwm_val_right<=push_val_right)
          {
           Right_moto_pwm=1; 
//           Right_moto_pwm1=1; 
           }
    else 
          {
           Right_moto_pwm=0;
//           Right_moto_pwm1=0; x
          }
    if(pwm_val_right>=20)
           pwm_val_right=0;
   }
   else    
          {
           Right_moto_pwm=0;
//           Right_moto_pwm1=0; 
          }
}
       
/***************************************************/
///*TIMER0?????????PWM??*/
     void timer0()interrupt 1   using 2
{
     TH0=0XFc;      //1Ms??
     TL0=0X18;
     time++;
     pwm_val_left++;
     pwm_val_right++;
     pwm_out_left_moto();
     pwm_out_right_moto();
 }    

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



void main(void)
{    

    unsigned char i;
    P1=0X00; 

B:        for(i=0;i<50;i++) 
        {
           delay(1);    
           if(P3_2!=0)
           goto B; 
        } 
        
         BUZZ=0;    
         delay(50);
         BUZZ=1;

             TMOD=0X01;
            TH0= 0XFc;          //1ms??
             TL0= 0X18;
               TR0= 1;
            ET0= 1;
            EA = 1;            
    while(1)    
    { 
     

              if(Left_1_led==1&&Right_1_led==1)

              stop();     

              else
             {              
                      if(Left_1_led==1&&Right_1_led==0)        
                  {
                       rightrun();     
                      delay(20);

                 }
               
                       if(Right_1_led==1&&Left_1_led==0)        
                  {      
                      
                      leftrun();      
                      delay(20);

                  }

建议仔细检查硬件接口是否正确,然后从main函数开始逐句分析。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7692727
  • 这篇博客也不错, 你可以看下51智能小车小车之循迹(一)
  • 除此之外, 这篇博客: 51智能小车(舵机、超声波、蓝牙)中的 总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    本项目能较好实现上述的功能,但由于硬件的一些限制还是会有一点问题。就这些问题进行如下说明:
    1.通过延时实现小车转动90,掉头等动作会因小车的区别而不同,需要根据实际情况调制延时函数参数,不过万向轮也会影响。
    2.本项目在运行是会发现小车直行时偏向左/右边,排除程序问题,初步判定是小车万向轮偏置导致(如有解决办法请告知本人,谢谢)。
    3.因超声波模块的硬件限制,在对条状物体的测距数据会不准确或者判断为无障碍。
    4.因小车运动过程中,测距需要一定时间导致小车过于靠近物体时,测距时间会延迟甚至卡在哪里(预测是给超声波用到定时器2定时时间太大(1ms),因距离太近,超声波高电平时间太短导致还没轮询到就变为低电平,count为0,数据不存储到数组),如果用外部中断触发可能可以避免。
    解决方法:设置超声波超时时间80ms(timeout,logo变量控制),超过时间执行后退,但仍需超声波模块扫描所有角度后才执行,不过延迟时间还是有点长但有所改善且不会卡在哪里。

    PS:第一次写文章,如有错误,望读者指正

  • 您还可以看一下 朱有鹏老师的巫妖王51单片机开发板配套视频课程课程中的 蓝牙模块小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^