DS18B20学习笔记

1 初始化时序

1.1 主机给从机发送复位脉冲

  MCU拉低总线至少480um,即复位脉冲。

/*********************************************************************
 * 名称:	 DS18B20_Rst(void)  
 * 功能:	 主机给从机发送复位脉冲 
 * 输入参数:无
 * 返回值:	 无
 *********************************************************************/
void DS18B20_Rst(void)
{
    
    
    DQ_out(0);
    DQ_out_able();
    Delay_us(500); //产生至少480us的低电平复位信号
    DQ_out(1); //在产生复位信号后,需将总线拉高  
    Delay_us(20);
}

在这里插入图片描述
  结合上下两个图,控制器TX发送复位脉冲以后,释放总线(对应的程序是 DQ_out(1)) 总线电平由于没有暂时没有主机或者从机控制被上拉电阻拉到高电平的状态,等待从机接收到主机的复位信号后,再次控制总线。

在这里插入图片描述

1.2 从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲

/*********************************************************************
 * 名称:	 DS18B20_Answer_Check(void)  
 * 功能:	 从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲 
 * 输入参数:无
 * 返回值:	 0:存在,1:不存在
 *********************************************************************/
INT8U DS18B20_Answer_Check(void)
{
    
    
    INT8U delay = 0;
    DQ_in_able(); //输入使能
    //等待应答脉冲(一个60~240us的低电平信号 )的到来  
    //如果100us内,没有应答脉冲,退出函数,注意:从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲  
    while (DQ_in() && delay < 50)//这里要是高电平就相当于仍然保持了上拉电阻保持的电平,没有被从机控制
    {
    
    
        delay++;
        Delay_us(2); //实际延时2us 
    }
    //经过100us后,如果没有应答脉冲,退出函数  
    if (delay >= 50)
        return 1;
    else
        delay = 0;
    //有应答脉冲,且存在时间不超过240us  
    while ((DQ_in() == 0) && delay < 120)
    {
    
    
        delay++;
        Delay_us(2);
    }
    if (delay >= 120)
        return 1;
    return 0;
}

  如果有从站(DS18B20传感器)控制总线(总线电平拉低),即存在脉冲。
在这里插入图片描述

2 读/写时序

2.1 写时序

  有两种写时序:写1时序和写0时序,所有写时序必须最少持续60us,包括两个写周期之间至少1us的恢复时间。当总线控制器把数据线从逻辑高电平拉到逻辑低电平的时候,写时序开始。
在这里插入图片描述
在这里插入图片描述
  不要与UART协议搞混,DS18B20的字节传输没有起始位校验和停止位。主机发送跳过ROM指令就是发送长度为一字节的报文:0xcc,传输过程中低位在前高位在后:00110011
  高速暂存器含有两个字节的温度寄存器,这两个温度寄存器用来存储温度传感器输出的数据。除此之外,高速暂存器提供一个直接的温度报警值寄存器(TH、TL)和一个字节的配置寄存器配置寄存器允许用户将温度的精度设为9、10、11或12位;TH、TL和配置寄存器是非易失性的可擦除程序寄存器(EEPROM),所以存储的数据在器件掉电时不会消失。

DS18B20_Write_Byte(0x4E); //写暂存器指令
DS18B20_Write_Byte(0x7F); //报警上限127  TH
DS18B20_Write_Byte(0xC4); //报警下限-60  TL
DS18B20_Write_Byte(0x5F); //配置寄存器,更改精度,此时精度0.125

  在这个总线系统中,MCU通过每个从器件独有的64位片序号序列号辨认总线上的期间以及记录总线上的器件地址。
  DS18B20要执行温度测量和AD转换时,总线控制器必须发送[44h]命令,在那以后,产生的温度数据以两个字节的形式被存储在高速暂存器的温度储存器中,DS18B20继续保持等待状态。当DS18B20有外部电源供电时,总线控制器在温度转换指令后发起“读时序”,DS18B20正在温度转换中返回0,转换结束返回1.
  每只DS18B20都有一个唯一存储在ROM中的64位编码。最前面的8位是单线系列编码:28h,接着的48位(6字节)是唯一的序列号。最后的8位是以上56位的CRC编码
在这里插入图片描述
  通过单总线端口访问DS18B20的协议如下:

  • 步骤1.初始化
  • 步骤2.ROM操作指令
  • 步骤3.DS18B20功能指令

  通过单总线的所有执行操作处理都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和其后由从机发出的存在脉冲组成。其中存在脉冲让MCU知道DS18B20在总线上已经准备好了,每一次DS18B20的操作必须满足以上步骤,若是缺少步骤或者是顺序混乱,器件将不会返回值。
  举例:0XF0是搜索ROM指令步骤

//初始化
DS18B20_Rst();          //主机给从机发送复位脉冲 
DS18B20_Answer_Check(); //从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲 
//ROM指令
DS18B20_Write_Byte(0xf0); //搜索ROM指令

猜你喜欢

转载自blog.csdn.net/luopeng12345/article/details/112346844