标题: 基于STC51单片机超声波测距(精简设计只需三个元件) [打印本页]

作者: 刘海龙    时间: 2016-10-16 21:33
标题: 基于STC51单片机超声波测距(精简设计只需三个元件)
基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧
1.所需元件:STC单片机+超声波模块+4位共阳数码管
2.原理:单片机向测距模块trig脚发送20us的高电平触发测距,Echo 测距结束时会输出高电平,电平时长为超声波信号往返时间之和。Echo 脚开始输出高电平时启动定时计数器计时,当Echo 脚高电平结束时停止计数,根据定时器的时间可算出距离。
3.连接:单片机插在面包板上数码管直接插在单片机上面(引脚一一对应见原理图)测距模块trig脚接P5.4Echo 脚接P5.5












  1. /***************************************************************                                                                                                        
  2. 作者:    刘海龙(部分程序来自网络及STC官网)
  3. 程序名:  51单片机超声波测距()    
  4. 编写时间:2016年7月4日
  5. 硬件支持:超声波模块US-020、四位共阳数码管、STC单片机                                                                  
  6. /***************************************************************/
  7. #include <STC15w.H>//        单片机头文件
  8. #include <intrins.h>
  9. #include <4LED_YANG.h>//包含共阳数码管驱动程序
  10. #define uchar unsigned char
  11. #define uint  unsigned int
  12. uint timeH,timeL;//定义2个存储计时器值的变量
  13. uint distance;//定义测量值的变量
  14. uint time;//定义Echo脚返回的高电平时间变量
  15. /***************************************************************/
  16. sbit        Echo         =         P5 ^ 5;        //超声波测距模块Echo连接的IO
  17. sbit        Trig         =         P5 ^ 4;        //超声波测距模块Trig连接的IO
  18. /*******************************************/
  19. void delay1ms (unsigned int a){ // 1ms延时程序
  20.         unsigned int i;
  21.         while( --a != 0){
  22.                 for(i = 0; i < 630; i++);//STC单片机在晶振为12MHz时i值上限为630  
  23.         }                                                       //AT89C51单片机在外部晶振为12MHz时i值上限为125
  24. }
  25. /*******************************************/               
  26. void delay_20us()                //@12.000MHz
  27. {
  28.         unsigned char i;
  29.         _nop_();
  30.         _nop_();
  31.         i = 57;
  32.         while (--i);
  33. }
  34. /*********************************************************************************************
  35. 函数名:定时器初始化函数
  36. 调  用:INT_init();
  37. /**********************************************************************************************/
  38. void INT_init (void){
  39.         TMOD=0x01; //定时器0,16位工作方式计数模式
  40.         TH0=0;   //定时器0清零
  41.     TL0=0; //定时器0清零
  42.         EA = 1;        //总中断开
  43.         Trig=0;//拉低为下次触发做准备   
  44. }
  45. //***************************************************************
  46. void dist (void){//测量距离程序
  47.         Trig=1;         //
  48.         delay_20us();   //延时20us
  49.         Trig=0;         //Trig输出20us高电平触发测距
  50.         while(Echo==0); //等待Echo回波引脚变高电平
  51.                 TR0=1;//程序运行到此处时说明Echo脚变成了高电平,此时启动T0开始计时
  52.                 while(Echo==1); //等待Echo回波引脚高电平结束               
  53.         TR0=0;//程序运行到此处时说明Echo脚变成了低电平,此时T0停止计时
  54.                 time=TH0*256+TL0;
  55.         distance=time*0.170;  //测量距离
  56.         distance=distance-2;//测量起点不同减去的数值不同        
  57.         TH0 = 0;  //重置计时器
  58.             TL0 = 0;
  59.                         
  60. }
  61. void main()//主函数  
  62. {

  63.         init();//单片机IO口工作方式初始化
  64.         INT_init;//T0初始化
  65.         while(1)        
  66.     {        
  67.                 dist();//测量距离
  68.                 disp();//数码管显示距离
  69.                 delay1ms(20);//两次测量间需要有10ms间隔                                            
  70.     }
  71. }
  72. //***************************************************************END
复制代码



超声波测距程序.rar

3.08 MB, 下载次数: 331, 下载积分: 黑币 -5

源程序+原理图


作者: gm388    时间: 2016-10-18 09:06
果然够精简
作者: 刘海龙    时间: 2016-10-18 10:14
gm388 发表于 2016-10-18 09:06
果然够精简

谢谢夸奖
作者: 紫电1    时间: 2017-2-19 10:05
下载看看
作者: 赵铎    时间: 2017-3-30 07:27
没有仿真图吗
作者: 刘海龙    时间: 2017-4-3 20:26
赵铎 发表于 2017-3-30 07:27
没有仿真图吗

没有仿真图
作者: 大肚肥猫    时间: 2017-4-3 23:46
下载看看
作者: rapemn    时间: 2017-6-2 11:33
你这是20脚单片机吧?哪有P5.5  P5.4的?
作者: kouzili    时间: 2017-11-8 22:01
好东西谢谢分享
作者: iloveplc    时间: 2017-12-13 10:46
超级简单,学习楼主的程序一下,问问楼主,连三极管都不用,单片机会没事吗?还有精度如果,误差为正负多少个mm?
作者: KAIving    时间: 2018-1-26 14:34
哈哈,正需要,谢谢啦
作者: KAIving    时间: 2018-1-26 14:52
回复回复,在找资料谢谢啦
作者: 993691524    时间: 2018-2-6 17:05
HC-SR04模块适用这套代码吗?

作者: 刚学车的小司机    时间: 2018-3-6 17:26
谢谢大佬分享
作者: wpq201800    时间: 2018-3-18 17:16
的确是很精简,学习下!
作者: 刚学车的小司机    时间: 2018-3-23 10:48
这个源程序为什么运行不出结果?
作者: 香辣小笼包    时间: 2018-4-12 11:46
学习一下
作者: hc1997    时间: 2018-6-4 12:01
学习一下

作者: XD1860    时间: 2018-6-4 13:16
厉害学习了这么精简效率好高啊
作者: 伦雪洋    时间: 2018-6-9 23:56
最近在做这方面的,下载来看看。
作者: 13855759542    时间: 2018-6-11 20:37
没有考虑超声波的测距范围吧,当定时器溢出的时候,不应该再添加个中断处理吗
作者: pantak    时间: 2018-7-5 10:07
学习一下
作者: 予轩同学    时间: 2018-8-4 11:24
没有仿真图嘛
作者: a9069776    时间: 2018-10-7 16:26
学习中,谢谢!
作者: 快乐眼泪    时间: 2018-10-7 20:19
这个精度和最大距离是多少
作者: 1468216262    时间: 2018-10-11 10:32
谢谢楼主,对我帮助很大
作者: 新乡家电维修    时间: 2018-10-11 12:13
rapemn 发表于 2017-6-2 11:33
你这是20脚单片机吧?哪有P5.5  P5.4的?

STC15W408AS单片机就有P5.5,P5.4,是个比较器两个输入脚,也可以做IO口使用
作者: pptototo    时间: 2018-10-12 09:58
确实精简
作者: gdxz001    时间: 2019-2-4 17:52
看着不错
作者: 文哥2019    时间: 2019-2-6 16:06
请问这个的精度和测量距离是多少?
作者: chwei1    时间: 2019-2-25 07:33
looklook,这几天正好在用sr04
作者: 艾特77    时间: 2019-2-25 13:38
楼主可以加一下Q吗,我想学习一下3444131422
作者: gxlin    时间: 2019-2-26 11:34
另件齐备,做一个玩玩。
作者: a461624201    时间: 2020-4-5 14:55
发个我理解和修改的程序,也不枉我研究一晚上。stc15f104e通过。

超声.zip

38.13 KB, 下载次数: 10, 下载积分: 黑币 -5


作者: tieq1952    时间: 2020-4-6 07:01
谢谢分享!!!
作者: rayin    时间: 2020-11-15 16:33
不错,值得学习。51hei有你更精彩!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1