一篇文章教会你DS18B20温度传感器读取温度,附STM32代码示例

目录

 

一、DS18B20温度传感器:

(1)描述:

(2)特点:

(3)引脚图及其定义:

(4)使用的DS18B20模块:

二、DS18B20功能命令集:

(1)搜索ROM命令(Search ROM [F0h]):

(2)读取ROM命令(Read ROM [33h]):

(3)匹配ROM命令(Match ROM [55H]):

(4)跳过ROM命令(Skip ROM [CCh]):

(5)报警搜索命令(Alarm Search [ECh]):

(6)转换温度命令(Convert T [44h]):

(7)写入暂存器命令(Write Scratchpad [4Eh]):

(8)读取暂存器命令(Read Scratchpad [BEh]):

(9)复制暂存器命令(Copy Scratchpad [48h]):

(10)回召E2命令(Recall E2 [B8h]):

(11)读取电源命令(Read Power Supply [B4h]):

三、 读取步骤:

(1)初始化1-Wire总线:

头文件:

 初始化引脚:

(2)初始化DS18B20:

(3)DS18B20写入一位 0/1:

(4)DS18B20读取一位 0/1:

(5)DS18B20写入一个字节:

 (6)DS18B20读取一个字节:

(7)DS18B20读取温度:

(8)主函数:

​编辑 

四、示例:

(1)DS18B20操作示例:

(2)DS18B20操作示例:

​编辑五、DS18B20其他说明:

(1)DS18B20方框图:

(2)测温操作: 

​编辑(3)报警操作信号:

(4)DS18B20供电: 

 (5)64位的激光光刻只读存储器(ROM):

 (6)存储器:

​编辑 (7)配置寄存器:

(8)CRC:

(9)单总线系统:

六、示例代码下载:


、DS18B20温度传感器:

(1)描述:

        DS18B20数字温度计提供9位到12位的摄氏度温度测量,并具有带非易失性用户可编程的上限和下限触发点的报警功能。DS18B20通过定义仅需要一条数据线(和地线)与中央微处理器通信的1-Wire总线进行通信。它的工作温度范围是-55°C至+125°C,在-10°C至+85°C的范围内准确度为±0.5°C。此外,DS18B20可以直接从数据线(“寄生电源”)获取电源,从而消除了对外部电源的需求。

        每个DS18B20都有一个独特的64位序列号,允许多个DS18B20在同一个1-Wire总线上工作。因此,使用一个微处理器控制分布在较大区域上的许多DS18B20是很简单的。可以从这个特性中受益的应用包括HVAC环境控制、建筑物、设备或机械内部的温度监测系统,以及过程监控和控制系统。

(2)特点:

  • 独特的1-Wire接口,通信只需要一个端口引脚。
  • 每个设备都有一个存储在板载ROM中的唯一64位序列号。
  • 多点能力简化了分布式温度感测应用。
  • 不需要外部组件。
  • 可以从数据线供电;电源供应范围是3.0V至5.5V。
  • 测量温度范围为-55°C至+125°C(-67°F至+257°F)。
  • 在-10°C至+85°C的范围内准确度为±0.5°C。
  • 用户可从9到12位选择温度计分辨率。
  • 将温度转换为最大750毫秒的12位数字字(最大值)。
  • 用户可定义的非易失性(NV)报警设置。
  • 报警搜索命令识别和寻址其温度超出设定限制的设备(温度报警条件)。
  • 有8引脚SO(150 mils)、8引脚µSOP和3引脚TO-92封装。
  • 与DS1822软件兼容。
  • 应用包括温控器、工业系统、消费产品、温度计或任何对热敏感的系统。

(3)引脚图及其定义:

 

 

(4)使用的DS18B20模块:

 

二、DS18B20功能命令集:

在DS18B20的1-Wire通信协议中,主机(微控制器)可以通过一系列ROM命令来识别和选择总线上的特定设备。

(1)搜索ROM命令(Search ROM [F0h]):

  • 主机发出搜索ROM命令,以识别1-Wire总线上所有设备的ROM代码。这个过程通过逐位发送信号,并检查设备的响应来完成。如果总线上有多个设备,主机可以通过重复搜索ROM命令来识别每个设备的ROM代码。

(2)读取ROM命令(Read ROM [33h]):

  • 当1-Wire总线上只有一个设备时,可以使用读取ROM命令。这个命令允许主机读取设备的完整64位ROM代码,而不需要执行搜索ROM过程。

(3)匹配ROM命令(Match ROM [55H]):

  • 主机先发送匹配ROM命令,然后跟上64位ROM代码序列,从而选择1-Wire总线上特定的一个设备。只有与发送的ROM代码完全匹配的设备会响应;不匹配的设备则会忽略命令。

(4)跳过ROM命令(Skip ROM [CCh]):

  • 主机使用跳过ROM命令可以同时向1-Wire总线上的所有设备发出命令,而不需要指定任何ROM代码信息。例如,主机可以让总线上的所有DS18B20同时开始温度转换。

(5)报警搜索命令(Alarm Search [ECh]):

  • 这个命令的作用与搜索ROM命令类似,但只有设置了报警标志的设备会响应。这允许主机检查是否有任何DS18B20在最近的温度转换中触发了报警条件。

在ROM命令之后,主机可以发出DS18B20功能命令来与DS18B20进行通信:

(6)转换温度命令(Convert T [44h]):

启动一次温度测量。转换完成后,结果存储在暂存器的两字节温度寄存器中,然后DS18B20返回低功耗空闲状态。

(7)写入暂存器命令(Write Scratchpad [4Eh]):

允许主机向DS18B20的暂存器写入3个字节的数据,包括报警上下限寄存器(TH和TL)和配置寄存器。

(8)读取暂存器命令(Read Scratchpad [BEh]):

允许主机读取暂存器的内容,包括温度值、报警上下限和配置寄存器。

(9)复制暂存器命令(Copy Scratchpad [48h]):

将暂存器中的报警上下限和配置寄存器的内容复制到EEPROM中。

(10)回召E2命令(Recall E2 [B8h]):

从EEPROM中回召报警上下限和配置数据到暂存器。

(11)读取电源命令(Read Power Supply [B4h]):

主机使用这个命令来确定总线上的任何DS18B20是否使用寄生电源模式。

三、 读取步骤:

(1)初始化1-Wire总线:

  • 确保1-Wire总线的物理连接正确,包括数据线(DQ)、地线(GND)和拉高电阻。
  • 我使用的是STM32F103C8T6的PA1引脚充当数据线(DQ),读取和写入数据。 
头文件:
#ifndef __DS18B20_H
#define __DS18B20_H

#include "stm32f10x.h"

#define DS18B20_PORT        GPIOA
#define DS18B20_PIN         GPIO_Pin_1

// 初始化GPIO PA1 用于DS18B20
void DS18B20_Init(void);

// DS18B20复位时序(初始化)
u8 DS18B20_Reset(void) ;

// DS18B20写入一位 0/1
void DS18B20_WriteBit(uint8_t bit);
// DS18B20读取一位 0/1
uint8_t DS18B20_ReadBit(void) ;

// DS18B20写入一个字节
void DS18B20_WriteByte(uint8_t byte);
// DS18B20读取一个字节
uint8_t DS18B20_ReadByte(void);

// DS18B20读取温度
float DS18B20_ReadTemperature(void);
#endif
 初始化引脚:
// 初始化GPIO PA1 用于DS18B20
void DS18B20_Init(void) {
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
    
    GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); // 将PA1设置为高电平
}

(2)初始化DS18B20:

  • 发送复位脉冲到1-Wire总线,以初始化通信。 
  • 检测复位脉冲后的返回存在脉冲,确认DS18B20在线。
// DS18B20复位时序(初始化)
u8 DS18B20_Reset(void) {
    GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
    Delay_us(750);
    GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
	Delay_us(70);
	if(GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN)==1){
	Delay_us(200);
		return 0;
	}else {
		Delay_us(200);
		return 1;
	}
}
  • 所有与DS18B20的通信都从一个初始化序列开始,该序列包括一个来自主端的复位脉冲,然后是DS18B20的存在脉冲。
  • 如图所示,当DS18B20发送在场脉冲以响应复位时,它向主控表明它在总线上并准备操作。

 

  • 在初始化过程中,总线主通过将单线总线拉低至少480µs来传输(TX)复位脉冲。然后总线主释放总线并进入接收模式(RX)。当总线被释放时,5kΩ上拉电阻将单线总线拉高。当DS18B20检测到这个上升边缘时,它等待15µs到60µs,然后通过拉低单线总线60µs到240µs来传输存在脉冲。

(3)DS18B20写入一位 0/1:

// DS18B20写入一位 0/1
void DS18B20_WriteBit(uint8_t bit) {
    if (bit) { // 写入1
        GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
        Delay_us(5); 
        GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); 
		Delay_us(60);
    } else { // 写入0
        GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);
        Delay_us(60); 
        GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
        Delay_us(5); // 释放总线
    }
}
  • 读/写时隙:
  • 总线主在写时隙向DS18B20写入数据,在读时隙从DS18B20读取数据。在单总线上每个时隙传输一位数据。 
  • 写入时隙:
  • 有两种写时隙:写1时隙和写0时隙。
  • 总线主用一个写1时隙向DS18B20写入逻辑1,用一个写0时隙向DS18B20写入逻辑0。
  • 所有写入时间槽必须至少为60 μ s,每个写入槽之间的恢复时间至少为1 μ s。
  • 两种类型的写时隙都是由主站将单总线拉低发起的。
  • 为了生成写1时间槽,在拉低单线总线后,总线主必须在15 μ s内释放单线总线。当总线被释放时,5kΩ上拉电阻将把总线拉高。
  • 要生成写0时间槽,在拉低单线总线后,总线主控必须在时间槽内继续保持总线低电压(至少60 μ s)。DS18B20在主单元启动写时隙后从15 μ s持续到60 μ s的窗口期间对单线总线进行采样。如果总线在采样窗口期间高电平,则将1写入DS18B20。如果线路低,则将0写入DS18B20。

 

(4)DS18B20读取一位 0/1:

// DS18B20读取一位 0/1
uint8_t DS18B20_ReadBit(void) {
    uint8_t bit_value = 0;
    GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);  // 拉低总线,准备读取
    Delay_us(2);  // 给总线一个短暂的低电平
    GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);  // 释放总线
   Delay_us(13);  // 等待DS18B20驱动总线
    if (GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN) == 1) {
        bit_value = 1;  
		Delay_us(50);  // 补足剩余的延时
		return bit_value;		 
    }else{
    Delay_us(50);  // 补足剩余的延时
    return bit_value;// 如果DS18B20将总线拉低,则读取为1
	}
}
  • 读取时隙
  • DS18B20只能在主设备发出读取时隙时向主设备发送数据。
  • 因此,在发出读片[BEh]或读电源[B4h]命令后,主设备必须立即产生读时隙,以便DS18B20提供所请求的数据。
  • 此外,主设备可以在发出转化温度 [44h]或读取暂存器 [B8h]命令后产生读取时隙,以了解操作的状态。
  • 所有的读取时间槽必须在持续时间内最少为60 μ s,槽之间最少为1 μ s的恢复时间。
  • 读取时间槽由主设备启动,将单线总线低拉至少1 μ s,然后释放总线。
  • 在主设备启动读取时隙之后,DS18B20将开始在总线上传输1或0。DS18B20通过使总线保持高电平来传输1,通过拉低总线来传输0。
  • 当发送一个0时,DS18B20将在时隙结束时释放总线,由上拉电阻将总线拉回高空闲状态。
  • DS18B20的输出数据在开始读取时隙的下降沿之后的15 μ s内有效。因此,主设备必须释放总线,然后从插槽开始的15 μ s内采样总线状态。
  • 对于一个读取时隙,T_{INT}T_{RC}T_{SAMPLE}的总和必须小于15 μ s。
  • 通过保持T_{INT}T_{RC}尽可能短,并将主样本时间定位在15 μ s周期结束时的读取时间槽中,系统时间裕度最大化。

 

(5)DS18B20写入一个字节:

// DS18B20写入一个字节
void DS18B20_WriteByte(uint8_t byte) {
    for (uint8_t i = 0; i < 8; i++) {
        // 提取当前位的值
        uint8_t bit = (byte >> i) & 0x01;
        // 写入这一位
        DS18B20_WriteBit(bit);		
    }
}
  •  写时序时是先写命令的低字节,比如写入跳过ROM指令0xCC(11001100),写的顺序是“0、0、1、1、0、0、1、0”,

 (6)DS18B20读取一个字节:

// DS18B20读取一个字节
uint8_t DS18B20_ReadByte(void) {
    uint8_t byte = 0;
    for (uint8_t i = 0; i < 8; i++) {
        uint8_t bit = DS18B20_ReadBit();
        // 将读取到的位左移至正确的位置
        byte |= (bit << i);		
    }
    return byte;
}
  • 读时序时是先读低字节,在读高字节,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) 。
  • 我们正常使用DS18B20读取温度读取两个温度字节即可 。

(7)DS18B20读取温度:

// DS18B20读取温度
float DS18B20_ReadTemperature(void) {
    uint8_t low, high;
    int16_t raw_temp;
    
	// 初始化DS18B20
    DS18B20_Init();
    
    // 重置DS18B20
    if (DS18B20_Reset() == 0) {
        // 传感器未连接
        return -1; // 返回-1表示传感器未连接
    }
    
    // 发送“读取温度”命令
    DS18B20_WriteByte(0xcc); // 跳过ROM命令
    DS18B20_WriteByte(0x44); // 读取温度命令
    
    // 等待转换完成
    Delay_ms(750); // DS18B20转换时间最长为750ms
    
    // 重置DS18B20
    if (DS18B20_Reset() == 0) {
        // 传感器未连接
        return -1; // 返回-1表示传感器未连接
    }
    
    // 发送“读取暂存器”命令
    DS18B20_WriteByte(0xcc); // 跳过ROM命令
    DS18B20_WriteByte(0xbe); // 读取暂存器命令
	
    low = DS18B20_ReadByte();  // 读取低字节
    high = DS18B20_ReadByte(); // 读取高字节
    
    // 组合成完整的温度值
    raw_temp = ((int16_t)high << 8) | low;
    
    // 检查温度值是否有效
    if (raw_temp == -32768) { // 检查是否为-32768,表示传感器故障
       return -1; // 返回-1表示读取失败
    }
    
    // 处理负温度值
    if (raw_temp & 0x8000) { // 如果符号位为1
        raw_temp = ~raw_temp; // 取反
        raw_temp += 1; // 加1
        raw_temp = -raw_temp; // 取负
    }

    // 转换为摄氏度
    float temperature = raw_temp * 0.0625;
    
    return temperature; // 返回浮点数温度值
}

(8)主函数:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "DS18B20.h"

int main(void)
{
	/*OLED初始化*/
	OLED_Init();	
	 // 初始化DS18B20
    DS18B20_Init();
    
    // 主循环
    while (1)
    {             		
        OLED_ShowString(0, 0, "temperature:", OLED_8X16);		   
		OLED_ShowFloatNum(0, 16, DS18B20_ReadTemperature(), 5,2, OLED_8X16);
	    OLED_Update();        
    }
}

 

四、示例:

(1)DS18B20操作示例:

  • 在这个例子中,总线上有多个ds18b20,它们使用寄生电源。总线主机在特定的DS18B20中发起一个温度转换,然后读取它的刮片并重新计算CRC以验证数据。

(2)DS18B20操作示例:

  • 在这个例子中,公交车上只有一个DS18B20,它使用的是寄生电源。主设备写入DS18B20的TH寄存器、TL寄存器和配置寄存器,然后读取DS18B20的数据并重新计算CRC以验证数据。然后,主设备将暂存器的内容复制到EEPROM。 

五、DS18B20其他说明:

(1)DS18B20方框图:

  • 唯一标识:每个DS18B20设备都拥有一个64位的只读存储器(ROM),存储了设备的唯一序列号,这使得每个传感器都可被单独识别。

  • 温度数据存储:传感器的高速暂存器中包含一个两字节的温度寄存器,用于存储温度传感器测量的温度数据。

  • 温度报警设置:高速暂存器还包含两个温度报警值寄存器,即上报警(TH)和下报警(TL),以及一个配置寄存器。这些寄存器允许用户设置温度报警阈值。

  • 可编程精度:配置寄存器允许用户选择温度测量的精度,可选的分辨率有9位、10位、11位或12位。

  • 非易失性存储:报警值和配置数据存储在非易失性的电可擦除可编程只读存储器(EEPROM)中,这意味着即使在断电的情况下,这些数据也不会丢失。

  • 单总线通信:DS18B20通过Dallas Semiconductor的单总线协议进行通信,该协议只需要一个数据线(DQ)和一个地线,通过一个弱上拉电阻来保持总线的高电平状态。

  • 寄生电源供电:DS18B20能够以寄生电源模式工作,这意味着它可以从单总线直接获取能量,不需要外部电源供电。当总线为高电平时,内部电容(Cpp)会充电,当总线为低电平时,电容会放电以供电。

  • 灵活的电源选项:除了寄生电源模式,DS18B20也可以通过VDD引脚连接外部电源供电。

(2)测温操作: 

温度传感器精度:

  • DS18B20提供可编程的精度选项,用户可以在9位到12位之间选择。
  • 每种精度对应不同的温度增量:
    • 9位:0.5°C增量
    • 10位:0.25°C增量
    • 11位:0.125°C增量
    • 12位:0.0625°C增量

默认精度:

  • 上电后,默认精度为12位,提供最高的精度。

低功耗等待状态:

  • DS18B20在启动后会进入低功耗等待状态,等待总线控制器的指令。

温度测量和AD转换:

  • 要进行温度测量,总线控制器(如微控制器)必须向DS18B20发送特定的命令(0x44)。

温度数据存储:

  • 温度测量完成后,结果会以两字节(16位)的形式存储在DS18B20的高速暂存器中的温度寄存器里。

温度转换状态:

  • 如果DS18B20由外部电源供电,总线控制器可以发起“读时序”,DS18B20在温度转换中返回0,转换结束返回1。
  • 如果DS18B20由寄生电源供电,则无法使用上述“读时序”功能,因为整个转换过程中总线必须被强上拉。

寄生电源供电要求:

  • 在寄生电源模式下,DS18B20需要在温度转换期间通过强上拉来供电。
  • 这要求总线控制器在发出转换温度命令后10微秒内启用强上拉,并在整个转换期间保持上拉状态。

温度寄存器格式: 

温度/数据关系:

(3)报警操作信号:

温度报警阈值:

  • 用户可以将上报警阈值(TH)和下报警阈值(TL)存储在DS18B20的非易失性EEPROM中的特定寄存器。
  • 这些阈值用于定义温度报警条件的范围。

报警阈值格式:

  • TH和TL是8位寄存器,用来存储报警阈值。

报警条件:

  • 如果测量的温度值高于TH或低于TL,则认为报警条件成立。

报警标识:

  • DS18B20内部有一个报警标识,当报警条件成立时,这个标识会被置位(设置为1)。
  • 每次进行温度测量后,报警标识都会更新。

报警搜索命令:

  • 主机(总线控制器)可以通过发送报警搜索命令(0xEC)来检测总线上所有DS18B20的报警标识。
  • 只有那些满足报警条件的DS18B20会响应这个命令。

报警确认:

  • 如果报警条件成立,但TH或TL的值已经改变,需要重新进行温度转换来确认报警条件。

非易失性存储:

  • 由于TH和TL存储在非易失性的EEPROM中,即使在掉电的情况下,这些值也不会丢失。

报警处理:

  • 主机可以读取每个DS18B20的TH和TL寄存器,以确定哪些设备触发了报警。

(4)DS18B20供电: 

外部电源供电:

  • DS18B20可以通过VDD引脚接入外部电源供电。
  • 在外部电源供电模式下,不需要在1-Wire总线上提供强上拉。
  • 总线在温度转换期间不需要一直保持高电平。

寄生电源模式:

  • 寄生电源模式允许DS18B20在没有外部电源的情况下工作。
  • 通过1-Wire数据线(DQ)和VDD引脚,DS18B20可以从总线“偷取”能量。
  • 偷取的能量部分存储在内部电容(Cpp)中,在总线为低电平时提供能量。

寄生电源控制回路:

  • 当总线为高电平时,DS18B20通过DQ引脚从总线获取能量。
  • 内部电容(Cpp)在总线高电平时充电,在总线低电平时放电,为DS18B20供电。

寄生电源模式下的VDD引脚:

  • 在寄生电源模式下,VDD引脚必须接地。

寄生电源模式的电流限制:

  • 在大部分操作中,1-Wire总线和Cpp可以提供足够的电流。
  • 在执行温度转换或数据传输到EEPROM时,DS18B20的电流可能高达1.5mA,这可能会在弱上拉电阻上产生不可接受的压降。

强上拉要求:

  • 在温度转换或数据传输到EEPROM期间,需要在10微秒内将1-Wire总线转换为强上拉状态,并保持强上拉状态直到操作完成。

温度和电源模式:

  • 当温度高于100°C时,不推荐使用寄生电源模式,因为DS18B20可能无法维持正常通信。

电源模式的指示:

  • DS18B20提供了一种方法来指示电源的使用意图。
  • 总线控制器可以通过Skip ROM指令和读电源指令来确定DS18B20是使用寄生电源还是外部电源。
  • DS18B20温度转换期间的强上拉供电:

  • 外部电源给DS18B20供电:

 (5)64位的激光光刻只读存储器(ROM):

在DS18B20温度传感器中,每个设备都内建了一个64位的激光光刻只读存储器(ROM),这个ROM存储了设备的唯一标识信息。这个64位编码的构成如下:

  • 系列码(Family Code):最前面的8位是系列码,对于DS18B20来说,这个系列码是28h。这个代码标识了设备属于Dallas/Maxim Integrated的1-Wire温度传感器家族。

  • 序列号(Serial Number):紧接着系列码之后的是48位序列号,这个序列号是每个设备独有的,确保了每个DS18B20设备在全球范围内都是可以识别的。

  • CRC(Cyclic Redundancy Check):最后8位是CRC校验码,这个校验码是通过计算前面56位(系列码和序列号)的CRC得到的。CRC用于检测在ROM代码读取过程中可能出现的错误。

 (6)存储器:

DS18B20的存储器结构包括了一个暂存器(Scratchpad)和一个非易失性电可擦除可编程只读存储器(EEPROM),用于存储温度数据和配置信息。

暂存器(Scratchpad):

  • 暂存器是易失性的,包含9个字节的数据。
  • 字节0和1存储测得的温度信息的最低有效位(LSB)和最高有效位(MSB)。
  • 字节2和3是温度报警触发值寄存器TH和TL的副本。
  • 字节4存储配置寄存器的数据。
  • 字节5、6和7保留,禁止写入,读回时表现为逻辑1。

非易失性EEPROM:

  • EEPROM用于存储TH、TL和配置寄存器的数据,即使在掉电情况下也能保持数据不丢失。
  • EEPROM的数据在设备上电时自动加载到暂存器中。
  • CRC校验码:

  • 暂存器的第8字节是只读的,包含前8个字节的CRC校验码,用于数据校验。

写入和读取操作:

  • 数据通过写暂存器指令(0x4E)写入暂存器的第2、3和4字节。
  • 写入数据时,必须从最低有效位开始传送。
  • 可以通过读暂存器指令(0xBE)读取暂存器的内容。

从暂存器到EEPROM的拷贝:

  • 总线控制器必须发出拷贝暂存器指令(0x48)将TH、TL和配置寄存器的数据从暂存器拷贝到EEPROM。

召回EEPROM命令:

  • 数据也可以通过召回EEPROM命令(0xB8)从EEPROM召回到暂存器。
  • 在召回操作进行中,DS18B20会向总线控制器发送0,操作结束发送1。

 (7)配置寄存器:

配置寄存器是DS18B20存储器中非常重要的一部分,它允许用户设置温度测量的精度。以下是配置寄存器的详细解释:

配置寄存器结构:

  • 存储器的第4位为配置寄存器。用户可以通过按表所示设置R0 和R1位来设定DS18B20的精度。
  • 上电默认设置:R0=1,R1=1(12位精度)。
  • 精度和转换时间之间有直接的关系。
  • 暂存器的位7和位0-4被器件保留,禁止写 入;在读回数据时,它们全部表现为逻辑1。

配置寄存器的设置:

用户可以通过设置R0和R1位来配置DS18B20的温度测量精度。具体的设置如下表所示:

R1R0分辨率 (位)最大转换时间 (ms)
00993.75 (tCONV/8)
0110187.5 (tCONV/4)
1011375 (tCONV/2)
1112750 (tCONV)

默认设置:

  • 上电后,默认设置为R0=1, R1=1,即12位精度。

精度与转换时间的关系:

  • 精度越高,转换时间越长。
  • 9位精度的转换时间最短,12位精度的转换时间最长。

(8)CRC:

在DS18B20的64位ROM中,CRC(循环冗余校验)字节用于确保数据的完整性。CRC是一个错误检测码,用于检测数据传输过程中可能出现的错误。

 

CRC的作用:

  • CRC用于验证DS18B20的ROM代码或暂存器内容在读取过程中是否正确无误。
  • CRC可以检测数据中的意外变化,确保数据的准确性。

CRC的计算:

  • CRC码由ROM的前56位计算得到,这些位包括家族代码、序列号和静态数据。
  • CRC计算使用的多项式是X^8 + X^5 + X^4 + 1

CRC的存储:

  • CRC值存储在64位ROM的最后一个字节。

CRC的比较:

  • 主机(总线控制器)在读取ROM或暂存器内容时,会计算接收到的数据的CRC值。
  • 计算得到的CRC值与DS18B20内部计算的CRC值进行比较。
  • 如果两个CRC值相匹配,说明数据传输没有错误。

CRC的错误处理:

  • 如果CRC值不匹配,主机需要决定是否重试数据传输或采取其他错误处理措施。

CRC的生成:

  • CRC生成可以通过一个由移位寄存器和XOR门构成的多项式发生器来完成。
  • 移位寄存器的各位在开始时被初始化为0。
  • 数据按位进入移位寄存器,经过一系列操作后,最终在移位寄存器中得到CRC值。

(9)单总线系统:

单总线系统是一种串行通信总线,用于连接一个主设备和多个从设备。DS18B20是这种系统中的常用从设备之一。

硬件结构:

  • 信号线:单总线系统仅使用一条数据线进行通信。
  • 端口配置:每个设备通过一个漏极开路或三态输出端口连接到总线上。DS18B20的DQ引脚是漏极开路的。
  • 上拉电阻:需要一个约5KΩ的外部上拉电阻来保持总线的空闲状态为高电平。
  • 空闲状态:当没有数据传输时,总线是高电平状态。

 

执行序列:

  • 初始化:通信开始前,主设备发送一个复位脉冲,随后设备返回一个存在脉冲。
  • ROM命令:一旦检测到存在脉冲,主设备可以发出ROM指令,如搜索ROM、匹配ROM等。
  • 功能命令:主设备通过ROM指令选中特定的设备后,可以发出功能命令来执行特定的操作,如读取温度、写入暂存器等。

单总线信号(信号类型和时序):

  • 复位脉冲:由主设备拉低总线至少480微秒后释放,设备返回存在脉冲。
  • 存在脉冲:设备在检测到复位脉冲后,拉低总线60到240微秒作为响应。
  • 写入操作:
    • 写1:主设备拉低总线至少1微秒后释放,设备在15到60微秒内采样总线,如果总线为高电平,则写入1。
    • 写0:主设备拉低总线至少60微秒,设备在15到60微秒内采样总线,如果总线为低电平,则写入0。
  • 读取操作:
    • 读1:设备释放总线,如果总线在15微秒内为高电平,则设备读取到1。
    • 读0:设备拉低总线,如果总线在15微秒内为低电平,则设备读取到0。

六、示例代码下载:

通过网盘分享的文件:15-DS18B20模块读取
链接: https://pan.baidu.com/s/1TDrklUD8ns_2mFGLgW2WKw?pwd=aq7r 提取码: aq7r 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值