stm32 18b20 代码 有中文注释
时间: 2023-06-18 22:08:32 浏览: 78
stm32f103采集DS18B20温度传感器通过oled显示程序,亲测可用
以下是基于STM32的DS18B20温度传感器的代码,带有中文注释。
```c
#include "ds18b20.h"
// DS18B20初始化函数
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 开启GPIO时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// 配置GPIO
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; // DQ引脚
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; // 100MHz
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始状态输出高电平
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
// 发送复位脉冲并检测DS18B20存在
uint8_t DS18B20_Reset(void)
{
uint8_t res;
// 输出低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
// 延时480us
Delay_us(480);
// 输出高电平
GPIO_SetBits(GPIOA, GPIO_Pin_4);
// 延时60us
Delay_us(60);
// 切换成输入模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 等待DS18B20响应
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == Bit_RESET);
// 再等待480us左右
Delay_us(480);
// 判断DS18B20是否存在
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == Bit_SET)
res = 1;
else
res = 0;
// 等待余下的时间
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == Bit_SET);
return res;
}
// 发送一个字节的数据到DS18B20
void DS18B20_WriteByte(uint8_t dat)
{
uint8_t i;
for(i=0; i<8; i++)
{
// 输出低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
// 如果是1则输出高电平
if(dat & 0x01)
GPIO_SetBits(GPIOA, GPIO_Pin_4);
// 延时60us
Delay_us(60);
// 输出高电平
GPIO_SetBits(GPIOA, GPIO_Pin_4);
// 延时1us
Delay_us(1);
// 从高电平转为低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
// 右移一位,发送下一个bit
dat >>= 1;
}
}
// 从DS18B20读取一个字节的数据
uint8_t DS18B20_ReadByte(void)
{
uint8_t i, dat = 0;
for(i=0; i<8; i++)
{
// 输出低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
// 延时6us
Delay_us(6);
// 输出高电平
GPIO_SetBits(GPIOA, GPIO_Pin_4);
// 切换成输入模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 读取数据
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == Bit_SET)
dat |= 0x01 << i;
// 延时加上一个时间间隔
Delay_us(60-6);
// 切换成输出模式
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 输出低电平
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
return dat;
}
// 读取温度值
float DS18B20_GetTemp(void)
{
float temp;
uint8_t tmh, tml;
// 复位
if(!DS18B20_Reset())
return 0;
// 发送跳过ROM指令
DS18B20_WriteByte(0xcc);
// 发送温度转换指令
DS18B20_WriteByte(0x44);
// 等待转换完成
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4));
// 复位
if(!DS18B20_Reset())
return 0;
// 发送跳过ROM指令
DS18B20_WriteByte(0xcc);
// 发送读取温度指令
DS18B20_WriteByte(0xbe);
// 读取高字节
tmh = DS18B20_ReadByte();
// 读取低字节
tml = DS18B20_ReadByte();
// 计算温度值
temp = (float)(tmh << 8 | tml) / 16.0;
return temp;
}
```
阅读全文