使用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) { // 写入1GPIO_ResetBits(DS18B20_PORT, DS18B20_PIN);Delay_us(5); GPIO_SetBits(DS18B20_PORT, DS18B20_PIN); Delay_us(60);} else { // 写入0GPIO_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;// 初始化DS18B20DS18B20_Init();// 重置DS18B20if (DS18B20_Reset() == 0) {// 传感器未连接return -1; // 返回-1表示传感器未连接}// 发送“读取温度”命令DS18B20_WriteByte(0xcc); // 跳过ROM命令DS18B20_WriteByte(0x44); // 读取温度命令// 等待转换完成Delay_ms(750); // DS18B20转换时间最长为750ms// 重置DS18B20if (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) { // 如果符号位为1raw_temp = ~raw_temp; // 取反raw_temp += 1; // 加1raw_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();	// 初始化DS18B20DS18B20_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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439185.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合

【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合 目录 文章目录 【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合目录0. 论文信息1. 摘要2. 研究背景3. 主要挑战4. 创新点5. 算法模型1. **标识符设…

JavaSE——面向对象练习题

1.对象数组排序 定义一个Person类{name,age,job}&#xff0c;初始化Person对象数组&#xff0c;有3个person对象&#xff0c;并按照age从小到大进行冒泡排序&#xff1b;再按照name的长度从小到大进行选择排序。 public class HomeWork01 {public static void main(String[] a…

字体文件压缩

技术点 npm、html、font-spider 实现原理 个人理解&#xff1a;先引入原先字体&#xff0c;然后重置字符为空&#xff0c;根据你自己填充文字、字符等重新生成字体文件&#xff0c;因此在引入的时候务必添加自己使用的文字、字符等&#xff01;&#xff01;&#xff01; 实…

PY32F002B

墨水屏&#xff1a; 前景和背景 在屏幕和图像处理中&#xff0c;前景和背景是两个重要的概念&#xff1a; 前景&#xff08;Foreground&#xff09;&#xff1a; 指的是图像或屏幕上最显著的部分&#xff0c;通常是用户关注的主要内容。例如&#xff0c;在一张照片中&#xf…

10.3学习

1.循环依赖 循环依赖其实就是循环引用&#xff0c;也就是两个或者两个以上的 Bean 互相持有对方&#xff0c;最终形成闭环。比如A 依赖于B&#xff0c;B又依赖于A Spring中循环依赖场景有: prototype 原型 bean循环依赖 构造器的循环依赖&#xff08;构造器注入&#xff09;…

PIKACHU | PIKACHU 靶场 XSS 后台配置

关注这个靶场的其他相关笔记&#xff1a;PIKACHU —— 靶场笔记合集-CSDN博客 PIKACHU 自带了一个 XSS 平台&#xff0c;可以辅助我们完成 XSS 攻击&#xff0c;但是该后台需要配置数据库以后才能使用。本教程&#xff0c;就是教大家如何配置 PIKACHU XSS 平台的。 PIKACHU XS…

资源《Arduino 扩展板4-单游戏摇杆》说明。

资源链接&#xff1a; Arduino 扩展板4-单游戏摇杆 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件…

深度学习的应用综述

文章目录 引言深度学习的基本概念深度学习的主要应用领域计算机视觉自然语言处理语音识别强化学习医疗保健金融分析 深度学习应用案例公式1.损失函数(Loss Function) 结论 引言 深度学习是机器学习的一个子领域&#xff0c;通过模拟人脑的神经元结构来处理复杂的数据。近年来&…

k8s实战-2

k8s实战-2 一、Deployment1.多副本2.扩缩容3.自愈&故障转移4.滚动更新5.版本回退 二、Service1.ClusterIP2.NodePort 总结 一、Deployment Deployment 是 k8s 中的一个资源对象&#xff0c;用于管理应用的副本&#xff08;Pods&#xff09;。它的主要作用是确保集群中运行…

【Linux】进程替换、命令行参数及环境变量(超详解)

目录 进程替换 替换函数的含义 命令行参数 环境变量 PATH 进程替换 我们先看代码&#xff1a; 1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5 printf("process...begin!\n");6 7 execl("/usr/bin/ls","ls"…

论文翻译 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust

摘要 近年来&#xff0c;NLP从业者集中于以下实践:(i)导入现成的预训练(掩码)语言模型;(ii)在CLS令牌的隐藏表示(随机初始化权重)上附加多层感知器;(iii)在下游任务(MLP-FT)上微调整个模型。这一过程在标准的NLP基准上产生了巨大的收益&#xff0c;但这些模型仍然很脆弱&#x…

尝试从 http://pypi.doubanio.com/simple 这个索引源安装 webdriver 时出现了问题

问题如下&#xff1a; WARNING: The repository located at pypi.doubanio.com is not a trusted or secure host and is being ignored. If this repository is available via HTTPS we recommend you use HTTPS instead, otherwise you may silence this warning and allow …

从介质失效看互联网时代的信息过载

来读一篇文章&#xff1a;90年代的硬盘已大规模变砖&#xff0c;没啥好担心的&#xff0c;好事。 结合我两年前的粗浅认知 互联网时代无信息&#xff0c;按照 “动” 的观念看&#xff0c;当信息越来越多&#xff0c;信息密度越来越大时&#xff0c;信息的寿命就会越来越短&am…

离线安装docker

背景描述 项目需要在研发环境虚拟机上安装docker部署应用。 所在的服务器是一个内网&#xff0c;无法访问到外网环境。 服务器OS版本是 麒麟V10 linux 安装docker 安装包下载 获取所需版本的docker binary包&#xff0c;官方链接https://download.docker.com/linux/stati…

CoRL 2024 麻省理工学院提出T3触觉Transformer,打破触觉感知的壁垒,重塑未来机器人

在智能机器人领域&#xff0c;触觉感知的研究正逐渐成为关注的焦点。然而&#xff0c;如何让机器人通过触觉更智能地感知和操作&#xff0c;依然是一个未解决的挑战。基于相机的触觉感知是一种通过在软弹性体下嵌入相机来捕获与环境的细粒度交互的感知方法&#xff0c;是最流行…

[Python学习日记-39] 闭包是个什么东西?

[Python学习日记-39] 闭包是个什么东西&#xff1f; 简介 闭包现象 闭包意义与作用 简介 在前面讲函数和作用域的时候应该提到过&#xff0c;当函数运行结束后会由 Python 解释器自带的垃圾回收机制回收函数内作用域已经废弃掉的变量&#xff0c;但是在 Python 当中还有一种…

MySQL--数据库约束(详解)

目录 一、前言二、概念三、数据库约束3.1 约束类型3.1.1 NOT NULL 约束3.1.2 UNIQUE (唯一&#xff09;3.1.3 DEFAULT&#xff08;默认&#xff09;3.1.4 PRIMARY KEY&#xff08;主键&#xff09;3.1.5 FOREIGN KEY&#xff08;外键&#xff09;3.1.6 CHECK 四、总结 一、前言…

Golang | Leetcode Golang题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; func fourSumCount(a, b, c, d []int) (ans int) {countAB : map[int]int{}for _, v : range a {for _, w : range b {countAB[vw]}}for _, v : range c {for _, w : range d {ans countAB[-v-w]}}return }

STM32新建工程-基于库函数

目录 一、创建一个新工程 二、为工程添加文件和路径 三、创建一个main.c文件&#xff0c;并调试 四、修改一些配置 五、用库函数进行写程序 1、首先加入一些库函数和头文件 2、编写库函数程序 一、创建一个新工程 我这里选择STM32F103C8的型号&#xff0c;然后点击OK。 …

如何提取b站的视频字幕,下载视频

打开视频地址 按F12打开—开发者工具 在开发者工具打开Network 过滤器关键字&#xff1a; 自动生成字幕&#xff1a;ai_subtitle 自制&#xff1a;json 打开/关闭字幕 刷新页面 找到字幕 点选字幕的respond 将方框中的内容复制&#xff1b; 复制到&#xff1a;https://www.drea…