STM32 - DS18B20驱动
<!--[toc]-->
DS18B20
简单介绍一下,查询数据手册可以知道:
一个温度传感器,
测量范围在-55°C ~ +125°C
,
仅需要单片机一个IO接口,
寄生电源模式(没玩过),
宽电压范围 +3.0V ~ +5.5V
。
通信时序图
时序图:
参数表:
如图有:
- 写指令时序
- 读数据时序
- 重置重置时序
- 检测时序
写指令函数
观察写指令时序图,
首先将电平从低拉高后等待tREC
的时间,时间查看参数表中最小为1us,
最小延迟1us是为了使电平稳定。
延迟1-2us后,
将电平改变成有效数据位的高低电平后,观察时序图tSLOT
一个周期时间在60-120us之间,所以我们延迟60us即可。
如部分代码(其中使用了部分宏定义,若需要更全的文件,请跳至最后下载附件即可):
/*******************************************************************************
* 函数名:DS18B20_WriteByte
* 功 能:向DS18B20写入一个字节
* 参 数:u8Data:要写入的数据
* 返回值:无
* 说 明:
*******************************************************************************/
void DS18B20_WriteByte(uint8_t u8Data)
{
uint8_t tempIndex,tempData;
DS18B20_DQModeOutput();//设置为输出
for (tempIndex = 1; tempIndex <= 8; tempIndex++)
{
tempData = (u8Data & 0x01);
u8Data >>= 1;
if (tempData == 1)
{
DS18B20_DQReset();//低电平
delay_us(2);
DS18B20_DQSet();//高电平
delay_us(60);//延时60us
}else
{
DS18B20_DQReset();//低电平
delay_us(60);//延时60us
DS18B20_DQSet();//高电平
delay_us(2);
}
}
}
读数据函数
同样和写指令时序一样,一个周期为60us到120us内,读取电平的有效数据时间在15us内都是有效的,
所以选择在12us后读取数据的电平,因为一个周期还没结束,所以多等待50us结束读取。
拉低电平 -> 等待2us -> 拉高电平 -> 等待12us -> 读取电平 -> 等待50us
部分代码(其中使用了部分宏定义,若需要更全的文件,请跳至最后下载附件即可):
/*******************************************************************************
* 函数名:DS18B20_ReadByte
* 功 能:从DS18B20读取一个字节
* 参 数:无
* 返回值:u8Data读出的数据
* 说 明:无
*******************************************************************************/
uint8_t DS18B20_ReadByte(void)
{
uint8_t i,j, u8Ddata = 0;
for (i = 1; i <= 8; i++)
{
j = DS18B20_ReadBit();
u8Ddata = (j << 7) | (u8Ddata >> 1);
}
return u8Ddata;
}
附件
该附件包含:
- DS18B20.c 驱动文件
- DS18B20.h 驱动头文件
- maxim-ds18b20.pdf 传感器文档
注意:此驱动使用的延迟方法利用定时器作为延迟,可自行更改。