通过超声波测距

2019-03-24 16:59发布

想用超声波实现避障,一共使用三个超声波——前左右各一个。超声波模块是hc-sr04,目前的问题应该是测距程序没有使用,想求助一下各位大佬,帮忙看下
  1. #include<reg52.h>
  2. #include <intrins.h>

  3. sbit ECHO_L=  P2^1;                                   //超声波接口定义
  4. sbit TRIG_L = P2^0;                                   //超声波接口定义

  5. sbit ECHO_R = P2^7;                                  //超声波接口定义
  6. sbit TRIG_R = P2^6;  

  7. sbit ECHO_b=P2^4;
  8. sbit TRIG_b=P2^3;                                //超声波接口定义

  9. #define dianji_pwm P2^2 //PWM信号端
  10. sbit Sevro_moto_pwm= P1^7 ;
  11. sbit IN1=P2^0;//电机控制
  12. sbit IN2=P2^1;
  13. sbit ENA=P2^2;


  14. bit Right_moto_stop=1;
  15. #define dianji_go {IN1=0,IN2=1,ENA=1;} //电机向前走
  16. #define dianji_back {IN1=1,IN2=0,ENA=1;} //电机向后走
  17. #define dianji_Stop {ENA=0;} //电机停转

  18. unsigned char pwm_val_dianji =0;//变量定义
  19. unsigned char push_val_dianji =0;//电机占空比N/20

  20. unsigned char pwm_val_duoji= 0;//变量定义
  21. unsigned char push_val_duoji =15;//舵机归中,产生约,1.5MS 信号

  22. unsigned int time;
  23. unsigned int timer;

  24. float S1;
  25. float S2;
  26. float S3;
  27. unsigned int flag;
  28. unsigned int time=0; //时间变量
  29. unsigned int timer=0; //延时基准变量
  30. unsigned char timer1=0; //扫描时间变量

  31. void delay(unsigned int k) //延时函数  11.059mhz下约10ms
  32. {
  33. unsigned int x,y;
  34. for(x=0;x<k;x++)
  35. for(y=0;y<2000;y++);
  36. }

  37. void delay_1ms(unsigned char x)          //1ms延时函数100ms以内可用
  38. {
  39. unsigned char i;
  40. while(x--)
  41. for(i=124;i>0;i--);
  42. }

  43. void Delay40us()                //@11.0592MHz
  44. {
  45.         unsigned char i;

  46.         _nop_();
  47.         i = 15;
  48.         while (--i);
  49. }
  50. void Delay1000ms()                //@11.0592MHz
  51. {
  52.         unsigned char i, j, k;

  53.         _nop_();
  54.         i = 8;
  55.         j = 1;
  56.         k = 243;
  57.         do
  58.         {
  59.                 do
  60.                 {
  61.                         while (--k);
  62.                 } while (--j);
  63.         } while (--i);
  64. }

  65. void Conut1(void)                   //计算距离
  66.         {
  67.         TRIG_L= 1; //拉高超声波模块触发IO
  68.     Delay40us();// 延时40us
  69.     TRIG_L= 0; //拉低超声波模块触发IO
  70.     while(ECHO_L==0);//等待超声波模块输出IO拉高
  71.     TR0 = 1; //开启定时器计时
  72.     while(ECHO_L==1); //等待超声波模块输出IO拉低
  73.     TR0 = 0;
  74.         time=(TH0*256+TL0);
  75.         S1=time*0.170;
  76.         TH0=0;
  77.         TL0=0;
  78.         }
  79. void Conut2(void)                   //计算距离
  80.         {
  81.           TRIG_R= 1; //拉高超声波模块触发IO
  82.     Delay40us();// 延时40us
  83.     TRIG_R= 0; //拉低超声波模块触发IO
  84.     while(ECHO_R==0);//等待超声波模块输出IO拉高
  85.     TR0 = 1; //开启定时器计时
  86.     while(ECHO_R==1); //等待超声波模块输出IO拉低
  87.     TR0 = 0;
  88.         time=(TH0*256+TL0);
  89.         S2=time*0.170;
  90.         TH0=0;
  91.         TL0=0;    //算出来是CM
  92.         }
  93. void Conut3(void)                   //计算距离
  94.         {
  95.           TRIG_b= 1; //拉高超声波模块触发IO
  96.     Delay40us();// 延时40us
  97.     TRIG_b= 0; //拉低超声波模块触发IO
  98.     while(ECHO_b==0);//等待超声波模块输出IO拉高
  99.     TR0 = 1; //开启定时器计时
  100.     while(ECHO_b==1); //等待超声波模块输出IO拉低
  101.     TR0 = 0;
  102.         time=(TH0*256+TL0);
  103.         S3=time*0.170;
  104.         TH0=0;
  105.         TL0=0;    //算出来是CM
  106.         }
  107. /*调节push_val_duoji的值改变舵机角度,占空比 */
  108. void  pwm_Servomoto(void)
  109. {
  110. if(pwm_val_duoji<=push_val_duoji)
  111.         Sevro_moto_pwm=1;           
  112. else {Sevro_moto_pwm=0;}       
  113. if(pwm_val_duoji>=200)
  114. pwm_val_duoji=0;
  115. }               
  116. /*调节电机占空比*/
  117. void pwm_out_dianji(void)
  118. {
  119.    
  120.           if(pwm_val_dianji<=push_val_dianji)
  121.            {
  122.              ENA=1;
  123.            }
  124.        else
  125.          {
  126.            ENA=0;
  127.          }
  128.        if(pwm_val_dianji>=20)
  129.            pwm_val_dianji=0;
  130.      
  131.    else
  132.     {
  133.      ENA=0;
  134.     }
  135. }
  136. void COMM(void)
  137. {
  138.         Conut1();
  139.         Conut2();
  140.         Conut3();
  141.         if(S3<20)
  142.         {
  143.                 ENA=0;;
  144.                
  145.         if(S1<10&&S2>10) flag=0;
  146.         if(S2<10&&S1>10) flag=1;
  147.         if(S1<10&&S2<10) flag=2;
  148.         if(S2>10&&S1>10) flag=3;
  149.         switch(flag)
  150.         {
  151.                 case 0 :push_val_duoji=17; break;
  152.                 case 1 :push_val_duoji=11; break;
  153.                 case 2 :push_val_duoji=14; break;
  154.                 case 3 :push_val_duoji=14; break;
  155.                 default :push_val_duoji=14; break;
  156.         }}
  157.        
  158. }
  159. void COMM1()
  160. {
  161. }
  162. /***************************************************/

  163. void main(void)
  164. {
  165.         TMOD=0X11;
  166.         TH1=(65536-100)/256; //100US定时
  167.         TL1=(65536-100)%256;
  168.         TR1= 1;
  169.         TH0=0;
  170.         TL0=0;
  171.        
  172.        
  173.        
  174.        
  175.         EA=1;
  176.         EX0=1;
  177.         EX1=1;
  178.         ET1=1;
  179.        
  180.         push_val_duoji=14; //舵机归中

  181.                
  182.         while(1) //无限循环
  183.         {      
  184.                 COMM();
  185.                
  186.         }
  187. }

  188. ///*TIMER1中断服务子函数产生PWM信号*/
  189. void timer0()interrupt 1            
  190. {        

  191. }

  192. void time1()interrupt 3
  193. {
  194.   TH1=(65536-100)/256; //100US定时
  195.   TL1=(65536-100)%256;
  196.   timer++; //定时器100US为准。在这个基础上延时
  197.   pwm_val_duoji++;
  198.   pwm_out_dianji();
  199.   pwm_Servomoto();
  200. }  


复制代码


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。