社区导航

 

搜索
查看: 4634|回复: 2

[求助] 51单片机自动避障循迹小车超声波测距模块

[复制链接]

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-4-16 20:42 | 显示全部楼层 |阅读模式
求大神指导,下面这个程序感觉上没错,但捎到小车上之后怎么都实现不了超声波测距和预期的效果,求大神指导,帮我看看程序有没有错误。
        /****************************************************************************
         硬件连接
        ****************************************************************************/

        #include
        #include

        #define Sevro_moto_pwm     P2_7           //接舵机信号端输入PWM信号调节速度

        #define  ECHO  P2_4                                   //超声波接口定义
        #define  TRIG  P2_5                                   //超声波接口定义

        #define Left_moto_go      {P1_0=1,P1_1=0,P1_2=1,P1_3=0;}    //左边两个电机向前走
        #define Left_moto_back    {P1_0=0,P1_1=1,P1_2=0,P1_3=1;}         //左边两个电机向后转
        #define Left_moto_Stop    {P1_0=0,P1_1=0,P1_2=0,P1_3=0;}    //左边两个电机停转                     
        #define Right_moto_go     {P1_4=1,P1_5=0,P1_6=1,P1_7=0;}        //右边两个电机向前走
        #define Right_moto_back   {P1_4=0,P1_5=1,P1_6=0,P1_7=1;}        //右边两个电机向前走
        #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 =14;//舵机归中,产生约,1.5MS 信号
    unsigned long S=0;
        unsigned long S1=0;
        unsigned long S2=0;
        unsigned long S3=0;
        unsigned long S4=0;
        unsigned int  time=0;                    //时间变量
        unsigned int  timer=0;                        //延时基准变量
        unsigned char timer1=0;                        //扫描时间变量
                               
/************************************************************************/
                void delay(unsigned int k)          //延时函数
{   
     unsigned int x,y;
           for(x=0;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=0;P2_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)
{                                  
         Left_moto_go ;     //左电机往前走
         Right_moto_go ;    //右电机往前走
}
/************************************************************************/
//前速后退
     void  backrun(void)
{
         Left_moto_back ;   //左电机往前走
         Right_moto_back ;  //右电机往前走
}
/************************************************************************/
//左转
     void  leftrun(void)
{
         Left_moto_back ;   //左电机往前走
         Right_moto_go ;   //右电机往前走
}
/************************************************************************/
//右转
     void  rightrun(void)
{
         Left_moto_go ;     //左电机往前走
         Right_moto_back ;  //右电机往前走
}
/************************************************************************/
//STOP
     void  stoprun(void)
{
         Left_moto_Stop ;   //左电机停走
         Right_moto_Stop ;  //右电机停走
}
/************************************************************************/
void  COMM( void )                      
  {
               
                 
                  push_val_left=5;          //舵机向左转90度
                  timer=0;
                  while(timer<=4000); //延时400MS让舵机转到其位置
                  StartModule();          //启动超声波测距
          Conut();                           //计算距离
                  S2=S;  
  
                  push_val_left=23;          //舵机向右转90度
                  timer=0;
                  while(timer<=4000); //延时400MS让舵机转到其位置
                  StartModule();          //启动超声波测距
          Conut();                          //计算距离
                  S4=S;        
       

                  push_val_left=14;          //舵机归中
                  timer=0;
                  while(timer<=4000); //延时400MS让舵机转到其位置

                  StartModule();          //启动超声波测距
          Conut();                          //计算距离
                  S1=S;        

          if((S2<30)||(S4<30)) //只要左右各有距离小于,20CM小车后退
                  {
                  backrun();
                   timer=0;
                  while(timer<=4000);   //后退
                  /*leftrun();                   //后退
                  timer=0;
                  while(timer<=4000); */
                  }
                  
                  if(S2>S4)                 
                     {
                                rightrun();          //车的左边比车的右边距离小        右转       
                        timer=0;
                        while(timer<=4000);
                     }                                     
                       else
                     {
                       leftrun();                //车的左边比车的右边距离大        左转
                       timer=0;
                       while(timer<=4000);
                     }
                                            

}

/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */
                void pwm_Servomoto(void)
{  

    if(pwm_val_left<=push_val_left)
               Sevro_moto_pwm=1;
        else
               Sevro_moto_pwm=0;
        if(pwm_val_left>=200)
        pwm_val_left=0;

}
/***************************************************/
/*///*TIMER1中断服务子函数产生PWM信号*/
/*        void time1()interrupt 3   using 2
{       
     TH1=(65536-100)/256;          //100US定时
         TL1=(65536-100)%256;
         timer++;                                  //定时器100US为准。在这个基础上延时
         pwm_val_left++;
         pwm_Servomoto();

         timer1++;                                 //2MS扫一次数码管
         if(timer1>=20)
         {
         timer1=0;
         Display();       
         }
}
**************************************************/
/*///*TIMER0中断服务子函数产生PWM信号*/
/*        void timer0()interrupt 1   using 0
{       
          
} */

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

        void main(void)
{

        TMOD=0X11;
        TH1=(65536-100)/256;          //100US定时
        TL1=(65536-100)%256;
        TH0=0;
        TL0=0;  
        TR1= 1;
        ET1= 1;
        ET0= 1;
        EA = 1;

        delay(100);
    push_val_left=14;          //舵机归中


        while(1)                       /*无限循环*/
        {  
         if(timer>=4000)          //100MS检测启动检测一次
           {
               timer=0;
                   StartModule(); //启动检测
           Conut();                  //计算距离
           if(S<30)                  //距离小于20CM
                   {
                   stoprun();          //小车停止
                   COMM();                   //方向函数
                   run();
                   }
      
                   else         run();          //距离大于,20CM往前走 run();
                  
           }

        }
          
          
   
}
       
此帖出自51单片机论坛

回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2014-4-16 21:06 | 显示全部楼层
大神们,求回复啊,现在真的很急啊

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-5-30 16:32 | 显示全部楼层
我也卡在这了,很纠结呀。

回复

使用道具 举报

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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-12-13 09:17 , Processed in 0.142010 second(s), 17 queries , Gzip On, MemCache On.

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