智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3949|回复: 15
打印 上一主题 下一主题

求大神帮忙分析程序!!

[复制链接]

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
跳转到指定楼层
1#
发表于 2014-8-30 18:36:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小车是四个电机驱动的,用超声波检测。我想让它检测到障碍后左转,可实现不了,还是一直往前走。不知程序哪里错了,求大神帮忙解决,小弟感激不已!!(就是左转那里有问题,程序其他部分经检验无误)

        /****************************************************************************
         硬件连接
        ****************************************************************************/

        #include<AT89x51.H>
        #include <intrins.h>
        #define  ECHO  P2_4                                   //超声波接口定义
        #define  TRIG  P2_5                                   //超声波接口定义

        #define Left_moto_pwm          P1_1         //PWM信号端
        #define Left_moto_pwm1          P1_3
        #define Right_moto_pwm          P1_5
        #define Right_moto_pwm1          P1_7               

        #define Left_moto_go      {P1_0=1,P1_2=1;}     //左边两个电机向前走
        #define Left_moto_back    {P1_0=0,P1_2=0;}           //左边两个电机向后转
        #define Left_moto_Stop    {P1_0=0,P1_1=0,P1_2=0,P1_3=0;}    //左边两个电机停转                     
        #define Right_moto_go     {P1_4=1,P1_6=1;}        //右边两个电机向前走
        #define Right_moto_back   {P1_4=0,P1_6=0;}        //右边两个电机向后走
        #define Right_moto_Stop   {P1_4=0,P1_5=0,P1_6=0,P1_7=0;}        //右边两个电机停转   


        unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
        unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
        unsigned char disbuff[4]          ={ 0,0,0,0,};
    unsigned char posit=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

        unsigned  int  time=0;
    unsigned long S=0;
        unsigned long S1=0;
        unsigned long S2=0;
        unsigned long S3=0;
        unsigned long S4=0;

        unsigned int  timer=0;                        //延时基准变量
        unsigned char timer1=0;                        //扫描时间变量               
       
    bit Right_moto_stop=1;
        bit Left_moto_stop =1;       
        bit flag_tt=1;       
       
/************************************************************************/
                void delay(unsigned int k)          //延时函数
{   
     unsigned int x,y;
           for(x=0;x<k;x++)
             for(y=0;y<2000;y++);
}
/************************************************************************/
    void Display(void)                                  //扫描数码管
        {
         if(posit==0)
         {P0=(discode[disbuff[posit]])&0x7f;}//产生点
         else
         {P0=discode[disbuff[posit]];}

          if(posit==0)
         { P2_1=02_2=1;P2_3=1;}
          if(posit==1)
          {P2_1=1;P2_2=0;P2_3=1;}
          if(posit==2)
          {P2_1=1;P2_2=1;P2_3=0;}
          if(++posit>=3)
          posit=0;
        }
/************************************************************************/
     void  StartModule()                       //启动测距信号
   {
          TRIG=1;                                        
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TRIG=0;
   }
/***************************************************/
          void Conut(void)                   //计算距离
        {
          while(!ECHO);                       //当RX为零时等待
          TR0=1;                               //开启计数
          while(ECHO);                           //当RX为1计数并等待
          TR0=0;                                   //关闭计数
          time=TH0*256+TL0;                   //读取脉宽长度
          TH0=0;
          TL0=0;
          S=(time*1.7)/100;        //算出来是CM
          disbuff[0]=S%1000/100;   //更新显示
          disbuff[1]=S%1000%100/10;
          disbuff[2]=S%1000%10 %10;
        }
/************************************************************************/
//全速前进
     void  run(void)
{       
     push_val_left=0;        //速度0最小,9最大
         push_val_right=0;                          
         Left_moto_go ;     //左电机往前走
         Right_moto_go ;    //右电机往前走
}
/************************************************************************/
//全速后退
     void  backrun(void)
{
     push_val_left=5;
         push_val_right=5;
         Left_moto_back ;   //左电机往后走
         Right_moto_back ;  //右电机往后走
}
/************************************************************************/
//左转
     void  leftrun(void)
{
     push_val_left=0;
         push_val_right=0;
         Left_moto_back ;     //左电机往后走
         Right_moto_go ;  //右电机往前走
}
/************************************************************************/
//右转
     void  rightrun(void)
{
     push_val_left=5;
         push_val_right=5;
         Left_moto_go ;   //左电机往前走
         Right_moto_back ;    //右电机往后走

}
/************************************************************************/
//STOP
     void  stoprun(void)
{
         Left_moto_Stop ;   //左电机停走
         Right_moto_Stop ;  //右电机停走

}
/************************************************************************/
/************************************************************************/
/*                    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;
                     Left_moto_pwm1=1;
                   }
        else
               {
                 Left_moto_pwm=0;
                     Left_moto_pwm1=0;
                   }
        if(pwm_val_left>=10)
               pwm_val_left=0;
   }
   else   
          {
                    stoprun();
                  }
}
/******************************************************************/
/*                    右电机调速                                  */  
   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;
                  }
        if(pwm_val_right>=10)
               pwm_val_right=0;
   }
   else   
          {
                   stoprun();
              }
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
        void time1()interrupt 3   using 2
{       

         TH1=0XFc;          //1Ms定时
         TL1=0X18;
         timer++;                                  //定时器100US为准。在这个基础上延时

         timer1++;                                  //2MS扫一次数码管
         if(timer1>=3)
         {
         timer1=0;
         Display();       
         }

         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}

/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/
        void timer0()interrupt 1   using 0
{       
          
}

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

        void main(void)
{

        TMOD=0X11;

        TH1=0XFc;          //1Ms定时
        TL1=0X18;
        TH0=0;
        TL0=0;  
        TR1= 1;
        ET1= 1;
        ET0= 1;
        EA = 1;


        while(1)                       /*无限循环*/
        {
         
          if(timer>=100)           //1000*1000US检测一次
           {
               timer=0;
                   StartModule(); //启动检测
           Conut();                  //计算距离
           if(S<30)                  //距离小于30CM
                   {
                       
                        leftrun();  //小车左转
               
                   }

                   else
                    {
                         Left_moto_stop=1;          //小车开始PWM
                            Right_moto_stop=1;
                         flag_tt=1;
                        }
                  
                }
       
        }         //END while

}
       

回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
2#
 楼主| 发表于 2014-8-30 18:39:03 | 只看该作者
sorry,   笑脸是分号
回复 支持 反对

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
3#
发表于 2014-8-30 19:02:07 | 只看该作者
你先看看是否检测到了
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
4#
 楼主| 发表于 2014-8-30 19:08:10 | 只看该作者
Quixote 发表于 2014-8-30 19:02
你先看看是否检测到了

能检测到。当遇到障碍后,左边两轮停止,右边两轮一直转,保持这样
回复 支持 反对

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
5#
发表于 2014-8-30 19:57:35 | 只看该作者
bruce_lu 发表于 2014-8-30 19:08
能检测到。当遇到障碍后,左边两轮停止,右边两轮一直转,保持这样

程序中提示检测到了?
回复 支持 反对

使用道具 举报

14

主题

876

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5811
威望
3006
贡献
1961
兑换币
1991
注册时间
2013-2-28
在线时间
422 小时
6#
发表于 2014-8-30 22:05:24 | 只看该作者
注释大法好!
控制变量打发好!
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
7#
 楼主| 发表于 2014-8-30 22:50:35 | 只看该作者
Quixote 发表于 2014-8-30 19:57
程序中提示检测到了?

烧录到单片机中让小车运行,当把手放到超声波前面时,左轮停止,右轮继续转
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
8#
 楼主| 发表于 2014-8-30 22:51:53 | 只看该作者
黑色枫夜 发表于 2014-8-30 22:05
注释大法好!
控制变量打发好!

那要怎么改?
回复 支持 反对

使用道具 举报

162

主题

2048

帖子

5

精华

超级版主

岳麓山没有车神

Rank: 10Rank: 10Rank: 10

积分
14920

论坛元老奖章优秀会员奖章活跃会员奖章论坛骨干奖章在线王奖章优秀版主奖章资源大师奖章

QQ
威望
6285
贡献
5963
兑换币
2581
注册时间
2013-11-14
在线时间
1336 小时
9#
发表于 2014-8-30 22:51:57 | 只看该作者
bruce_lu 发表于 2014-8-30 22:50
烧录到单片机中让小车运行,当把手放到超声波前面时,左轮停止,右轮继续转

那你程序应该没有问题。应该是检测不及时我感觉。
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
10#
 楼主| 发表于 2014-8-30 22:53:23 | 只看该作者
Quixote 发表于 2014-8-30 22:51
那你程序应该没有问题。应该是检测不及时我感觉。

恩,我再想想吧,thank you !!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 18:09 , Processed in 0.080563 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表