stm32f103c8t6读取ds18b20的温度
时间: 2023-08-01 10:15:33 浏览: 108
STM32F103读取DS18B20温度数据.zip
5星 · 资源好评率100%
连接DS18B20到STM32F103C8T6的方法如下:
DS18B20的VCC引脚连接到STM32F103C8T6的3.3V电源引脚,GND引脚连接到STM32F103C8T6的GND引脚,DQ引脚连接到STM32F103C8T6的GPIO引脚。
下面是读取DS18B20温度的步骤:
1. 初始化DS18B20
- 置DQ引脚为低电平,保持至少480us
- 将DQ引脚置高,等待15-60us
- 读取DQ引脚的状态,如果为低电平,则DS18B20初始化成功,如果为高电平,则DS18B20初始化失败
2. 发送读取温度命令
- 置DQ引脚为低电平,保持至少480us
- 将DQ引脚置高,等待15-60us
- 置DQ引脚为低电平,发送读取温度命令0x44
3. 等待DS18B20转换温度完成
- 置DQ引脚为低电平,发送读取温度命令0xBE
- 读取DS18B20返回的温度值,共16位,先低位后高位
下面是读取DS18B20温度的示例代码,使用的是STM32F103C8T6的HAL库:
```C
#include "stm32f1xx_hal.h"
#include "main.h"
#define DS18B20_GPIO GPIOB
#define DS18B20_PIN GPIO_PIN_12
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DS18B20_GPIO, &GPIO_InitStruct);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(50);
HAL_GPIO_ReadPin(DS18B20_GPIO, DS18B20_PIN);
HAL_Delay(500);
}
void DS18B20_Read_Temperature(float *temp)
{
uint8_t buffer[2];
uint16_t raw_temp;
float temperature;
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(15);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(60);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(15);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_ReadPin(DS18B20_GPIO, DS18B20_PIN);
HAL_Delay(100);
HAL_GPIO_ReadPin(DS18B20_GPIO, DS18B20_PIN);
HAL_Delay(2);
HAL_GPIO_ReadPin(DS18B20_GPIO, DS18B20_PIN);
HAL_Delay(2);
HAL_GPIO_ReadPin(DS18B20_GPIO, DS18B20_PIN);
HAL_Delay(2);
HAL_GPIO_ReadPin(DS18B20_GPIO, DS18B20_PIN);
HAL_Delay(2);
buffer[0] = 0xBE;
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(DS18B20_GPIO, DS18B20_PIN, GPIO_PIN_RESET);
HAL_Delay(2);
HAL_UART_Transmit(&huart1, buffer, 1, 100);
HAL_UART_Receive(&huart1, buffer, 2, 100);
raw_temp = (buffer[1] << 8) | buffer[0];
temperature = (float)raw_temp * 0.0625f;
*temp = temperature;
}
```
其中,DS18B20_Init函数用于初始化DS18B20,DS18B20_Read_Temperature函数用于读取DS18B20的温度值,temp为温度值的指针。
阅读全文