stm32 hal库 ds18b20温度报警 代码
时间: 2023-07-30 08:10:18 浏览: 195
好的,以下是一个使用STM32 HAL库和DS18B20温度传感器进行温度报警的示例代码,供你参考:
```c
#include "stm32f1xx_hal.h"
#define DS18B20_PORT GPIOA
#define DS18B20_PIN GPIO_PIN_0
#define ALERT_TEMP 30.0f
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
void Delay_us(uint16_t us);
void DS18B20_Init(void);
void DS18B20_Reset(void);
void DS18B20_WriteBit(uint8_t bit);
uint8_t DS18B20_ReadBit(void);
void DS18B20_WriteByte(uint8_t byte);
uint8_t DS18B20_ReadByte(void);
float DS18B20_ReadTemp(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
float temp;
while (1)
{
temp = DS18B20_ReadTemp();
if (temp > ALERT_TEMP)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
}
HAL_Delay(1000);
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = DS18B20_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
}
void Delay_us(uint16_t us)
{
uint16_t i = 0;
while (us--)
{
i = 10;
while (i--)
{
__NOP();
}
}
}
void DS18B20_Init(void)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(500);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(500);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(500);
}
void DS18B20_Reset(void)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(500);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(60);
while (HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN) == GPIO_PIN_SET);
Delay_us(500);
}
void DS18B20_WriteBit(uint8_t bit)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2);
if (bit)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
}
Delay_us(60);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
}
uint8_t DS18B20_ReadBit(void)
{
uint8_t bit = 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
Delay_us(2);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
Delay_us(10);
bit = HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN);
Delay_us(50);
return bit;
}
void DS18B20_WriteByte(uint8_t byte)
{
uint8_t i = 8;
while (i--)
{
DS18B20_WriteBit(byte & 0x01);
byte >>= 1;
}
}
uint8_t DS18B20_ReadByte(void)
{
uint8_t i = 8;
uint8_t byte = 0;
while (i--)
{
byte >>= 1;
byte |= (DS18B20_ReadBit() << 7);
}
return byte;
}
float DS18B20_ReadTemp(void)
{
uint8_t temp_l, temp_h;
int16_t temp;
float temp_f;
DS18B20_Init();
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
HAL_Delay(800);
DS18B20_Init();
DS18B20_Reset();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
temp_l = DS18B20_ReadByte();
temp_h = DS18B20_ReadByte();
temp = temp_h << 8 | temp_l;
if (temp & 0x8000)
{
temp = (~temp) + 1;
temp_f = (float)temp * 0.0625f * (-1);
}
else
{
temp_f = (float)temp * 0.0625f;
}
return temp_f;
}
```
这段代码中,将DS18B20的数据线连接到了PA0口,将LED连接到了PC13口。其中,DS18B20_Init()函数用于初始化DS18B20,DS18B20_Reset()函数用于复位DS18B20,DS18B20_WriteBit()和DS18B20_ReadBit()函数用于向DS18B20写入和读取1位数据,DS18B20_WriteByte()和DS18B20_ReadByte()函数用于向DS18B20写入和读取1字节数据,DS18B20_ReadTemp()函数用于读取温度数据并返回温度值。在main函数中,不断读取温度数据并与预设的报警温度进行比较,如果温度超过报警温度,则点亮LED进行报警。
阅读全文