登录/注册

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秒更新一次
    }
}

关键说明:

  1. 硬件连接

    • DS18B20数据线接PA0(可修改宏定义)
    • VCC接3.3V,GND接地
    • 需4.7KΩ上拉电阻
    • USART1用于串口输出(PA9-TX, PA10-RX)
  2. 使用步骤

    • 在STM32CubeMX中配置:
      • 使能USART1
      • 配置PA0为GPIO Output Open Drain
      • 配置系统时钟
    • 复制代码到工程
    • 连接串口助手(波特率115200)
  3. 功能特点

    • 每2秒读取并显示一次温度
    • 支持小数精度显示(xx.xx°C)
    • 自动检测传感器连接状态
    • 符合单总线严格时序要求
  4. 自定义修改

    
    // 修改传感器引脚
    #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单片机的六路DS18B20温度监测报警仿真设计

STM32F103R6+DS18B20温度传感器+LCD1602显示,温度

2023-09-01 09:35:31

基于STM32+SHT30设计的环境温度与湿度检测系统(IIC模拟时序)

,STM32芯片通过处理这些数据并将它们显示在0.91寸OLED显示屏上,以便用户能够方便地观察环境

2023-06-20 09:16:57

基于STM32的0.96寸OLED时钟程序

用的是stm32自带的RTC时钟。硬件连接很简单,当然程序也是比较简单的,只写了温度(DS18B20),

2023-05-08 09:58:02

STM32 DS18B20温度显示参考实验资料汇总

DS18B20温度显示参考实验,可供STM32学习者参考。

资料下载 郑兵 2021-12-30 10:28:08

单片机LCD显示温度串口接收温度程序和接线图免费下载

本文档的主要内容详细介绍的是单片机LCD显示温度串口接收温度的程序和接线

资料下载 佚名 2020-06-15 17:21:00

ZigBee采集温度湿度手机显示实验的软件和程序及设计资料说明

本文档的主要内容详细介绍的是ZigBee采集温度湿度手机显示实验的软件和程序及设计资料说明。

资料下载 佚名 2020-01-14 10:53:00

使用STM32单片机实现二维码显示的资料和程序免费下载

本文档的主要内容详细介绍的是使用STM32单片机实现二维码显示的资料和程序免费下载。

资料下载 王涛 2019-08-16 17:32:00

LCD显示温度和串口接收温度的C语言程序免费下载

本文档的主要内容详细介绍的是LCD显示温度和串口接收温度的C语言程序免费

资料下载 佚名 2019-06-04 16:02:35

基于stm32F446RE的温度显示/设定及报警系统的设计资料分享

温度显示、设定及报警系统设计(我是菜鸟)2.1硬件:(1)选用ST公司的stm32F446RE开发板;(2)运用

2022-02-28 11:16:41

单片机程序读取温度显示

:(1)单片机程序读取温度并显示。读取的是DS18B20温度传感器内部的

2022-01-17 06:58:24

如何去实现一种基于stm32F446RE的温度显示报警系统设计呢

如何去实现一种基于stm32F446RE的温度显示报警系统设计呢?温度

2021-11-29 06:01:56

如何用STM32驱动DS18B20温度传感器实现温度的串口打印显示

如何用STM32驱动DS18B20温度传感器实现温度的串口打印显示?

2021-11-23 06:32:06

stm32用什么软件写程序

stm32用什么软件写程序?STM32单片机在编程时可以使用库函数和使用配置寄存器的方式来进行

2021-09-21 16:00:00

基于 STM32 和 CAN 总线的温度监控系统的设计

本文为大家总结了一篇基于 STM32 和 CAN 总线的温度监控系统的设计,通过上位机与下位机的通信,实现对温度数据的监控,并经初步实验达到了设

2020-05-30 08:00:00

STM32工作的自举程序 你了解多少?

STM32自举程序,你了解多少?

2020-03-03 11:07:34

7天热门专题 换一换
相关标签