关于HC04超声波模块测距的进一步思考(51版)
之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接。
后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好,所以这次对它进行了改进。虽然上一次也使用了多次测量取平均值,但是内有排除中间会有错误数据的情况。
之前的程序是这样的(测距部分) :
- u32 t = 0;
- int i = 0;
- float lengthTemp = 0;
- float sum = 0;
- while(i!=5)
- {
- TRIG_Send = 1; //发送口高电平输出
- Delay_Us(20);
- TRIG_Send = 0;
- while(ECHO_Reci == 0); //等待接收口高电平输出
- OpenTimerForHc(); //打开定时器
- i = i + 1;
- while(ECHO_Reci == 1);
- CloseTimerForHc(); //关闭定时器
- t = GetEchoTimer(); //获取时间,分辨率为1US
- lengthTemp = ((float)t/58.0);//cm
- sum = lengthTemp + sum ;
- }
- lengthTemp = sum/5.0;
- 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版)相关推荐
- 关于HC04超声波模块测距的思考(51版)
之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好, 所以这次对它进行了改进.虽然 ...
- 快速上手Arduino -- 打印超声波模块测距信息到OLED屏幕上
文章目录 快速上手Arduino -- 打印超声波模块测距信息到OLED屏幕上 实现效果: 模块说明: 引脚接线方法: 程序源码 附录 快速上手Arduino – 打印超声波模块测距信息到OLED屏幕 ...
- 树莓派超声波模块测距
参考:树莓派超声波模块测距及C语言demo 作者:一只青木呀 发布时间: 2020-07-22 16:54:16 网址:https://blog.csdn.net/weixin_45309916/ar ...
- 超声波模块测距 Arduino代码
1.本篇是记录关于使用超声波模块测距的记录,本次使用的超声波测距模块(HC-SR04)探测角度为<5° 宽电压工作在3.3~5V之间,最大测距为7m. 在Arduino中定义引脚,距离变量等. ...
- 用8266学习单片机-13-HC-SR04超声波模块测距示例-Ultrasonic-US-015
HC-SR04原理 重点 5v供电.Tri引脚需要至少10us的高脉冲去触发.Echo返回的是超声波发射到返回的时间 距离怎么算看上面第三张图,US-015原理相似,注意测量范围最小值和最大值 接线 ...
- STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时
参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...
- 32、树莓派的简单测试串口通信和超声波模块测距
基本思想:随手记录一下众灵科技树莓派的测试串口通信和超声波模块,其镜像还是很nice,基本的库都给你安装了,比较大 链接:https://pan.baidu.com/s/11tMdoRh3bHmcYz ...
- STM32 超声波模块测距
目录 HC-SR04模块 HC-SR04超声波测距模块工作原理 HC-SR04超声波模块的时序触发图 思路步骤 代码 实验结果 总结 HC-SR04模块 HC-SR04超声波测距模块工作原理 (1)采 ...
- Arduino实现使用超声波模块测距
硬件材料: Arduino UNO R3.超声波模块.面包板一块.连接线若干 超声波模块如下图,一个超声波模块价格在5元以内. arduino实物连接图如下: 源码: void setup() { ...
最新文章
- java访问手机里的通讯录,访问手机通讯录(示例代码)
- jenkins角色权限管理
- 内存管理:_CrtDumpMemoryLeaks和_CrtSetBreakAlloc
- OpenStack(二)——Keystone组件
- 八戒科技服务技术负责人鸿鹄真人:做好技术负责人的4个关键特质
- 数据库报错SELECT list is not in GROUP BY clause and contains nonaggregated col
- css背景图充满整个屏幕
- 【阅读】所谓情商高,就是会说话
- 为什么安装了增强功能,VirtualBox菜单自动调整显示尺寸还是灰色,不能用
- 数据结构(C语言版 第2版严蔚敏版)完整课后习题答案汇总
- 威纶通触摸屏部分元件下载后不显示且编辑时无法选择
- 驱动实验一(第一个驱动程序创建)
- lol无法连接服务器win10系统,win10系统中lol无法连接服务器怎么办
- 为什么说暴雪必须“手游化”?
- Python分析《武林外传》 -----转载
- 你好,CSDN!你好,C语言!
- [附源码]计算机毕业设计Node.js-报刊征订管理系统(程序+LW)
- 台式机怎样连接连接蓝牙耳机?搜索不到蓝牙耳机?
- android16进制编辑器,16进制编辑器app
- java.lang.IllegalArgumentException异常
热门文章
- mysql进阶:optimize table 优化表命令 Table does not support optimize, doing recreate + analyze instead
- javascript 仿QQ五子棋
- 蓝湖切图后如何做成html,蓝湖支持「切图压缩」了!
- DeFi 生态大溃败:“寿司”,糊了;“三文鱼”,焦了
- 系统构架及工作原理详细介绍
- Shell sed编辑器
- css clip-path裁剪形状,实现绘制常用的形状和图形。反向裁剪
- 用C/C++获取CPU温度总结(一)
- 剑指Offer JZ45 扑克牌顺子(Java)
- 我的.emacs(Ubuntu版)(二十二)