DS18B20是一种数字温度传感器,与STM32单片机相配合可以方便地实现温度监测功能。本文将介绍如何在STM32上使用DS18B20传感器,并提供详细的代码案例。
一、硬件准备
- STM32开发板(本文以STM32F103为例)
- DS18B20温度传感器
- 杜邦线若干
二、电路连接
将DS18B20传感器连接到STM32开发板上,电路连接如下:
DS18B20引脚 --> STM32引脚
GND --> GND(地)
VCC --> 3.3V(电源)
DQ --> PA0(数据线)
三、软件设置
- 创建新的STM32工程,选择适合的STM32型号和开发环境。
- 在工程中添加相关的库文件并配置工程编译设置。
四、代码实现
- 初始化GPIO引脚
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置GPIO引脚
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 拉高数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
}
- 初始化DS18B20传感器
void DS18B20_Start(void)
{
// 拉低数据线至少480us
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
Delay_us(500);
// 释放数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
// 等待DS18B20回应
Delay_us(70);
}
- 读取DS18B20传感器的温度值
float DS18B20_ReadTemp(void)
{
uint8_t tempL, tempH;
int16_t temp;
// 发送读取温度命令
DS18B20_Start();
DS18B20_WriteByte(0xCC); // 跳过ROM指令
DS18B20_WriteByte(0x44); // 温度转换指令
// 等待温度转换完成(精度决定了等待的时间)
Delay_ms(800);
// 发送读取温度命令
DS18B20_Start();
DS18B20_WriteByte(0xCC); // 跳过ROM指令
DS18B20_WriteByte(0xBE); // 读取温度指令
//读取温度值的低八位和高八位
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
// 将低八位和高八位组合成16位的温度值
temp = (tempH << 8) | tempL;
// 将温度值由16位有符号数转换为浮点数
return (float)temp / 16.0;
}
- 读写数据的辅助函数
void DS18B20_WriteByte(uint8_t byte)
{
uint8_t i;
// 逐位发送数据,MSB先发送
for (i = 0; i < 8; i++)
{
// 拉低数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
// 发送数据位
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, (byte & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);
// 拉高数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
// 准备发送下一位
byte >>= 1;
}
}
uint8_t DS18B20_ReadByte(void)
{
uint8_t i, byte = 0;
// 逐位读取数据,MSB先接收
for (i = 0; i < 8; i++)
{
// 拉低数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
// 拉高数据线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
// 读取数据位
byte |= (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) ? 0x80 : 0x00);
byte >>= 1;
// 延时一段时间
Delay_us(5);
}
return byte;
}
五、使用示例
在主函数中调用以上函数实现温度的读取,并将结果通过串口打印出来。
int main(void)
{
float temperature;
// 硬件初始化
HAL_Init();
SystemClock_Config();
UART_Init();
DS18B20_Init();
// 读取温度并打印
while (1)
{
temperature = DS18B20_ReadTemp();
printf("Temperature: %.2f degrees Celsius\r\n", temperature);
Delay_ms(1000);
}
}
通过串口调试工具连接STM32开发板,即可实时查看DS18B20传感器的温度数据。
六、总结
本文介绍了如何在STM32上使用DS18B20温度传感器,并提供了详细的代码案例。通过以上步骤,我们可以方便地实现温度监测功能。希望本文对学习STM32的DS18B20温度传感器有所帮助。