<!--[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 传感器文档

注意:此驱动使用的延迟方法利用定时器作为延迟,可自行更改。

附件:DS18B20 STM32驱动.zip