HAL库ds18b20例程
时间: 2023-11-10 15:05:27 浏览: 89
DS18B20例程
以下是基于HAL库的DS18B20温度传感器例程:
```c
#include "stm32f1xx_hal.h"
#define DS18B20_PORT GPIOA
#define DS18B20_PIN GPIO_PIN_0
void ds18b20_delay_us(uint32_t us)
{
uint32_t ticks = us * (SystemCoreClock / 1000000) / 5;
while(ticks--);
}
void ds18b20_reset(void)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
ds18b20_delay_us(480);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
ds18b20_delay_us(60);
}
void ds18b20_write_bit(uint8_t bit)
{
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
if(bit)
ds18b20_delay_us(10);
else
ds18b20_delay_us(60);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
if(bit)
ds18b20_delay_us(60);
else
ds18b20_delay_us(10);
}
uint8_t ds18b20_read_bit(void)
{
uint8_t bit = 0;
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_RESET);
ds18b20_delay_us(2);
HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, GPIO_PIN_SET);
ds18b20_delay_us(10);
bit = HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN);
ds18b20_delay_us(50);
return bit;
}
void ds18b20_write_byte(uint8_t byte)
{
uint8_t i;
for(i = 0; i < 8; i++)
{
ds18b20_write_bit(byte & 0x01);
byte >>= 1;
}
}
uint8_t ds18b20_read_byte(void)
{
uint8_t i, byte = 0;
for(i = 0; i < 8; i++)
{
byte >>= 1;
if(ds18b20_read_bit())
byte |= 0x80;
}
return byte;
}
float ds18b20_read_temperature(void)
{
uint8_t temp_l, temp_h;
float temp;
ds18b20_reset();
ds18b20_write_byte(0xcc); // skip ROM
ds18b20_write_byte(0x44); // convert temperature
while(!ds18b20_read_bit()); // wait until conversion is complete
ds18b20_reset();
ds18b20_write_byte(0xcc); // skip ROM
ds18b20_write_byte(0xbe); // read scratchpad
temp_l = ds18b20_read_byte();
temp_h = ds18b20_read_byte();
temp = ((temp_h << 8) | temp_l) * 0.0625;
return temp;
}
int main(void)
{
float temperature = 0.0;
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
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);
while (1)
{
temperature = ds18b20_read_temperature();
// do something with temperature
HAL_Delay(1000);
}
}
```
在该例程中,使用了以下函数:
- `ds18b20_delay_us(uint32_t us)`:us微秒级别的延时函数。
- `ds18b20_reset()`:复位DS18B20温度传感器。
- `ds18b20_write_bit(uint8_t bit)`:向DS18B20写入1个bit。
- `ds18b20_read_bit()`:从DS18B20读取1个bit。
- `ds18b20_write_byte(uint8_t byte)`:向DS18B20写入1个byte。
- `ds18b20_read_byte()`:从DS18B20读取1个byte。
- `ds18b20_read_temperature()`:读取DS18B20的温度值。
在主函数`main()`中,首先初始化HAL库,并设置DS18B20引脚为输出模式。然后进入循环,不断读取温度并进行处理。
阅读全文