标题: stc15单片机超声波测距教程 [打印本页]

作者: phpython    时间: 2017-3-31 15:40
标题: 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, 下载次数: 505)


作者: xmch    时间: 2017-4-14 20:00
支持一下。
作者: akzyzj    时间: 2017-4-15 00:44
谢谢分享,支持一下            
作者: joesck    时间: 2017-5-17 11:09
谢谢分享,很不错的资料,感谢
作者: lilining    时间: 2017-6-12 15:32
赞一个
作者: 黑科技李    时间: 2017-6-14 09:50
谢谢分享
作者: 13852833337    时间: 2017-6-16 05:26
很不错的东西。。谢谢楼主分享
作者: jaytan    时间: 2017-7-12 23:07
谢谢分享!
作者: jaytan    时间: 2017-7-12 23:08
正好用到,强烈支持!
作者: 15680255162    时间: 2017-7-21 16:56
可以用51单片机做吗?
作者: 山大王    时间: 2017-7-22 22:23
32的有没有
作者: aftvc    时间: 2017-8-10 08:48
谢谢分享!
作者: JimmyLin    时间: 2017-8-31 20:36
hao  hao哈哈哈好
作者: 2855177040    时间: 2017-9-1 17:09
感谢分享,支持一下。
作者: bbcf123    时间: 2017-9-28 20:17
谢谢分享
作者: chenpp    时间: 2017-12-4 09:18
谢谢呢
作者: li7301298    时间: 2017-12-5 20:46
谢谢楼主分享
作者: A17094430    时间: 2017-12-20 21:03
我也来做一个看看
作者: chunmei    时间: 2018-2-24 15:48
支持 一下!
作者: zmotian    时间: 2018-3-22 17:17
谢谢,非常感谢楼主
作者: 875870842    时间: 2018-4-3 15:59
楼主好人,超级不错
作者: zhuzeng    时间: 2018-4-5 16:59
感谢分享
作者: narutoa    时间: 2018-6-13 22:44
虽然没积分下载 但是先 mark了
作者: jackyang75    时间: 2018-7-11 15:35
谢谢分享,很不错的资料,感谢
作者: tuxiaoxi    时间: 2018-7-11 21:33
好东西 ,谢谢分享
作者: 君子的君    时间: 2018-7-24 15:39
学习学习,谢谢楼主!!!!!!!!
作者: wzk123321    时间: 2018-8-6 02:12
谢谢分享,顶起
作者: bhjyqjs    时间: 2018-8-7 14:32
好东东,谢谢分享!
作者: liyuanchengx    时间: 2018-9-5 14:58
请问:time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;程序中为什么要+0.5?
作者: liyuanchengx    时间: 2018-9-5 14:59
请问:time = (TH0 * 256 + TL0 + cnt * 65536) * (1 / 12.000) + 0.5;中为什么要+0.5
作者: 一片到    时间: 2018-9-28 16:50
先学习STc89吧,前面的基础都还没懂
作者: 自哦    时间: 2018-11-14 02:26
感谢楼主

作者: 李云能    时间: 2018-12-13 15:21
很好 支持一下
作者: long369351    时间: 2018-12-16 21:54
很好 支持一下
作者: 铁血大师    时间: 2018-12-17 14:09
这个源程序可以直接复制吗
作者: 铁血大师    时间: 2018-12-17 14:38
这个有显示距离的吗?显示是以数码管显示还是e1602显示
作者: 快乐眼泪    时间: 2018-12-18 13:02
感谢楼主分享!
作者: highgong    时间: 2019-3-17 15:01
这个模块的缺点是什么,还有定时器初始化中TH0和TL0的值为什么不是从0开始计算。
作者: ZimmerHo    时间: 2019-5-15 07:34
不错不错
作者: 迁就    时间: 2019-5-15 19:02
谢谢分享
作者: sf116    时间: 2019-5-28 20:54
谢谢分享,下载试试
作者: 3230    时间: 2019-5-30 21:02
来测试下
作者: 开心果666    时间: 2019-6-2 12:31
有封装库吗
作者: fanywe    时间: 2019-6-9 10:23
君子的君 发表于 2018-7-24 15:39
学习学习,谢谢楼主!!!!!!!!

怎么下载的
作者: 郑子    时间: 2020-1-6 22:37
时间差怎么搞?第二次测距时的时间还算在内吗?
作者: shadaodadi    时间: 2020-5-24 20:51
速度快了肯定是好事啊,时间不是不够用,是速度快了,16位的计时器计时时间短, 要延时还不简单吗,用12T模式,或者是循环计数就好了,就怕跑的慢,不怕跑的快
作者: robinWei    时间: 2020-6-16 15:35
没有头文件,请版主共享一下,谢谢!




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