找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26018|回复: 46
收起左侧

stc15单片机超声波测距教程

  [复制链接]
ID:93375 发表于 2017-3-31 15:40 | 显示全部楼层 |阅读模式
我想做超声波测距,用89c51系列的很简单,再这个系列的单片机太慢,现在基本上都
用stc15系列了吧,我现在都是stc15系列了,价格便宜,速度快。电压还是宽电压,在3.3v~5v之间
都可以,主要是速度快了,就可以处理更多的程序了。
好了,不说费话了,
其实用过stc15系列做超声波测距,就知道有个问题就是,单片机的速度快了,那么定时器
跑一圈的时间就少了,像stc15t系列跑一圈才 1除以12乘以65536,计算公式
1/12*65536=5.461ms左右。声音的速度大概为 us/58cm, 5461/58=94.2cm左右,发现计时器不够用了,
这个时候就得想办法了,
一般新手就不知道怎么办了,
其它很简单,定一个全局变量,记录跑了几圈,然后乘以65536,
具体的程序可以了看下面我发的 马伟的教程
上面有详细介绍。这里我就不多说,
那个教程写的很清楚。
写教程太花时间了。

教程:
本教程用的硬件清单:
    单片机:stc12c5a60s2、stc15w408as、stc15f2k60等
    超声波模块:HC-SR04
超声波测距的特点就是便宜,缺点就不说了,主要说说超声波器距离模块的用法原理吧,模块图如下:
2017032910503010506.png 2017032910511011227.png
2017032910541752019.png

好了,超声波模块的简介就这么多了,话不多说,直接上程序

源程序:

  1. #include "STC12C5A.H"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit Trig = P2^1;
  5. sbit Echo = P2^0;

  6. //声明函数
  7. void getDistance();//获取距离
  8. void Timer0Init();//初始化定时器0
  9. void UartInit();//初始化串口
  10. void SendData(u8 data_buf); //发送数据到串口
  11. void DelayXms(u16 n); //延时N ms

  12. //定义全局变量
  13. u8 cnt=0; //定时器0中断次数
  14. u16 time; //计时
  15. u16 distance; //距离


  16. void main(){
  17.     EA = 1;//开启总中断

  18.     UartInit();//初始化串口
  19.     Timer0Init();//初始化定时器0

  20.     while(1){
  21.         getDistance(); //获取距离
  22.         DelayXms(800); //延时
  23.     }

  24. }

  25. //获取距离
  26. void getDistance()
  27. {
  28.     u8 i,j=60;
  29.     u8 str[] = "D:-.--M";

  30.     TH0 = TL0 = cnt = 0; //初始化定时器0
  31.     Trig = 1; //拉高超声波模块触发IO
  32.     while(j--); // 延时20us
  33.     Trig = 0; //拉低超声波模块触发IO
  34.     while(!Echo);//等待超声波模块输出IO拉高
  35.     TR0 = 1; //开启定时器计时
  36.     while(Echo); //等待超声波模块输出IO拉低
  37.      TR0 = 0; //关闭定时器计时

  38.      //判断是否超出模块最大测距 4m
  39.      if(cnt < 5){
  40.          //计算出时间
  41.         time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;
  42.         //计算出距离 340m/s 或 us/58cm
  43.         distance = time / 58 + 0.5;
  44.     }else
  45.         distance = 0;

  46.     str[2] = (distance % 1000 / 100) + '0';
  47.     str[4] = (distance % 100 / 10) + '0';
  48.     str[5] = (distance % 10) + '0';
  49.     //从串口发出,也可以用显示器显示,自己接显示驱动就可以了
  50.     for(i=0;i<7;i++){
  51.         SendData(str[i]);
  52.     }
  53.     SendData('');
  54.     //复位定时器
  55.     cnt = 0;
  56.     TH0 = TL0 = 0;
  57. }
  58. //定时器0寄存器初始化
  59. void Timer0Init(void)        //100微秒@12.000MHz
  60. {
  61.     AUXR |= 0x80;        //定时器时钟1T模式
  62.     TMOD &= 0xF0;        //设置定时器模式
  63.     TMOD |= 0x01;        //设置定时器模式
  64.     TL0 = 0x50;        //设置定时初值
  65.     TH0 = 0xFB;        //设置定时初值
  66.     TF0 = 0;        //清除TF0标志
  67.     TR0 = 0;        //定时器0开始计时
  68.     ET0 = 1; //开启定时器中断
  69. }

  70. void T0() interrupt 1
  71. {
  72.     cnt++;
  73. }
  74. //串口初始化定时器1
  75. void UartInit(void)        //4800bps@12.000MHz
  76. {
  77.     SCON=0x52;                  
  78.     AUXR &= 0xFE;
  79.     TMOD=0x20;   
  80.     TH1=TL1=0xf3;
  81.     PCON=0x80;     
  82.     TR1=1;
  83. }

  84. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

下载:
超声波测距程序.rar (1.25 KB, 下载次数: 498)

评分

参与人数 5黑币 +99 收起 理由
angmall + 35 共享资料的黑币奖励!
ljw123456 + 5 共享资料的黑币奖励!
2482366442 + 5 共享资料的黑币奖励!
黑科技李 + 4
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:781098 发表于 2020-6-16 15:35 | 显示全部楼层
没有头文件,请版主共享一下,谢谢!
回复

使用道具 举报

ID:701637 发表于 2020-5-24 20:51 | 显示全部楼层
速度快了肯定是好事啊,时间不是不够用,是速度快了,16位的计时器计时时间短, 要延时还不简单吗,用12T模式,或者是循环计数就好了,就怕跑的慢,不怕跑的快
回复

使用道具 举报

ID:502551 发表于 2020-1-6 22:37 | 显示全部楼层
时间差怎么搞?第二次测距时的时间还算在内吗?
回复

使用道具 举报

ID:558051 发表于 2019-6-9 10:23 | 显示全部楼层
君子的君 发表于 2018-7-24 15:39
学习学习,谢谢楼主!!!!!!!!

怎么下载的
回复

使用道具 举报

ID:551975 发表于 2019-6-2 12:31 | 显示全部楼层
有封装库吗
回复

使用道具 举报

ID:268503 发表于 2019-5-30 21:02 | 显示全部楼层
来测试下
回复

使用道具 举报

ID:90358 发表于 2019-5-28 20:54 | 显示全部楼层
谢谢分享,下载试试
回复

使用道具 举报

ID:484435 发表于 2019-5-15 19:02 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:530474 发表于 2019-5-15 07:34 来自手机 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:490013 发表于 2019-3-17 15:01 | 显示全部楼层
这个模块的缺点是什么,还有定时器初始化中TH0和TL0的值为什么不是从0开始计算。
回复

使用道具 举报

ID:399179 发表于 2018-12-18 13:02 来自手机 | 显示全部楼层
感谢楼主分享!
回复

使用道具 举报

ID:447947 发表于 2018-12-17 14:38 来自手机 | 显示全部楼层
这个有显示距离的吗?显示是以数码管显示还是e1602显示
回复

使用道具 举报

ID:447947 发表于 2018-12-17 14:09 来自手机 | 显示全部楼层
这个源程序可以直接复制吗
回复

使用道具 举报

ID:58820 发表于 2018-12-16 21:54 | 显示全部楼层
很好 支持一下
回复

使用道具 举报

ID:445696 发表于 2018-12-13 15:21 | 显示全部楼层
很好 支持一下
回复

使用道具 举报

ID:419084 发表于 2018-11-14 02:26 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:403231 发表于 2018-9-28 16:50 | 显示全部楼层
先学习STc89吧,前面的基础都还没懂
回复

使用道具 举报

ID:81444 发表于 2018-9-5 14:59 | 显示全部楼层
请问:time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;中为什么要+0.5
回复

使用道具 举报

ID:81444 发表于 2018-9-5 14:58 | 显示全部楼层
请问:time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;程序中为什么要+0.5?
回复

使用道具 举报

ID:66287 发表于 2018-8-7 14:32 | 显示全部楼层
好东东,谢谢分享!
回复

使用道具 举报

ID:383273 发表于 2018-8-6 02:12 | 显示全部楼层
谢谢分享,顶起
回复

使用道具 举报

ID:378529 发表于 2018-7-24 15:39 | 显示全部楼层
学习学习,谢谢楼主!!!!!!!!
回复

使用道具 举报

ID:369118 发表于 2018-7-11 21:33 | 显示全部楼层
好东西 ,谢谢分享
回复

使用道具 举报

ID:345079 发表于 2018-7-11 15:35 | 显示全部楼层
谢谢分享,很不错的资料,感谢
回复

使用道具 举报

ID:351471 发表于 2018-6-13 22:44 | 显示全部楼层
虽然没积分下载 但是先 mark了
回复

使用道具 举报

ID:268439 发表于 2018-4-5 16:59 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:301545 发表于 2018-4-3 15:59 | 显示全部楼层
楼主好人,超级不错
回复

使用道具 举报

ID:103510 发表于 2018-3-22 17:17 | 显示全部楼层
谢谢,非常感谢楼主
回复

使用道具 举报

ID:285174 发表于 2018-2-24 15:48 | 显示全部楼层
支持 一下!
回复

使用道具 举报

ID:183763 发表于 2017-12-20 21:03 | 显示全部楼层
我也来做一个看看
回复

使用道具 举报

ID:255989 发表于 2017-12-5 20:46 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:256836 发表于 2017-12-4 09:18 | 显示全部楼层
谢谢呢
回复

使用道具 举报

ID:236374 发表于 2017-9-28 20:17 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:106195 发表于 2017-9-1 17:09 | 显示全部楼层
感谢分享,支持一下。
回复

使用道具 举报

ID:230319 发表于 2017-8-31 20:36 | 显示全部楼层
hao  hao哈哈哈好
回复

使用道具 举报

ID:226405 发表于 2017-8-10 08:48 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:215883 发表于 2017-7-22 22:23 | 显示全部楼层
32的有没有
回复

使用道具 举报

ID:221358 发表于 2017-7-21 16:56 | 显示全部楼层
可以用51单片机做吗?
回复

使用道具 举报

ID:219260 发表于 2017-7-12 23:08 | 显示全部楼层
正好用到,强烈支持!
回复

使用道具 举报

ID:219260 发表于 2017-7-12 23:07 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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