stm32和ds18b20
时间: 2025-04-29 14:51:41 浏览: 20
### STM32 使用 DS18B20 温度传感器教程
#### 实现概述
STM32 微控制器能够与 DS18B20 数字温度传感器协同工作,从而实现精确的温度测量。该过程涉及初始化硬件接口、配置 GPIO 口以及编写必要的软件逻辑来处理单总线通信协议。
#### 单总线通信协议简介
由于 DS18B20 采用单总线通信方式,因此需要特别关注其独特的信号传输机制。这种通信模式允许在一个 I/O 线路上完成所有的控制命令发送和数据接收操作[^3]。
#### 初始化设置
对于 STM32 来说,在使用之前应该先定义好用于连接 DS18B20 的 GPIO 引脚,并对其进行适当配置以便支持单总线通讯:
```c
// 定义使用的GPIO端口及引脚编号
#define ONE_WIRE_PORT GPIOA
#define ONE_WIRE_PIN GPIO_PIN_4
void OneWire_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 配置PA4作为推挽输出 */
GPIO_InitStruct.Pin = ONE_WIRE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ONE_WIRE_PORT, &GPIO_InitStruct);
}
```
#### 数据读取流程
当一切准备就绪之后,就可以按照如下步骤获取当前环境下的实际温度值了:
1. 发送复位脉冲给 DS18B20 设备;
2. 接收来自器件的存在脉冲响应确认;
3. 发出跳过 ROM 命令 (如果只接有一个传感器的话),或者匹配特定序列号;
4. 执行转换指令让传感器开始采集新的样本点;
5. 经过一定延时等待采样结束;
6. 请求读回最新测得的结果;
7. 对返回的数据包执行 CRC 校验确保准确性;
以下是简化版 C 语言函数用来演示上述过程的一部分:
```c
uint8_t Read_DS18B20_Temperature(float *temperature){
uint8_t i,j,data[9];
float temp;
// 复位并检测是否存在设备...
if(!OneWire_Reset()) return ERROR_NO_DEVICE_FOUND;
// 跳过ROM地址查找阶段(假设仅有一颗芯片)
OneWire_WriteByte(SKIP_ROM);
// 下达启动温度转换命令
OneWire_WriteByte(CONVERT_TEMP_CMD);
// 短暂延迟直到ADC转换完毕
HAL_Delay(750);
// 再次唤醒DS18B20进入读状态
OneWire_Reset();
OneWire_WriteByte(SKIP_ROM);
// 获取全部九个字节的数据流
for(i=0;i<9;i++) data[i]=OneWire_ReadByte();
// 计算CRC校验码验证完整性
if(CRC_Check(data)!=data[8]) return ERROR_CRC_FAIL;
// 解析低高两个有效字节得到最终结果
int16_t raw_temp=(int16_t)((data[1]<<8)|data[0]);
temp=((float)(raw_temp)/16)*0.0625f;
*temperature=temp;
return SUCCESS;
}
```
需要注意的是,首次上电后的默认初始温度可能为 85°C ,这属于正常现象,多次刷新即可恢复正常范围内的数值显示[^5]。
阅读全文
相关推荐
















