news 2026/4/14 11:57:14

基于STM32的BMP180气压传感器探索:仿真与程序实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32的BMP180气压传感器探索:仿真与程序实现

基于STM32的BMP180气压传感器(仿真+程序) Proteus仿真版本:proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计说明: keil5 基于HAL库 通过STM32读取BMP180输出的数据通过串口及LCD显示屏,将高度,温度大气压强信息显示出来。 注:仿真效果有些许误差,不能100%还原传感器,误差大概1%

最近玩了玩基于STM32的BMP180气压传感器项目,和大家分享下过程,包括Proteus仿真以及在Keil 5里用C语言基于HAL库写的程序。

Proteus仿真

我用的是Proteus 8.9版本,这个版本对各类元件支持挺不错的。在搭建仿真电路的时候,要先在元件库找到STM32芯片以及BMP180气压传感器元件。STM32芯片就像我们项目的大脑,负责处理各种数据,而BMP180则是感知外界气压、温度等信息的触角。

连接电路时,要把BMP180的通信引脚(比如I2C或者SPI,具体看你的硬件设计,这里假设用I2C)和STM32对应的I2C引脚连好。LCD显示屏用来直观地显示数据,也要正确连接到STM32,串口部分则用于和电脑等外部设备通信,方便调试。虽然Proteus仿真很方便,但得注意它有大概1%的误差,没办法完全等同于真实的传感器工作情况。

Keil 5编程

初始化

编程环境用的是Keil 5,基于HAL库来写C语言代码。首先要对STM32进行初始化,包括系统时钟、I2C外设、串口和LCD相关的GPIO口。

// 初始化系统时钟 void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; // 这里配置HSE(高速外部时钟),具体根据你的硬件来 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 72; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK) { // 初始化失败处理 Error_Handler(); } // 配置系统时钟 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)!= HAL_OK) { // 时钟配置失败处理 Error_Handler(); } }

这段代码就是设置系统时钟,像给STM32定好一个稳定的“节拍”,它决定了STM32运行各种指令的速度。

读取BMP180数据

接下来是读取BMP180的数据。BMP180通过I2C协议和STM32通信。

// 假设已经定义好了I2C句柄hi2c1 // 读取BMP180寄存器数据 uint8_t BMP180_Read(uint8_t reg) { uint8_t data; HAL_I2C_Mem_Read(&hi2c1, BMP180_ADDR, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, 1000); return data; } // 计算温度 float BMP180_GetTemperature(void) { int32_t UT, X1, X2, B5, temperature; uint8_t msb, lsb, xlsb; // 发送温度转换命令 BMP180_Write(0xF4, 0x2E); HAL_Delay(5); // 读取温度数据 msb = BMP180_Read(0xF6); lsb = BMP180_Read(0xF7); UT = (int32_t)(msb << 8) | lsb; // 利用校准数据计算温度 X1 = (UT - ac6) * ac5 >> 15; X2 = mc << 11 / (X1 + md); B5 = X1 + X2; temperature = ((B5 + 8) >> 4); return (float)temperature / 10; }

BMP180Read函数里,通过HALI2CMemRead这个HAL库函数从BMP180指定寄存器读取数据。而BMP180_GetTemperature函数则是先发送温度转换命令,等转换完成后读取数据,再结合BMP180内部校准数据计算出实际温度值。

数据显示

读取到温度、气压、高度数据后,要通过串口和LCD显示出来。

// 在main函数里 int main(void) { float temperature, pressure, altitude; char buffer[50]; HAL_Init(); SystemClock_Config(); // 初始化I2C、串口、LCD等外设 while (1) { temperature = BMP180_GetTemperature(); pressure = BMP180_GetPressure(); altitude = BMP180_GetAltitude(pressure); // 串口打印数据 sprintf(buffer, "Temperature: %.2f C\r\n", temperature); HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 1000); sprintf(buffer, "Pressure: %.2f hPa\r\n", pressure); HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 1000); sprintf(buffer, "Altitude: %.2f m\r\n", altitude); HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), 1000); // LCD显示数据,假设已经有LCD显示函数LCD_Print LCD_Print("Temp:", temperature, " C"); LCD_Print("Press:", pressure, " hPa"); LCD_Print("Alt:", altitude, " m"); HAL_Delay(2000); } }

这里在main函数的循环里,不断读取数据,然后通过sprintf函数把数据格式化到字符串里,再用HALUARTTransmit通过串口发送出去,同时也调用LCD显示函数把数据显示在LCD屏幕上,每2秒更新一次数据。

总的来说,这个基于STM32的BMP180气压传感器项目,通过Proteus仿真和Keil 5编程实现了从传感器数据采集到显示的全过程,虽然仿真有小误差,但整体能让我们很好地理解这类传感器的工作原理和应用开发。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 21:15:09

5分钟掌握AI绘画:用stable-diffusion-webui创作个性化数字艺术

你是否曾梦想将自己的创意瞬间转化为视觉艺术作品&#xff1f;stable-diffusion-webui让这个梦想变得触手可及。这款基于Gradio库开发的Web界面工具&#xff0c;将复杂的AI图像生成技术转化为直观的可视化操作&#xff0c;让零基础用户也能轻松创作出令人惊艳的数字艺术作品。 …

作者头像 李华
网站建设 2026/4/11 9:11:44

YOLO模型训练任务崩溃?常见GPU内存溢出原因及解决方案

YOLO模型训练任务崩溃&#xff1f;常见GPU内存溢出原因及解决方案 在部署一个工业质检系统时&#xff0c;团队正准备对产线上的微小缺陷进行高精度检测。他们选用了YOLOv8x——这个以强大表征能力著称的模型&#xff0c;并将输入分辨率提升至12801280以捕捉更细微的目标。然而&…

作者头像 李华
网站建设 2026/4/8 14:56:20

Waymo Open Dataset自动驾驶数据集:5步快速上手终极指南

Waymo Open Dataset自动驾驶数据集&#xff1a;5步快速上手终极指南 【免费下载链接】waymo-open-dataset Waymo Open Dataset 项目地址: https://gitcode.com/gh_mirrors/wa/waymo-open-dataset Waymo Open Dataset作为业界领先的自动驾驶开源数据集&#xff0c;为研究…

作者头像 李华
网站建设 2026/4/11 9:20:03

PPSSPP终极控制映射指南:三步搞定完美游戏操控体验

还在为手机模拟器操作不顺而烦恼吗&#xff1f;想要让虚拟按键像实体手柄一样精准响应吗&#xff1f;作为一款跨平台的PSP模拟器&#xff0c;PPSSPP通过强大的控制映射系统&#xff0c;能够将你的手机、平板或电脑完美变身为一台功能齐全的PSP掌机。无论你是触屏玩家还是键盘手…

作者头像 李华
网站建设 2026/4/14 13:31:15

YOLO目标检测模型如何应对光照变化?自适应增强+GPU训练

YOLO目标检测如何应对光照变化&#xff1f;自适应增强与GPU训练的实战融合 在汽车焊装车间的质检线上&#xff0c;一台搭载YOLO模型的视觉系统正高速运转。白天阳光斜射时&#xff0c;工件表面反光强烈&#xff1b;傍晚自然光减弱后&#xff0c;阴影区域细节模糊——原本稳定的…

作者头像 李华
网站建设 2026/4/10 14:29:57

YOLO目标检测模型支持多语言标签吗?结合NLP token轻松实现

YOLO目标检测模型支持多语言标签吗&#xff1f;结合NLP token轻松实现 在智能摄像头遍布楼宇、工厂和街道的今天&#xff0c;一个看似简单的问题却频繁出现在开发者的工单中&#xff1a;“为什么报警信息里的‘person’不能显示成‘人’&#xff1f;” 或者&#xff0c;“我们的…

作者头像 李华