找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26501|回复: 46
打印 上一主题 下一主题
收起左侧

stc15单片机超声波测距教程

  [复制链接]
跳转到指定楼层
楼主
我想做超声波测距,用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
超声波测距的特点就是便宜,缺点就不说了,主要说说超声波器距离模块的用法原理吧,模块图如下:



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

源程序:

  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 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏24 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:161033 发表于 2017-4-14 20:00 | 只看该作者
支持一下。
回复

使用道具 举报

板凳
ID:187096 发表于 2017-4-15 00:44 | 只看该作者
谢谢分享,支持一下            
回复

使用道具 举报

地板
ID:192084 发表于 2017-5-17 11:09 | 只看该作者
谢谢分享,很不错的资料,感谢
回复

使用道具 举报

5#
ID:115593 发表于 2017-6-12 15:32 | 只看该作者
赞一个
回复

使用道具 举报

6#
ID:211040 发表于 2017-6-14 09:50 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:209421 发表于 2017-6-16 05:26 | 只看该作者
很不错的东西。。谢谢楼主分享
回复

使用道具 举报

8#
ID:219260 发表于 2017-7-12 23:07 | 只看该作者
谢谢分享!
回复

使用道具 举报

9#
ID:219260 发表于 2017-7-12 23:08 | 只看该作者
正好用到,强烈支持!
回复

使用道具 举报

10#
ID:221358 发表于 2017-7-21 16:56 | 只看该作者
可以用51单片机做吗?
回复

使用道具 举报

11#
ID:215883 发表于 2017-7-22 22:23 | 只看该作者
32的有没有
回复

使用道具 举报

12#
ID:226405 发表于 2017-8-10 08:48 | 只看该作者
谢谢分享!
回复

使用道具 举报

13#
ID:230319 发表于 2017-8-31 20:36 | 只看该作者
hao  hao哈哈哈好
回复

使用道具 举报

14#
ID:106195 发表于 2017-9-1 17:09 | 只看该作者
感谢分享,支持一下。
回复

使用道具 举报

15#
ID:236374 发表于 2017-9-28 20:17 | 只看该作者
谢谢分享
回复

使用道具 举报

16#
ID:256836 发表于 2017-12-4 09:18 | 只看该作者
谢谢呢
回复

使用道具 举报

17#
ID:255989 发表于 2017-12-5 20:46 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

18#
ID:183763 发表于 2017-12-20 21:03 | 只看该作者
我也来做一个看看
回复

使用道具 举报

19#
ID:285174 发表于 2018-2-24 15:48 | 只看该作者
支持 一下!
回复

使用道具 举报

20#
ID:103510 发表于 2018-3-22 17:17 | 只看该作者
谢谢,非常感谢楼主
回复

使用道具 举报

21#
ID:301545 发表于 2018-4-3 15:59 | 只看该作者
楼主好人,超级不错
回复

使用道具 举报

22#
ID:268439 发表于 2018-4-5 16:59 | 只看该作者
感谢分享
回复

使用道具 举报

23#
ID:351471 发表于 2018-6-13 22:44 | 只看该作者
虽然没积分下载 但是先 mark了
回复

使用道具 举报

24#
ID:345079 发表于 2018-7-11 15:35 | 只看该作者
谢谢分享,很不错的资料,感谢
回复

使用道具 举报

25#
ID:369118 发表于 2018-7-11 21:33 | 只看该作者
好东西 ,谢谢分享
回复

使用道具 举报

26#
ID:378529 发表于 2018-7-24 15:39 | 只看该作者
学习学习,谢谢楼主!!!!!!!!
回复

使用道具 举报

27#
ID:383273 发表于 2018-8-6 02:12 | 只看该作者
谢谢分享,顶起
回复

使用道具 举报

28#
ID:66287 发表于 2018-8-7 14:32 | 只看该作者
好东东,谢谢分享!
回复

使用道具 举报

29#
ID:81444 发表于 2018-9-5 14:58 | 只看该作者
请问:time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;程序中为什么要+0.5?
回复

使用道具 举报

30#
ID:81444 发表于 2018-9-5 14:59 | 只看该作者
请问:time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;中为什么要+0.5
回复

使用道具 举报

31#
ID:403231 发表于 2018-9-28 16:50 | 只看该作者
先学习STc89吧,前面的基础都还没懂
回复

使用道具 举报

32#
ID:419084 发表于 2018-11-14 02:26 | 只看该作者
感谢楼主
回复

使用道具 举报

33#
ID:445696 发表于 2018-12-13 15:21 | 只看该作者
很好 支持一下
回复

使用道具 举报

34#
ID:58820 发表于 2018-12-16 21:54 | 只看该作者
很好 支持一下
回复

使用道具 举报

35#
ID:447947 发表于 2018-12-17 14:09 来自手机 | 只看该作者
这个源程序可以直接复制吗
回复

使用道具 举报

36#
ID:447947 发表于 2018-12-17 14:38 来自手机 | 只看该作者
这个有显示距离的吗?显示是以数码管显示还是e1602显示
回复

使用道具 举报

37#
ID:399179 发表于 2018-12-18 13:02 来自手机 | 只看该作者
感谢楼主分享!
回复

使用道具 举报

38#
ID:490013 发表于 2019-3-17 15:01 | 只看该作者
这个模块的缺点是什么,还有定时器初始化中TH0和TL0的值为什么不是从0开始计算。
回复

使用道具 举报

39#
ID:530474 发表于 2019-5-15 07:34 来自手机 | 只看该作者
不错不错
回复

使用道具 举报

40#
ID:484435 发表于 2019-5-15 19:02 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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