STM32 温度显示程序
STM32 温度显示程序
更多
以下是一个基于STM32的DS18B20温度传感器显示程序示例(使用串口输出显示),采用HAL库开发(适用于STM32CubeIDE环境):
#include "main.h"
#include <stdio.h>
// 定义DS18B20引脚
#define DS18B20_PIN GPIO_PIN_0
#define DS18B20_PORT GPIOA
// 单总线延时函数
void delay_us(uint16_t us) {
uint32_t ticks = us * (SystemCoreClock / 1000000) / 9;
while(ticks--);
}
// 初始化单总线
void DS18B20_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET); // 拉高总线
}
// 发送复位脉冲
uint8_t DS18B20_Reset(void) {
uint8_t status = 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
delay_us(480); // 保持480us低电平
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET); // 释放总线
delay_us(70); // 等待15-60us
if(!HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN)) status = 1; // 检测应答信号
delay_us(410); // 等待复位完成
return status;
}
// 写1位数据
void DS18B20_WriteBit(uint8_t bit) {
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
delay_us(bit ? 3 : 60); // 写1保持3us,写0保持60us
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
delay_us(bit ? 60 : 3); // 恢复时间
}
// 写1字节数据
void DS18B20_WriteByte(uint8_t byte) {
for(uint8_t i=0; i<8; i++) {
DS18B20_WriteBit(byte & 0x01);
byte >>= 1;
}
}
// 读1位数据
uint8_t DS18B20_ReadBit(void) {
uint8_t bit = 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
delay_us(3); // 保持低电平3us
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
delay_us(10); // 等待10us
if(HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN)) bit = 1; // 读取数据
delay_us(50); // 等待周期结束
return bit;
}
// 读1字节数据
uint8_t DS18B20_ReadByte(void) {
uint8_t byte = 0;
for(uint8_t i=0; i<8; i++) {
byte >>= 1;
if(DS18B20_ReadBit()) byte |= 0x80;
}
return byte;
}
// 读取温度值(摄氏度)
float DS18B20_ReadTemp(void) {
uint8_t temp_l, temp_h;
int16_t temp;
float temperature;
if(DS18B20_Reset() == 0) return -999; // 设备未响应
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 启动温度转换
HAL_Delay(750); // 等待转换完成(12位精度)
if(DS18B20_Reset() == 0) return -999;
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读取暂存器
temp_l = DS18B20_ReadByte(); // 温度低字节
temp_h = DS18B20_ReadByte(); // 温度高字节
temp = (temp_h << 8) | temp_l;
temperature = temp / 16.0f; // 12位精度转换
return temperature;
}
// 重定向printf到串口
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 10);
return ch;
}
int main(void) {
HAL_Init();
SystemClock_Config();
// 初始化串口(需在CubeMX中配置USART1)
MX_USART1_UART_Init();
DS18B20_Init();
printf("STM32温度监测系统启动...\r\n");
while(1) {
float temp = DS18B20_ReadTemp();
if(temp > -100) {
printf("当前温度: %.2f°C\r\n", temp);
} else {
printf("传感器错误!\r\n");
}
HAL_Delay(2000); // 每2秒更新一次
}
}
关键说明:
-
硬件连接:
- DS18B20数据线接PA0(可修改宏定义)
- VCC接3.3V,GND接地
- 需4.7KΩ上拉电阻
- USART1用于串口输出(PA9-TX, PA10-RX)
-
使用步骤:
- 在STM32CubeMX中配置:
- 使能USART1
- 配置PA0为GPIO Output Open Drain
- 配置系统时钟
- 复制代码到工程
- 连接串口助手(波特率115200)
- 在STM32CubeMX中配置:
-
功能特点:
- 每2秒读取并显示一次温度
- 支持小数精度显示(xx.xx°C)
- 自动检测传感器连接状态
- 符合单总线严格时序要求
-
自定义修改:
// 修改传感器引脚 #define DS18B20_PIN GPIO_PIN_5 // 改为其他引脚 #define DS18B20_PORT GPIOB
// 修改更新间隔(毫秒) HAL_Delay(5000); // 改为5秒更新
### 串口输出示例:
STM32温度监测系统启动... 当前温度: 25.62°C 当前温度: 26.13°C 当前温度: 26.75°C 传感器错误! // 当断开传感器时
### 扩展建议:
1. 添加LCD显示:替换printf为LCD驱动函数
2. 添加温度报警:当温度超过阈值时触发GPIO输出
3. 添加多路传感器:修改单总线驱动支持多设备寻址
4. 添加校准功能:通过EEPROM存储校准参数
> 注意:实际使用时需根据具体STM32型号调整时钟配置和延时函数参数。建议使用STM32CubeMX生成基础工程框架。 基于STM32+SHT30设计的环境温度与湿度检测系统(IIC模拟时序)
,STM32芯片通过处理这些数据并将它们显示在0.91寸OLED显示屏上,以便用户能够方便地观察环境
2023-06-20 09:16:57
ZigBee采集温度湿度手机显示实验的软件和程序及设计资料说明
本文档的主要内容详细介绍的是ZigBee采集温度湿度手机显示实验的软件和程序及设计资料说明。
资料下载
佚名
2020-01-14 10:53:00
基于stm32F446RE的温度显示/设定及报警系统的设计资料分享
温度显示、设定及报警系统设计(我是菜鸟)2.1硬件:(1)选用ST公司的stm32F446RE开发板;(2)运用
2022-02-28 11:16:41
基于 STM32 和 CAN 总线的温度监控系统的设计
本文为大家总结了一篇基于 STM32 和 CAN 总线的温度监控系统的设计,通过上位机与下位机的通信,实现对温度数据的监控,并经初步实验达到了设
2020-05-30 08:00:00
7天热门专题
换一换
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- dtmb信号覆盖城市查询
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机