2416|2

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

通过超声波测距 [复制链接]

想用超声波实现避障,一共使用三个超声波——前左右各一个。超声波模块是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. }  


复制代码



此帖出自51单片机论坛

最新回复

好不错  详情 回复 发表于 2018-7-25 18:14
点赞 关注(1)
 

回复
举报

15

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我提一下自己的看法:首先,我觉得有一点不太好,你把设置中断优先级放在了开启总中断后面,然后,我觉得Tim1定时时间不太好,三个测距下来用的总时间就超过120us,而你设置的Tim1中断时间是100us,第一次S3还没有计算出数据,之后都是用的前一次的S3,可能用的本次的S1和S2,程序运行不会出问题,可能不能实现你想实现的功能,你说测距程序没有用,可能是因为没有检测到回波,你可以在检测到回波后加一个指示灯,或串口打印输出,确定问题出在具体什么地方
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
好不错
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表