关于HC04超声波模块测距的思考(51版)
之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接。
后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好,
所以这次对它进行了改进。虽然上一次也使用了多次测量取平均值,但是内有排除中间会有错误数据的情况。
之前的程序是这样的(测距部分) :
- u32 t = ;
- int i = ;
- float lengthTemp = ;
- float sum = ;
- while(i!=)
- {
- TRIG_Send = ; //发送口高电平输出
- Delay_Us();
- TRIG_Send = ;
- while(ECHO_Reci == ); //等待接收口高电平输出
- OpenTimerForHc(); //打开定时器
- i = i + ;
- while(ECHO_Reci == );
- 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 = ; //总耗时
- float distence = ; //计算一次距离
- float sum = ; //多次计算的总距离
- uchar i = ;
- while(i < NUM)
- {
- time_flag = ; //先清除标志
- sr04_start(); //开始测距
- while(!ECHO); //等待发出40khz脉冲,触发信号之后,echo会变成高电平
- time_0_start(); //当把trig拉高10us之后,模块即开始发出8个40khz的脉冲,与此同时,echo变为高电平时,打开定时器。
- while(ECHO); //等待回响信号,收到回响信号,echo会变低电平
- TR0 = ; //关闭定时器
- if(time_flag != ) //超出测量范围
- continue; //不进行计算,放弃这次测量,从新测量
- else //time_flag = 0,没有超出测量范围
- {
- time_buf = (TH0 * ) + 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
- {
- // TF0 = 0; //模式1硬件自动清零
- TH0 = ;
- TL0 = ;
- time_flag++;
- }
其中对一些操作进行了简单的封装。开始测距函数,就是按照要求拉高TRIG引脚
- /*start*/
- void sr04_start()
- {
- TRIG = ;
- delay_10us(); //拉高50us
- TRIG = ;
- }
还有就是定时器开始函数,在这个函数里面需要把计数清零:
- /*开启定时器0,打开之前先清除之前的计数,不然会累计计数*/
- void time_0_start()
- {
- TH0 = ; //打开前计数清零
- TL0 = ;
- TR0 = ; //打开定时器
- }
然后就是模块的 初始化函数了,在初始化的时候其实就是对定时器的初始化,顺便把TRIG和ECHO引脚置0;
- void sr04_init()
- {
- TRIG = ;
- ECHO = ;
- TMOD |= 0X01; //定时器0模式设置1
- TH0 = ; //从0开始计数
- TL0 = ;
- TR0 = ; //关闭定时器
- EA = ; //开总中断
- ET0 = ; //允许定时器0中断
- }
关于HC04超声波模块测距的思考(51版)的更多相关文章
- 树莓派控制HC-SR04超声波模块测距(新手向+C语言向)
因为作业要求使用c语言代码,这里先附上一段摘自网上的代码 感谢KalaerSun的c语言代码,摘自https://blog.csdn.net/qq_25247589/article/details/6 ...
- 超声波模块HC-SR04简介以及编程
HC-SR04 一.主要参数1:使用电压:DC-5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度 可达0.2cm ...
- [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.实验器材 1.TPYboard V102板 一块 2.电机驱动模块L2 ...
- C语言单片机项目实战超声波雷达测距
本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD 1602液晶屏上. 模块工作原理如下 (1)采用 IO 触发测距,给至少 10us 的 ...
- stm32与HC-SR04超声波传感器测距
首先,先来看一下这个模块的基本功能和原理. HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm:模块包括超声波发射器.接收器与控制电路.像智能小车的测距 ...
- stm32驱动超声波模块
下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发. #define HCSR04_PORT GPIOB #define HCSR04_CLK RCC ...
- Mybatis的mapper文件引起模块划分的思考
起因:项目中将公用的代码抽离到单独一个项目 cms-common.jar (注:公用的代码不只是工具类代码,包含service和dao等) 构建:每次构建项目 cms.war 的时候,需要引入cms- ...
- 一些node模块的学习思考
12月14日清单 1 readline模块 var readline = require("readline"); // input 是必须的,output是可选的 rl = re ...
- 【Arduino】超声波模块(HC-SR04)
还好,这个模块有现成的库能够用: https://github.com/bosgood/arduino-playground/tree/master/lib/HCSR04Ultrasonic 下面仅仅 ...
随机推荐
- 【转】linux下设置ssh无密码登录
ssh配置 主机A:10.0.5.199 主机B:10.0.5.198 需要配置主机A无密码登录主机A,主机B 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh ...
- PostgreSQL版本快速升级
PostgreSQL版本快速升级 写在前面 PostgreSQL9.5版本支持数据分片的功能,为以后做分布式考虑,准备将生产环境的9.1版本升级至9.5.中间需要做数据迁移. 在迁移操作中,为保证数据 ...
- ABP框架源码学习之修改默认数据库表前缀或表名称
ABP框架源码学习之修改默认数据库表前缀或表名称 1,源码 namespace Abp.Zero.EntityFramework { /// <summary> /// Extension ...
- Electron 桌面应用打包(npm run build)简述(windows + mac)
最近一段时间在用electron+vue做内部项目的一键构建发布系统的桌面应用,现就其中打包流程写个备注,以示记录. Windows环境打包:1.首先贴一下package.json. { " ...
- 网页转图片--- html2canvas截图
最近有个做在线名片(可保存图片至本地)的任务,特意研究了一下图片生成,也踩了几个坑.特此总结一下,顺便分享一下demo: 链接:https://pan.baidu.com/s/1o98UBJO 密码: ...
- spring之构造注入
第一种:通过构造name和value属性(不常用) <!-- userAction --> <bean id="userAction" class="c ...
- iOS UITableView左滑操作功能的实现(iOS8-11)
WeTest 导读 本文主要是介绍下iOS 11系统及iOS 11之前的系统在实现左滑操作功能上的区别,及如何自定义左滑的标题颜色.字体大小. 一.左滑操作功能实现 1.如果左滑的时候只有一个操作按钮 ...
- MongoDB之副本集
MongoDB之副本集 一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库 ...
- ABP官方文档翻译 10.1 ABP Nuget包
ABP Nuget包 Packages Abp Abp.AspNetCore Abp.Web.Common Abp.Web Abp.Web.Mvc Abp.Web.Api Abp.Web.Api.OD ...
- 制作 alipay-sdk-java包到本地仓库
一.首先 搭建好maven 基础环境,本地可以运行maven 命令 从支付宝官网上下载sdk https://doc.open.alipay.com/doc2/detail?treeId=54& ...