目录
一、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内采样总线状态。
- 对于一个读取时隙,、和的总和必须小于15 μ s。
- 通过保持和尽可能短,并将主样本时间定位在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的温度测量精度。具体的设置如下表所示:
R1 | R0 | 分辨率 (位) | 最大转换时间 (ms) |
---|---|---|---|
0 | 0 | 9 | 93.75 (tCONV/8) |
0 | 1 | 10 | 187.5 (tCONV/4) |
1 | 0 | 11 | 375 (tCONV/2) |
1 | 1 | 12 | 750 (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