stm32f103c8t6最小系统板实现温度测试功能
时间: 2025-06-13 12:01:05 浏览: 5
### 使用STM32F103C8T6最小系统板实现温度测试功能
要通过STM32F103C8T6最小系统板实现温度测试功能,通常需要连接一个外部温度传感器(如DS18B20、LM35或DHT系列)。以下是具体方法和示例代码。
#### 1. 硬件设计
硬件部分主要包括STM32F103C8T6芯片及其外围电路,以及温度传感器的接线方式。常见的温度传感器有模拟信号输出型(如LM35)和数字信号输出型(如DS18B20)。
对于数字传感器DS18B20,其接法如下:
- VCC 接到 STM32 的电源正极 (3.3V 或 5V)。
- GND 接到 STM32 的地。
- DQ 数据引脚接到 STM32 的 GPIO 口,并通过一个上拉电阻 (约4.7kΩ) 连接到电源[^1]。
#### 2. 软件配置
软件部分涉及初始化GPIO口、读取数据并处理温度值。以下是一个基于HAL库的示例程序,用于读取DS18B20的数据:
```c
#include "stm32f1xx_hal.h"
#define DS18B20_PIN GPIO_PIN_0
#define DS18B20_GPIO_PORT GPIOA
void DS18B20_Init(void);
uint8_t DS18B20_ReadBit(void);
void DS18B20_WriteByte(uint8_t data);
uint8_t DS18B20_ReadByte(void);
float GetTemperature(void);
int main(void)
{
HAL_Init();
DS18B20_Init();
while (1)
{
float temperature = GetTemperature(); // 获取当前温度
printf("Current Temperature: %.2f C\n", temperature); // 打印温度
HAL_Delay(1000); // 延迟一秒
}
}
// 初始化DS18B20接口
void DS18B20_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 开漏模式
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStruct);
}
// 发送复位脉冲并等待响应
uint8_t DS18B20_Reset(void)
{
uint8_t presence_pulse;
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_PIN, GPIO_PIN_RESET); // 下拉总线
HAL_Delay(500); // 延迟至少480us
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_PIN, GPIO_PIN_SET); // 上拉总线
HAL_DelayMicroseconds(60); // 延迟60~240us检测是否存在器件
presence_pulse = !HAL_GPIO_ReadPin(DS18B20_GPIO_PORT, DS18B20_PIN); // 检测是否有低电平回应
HAL_DelayMicroseconds(400); // 完成剩余时间延迟
return presence_pulse;
}
// 写入字节到DS18B20
void DS18B20_WriteByte(uint8_t wr_data)
{
uint8_t i;
for(i=0;i<8;i++)
{
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_PIN, GPIO_PIN_RESET); // 下拉总线
if(wr_data & 0x01) // 如果最低位为1,则保持高电平较长时间
HAL_DelayMicroseconds(60);
else // 如果最低位为0,则快速释放总线
HAL_DelayMicroseconds(10);
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_PIN, GPIO_PIN_SET); // 释放总线
HAL_DelayMicroseconds(60); // 等待恢复周期
wr_data >>= 1; // 移动下一位
}
}
// 从DS18B20读取字节
uint8_t DS18B20_ReadByte(void)
{
uint8_t i,j=0;
for(i=0;i<8;i++) // 循环八次接收每一位数据
{
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_PIN, GPIO_PIN_RESET); // 将总线下拉启动一次传输
HAL_DelayMicroseconds(2); // 维持一段时间让对方准备好发送数据
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_PIN, GPIO_PIN_SET); // 释放总线以便接收数据
j>>=1; // 准备存储新收到的一位数据
if(HAL_GPIO_ReadPin(DS18B20_GPIO_PORT, DS18B20_PIN)) // 判断此时总线上是否被拉低
j|=0x80; // 存储该位数据
HAL_DelayMicroseconds(60); // 等待其余的时间完成本次通信
}
return j;
}
// 获取温度值
float GetTemperature(void)
{
int16_t temp_value;
DS18B20_Reset(); // 复位DS18B20
DS18B20_WriteByte(0xCC); // 跳过ROM操作命令
DS18B20_WriteByte(0x44); // 启动转换命令
DS18B20_Reset(); // 再次复位
DS18B20_WriteByte(0xCC); // 跳过ROM操作命令
DS18B20_WriteByte(0xBE); // 读取寄存器命令
temp_value = DS18B20_ReadByte(); // 读取低位
temp_value |= ((int16_t)(DS18B20_ReadByte()) << 8); // 读取高位
return (float)((temp_value * 0.0625)); // 计算实际温度值
}
```
上述代码实现了基本的温度采集功能,适用于DS18B20传感器[^2]。
---
阅读全文
相关推荐

















