当前位置: 首页 > news >正文

基于STM32的超声波测距仪设计

引言

本项目将基于STM32微控制器设计一个超声波测距仪,通过超声波传感器实现距离测量,并将结果显示在液晶屏上。该项目展示了STM32微控制器与超声波传感器、LCD显示器的接口通信,以及信号处理和距离计算的过程。

环境准备

1. 硬件设备
  • STM32F103C8T6 开发板(或其他 STM32 系列)
  • 超声波传感器模块(如 HC-SR04)
  • 1602 LCD 显示屏(I2C 或并行接口)
  • USB-TTL 串口调试工具
  • 面包板和杜邦线
2. 软件工具
  • STM32CubeMX:用于初始化 STM32 外设。
  • Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
  • ST-Link 驱动程序:用于下载程序到 STM32。

项目实现

1. 硬件连接
  • 将 HC-SR04 超声波传感器的 VCC 接到 STM32 的 5V 电源,GND 接到地。
  • 将 HC-SR04 的 Trig 引脚连接到 STM32 的 GPIO 引脚(如 PA1),Echo 引脚连接到另一个 GPIO 引脚(如 PA2)。
  • 将 1602 LCD 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7,适用于 I2C 接口的 LCD),或将控制引脚接到 STM32 的其他 GPIO 引脚(适用于并行接口)。
2. STM32CubeMX 配置
  • 打开 STM32CubeMX,选择你的开发板型号。
  • 配置系统时钟为 HSI,以确保 STM32 工作稳定。
  • 在 GPIO 配置中,将 Trig 和 Echo 引脚配置为输出和输入模式。
  • 如果使用 I2C 接口的 LCD,启用 I2C 外设,并配置相关引脚。
  • 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序

在生成的项目基础上,编写超声波传感器的驱动代码,计算测量距离,并通过 LCD 显示结果。以下是一个基本的超声波测距代码示例:

#include "stm32f1xx_hal.h"
#include "lcd.h"// 定义超声波引脚
#define TRIG_PIN GPIO_PIN_1
#define TRIG_PORT GPIOA
#define ECHO_PIN GPIO_PIN_2
#define ECHO_PORT GPIOA// 超声波测距函数
uint32_t UltraSonic_ReadDistance(void)
{uint32_t local_time = 0;uint32_t distance = 0;// 发送触发信号HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);HAL_Delay(10); // 发送10us脉冲HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);// 等待 ECHO 引脚的上升沿while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_RESET);// 计时while (HAL_GPIO_ReadPin(ECHO_PORT, ECHO_PIN) == GPIO_PIN_SET){local_time++;HAL_Delay(1); // 每次延时 1 微秒}// 计算距离distance = (local_time * 0.034) / 2; // 声波在空气中的速度约为 340m/s,计算公式为时间*声速/2return distance;
}int main(void)
{HAL_Init();SystemClock_Config();// 初始化 GPIO 和 I2CMX_GPIO_Init();MX_I2C1_Init();// 初始化 LCD 显示屏LCD_Init();LCD_Clear();uint32_t distance = 0;while (1){// 读取距离distance = UltraSonic_ReadDistance();// 在 LCD 上显示距离LCD_SetCursor(0, 0);LCD_Print("Distance: ");LCD_SetCursor(1, 0);LCD_PrintNum(distance);LCD_Print(" cm");HAL_Delay(1000); // 每秒更新一次测量数据}
}
4. LCD 显示屏驱动代码

LCD 显示屏的初始化和显示功能可以通过以下代码实现:

#include "lcd.h"
#include "i2c.h"// 初始化 LCD
void LCD_Init(void)
{// LCD 初始化代码,具体依赖于 LCD 模块的型号// 使用 I2C 或并行接口进行初始化
}// 清空显示屏
void LCD_Clear(void)
{// 清屏命令
}// 在指定位置打印文本
void LCD_SetCursor(uint8_t row, uint8_t col)
{// 设置光标位置
}// 打印数字
void LCD_PrintNum(uint32_t num)
{char buffer[10];sprintf(buffer, "%ld", num);LCD_Print(buffer);
}// 打印字符串
void LCD_Print(char *str)
{while (*str){// 发送字符到 LCDstr++;}
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

5. 测距原理

超声波测距的原理是通过发射超声波,测量声波从发射到遇到障碍物反射回来的时间。根据声波在空气中的传播速度,可以通过公式计算出物体的距离:

距离=时间×声速2\text{距离} = \frac{\text{时间} \times \text{声速}}{2}距离=2时间×声速​

由于声速在空气中的传播速度约为 340 m/s,我们可以通过测量时间并应用上述公式来计算物体的距离。

常见问题与解决方法

1. 无法正确测量距离
  • 检查超声波传感器的连接是否正确,确保 Trig 和 Echo 引脚没有接反。
  • 确保测量环境没有过多干扰物,避免影响超声波的反射。
2. LCD 显示异常
  • 检查 LCD 的 I2C 地址是否正确,确认 I2C 通信正常。
  • 如果使用并行接口,检查数据线的连接是否可靠。
3. 测量结果不稳定
  • 尝试在测量前加入较长的延时,以确保超声波信号稳定。
  • 尽量减少信号干扰源,确保超声波能够正常传播。

结论

通过本项目,我们成功实现了基于 STM32 的超声波测距仪设计,展示了如何使用 STM32 与超声波传感器进行通信,并通过 LCD 显示测量结果。该系统应用简单而实用,可用于各类距离检测和测量场景。在实际开发中,你还可以扩展更多功能,如加入无线通信模块,实现远程测距等。

相关文章:

基于STM32的超声波测距仪设计

引言 本项目将基于STM32微控制器设计一个超声波测距仪,通过超声波传感器实现距离测量,并将结果显示在液晶屏上。该项目展示了STM32微控制器与超声波传感器、LCD显示器的接口通信,以及信号处理和距离计算的过程。 环境准备 1. 硬件设备 ST…...

【数据库】Java 集成mongodb— MongoTemplate 详解

MongoTemplate 是 Spring Data MongoDB 提供的核心类,用于简化与 MongoDB 数据库的交互。它封装了许多常见的数据库操作,使开发者能够轻松执行 CRUD(创建、读取、更新、删除)操作,处理复杂查询和聚合等。本文将详细介绍…...

腿和脚的动作透露出你的内心“世界”

离大脑越近的部位越容易受大脑控制,而腿脚离大脑最远,想要在第一时间进行伪装是很难的。当危险靠近时,我们的双腿会自然而然地进入戒备状态,产生一些不自觉的动作。因此,观察一个人的腿脚,可以帮助我们了解…...

Oracle架构之用户,权限,角色讲解

文章目录 1 用户1.1 简介1.1.1 定义1.1.2 用户相关信息1.1.2.1 用户默认表空间1.1.2.2 用户临时表空间1.1.2.3 用户资源文件1.1.2.4 用户表空间限额1.1.2.5 用户管理有关的数据字典 1.1.3 用户、模式、模式对象1.1.4 实例模式 SCOTT1.1.5 各个角色区别 1.2 用户管理1.2.1 创建用…...

Unity_Obfuscator Pro代码混淆工具_学习日志

Unity_Obfuscator Pro代码混淆工具_学习日志 切勿将密码或 API 密钥存储在您附带的应用程序内。 混淆后的热更新暂时没有想到怎么办 Obfuscator 文档 https://docs.guardingpearsoftware.com/manual/Obfuscator/Description.html商店链接Obfuscator Pro(大约$70&a…...

已解决:org.springframework.web.HttpMediaTypeNotAcceptableException

文章目录 写在前面问题描述报错原因分析: 解决思路解决办法1. 确保客户端请求的 Accept 头正确2. 修改 Controller 方法的 produces 参数3. 配置合适的消息转换器4. 检查 Spring 配置中的媒体类型5. 其他解决方案 总结 写在前面 在开发过程中,Spring 框…...

C/C++简单编译原理

我们写的头文件和.cpp文件究竟是如何在电脑中运行的? 先明确几个文件类型: 1、头文件(.h .hpp) 第三方头文件、系统头文件、自编头文件…… 2、编译单位(.cpp .c cu) 自己写的脚本文件 3、目标文件&…...

文件处理不再难:带你轻松攻克C语言文件操作

嘿嘿,家人们,今天咱们来详细剖析C语言中的文件操作,好啦,废话不多讲,开干! 目录 1:为什么使用文件 2:文件的概念 2.1:程序文件 2.2:数据文件 2.3:文件名 3:二进制文件与文本文件 4:文件的打开与关闭 4.1:流与标准流 4.1.1:流 4.1.2:标准流 4.2:文件指针 4.3:文件的…...

Unity3D 单例模式

Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式,能够保证一个类只有一个实例,提供访问实例的全局节点。 通常会把一些管理类设置成单例,例如 GameManager、UIManager 等,可以很方便地使用这些管理类单例,…...

解析TMalign文本文件中的转换矩阵

TM-align 将两个蛋白质结构通过旋转和位移对齐后: TMalign test1.pdb test2.pdb -m mtx.txt 输出转换矩阵,文件内容为: ------ The rotation matrix to rotate Chain_1 to Chain_2 ------ m t[m] u[m][0] u[…...

vue.js组建开发

Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它采用了组件化的开发方式,将UI界面拆分成多个可重用的组件,通过组合这些组件来构建复杂的应用程序。在本文中,我们将探讨Vue.js组件开发的相关概念和技术。 一、组件化开发的优势 组件…...

D29【python 接口自动化学习】- python基础之输入输出与文件操作

day29 格式化输出 学习日期:20241006 学习目标:输入输出与文件操作﹣-41 格式化输出:如何将执行结果通过屏幕输出? 学习笔记: 三种常用的格式化输出方式 百分号方式 format函数方式 总结 1. 格式化输出…...

jQuery——平滑翻页

平滑翻页 param next true:下一页 false:下一页 本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中循环翻页的学习。...

二叉树--DS

1. 树 1.1 树的定义 树是一种非线性的数据结构,它是由n (n > 0)个有限结点组成的一个具有层次关系的集合。之所以将它称为“树”,是因为它像一颗倒挂起来的树,也就是说它是根朝上,叶子在下的。 参考上面的图片,…...

State of ChatGPT ---- ChatGPT的技术综述

声明:该文总结自AI菩萨Andrej Karpathy在youtube发布的演讲视频。 原视频连接:State of GPT | BRK216HFS 基础知识: Transformer原文带读与代码实现https://blog.csdn.net/m0_62716099/article/details/141289541?spm1001.2014.3001.5501 H…...

构建高效新闻推荐系统:Spring Boot的力量

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...

如何使用ipopt进行非线性约束求目标函数最小值(NLP非线性规划)内点法(inner point method)

非线性规划,一般用matlab调用cplex和gurobi了,但这两个一般用于线性规划和二次规划 线性规划LP,二次规划(quadratic programming),如果要求更一般的非线性规划IPOT是个很好的选择,求解器很多&a…...

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题 一句话省流: 确保项目地址没有任何中文,重新申请个许可证,然后该咋就咋,完事。 ——————————————————————————————…...

回归分析在数据挖掘中的应用简析

一、引言 在数据驱动的时代,数据挖掘技术已成为从海量数据中提取有价值信息的关键工具。 回归分析,作为一种经典的统计学习方法,不仅在理论研究上有着深厚的基础,而且在实际 应用中也展现出强大的功能。 二、回归分析基础 2.1 回…...

【Node.js】worker_threads 多线程

Node.js 中的 worker_threads 模块 worker_threads 模块是 Node.js 中用于创建多线程处理的工具。 尽管 JavaScript 是单线程的,但有时候在处理计算密集型任务或长时间运行的操作时,单线程的运行会导致主线程被阻塞,影响服务器性能。 为了…...

贪心算法c++

贪心算法C概述 一、贪心算法的基本概念 贪心算法(Greedy Algorithm),又名贪婪法,是一种解决优化问题的常用算法。其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决…...

【STM32】 TCP/IP通信协议(3)--LwIP网络接口

LwIP协议栈支持多种不同的网络接口(网卡),由于网卡是直接跟硬件平台打交道,硬件不同则处理也是不同。那Iwip如何兼容这些不同的网卡呢? LwIP提供统一的接口,底层函数需要用户自行完成,例如网卡的…...

15分钟学 Python 第39天:Python 爬虫入门(五)

Day 39:Python 爬虫入门数据存储概述 在进行网页爬虫时,抓取到的数据需要存储以供后续分析和使用。常见的存储方式包括但不限于: 文件存储(如文本文件、CSV、JSON)数据库存储(如SQLite、MySQL、MongoDB&a…...

使用Pytorch构建自定义层并在模型中使用

使用Pytorch构建自定义层并在模型中使用 继承自nn.Module类,自定义名称为NoisyLinear的线性层,并在新模型定义过程中使用该自定义层。完整代码可以在jupyter nbviewer中在线访问。 import torch import torch.nn as nn from torch.utils.data import T…...

学习记录:js算法(五十六):从前序与中序遍历序列构造二叉树

文章目录 从前序与中序遍历序列构造二叉树我的思路网上思路 总结 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示…...

qt使用QDomDocument读写xml文件

在使用QDomDocument读写xml之前需要在工程文件添加: QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…...

Oracle架构之表空间详解

文章目录 1 表空间介绍1.1 简介1.2 表空间分类1.2.1 SYSTEM 表空间1.2.2 SYSAUX 表空间1.2.3 UNDO 表空间1.2.4 USERS 表空间 1.3 表空间字典与本地管理1.3.1 字典管理表空间(Dictionary Management Tablespace,DMT)1.3.2 本地管理方式的表空…...

springboot整合seata

一、准备 docker部署seata-server 1.5.2参考&#xff1a;docker安装各个组件的命令 二、springboot集成seata 2.1 引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>&…...

鸿蒙开发(NEXT/API 12)【二次向用户申请授权】程序访问控制

当应用通过[requestPermissionsFromUser()]拉起弹框[请求用户授权]时&#xff0c;用户拒绝授权。应用将无法再次通过requestPermissionsFromUser拉起弹框&#xff0c;需要用户在系统应用“设置”的界面中&#xff0c;手动授予权限。 在“设置”应用中的路径&#xff1a; 路径…...

docker export/import 和 docker save/load 的区别

Docker export/import 和 docker save/load 都是用于容器和镜像的备份和迁移&#xff0c;但它们有一些关键的区别&#xff1a; docker export/import: export 作用于容器&#xff0c;import 创建镜像导出的是容器的文件系统&#xff0c;不包含镜像的元数据丢失了镜像的层级结构…...