STM32-笔记23-超声波传感器HC-SR04
一、简介
HC-SR04 工作参数:
• 探测距离:2~600cm
• 探测精度:0.1cm±1%
• 感应角度:<15°
• 输出方式:GPIO
• 工作电压:DC 3~5.5V
• 工作电流:5.3mA
• 工作温度:-40~85℃

- 怎么让它发送波 Trig?
给Trig端口至少10us的高电平
- 怎么知道它开始发了波 Echo引脚?
由低电平跳转到高电平,表示开始发送波
- 怎么知道接收了返回波 Echo?
由高电平跳转回低电平,表示波回来了
- 怎么算时间 ?
Echo引脚维持高电平的时间,波发出去的那一下,开始启动定时器 波回来的那一下,我们开始停止定时器,计算出中间经过多少时间
- 怎么算距离?
距离 = 速度(343m/s) * 时间 / 2
二、实验前期准备
因为想把测出来的距离打印在串口上,所以复制项目文件19-串口打印功能,重命名25-超声波传感器,新建文件夹hc-sr04

打开工程文件
加载文件
引脚接线

三、代码:
main.c
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "hcsr04.h"int main(void)
{HAL_Init(); /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯hcsr04_init();uart1_init(115200);while(1){ printf("距离是:%.2f\r\n",hcsr04_get_lenght());delay_ms(1000);}
}
hcsr04.c
#include "hcsr04.h"
#include "delay.h"TIM_HandleTypeDef tim2_handle = {0};//定义结构体//定时器初始化函数
void timer_init()//把ARR和PSC当作参数传进来
{tim2_handle.Instance = TIM2; //选择使用的定时器tim2_handle.Init.Prescaler = 72-1; //PSC:使其读一个数用1ustim2_handle.Init.Period = 65536-1; //ARRtim2_handle.Init.CounterMode = TIM_COUNTERMODE_UP;//配置成向上的,默认向上的tim2_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //自动重装载,默认自动重装载HAL_TIM_Base_Init(&tim2_handle);
// HAL_TIM_Base_Start_IT(&tim2_handle);//设置使能更新中断,和启动计数器
}//msp函数
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){__HAL_RCC_TIM2_CLK_ENABLE();
// HAL_NVIC_SetPriority(TIM2_IRQn,2,2);//设置优先级
// HAL_NVIC_EnableIRQ(TIM2_IRQn);//设置使能中断}
}
//定时器启动的函数
void tim2_start(void)
{HAL_TIM_Base_Start(&tim2_handle);
}
//定时器关闭的函数
void tim2_stop(void)
{HAL_TIM_Base_Stop(&tim2_handle);
}
//读CNT计数器的值
uint16_t tim2_get_cnt(void)
{return __HAL_TIM_GetCounter(&tim2_handle);
}
//将CNT计数器的值传递进来
void tim2_set_cnt(uint16_t val)
{__HAL_TIM_SetCounter(&tim2_handle,val);
}
//初始化gpio口引脚
void hcsr04_gpio_init(void)
{ GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct//打开trig和echo时钟TRIG_GPIO_CLK_ENABLE();ECHO_GPIO_CLK_ENABLE();//调用TRIG的GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;//推挽输出gpio_initstruct.Pin = TRIG_PIN;//trig对应的引脚gpio_initstruct.Pull = GPIO_NOPULL;//引脚不拉gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(TRIG_PORT,&gpio_initstruct);//调用echo的GPIO初始化函数gpio_initstruct.Mode = GPIO_MODE_INPUT;//作为输入引脚gpio_initstruct.Pin = ECHO_PIN;//echo对应的引脚HAL_GPIO_Init(ECHO_PORT,&gpio_initstruct);
}
//初始化超声波
void hcsr04_init(void)
{timer_init();//初始化定时器hcsr04_gpio_init();//初始化GPIO引脚}
//读取超声波测出来的距离
float hcsr04_get_lenght(void)
{uint16_t total_time = 0; //定义一个变量用于接收CNT的值float distance = 0;//1、Trig,给Trig端口至少10us的高电平TRIG_HIGH();delay_us(15);TRIG_LOW();//2、Echo引脚,由低电平跳转到高电平,表示开始发送波//波发出去的那一下,开始启动定时器while(ECHO_STATUS() == GPIO_PIN_RESET);//用echo引脚是否从低电平变成高电平来决定波是否发出去了tim2_start(); //启动定时器2tim2_set_cnt(0);//将定时器初始值置0//3、Echo,由高电平跳转回低电平,表示波回来了//波回来的那一下,我们开始停止定时器while(ECHO_STATUS() == GPIO_PIN_SET);//用echo引脚是否从高电平变成低电平来决定波是否接到tim2_stop();//关掉定时器//4、Echo引脚维持高电平的时间=计算出中间经过多少时间total_time = tim2_get_cnt();//用total_time接收CNT定时器里面的值//距离 = 速度(343m/s) * 时间 / 2//343m/s = 34300cm/s,因为距离是一个来回,所以要/2(这里速度除2下面路程就不用除2了)// = 34300/2 = 17150cm/s = 0.017150cm/usdistance = total_time * 0.01715;return distance;
}
hcsr04.h
#ifndef __HCSR04_H__
#define __HCSR04_H__#include "sys.h"#define TRIG_PORT GPIOB //trig对应gpio的哪一组
#define TRIG_PIN GPIO_PIN_6 //trig对应gpio的哪个引脚
#define TRIG_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //gpio口时钟打开
#define TRIG_HIGH() HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_SET)//trig对应的引脚拉高
#define TRIG_LOW() HAL_GPIO_WritePin(TRIG_PORT,TRIG_PIN,GPIO_PIN_RESET)//trig对应的引脚拉低#define ECHO_PORT GPIOB //echo对应gpio的哪一组
#define ECHO_PIN GPIO_PIN_7 //echo对应gpio的哪个引脚
#define ECHO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() //gpio口时钟打开
#define ECHO_STATUS() HAL_GPIO_ReadPin(ECHO_PORT,ECHO_PIN) //读取echo对应的引脚电平void hcsr04_init(void);
float hcsr04_get_lenght(void);#endif
打开串口助手,每一秒超声波都在测距

相关文章:
STM32-笔记23-超声波传感器HC-SR04
一、简介 HC-SR04 工作参数: • 探测距离:2~600cm • 探测精度:0.1cm1% • 感应角度:<15 • 输出方式:GPIO • 工作电压:DC 3~5.5V • 工作电流:5.3mA • 工作温度:-40~85℃ 怎么…...
Linux | Ubuntu零基础安装学习cURL文件传输工具
目录 介绍 检查安装包 下载安装 手册 介绍 cURL是一个利用URL语法在命令行下工作的文件传输工具,首次发行于1997年12。cURL支持多种协议,包括FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3…...
什么是 GPT?Transformer 工作原理的动画展示
大家读完觉得有意义记得关注和点赞!!! 目录 1 图解 “Generative Pre-trained Transformer”(GPT) 1.1 Generative:生成式 1.1.1 可视化 1.1.2 生成式 vs. 判别式(译注) 1.2 Pr…...
SpringCloudAlibaba实战入门之路由网关Gateway过滤器(十三)
承接上篇,我们知道除了断言,还有一个重要的功能是过滤器,本节课我们就讲一下常见的网关过滤器及其一般使用。 一、Filter介绍 类似SpringMVC里面的的拦截器Interceptor,Servlet的过滤器。“pre”和“post”分别会在请求被执行前调用和被执行后调用,用来修改请求和响应信…...
电路仿真软件PSIM简介
在从事开关电源相关产品开发的工程师或者正在学习开关电源的学习者,常常会用到各种仿真软件进行电路的仿真,不仅可以快速验证电路参数,还能清楚知道各器件的工作状态。 现在的电路仿真软件很多,例如matlab、Multisim、Simplis&…...
C语言:调试的概念和调试器的选择
所谓调试(Dubug),就是跟踪程序的运行过程,从而发现程序的逻辑错误(思路错误),或者隐藏的缺陷(Bug)。 在调试的过程中,我们可以监控程序的每一个细节ÿ…...
25. C++继承 1 (继承的概念与基础使用, 继承的复制兼容规则,继承的作用域)
⭐上篇模板文章:24. C模板 2 (非类型模板参数,模板的特化与模板的分离编译)-CSDN博客 ⭐本篇代码:c学习 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. 继承的基础使用 1.1 继承的格式 1.2 …...
git 退出编辑模式
在使用 Git 时,有时需要进入编辑器来输入提交信息或进行其他编辑操作。不同的系统和配置可能会导致使用不同的编辑器。以下是几种常见 Git 编辑器的退出方法: Vim 编辑器: 保存并退出: 按下 Esc 键退出编辑模式。输入 :w…...
内容营销与传统营销方式有哪些差别?
在互联网高度发达的当下,碎片化的信息接收方式,让用户对于营销信息拥有较高的敏感度。这一现状,也使得众多传统营销方式正在逐渐失效。想要稳定推广效率,内容营销是当下不少品牌的共同选择。接下来,就让我们来了解下内…...
EasyExcel(读取操作和填充操作)
文章目录 1.准备Read.xlsx(具有两个sheet)2.读取第一个sheet中的数据1.模板2.方法3.结果 3.读取所有sheet中的数据1.模板2.方法3.结果 EasyExcel填充1.简单填充1.准备 Fill01.xlsx2.无模版3.方法4.结果 2.列表填充1.准备 Fill02.xlsx2.模板3.方法4.结果 …...
【华为OD-E卷 - 机房布局 100分(python、java、c++、js、c)】
【华为OD-E卷 - 机房布局 100分(python、java、c、js、c)】 题目 小明正在规划一个大型数据中心机房,为了使得机柜上的机器都能正常满负荷工作,需要确保在每个机柜边上至少要有一个电箱。 为了简化题目,假设这个机房…...
【竞技宝】LOL:IG新赛季分组被质疑
北京时间2024年12月31日,今天已经2024年的最后一天,在进入一月之后,英雄联盟将迎来全新的2025赛季。而目前新赛季第一阶段的抽签结果已经全部出炉,其中人气最高的IG战队在本次抽签中抽到了“绝世好签”引来了网友们的质疑。 首先介…...
ChatBI来啦!NBAI 正式上线 NL2SQL 功能
NebulaAI 现已正式上线 NL2SQL 功能,免费开放使用! 什么是 NL2SQL?NL2SQL 即通过自然语言交互,用户可以轻松查询、分析和管理数据库中的数据(ChatBI),从此摆脱传统复杂的数据库操作。 欢迎免费…...
8. Web应用程序(Web)
8. Web应用程序(Web) Spring Boot 非常适用于Web应用程序开发。你可以使用嵌入式 Tomcat、Jetty、Undertow或Netty创建一个独立的HTTP服务器。大多是Web应用程序都会使用 spring-boot-starter-web 依赖模块来快速启动和运行项目。你也可以选择使用 spri…...
Linux内核修改内存分配策略
今天遇到了如下的内核报错 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f0e1e06c000, 65536, 1) failed; errorCannot allocate memory (errno12)这个报错是因为,linux会对大部分的内存资源申请都回复允许,以便于运行更…...
六大亮点解析:AI视频监控助力部队训练安全管理
一、用户痛点: 在部队的日常训练和任务执行中,官兵的安全始终是最为重要的保障。然而,传统的监控方式存在显著的局限性,尤其是在高强度、长时间的训练过程中,人工值守监控容易产生疲劳,误判的风险大&#…...
【从零开始入门unity游戏开发之——C#篇33】C#委托(`Delegate`)和事件(`event` )、事件与委托的区别、Invoke()的解释
文章目录 一、委托(Delegate)1、什么是委托?2、委托的基本语法3、定义自定义委托4、如何使用自定义委托5、多播委托6、C# 中的系统委托7、GetInvocationList 获取多个函数返回值8、总结 二、事件(event )1、事件是什么…...
大数据与机器学习(它们有何关系?)
想了解大数据和机器学习吗?我们将为你解释它们是什么、彼此之间有何关联,以及它们为何在数据密集型应用中如此重要。 大数据和机器学习是如何相互关联的? 大数据指的是传统存储方法无法处理的海量数据。机器学习则是计算机系统从观察结果和…...
深入浅出 Spring(一) | Spring简介、IOC理论推导、快速上手 Spring
1. spring 1.1 简介 Spring : 春天 —>给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。 很难想象…...
IDEA 社区版 SpringBoot不能启动
报错原因,Failed to load class [javax.servlet.Filter] <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope> </dependency>…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)
崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题,不一定会立刻崩,但一旦积累,就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能,而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...
零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)
经过前面几期的内容我们学习了很多网络安全的知识,而这期内容就涉及到了前面的第六期-RCE模块,第七期-File inclusion模块,第八期-Unsafe Filedownload模块。 什么是"遍历"呢:对学过一些开发语言的朋友来说应该知道&…...
