单片机:实现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;并为其分配一个特定的…

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;从而减轻测试人员的负…

项目管理工具Maven(一)

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

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;尤其是在分布式系统中。下面是每个组件的概述&…

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

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

js进阶语法详解

文章目录 js进阶语法详解一、引言二、闭包与作用域1、闭包1.1、示例代码 2、作用域2.1、示例代码 三、this关键字与函数调用1、this的指向1.1、示例代码 2、apply和call方法2.1、示例代码 四、异步编程1、Promise1.1、示例代码 五、JS的面向对象封装1、封装的概念1.1、构造函数…

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#x…

.Net WebAPI(一)

文章目录 项目地址一、WebAPI基础1. 项目初始化1.1 创建简单的API1.1.1 get请求1.1.2 post请求1.1.3 put请求1.1.4 Delete请求 1.2 webapi的流程 2.Controllers2.1 创建一个shirts的Controller 3. Routing3.1 使用和创建MapControllers3.2 使用Routing的模板语言 4. Mould Bind…

Java操作Redis-Jedis

介绍 前面我们讲解了Redis的常用命令&#xff0c;这些命令是我们操作Redis的基础&#xff0c;那么我们在 java程序中应该如何操作Redis呢&#xff1f;这就需要使用Redis的Java客户端&#xff0c;就如同我们使 用JDBC操作MySQL数据库一样。 Redis 的 Java 客户端很多&#xff0…

Vue3 + Element-Plus + vue-draggable-plus 实现图片拖拽排序和图片上传到阿里云 OSS 父组件实现真正上传(最新保姆级)

Vue3 Element-Plus vue-draggable-plus 实现图片拖拽排序和图片上传到阿里云 OSS&#xff08;最新保姆级&#xff09;父组件实现真正上传 1、效果展示2、UploadImage.vue 组件封装3、相关请求封装4、SwiperConfig.vue 调用组件5、后端接口 1、效果展示 如果没有安装插件&…

将 Ubuntu 22.04 LTS 升级到 24.04 LTS

Ubuntu 24.04 LTS 将支持 Ubuntu 桌面、Ubuntu 服务器和 Ubuntu Core 5 年&#xff0c;直到 2029 年 4 月。 本文将介绍如何将当前 Ubuntu 22.04 系统升级到最新 Ubuntu 24.04 LTS版本。 备份个人数据 以防万一&#xff0c;把系统中的重要数据自己备份一下~ 安装配置SSH访问…

宝塔SSL证书申请失败,报错:申请SSL证书错误 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘(已解决)

刚安装宝塔申请SSL就报错&#xff1a;申请SSL证书错误 module OpenSSL.crypto has no attribute sign 面板、插件版本&#xff1a;9.2.0 系统版本&#xff1a;Alibaba Cloud Linux 3.2104 LTS 问题&#xff1a;申请SSL证书错误 module OpenSSL.crypto has no attribute sign…

<mutex>注释 12:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(下)

&#xff08;60&#xff09;继续分析&#xff0c;为什么 timed_mutex 可以拥有准时的等待时间&#xff1a; 逐步测试&#xff1a; 以及&#xff1a; 以及&#xff1a; 以及&#xff1a; 上面的例子里之所以这么编写。无论 timed_mutex 里的定时等待函数&#xff0c;还是 条件…

【MySQL】InnoDB引擎中的Compact行格式

目录 1、背景2、数据示例3、Compact解释【1】组成【2】头部信息【3】隐藏列【4】数据列 4、总结 1、背景 mysql中数据存储是存储引擎干的事&#xff0c;InnoDB存储引擎以页为单位存储数据&#xff0c;每个页的大小为16KB&#xff0c;平时我们操作数据库都是以行为单位进行增删…

Kylin麒麟操作系统 | 网络链路聚合配置(team和bond)

目录 一、理论储备1. 链路聚合 二、任务实施1. team模式2. bond模式 一、理论储备 1. 链路聚合 链路聚合是指将多个物理端口捆绑在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量在各成员端口中的负载分担。链路聚合在增加链路带宽、实现链路传输弹性和冗余等…

Linux中用户和用户管理详解

文章目录 Linux中用户和用户管理详解一、引言二、用户和用户组的基本概念1、用户账户文件2、用户组管理 三、用户管理操作1、添加用户2、设置用户密码3、删除用户 四、用户组操作1、创建用户组2、将用户添加到用户组 五、总结 Linux中用户和用户管理详解 一、引言 在Linux系统…