stm32cubx ds18b20
时间: 2025-02-15 16:14:43 浏览: 42
### 如何在STM32Cube中使用DS18B20温度传感器
#### 配置指南
为了使STM32能够读取来自DS18B20的数据,在硬件连接完成后,需通过STM32CubeMX软件完成初始化设置。具体而言:
- 打开STM32CubeMX并创建新工程,选择对应的MCU型号。
- 进入Pinout & Configuration界面,找到I/O口配置部分,将用于与DS18B20通信的GPIO端口设定为复用推挽输出模式[^2]。
#### 示例代码
下面展示一段基于HAL库编写的C语言函数来获取当前环境下的温度测量值:
```c
#include "main.h"
#include "stm32f1xx_hal.h"
#define ONE_WIRE_PIN GPIO_PIN_4
#define ONE_WIRE_PORT GPIOD
void DS18B20_Init(void);
float DS18B20_ReadTemperature(void);
int main(void){
HAL_Init();
SystemClock_Config(); // 初始化系统时钟
MX_GPIO_Init(); // 初始化GPIO
DS18B20_Init();
while (1){
float temperature = DS18B20_ReadTemperature();
printf("Current Temperature:%.2f°C\n",temperature);
HAL_Delay(1000); // 延迟一秒再进行下一次采样
}
}
// 初始化DS18B20接口
void DS18B20_Init(){
/* 设置数据线引脚 */
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = ONE_WIRE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(ONE_WIRE_PORT,&GPIO_InitStruct);
}
// 获取温度数值
float DS18B20_ReadTemperature(){
uint8_t rom_code[8];
uint8_t scratchpad_data[9];
OneWire_Reset(ONE_WIRE_PORT,ONE_WIRE_PIN);
OneWire_WriteByte(ONE_WIRE_PORT,ONE_WIRE_PIN,0xCC); // 跳过ROM命令
OneWire_WriteByte(ONE_WIRE_PORT,ONE_WIRE_PIN,0x44); // 启动转换指令
delay_ms(750); // 等待转换结束
OneWire_Reset(ONE_WIRE_PORT,ONE_WIRE_PIN);
OneWire_WriteByte(ONE_WIRE_PORT,ONE_WIRE_PIN,0xCC); // 再次跳过ROM命令
OneWire_WriteByte(ONE_WIRE_PORT,ONE_WIRE_PIN,0xBE); // 发送读寄存器命令
for(int i=0;i<9;i++){
scratchpad_data[i]=OneWire_ReadByte(ONE_WIRE_PORT,ONE_WIRE_PIN);
}
int16_t raw_temp=(scratchpad_data[1]<<8)|scratchpad_data[0]; // 组合高低位得到原始温度值
if(raw_temp&0x8000){ // 判断是否为负数
raw_temp=~raw_temp+1; // 如果是,则求补码表示实际温度
}
return ((float)(raw_temp)/16); // 将整数形式转化为浮点型返回
}
```
此段代码实现了基本的功能需求,即初始化设备以及周期性的查询最新的温度读数,并将其打印出来显示给用户查看。
阅读全文
相关推荐















