STM32+DS18B20
时间: 2025-03-09 08:10:24 浏览: 59
### STM32 使用 DS18B20 温度传感器
#### 单线通信协议简介
DS18B20温度传感器使用单线通信协议(即单总线协议),这使得其能够仅通过一根数据线与微控制器进行双向通信[^1]。
#### 测量范围和精度
此传感器的测温区间为−55°C至+125°C,在−10°C到+85°C之间可达到±0.5°C的精确度。相较于某些其他类型的传感器,比如DHT11, DS18B20不仅提供了更宽广的工作温度区间也提高了测量准确性[^2]。
#### 多点组网能力
值得注意的是,多个DS18B20器件可以通过同一根数据线连接起来形成网络;每个设备都有独一无二的64位ROM地址码用来区分各个节点并实现独立寻址访问。
#### 示例代码展示如何初始化以及读取来自DS18B20的数据:
```c
#include "stm32f1xx_hal.h"
// 定义用于单总线通讯的GPIO引脚
#define ONE_WIRE_PIN GPIO_PIN_2
#define ONE_WIRE_PORT GPIOA
void OneWire_Init(void);
uint8_t OneWire_Reset(void);
void OneWire_WriteByte(uint8_t byte);
uint8_t OneWire_ReadByte(void);
float Read_DS18B20_Temperature()
{
uint8_t i;
uint8_t data[9];
// 初始化One-Wire接口
OneWire_Init();
// 发送复位脉冲并等待响应
if (!OneWire_Reset()) return -1; // 如果没有检测到任何从机,则返回错误
// 跳过 ROM 地址匹配命令 (针对单一挂载情况)
OneWire_WriteByte(0xCC);
// 启动转换指令
OneWire_WriteByte(0x44);
HAL_Delay(750); // 等待转换完成
// 再次发送复位脉冲
if (!OneWire_Reset()) return -1;
// 跳过 ROM 地址匹配命令
OneWire_WriteByte(0xCC);
// 请求读取刮板中的数据
OneWire_WriteByte(0xBE);
for(i=0;i<9;i++) {
data[i]=OneWire_ReadByte();
}
int16_t raw_temp=(data[1]<<8)|data[0];
float temperature = ((raw_temp & 0xFFFC) >> 2)*0.0625;
return temperature;
}
```
上述函数实现了基本的功能——向DS18B20发出启动温度采集请求,并在一段时间延迟后获取结果。这里假设只存在一个未指定具体位置编码的DS18B20实例被连接到了系统的单总线上面[^3]。
阅读全文
相关推荐













