STM32F103库函数驱动DS18B20
时间: 2023-12-18 07:29:06 浏览: 95
基于STM32的DS18b20驱动程序.doc
以下是使用STM32F103库函数驱动DS18B20的步骤:
1.在STM32CubeMX中配置GPIO引脚,将DS18B20的数据线连接到STM32的GPIO引脚上。
2.在代码中包含头文件"stm32f1xx_hal.h"和"onewire.h"。
3.定义一个GPIO结构体变量和一个OneWire_HandleTypeDef结构体变量。
4.在main函数中初始化GPIO和OneWire_HandleTypeDef结构体变量。
5.使用OneWire_Reset函数向DS18B20发送复位脉冲。
6.使用OneWire_WriteByte函数向DS18B20发送读取温度命令。
7.使用OneWire_ReadByte函数读取DS18B20返回的温度值。
8.将读取到的温度值进行计算,得到实际温度值。
9.将实际温度值通过串口或其他方式发送出去。
下面是一个简单的示例代码:
```c
#include "stm32f1xx_hal.h"
#include "onewire.h"
#define DS18B20_GPIO_PORT GPIOA
#define DS18B20_GPIO_PIN GPIO_PIN_0
OneWire_HandleTypeDef onewire;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
onewire.GPIOx = DS18B20_GPIO_PORT;
onewire.GPIO_Pin = DS18B20_GPIO_PIN;
while (1)
{
OneWire_Reset(&onewire);
OneWire_WriteByte(&onewire, 0xcc);
OneWire_WriteByte(&onewire, 0x44);
HAL_Delay(800);
OneWire_Reset(&onewire);
OneWire_WriteByte(&onewire, 0xcc);
OneWire_WriteByte(&onewire, 0xbe);
uint8_t temp_l = OneWire_ReadByte(&onewire);
uint8_t temp_h = OneWire_ReadByte(&onewire);
int16_t temp = (temp_h << 8) | temp_l;
float temperature = (float)temp / 16.0;
// 将温度值发送出去
}
}
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_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(DS18B20_GPIO_PORT, DS18B20_GPIO_PIN, GPIO_PIN_SET);
GPIO_InitStruct.Pin = DS18B20_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStruct);
}
```
阅读全文