学习STM32的DS18B20温度传感器

DS18B20是一种数字温度传感器,与STM32单片机相配合可以方便地实现温度监测功能。本文将介绍如何在STM32上使用DS18B20传感器,并提供详细的代码案例。

一、硬件准备

  1. STM32开发板(本文以STM32F103为例)
  2. DS18B20温度传感器
  3. 杜邦线若干

二、电路连接

将DS18B20传感器连接到STM32开发板上,电路连接如下:

DS18B20引脚 --> STM32引脚
GND        --> GND(地)
VCC        --> 3.3V(电源)
DQ         --> PA0(数据线)

三、软件设置

  1. 创建新的STM32工程,选择适合的STM32型号和开发环境。
  2. 在工程中添加相关的库文件并配置工程编译设置。

四、代码实现

  1. 初始化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);
}

  1. 初始化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);
}

  1. 读取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;
}

  1. 读写数据的辅助函数
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温度传感器有所帮助。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值