单片机:实现HC-SR04超声波测距(附带源码)

使用单片机实现 HC-SR04 超声波测距模块 的功能,通常用于测量物体与超声波传感器之间的距离。HC-SR04 模块通过发射超声波信号并测量其返回时间来计算距离。单片机(如 STM32、51 系列、Arduino 等)可用来控制该模块的工作,并处理返回的脉冲信号。

下面我会提供一个基于单片机的 HC-SR04 超声波测距实现方案,并详细阐述每个步骤的设计思路和代码实现。

1. HC-SR04 超声波模块工作原理

HC-SR04 模块通过发送一系列声波脉冲来测量与目标物体的距离。模块由两部分组成:

  • 发射部分(Trigger):用来发送 10 微秒的脉冲,激发超声波信号的发送。
  • 接收部分(Echo):接收从目标物体反射回来的超声波脉冲,产生一个持续高电平的信号,持续时间等于声波往返的时间。
计算公式:

距离 = (回波时间 × 声速) / 2

  • 声速约为 340 m/s(即 0.034 cm/μs),所以计算的公式为:

    上式中,回波时间指的是从发送脉冲到接收到返回信号的时间。

2. 硬件连接

HC-SR04 模块有四个引脚:

  • VCC:电源(通常为 5V)
  • GND:地线
  • Trig:触发引脚(用于发射超声波脉冲)
  • Echo:回声引脚(接收返回的超声波脉冲)

单片机的引脚连接方式:

  • Trig:连接到单片机的一个 GPIO 引脚,用于触发超声波发射。
  • Echo:连接到单片机的另一个 GPIO 引脚,用于接收回声信号。

3. 设计思路

本设计采用单片机控制 HC-SR04 模块,通过控制 Trig 引脚生成超声波触发脉冲,并通过 Echo 引脚测量回波信号的持续时间。具体的步骤包括:

  1. 触发超声波信号:通过向 Trig 引脚输出一个 10 微秒的高电平脉冲,激发 HC-SR04 发射超声波。
  2. 测量回波时间:通过读取 Echo 引脚的高电平持续时间来计算回波时间。单片机根据此时间计算距离。
  3. 计算距离:根据回波时间和声速公式计算物体到传感器的距离。

4. 软件设计

以 STM32 微控制器为例,介绍如何实现该功能。可以使用 STM32 的 HAL 库来实现超声波测距。

4.1 初始化 GPIO

首先需要初始化 GPIO 引脚:

  • Trig 引脚配置为输出模式,用于发射触发脉冲。
  • Echo 引脚配置为输入模式,用于接收回波信号。
#include "stm32f4xx_hal.h"
#include <stdio.h>#define TRIG_PIN        GPIO_PIN_0   // Trig 引脚
#define ECHO_PIN        GPIO_PIN_1   // Echo 引脚
#define GPIO_PORT       GPIOA        // 假设使用 GPIOA 端口void SystemClock_Config(void);
void GPIO_Init(void);
void trigger_ultrasonic_pulse(void);
uint32_t read_echo_pulse(void);
float calculate_distance(uint32_t pulse_width);int main(void)
{HAL_Init();  // 初始化 HAL 库SystemClock_Config();  // 配置系统时钟GPIO_Init();  // 初始化 GPIO 引脚while (1){trigger_ultrasonic_pulse();  // 触发超声波信号uint32_t pulse_time = read_echo_pulse();  // 获取回波时间float distance = calculate_distance(pulse_time);  // 计算距离// 可以通过串口输出距离值,或者在 LCD 上显示printf("Distance: %.2f cm\n", distance);HAL_Delay(500);  // 每 500 毫秒测量一次}
}// 系统时钟配置函数(根据具体硬件配置)
void SystemClock_Config(void)
{// 这里可以根据需要配置时钟,一般不需要修改
}// GPIO 初始化:配置 Trig 为输出,Echo 为输入
void GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};// 启用 GPIO 时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 初始化 Trig 引脚(输出)GPIO_InitStruct.Pin = TRIG_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);// 初始化 Echo 引脚(输入)GPIO_InitStruct.Pin = ECHO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIO_PORT, &GPIO_InitStruct);
}// 触发超声波信号:生成 10 微秒的脉冲
void trigger_ultrasonic_pulse(void)
{HAL_GPIO_WritePin(GPIO_PORT, TRIG_PIN, GPIO_PIN_SET);  // Trig 引脚置高HAL_Delay(0);  // 保持高电平至少 10 微秒HAL_GPIO_WritePin(GPIO_PORT, TRIG_PIN, GPIO_PIN_RESET);  // Trig 引脚置低
}// 读取 Echo 引脚的高电平持续时间(脉冲宽度)
uint32_t read_echo_pulse(void)
{uint32_t pulse_width = 0;// 等待 Echo 引脚为高电平while (HAL_GPIO_ReadPin(GPIO_PORT, ECHO_PIN) == GPIO_PIN_RESET);// 计数 Echo 引脚高电平的持续时间while (HAL_GPIO_ReadPin(GPIO_PORT, ECHO_PIN) == GPIO_PIN_SET){pulse_width++;  // 每次延时 1 毫秒HAL_Delay(1);   // 延时 1 毫秒,计数单位是毫秒}return pulse_width;  // 返回脉冲宽度(单位:毫秒)
}// 根据回波时间计算距离(单位:cm)
float calculate_distance(uint32_t pulse_width)
{// 使用公式:距离 (cm) = (回波时间 (微秒) * 0.034) / 2// 由于我们在 read_echo_pulse 函数中每次延时 1 毫秒,pulse_width 其实已经是毫秒单位。float distance = pulse_width * 0.034 / 2.0;  // 公式:距离 = 时间 * 声速 / 2return distance;
}

代码解读

  1. 初始化 GPIO

    • GPIO_Init() 函数初始化了两个 GPIO 引脚:
      • Trig 引脚(GPIO_PIN_0):用于触发超声波发射,配置为推挽输出模式。
      • Echo 引脚(GPIO_PIN_1):用于接收超声波回波信号,配置为输入模式。
  2. 触发超声波发射信号

    • trigger_ultrasonic_pulse() 函数通过在 Trig 引脚输出一个 10 微秒的高电平脉冲来激发 HC-SR04 模块发射超声波信号。
  3. 测量回波时间

    • read_echo_pulse() 函数通过读取 Echo 引脚的高电平持续时间来获取回波信号的时长。通过 pulse_width 计数,记录回波信号持续的时间。
  4. 计算距离

    • calculate_distance() 函数根据回波信号的时长(pulse_width)和声速公式来计算物体与传感器的距离:
      \text{距离 (cm)} = \frac{\text{回波时间 (毫秒)} \times 0.034}{2} ] 其中,0.034 为声速(单位:cm/μs)。
  5. 主循环

    • main() 函数中,程序会不断触发超声波信号,并读取回波时间,通过计算得到距离,最后打印出距离值。每次测量之间有 500 毫秒的延时。

5. 项目总结

5.1 硬件总结
  1. HC-SR04 超声波模块:通过发射和接收超声波信号来测量距离,连接到单片机的 GPIO 引脚(TrigEcho)。
  2. 单片机:负责控制 Trig 引脚生成脉冲,并读取 Echo 引脚的高电平持续时间,计算并输出距离。
5.2 软件总结
  1. GPIO 初始化:配置 Trig 为输出,Echo 为输入。
  2. 触发超声波信号:通过给 Trig 引脚发送 10 微秒的高电平脉冲来激发 HC-SR04 发射超声波。
  3. 回波时间测量:通过读取 Echo 引脚的高电平持续时间,计算超声波往返所需的时间。
  4. 距离计算:根据回波时间和声速公式计算距离,并输出测量结果。
5.3 优化与扩展
  1. 更高精度:为了获得更高精度的距离,可以增加计时的精度(例如,使用定时器或更高分辨率的计时方法)。
  2. 多次测量平均值:可以通过多次测量距离并取平均值来提高测量的稳定性和精度。
  3. 串口输出:通过串口将测量的距离数据发送到 PC 或其他设备进行显示。
  4. 电源管理:对于电池供电的系统,可以在不需要测量时关闭超声波模块,以节省电量。

通过以上设计,我们成功实现了使用单片机控制 HC-SR04 超声波模块进行测距的功能,并能够在不同的应用场景下测量距离。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python langchain ReAct 使用范例

0. 介绍 ReAct: Reasoning Acting &#xff0c;ReAct Prompt 由 few-shot task-solving trajectories 组成&#xff0c;包括人工编写的文本推理过程和动作&#xff0c;以及对动作的环境观察。 1. 范例 langchain version 0.3.7 $ pip show langchain Name: langchain Ver…

selenium工作原理

原文链接&#xff1a;https://blog.csdn.net/weixin_67603503/article/details/143226557 启动浏览器和绑定端口 当你创建一个 WebDriver 实例&#xff08;如 webdriver.Chrome()&#xff09;时&#xff0c;Selenium 会启动一个新的浏览器实例&#xff0c;并为其分配一个特定的…

CTF知识集-SSRF

title: CTF知识集-SSRF 写在开头可能用到的提示 SSRF入口也可以尝试读文件&#xff0c;例如file:///etc/passwd127.0.0.1/localhost可以用127.1 | 127.0.1 来表示&#xff0c;做题的还可能可以用http://0 来访问本地如果过滤ip&#xff0c;可以尝试使用进制转换来绕过&#x…

PDFMathTranslate 一个基于AI优秀的PDF论文翻译工具

PDFMathTranslate 是一个设想中的工具&#xff0c;旨在翻译PDF文档中的数学内容。以下是这个工具的主要特点和使用方法&#xff1a; 链接&#xff1a;https://www.modelscope.cn/studios/AI-ModelScope/PDFMathTranslate 功能特点 数学公式识别&#xff1a;利用先进的OCR&…

ChatGPT生成接口测试用例(二)

5.1.4 自动生成测试数据 测试数据的生成通常是接口测试的一个烦琐任务。ChatGPT可以帮助测试团队生成测试数据&#xff0c;包括各种输入和它们的组合。测试人员可以描述他们需要的数据类型和范围&#xff0c;ChatGPT可以生成符合要求的测试数据&#xff0c;从而减轻测试人员的负…

@pytest.fixture() 跟 @pytest.fixture有区别吗?

在iOS UI 自动化工程里面最早我用的是pytest.fixture()&#xff0c;因为在pycharm中联想出来的fixture是带&#xff08;&#xff09;的&#xff0c;后来偶然一次我没有带&#xff08;&#xff09;发现也没有问题&#xff0c;于是详细查了一下pytest.fixture() 和 pytest.fixtur…

项目管理工具Maven(一)

Maven的概念 什么是Maven 翻译为“专家”&#xff0c;“内行”Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。什么是理想的项目构建&#xff1f; 高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准…

webstorm中vue项目import的内容不能直接ctrl+鼠标点击跳转(若依等vue项目)

webstorm中vue项目import的内容不能直接ctrl鼠标点击跳转&#xff08;若依等vue项目&#xff09; https://blog.csdn.net/wangzhenhuait/article/details/121231087 https://blog.csdn.net/qq_26711723/article/details/137586701?spm1001.2101.3001.6650.5&utm_mediumd…

深入解析MySQL Explain关键字:字段意义及调优策略

一、引言 在数据库优化过程中&#xff0c;Explain关键字发挥着至关重要的作用。它可以帮助我们了解MySQL如何执行SQL语句&#xff0c;从而找出潜在的性能瓶颈。下面我们将从Explain表的各个字段入手&#xff0c;逐一解释其意义&#xff0c;并探讨如何利用Explain进行调优。 二…

C++设计模式:组合模式(公司架构案例)

组合模式是一种非常有用的设计模式&#xff0c;用于解决**“部分-整体”**问题。它允许我们用树形结构来表示对象的层次结构&#xff0c;并且让客户端可以统一地操作单个对象和组合对象。 组合模式的核心思想 什么是组合模式&#xff1f; 组合模式的目的是将对象组织成树形结…

ElasticSearch 自动补全

1、前言 当用户在搜索框输入字符时&#xff0c;我们应该提示出与该字符有关的搜索项&#xff0c;根据用户输入的字母&#xff0c;提示完整词条的功能&#xff0c;就是自动补全。 2、安装拼音分词器 Github地址&#xff1a;https://github.com/infinilabs/analysis-pinyin 插件…

UML 建模实验

文章目录 实验一 用例图一、安装并熟悉软件EnterpriseArchitect16二、用例图建模 实验二 类图、包图、对象图类图第一题第二题 包图对象图第一题第二题 实验三 顺序图、通信图顺序图银行系统学生指纹考勤系统饮料自动销售系统“买到饮料”“饮料已售完”“无法找零”完整版 通信…

Linux环境下 搭建ELk项目 -单机版练习

前言 ELK 项目是一个由三个开源工具组成的日志处理和分析解决方案&#xff0c;ELK 是 Elasticsearch、Logstash 和 Kibana 的首字母缩写。这个项目的目标是帮助用户采集、存储、搜索和可视化大量的日志和事件数据&#xff0c;尤其是在分布式系统中。下面是每个组件的概述&…

探索 Vue.js 组件开发:从基础到进阶的完整指南

引言 在现代前端开发中&#xff0c;Vue.js 凭借其易用性和强大的功能&#xff0c;成为了开发者钟爱的框架之一。其核心理念——组件化开发&#xff0c;不仅让代码更加模块化、可维护&#xff0c;还大大提高了开发效率。本文将从基础入手&#xff0c;详细探讨 Vue.js 组件开发的…

智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之3(百度文库答问 之1)

Q&A&#xff08;百度文库&#xff09; Q1、今天聊聊“智能工厂的设计软件”中的三种处理单元&#xff08;NPU/GPU/CPU&#xff09;。一般来说提起这三者就不得不说“深度学习”。那我们就从这里开始。 请先给出一个程序例子来说明NPU 如何协作CPU和GPU来完成深度学习任务 …

jdk 离线安装脚本

jdk 离线安装脚本 说明脚本使用完整脚本脚本内容说明1、是否卸载原有jdk&#xff0c;检查安装包是否正确2、先卸载、再安装并检验安装成果 说明 经常装服务器环境&#xff0c;根据以前的安装经验写了个安装脚本。本人不是专业运维&#xff0c;也是边百度边写的&#xff0c;发现…

HTTP 常见的请求头有哪些? 作用?常见的使用场景都有哪些?

在 HTTP 协议中,**请求头(Request Headers)**是客户端向服务器发送请求时附带的元数据,主要用于传递请求的相关信息,比如客户端信息、请求的格式要求、认证信息等。理解这些请求头的作用和使用场景对于开发现代 Web 应用至关重要。以下是一些常见的 HTTP 请求头及其作用和…

day14-16系统服务管理和ntp和防火墙

一、自有服务概述 服务是一些特定的进程&#xff0c;自有服务就是系统开机后就自动运行的一些进程&#xff0c;一旦客户发出请求&#xff0c;这些进程就自动为他们提供服务&#xff0c;windows系统中&#xff0c;把这些自动运行的进程&#xff0c;称为"服务" window…

2024年底-Sre面试回顾

前言 背景: 2024.11月底 公司不大行了, 裁员收缩, 12月初开始面试, 2周大概面试了十几家公司, 3个2面要去线下, 有1个还不错的offer, 想结束战斗但还没到时候 个人情况: base上海 5年经验(2年实施3年运维半年开发) 面试岗位: Sre、云原生运维、驻场运维、高级运维、实施交付 …

pytest入门十:配置文件

pytest.ini&#xff1a;pytest的主配置文件&#xff0c;可以改变pytest的默认行为conftest.py&#xff1a;测试用例的一些fixture配置 pytest.ini marks mark 打标的执行 pytest.mark.add add需要些marks配置否则报warning [pytest] markersadd:测试打标 测试用例中添加了 p…