之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接。

后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好,所以这次对它进行了改进。虽然上一次也使用了多次测量取平均值,但是内有排除中间会有错误数据的情况。

之前的程序是这样的(测距部分) :

  1. u32 t = 0;
  2. int i = 0;
  3. float lengthTemp = 0;
  4. float sum = 0;
  5. while(i!=5)
  6. {
  7. TRIG_Send = 1;      //发送口高电平输出
  8. Delay_Us(20);
  9. TRIG_Send = 0;
  10. while(ECHO_Reci == 0);      //等待接收口高电平输出
  11. OpenTimerForHc();        //打开定时器
  12. i = i + 1;
  13. while(ECHO_Reci == 1);
  14. CloseTimerForHc();        //关闭定时器
  15. t = GetEchoTimer();        //获取时间,分辨率为1US
  16. lengthTemp = ((float)t/58.0);//cm
  17. sum = lengthTemp + sum ;
  18. }
  19. lengthTemp = sum/5.0;
  20. return lengthTemp;

就是当超出测量范围的时候(3.4米),数据肯定是不准确的。还有就是当因为某些原因模块没有接收到返回的超声波,也会导致错误的数据,就算是取平均值,如果中间有一个很大的数据的话,计算的结果也是不精确的。

利用51再次使用这个模块的程序如下:

/*
获取当前距离
2018.3.5  误差在1cm以内
*/
float get_distence()
{unsigned long int time_buf = 0;       //总耗时float distence = 0;       //计算一次距离float sum = 0;         //多次计算的总距离uchar i = 0;while(i < NUM){time_flag = 0;    //先清除标志sr04_start();    //开始测距while(!ECHO);     //等待发出40khz脉冲,触发信号之后,echo会变成高电平time_0_start();    //当把trig拉高10us之后,模块即开始发出8个40khz的脉冲,与此同时,echo变为高电平时,打开定时器。while(ECHO);   //等待回响信号,收到回响信号,echo会变低电平TR0 = 0;        //关闭定时器if(time_flag != 0)  //超出测量范围continue;       //不进行计算,放弃这次测量,从新测量else               //time_flag = 0,没有超出测量范围{time_buf = (TH0 * 256) + TL0;distence = time_buf * 0.0168;//(单位:cm)虽然声速340m/s,发现使用0.0168更精确,可能和温度有关sum+= distence;i++;}      } return (sum/NUM) ;  //取NUM次平均值
} 

其实就是在进行计算前先判断一下定时器是否产生中断,如果产生中断,就放弃本次数据,再次测量。这样测出的数据算是很精确了,唯一的误差就是声速的计算上面,导致会有1-2cm的误差。

16位的定时器,12M的晶振,定时器模式1,从0开始计数,最大到65535,一次溢出需要的时间是0.065s,声速为340m/s。那么溢出时的距离为22.1m,已经远远超过了超声波模块的测量范围(0-5m),所以只要产生一次溢出,就可以认为是超出测量范围.。

所以在定时器中断函数中 :

void TIME0() interrupt 1
{
//  TF0 = 0;      //模式1硬件自动清零TH0 = 0;TL0 = 0;time_flag++;
}

其中对一些操作进行了简单的封装。开始测距函数,就是按照要求拉高TRIG引脚

/*start*/
void  sr04_start()
{TRIG = 1; delay_10us(5); //拉高50usTRIG = 0;
}

还有就是定时器开始函数,在这个函数里面需要把计数清零:

/*开启定时器0,打开之前先清除之前的计数,不然会累计计数*/
void time_0_start()
{   TH0 = 0;      //打开前计数清零TL0 = 0;TR0 = 1;     //打开定时器
}

然后就是模块的 初始化函数了,在初始化的时候其实就是对定时器的初始化,顺便把TRIG和ECHO引脚置0;

void sr04_init()
{   TRIG = 0;ECHO = 0;TMOD |= 0X01;  //定时器0模式设置1TH0 = 0;    //从0开始计数TL0 = 0;TR0 = 0;  //关闭定时器EA = 1;     //开总中断ET0 = 1; //允许定时器0中断
}

关于HC04超声波模块测距的进一步思考(51版)相关推荐

  1. 关于HC04超声波模块测距的思考(51版)

    之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好, 所以这次对它进行了改进.虽然 ...

  2. 快速上手Arduino -- 打印超声波模块测距信息到OLED屏幕上

    文章目录 快速上手Arduino -- 打印超声波模块测距信息到OLED屏幕上 实现效果: 模块说明: 引脚接线方法: 程序源码 附录 快速上手Arduino – 打印超声波模块测距信息到OLED屏幕 ...

  3. 树莓派超声波模块测距

    参考:树莓派超声波模块测距及C语言demo 作者:一只青木呀 发布时间: 2020-07-22 16:54:16 网址:https://blog.csdn.net/weixin_45309916/ar ...

  4. 超声波模块测距 Arduino代码

    1.本篇是记录关于使用超声波模块测距的记录,本次使用的超声波测距模块(HC-SR04)探测角度为<5°  宽电压工作在3.3~5V之间,最大测距为7m. 在Arduino中定义引脚,距离变量等. ...

  5. 用8266学习单片机-13-HC-SR04超声波模块测距示例-Ultrasonic-US-015

    HC-SR04原理 重点 5v供电.Tri引脚需要至少10us的高脉冲去触发.Echo返回的是超声波发射到返回的时间 距离怎么算看上面第三张图,US-015原理相似,注意测量范围最小值和最大值 接线 ...

  6. STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时

    参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...

  7. 32、树莓派的简单测试串口通信和超声波模块测距

    基本思想:随手记录一下众灵科技树莓派的测试串口通信和超声波模块,其镜像还是很nice,基本的库都给你安装了,比较大 链接:https://pan.baidu.com/s/11tMdoRh3bHmcYz ...

  8. STM32 超声波模块测距

    目录 HC-SR04模块 HC-SR04超声波测距模块工作原理 HC-SR04超声波模块的时序触发图 思路步骤 代码 实验结果 总结 HC-SR04模块 HC-SR04超声波测距模块工作原理 (1)采 ...

  9. Arduino实现使用超声波模块测距

    硬件材料: Arduino UNO R3.超声波模块.面包板一块.连接线若干 超声波模块如下图,一个超声波模块价格在5元以内. arduino实物连接图如下:  源码: void setup() { ...

最新文章

  1. java访问手机里的通讯录,访问手机通讯录(示例代码)
  2. jenkins角色权限管理
  3. 内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
  4. OpenStack(二)——Keystone组件
  5. 八戒科技服务技术负责人鸿鹄真人:做好技术负责人的4个关键特质
  6. 数据库报错SELECT list is not in GROUP BY clause and contains nonaggregated col
  7. css背景图充满整个屏幕
  8. 【阅读】所谓情商高,就是会说话
  9. 为什么安装了增强功能,VirtualBox菜单自动调整显示尺寸还是灰色,不能用
  10. 数据结构(C语言版 第2版严蔚敏版)完整课后习题答案汇总
  11. 威纶通触摸屏部分元件下载后不显示且编辑时无法选择
  12. 驱动实验一(第一个驱动程序创建)
  13. lol无法连接服务器win10系统,win10系统中lol无法连接服务器怎么办
  14. 为什么说暴雪必须“手游化”?
  15. Python分析《武林外传》 -----转载
  16. 你好,CSDN!你好,C语言!
  17. [附源码]计算机毕业设计Node.js-报刊征订管理系统(程序+LW)
  18. 台式机怎样连接连接蓝牙耳机?搜索不到蓝牙耳机?
  19. android16进制编辑器,16进制编辑器app
  20. java.lang.IllegalArgumentException异常

热门文章

  1. mysql进阶:optimize table 优化表命令 Table does not support optimize, doing recreate + analyze instead
  2. javascript 仿QQ五子棋
  3. 蓝湖切图后如何做成html,蓝湖支持「切图压缩」了!
  4. DeFi 生态大溃败:“寿司”,糊了;“三文鱼”,焦了
  5. 系统构架及工作原理详细介绍
  6. Shell sed编辑器
  7. css clip-path裁剪形状,实现绘制常用的形状和图形。反向裁剪
  8. 用C/C++获取CPU温度总结(一)
  9. 剑指Offer JZ45 扑克牌顺子(Java)
  10. 我的.emacs(Ubuntu版)(二十二)