文章目录

  • 参考链接
  • DS18B20 主要特性
  • DS18B20 引脚及内部结构【重要!】
    • 引脚
    • 电路连接
    • 总体结构
      • 1. 64位ROM
      • 2. 高低温报警寄存器TH,TL
      • 3. 高速缓冲存储器&温度寄存器
      • 4. 配置寄存器
  • DS18B20 工作时序
    • 初始化(复位)
    • 写入字节
    • 读出字节
  • DS18B20 指令汇总
    • ROM指令
    • RAM指令
  • 例程
    • 51单片机

参考链接

51黑电子论坛
CSDN
bilibili

DS18B20 主要特性

  • 适应电压范围宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电
  • 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20的双向通讯
  • DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上实现组网多点测温
  • DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
  • 测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
  • 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
  • 在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度快
  • 测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
  • 负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

DS18B20 引脚及内部结构【重要!】

引脚

  其引脚如下图所示:

  这个传感器具有三个引脚,一个电源,一个地,一个信号传输引脚。

一般来说,这样的三个引脚的器件要么是输出0,1数字量,要么是输出一个模拟量,但DS18B20这个传感器输出的处理好的数字量,可见这个传感器的特殊之处。

电路连接

  DS18B20有两种电路连接方式:独立电源和寄生电源。独立电源即VDD引脚连接5V电源,这是最推荐的方式,也是最稳妥的方式。
  另一种连接方式是VDD也接地,器件电源的来源靠信号引脚DQ为高电平时给内部电容充电,因此这种连接方式要求DQ有强上拉。使用较少。

总体结构

  首先来看看两个版本的内部结构图,对比来看,内部结构更加清晰。


  从图中我们可以看出DS18B20共有五个主要模块64位ROM高速缓冲存储器温度传感器高低温报警寄存器配置寄存器,下面将分别介绍。

可以发现,后面几个寄存器都属于EEPROM,即掉电不会消失,意味着配置后的传感器可以不用再配置(但保险起见,每次使用还是配置一下比较安心)

1. 64位ROM

  64位ROM中的64位序列号是出厂前被光刻好的,不能改变。它可以看作是该DS18B20的地址序列码。64位ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的

2. 高低温报警寄存器TH,TL

  高低温报警寄存器的结构如下图所示:

  TH和TL寄存器存储温度报警触发值,符号位S表示值是正还是负,对于正数,S=0,对于负数,S=1。 若被测温度低于或等于TL值,或高于或等于TH值,则器件内的一个报警标志位就会置位。当主设备发出报警搜索指令[EC]时,DS18B20就会对报警标志做出响应。这两个寄存器用户可以通过特定的指令修改。【见后面指令表】

3. 高速缓冲存储器&温度寄存器

  DS18B20的高速缓冲存储器由9个字节组成,其结构如下图所示。

  从低到高9个字节分别为:温度寄存器低8位,温度寄存器高8位,高温寄存器TH,低温寄存器TL,配置寄存器,3个保留寄存器,CRC校验寄存器。另外,值得一提的是,高速缓冲存储器属于RAM,掉电信息会消失,但一上电EEPROM中的数据会自动加载到高速RAM中。

  其中,两个温度寄存器用来存储温度传感器测量得到的温度,其结构如下图所示。

  其中S为符号位(正数S=0,负数S=1)。温度传感器的分辨率可由用户配置为9、10、11或12位,分别对应0.5℃、0.25 ℃、0.125℃和0.0625℃的增量。开机时的默认分辨率是12位。如果DS18B20配置为12位分辨率,那么温度寄存器中的所有位都将包含有效数据。对于11位分辨率,0位没有定义。对于10位分辨率,位1和0没有定义,对于9位分辨率,位2、位1和位0没有定义。
  注意:这张图很容易误导使用者,以为前面的只是符号位而已,从而会采用按位读取然后乘以权值的方式再加上符号来得到最后的温度值,但实际上这两个字节得到的是此时温度的补码!需要按照补码的计算方式来计算(除符号位外按位取反再加1)!另外,一般是直接读出寄存器的数值然后乘以0.0625来实现最后的移位操作。且实际的温度值单位为摄氏度。

4. 配置寄存器

  配置寄存器的格式如下图所示

  其中,我们可以通过R1,R0两位来配置分辨率,如下表所示。

  器件上电默认状态为(R1, R0)=(1, 1),即12位分辨率。

DS18B20 工作时序

  根据DS18B20的通信协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。

注意:是每一次操作都需要先初始化(复位),再写入ROM指令,写入RAM指令。

初始化(复位)

  初始化时,要先将数据线拉低500us左右,然后释放,当DS18B20收到信号后等待15~60微秒左右,后发出60~240微秒的存响应负脉冲,即拉低总线。主CPU收到此信号表示复位成功。时序图如下图所示。

写入字节

  ROM指令和RAM指令都是靠单总线来写入一个字节的。因此写入字节时,要按照严格的时序要求来写入。

  写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。
  从DS18B20的角度来看,它在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

读出字节


  对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
  DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。
  主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成

DS18B20 指令汇总

ROM指令

指 令 约定代码 功 能
读ROM 33H 读DS1820温度传感器ROM中的编码(即64位地址)
符合 ROM 55H 发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。
搜索 ROM 0FOH 用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。
跳过 ROM 0CCH 忽略 64 位 ROM 地址,直接向 DS1820 发温度变换命令。适用于单片工作
报警搜索命令 0ECH 执行后只有温度超过设定值上限或下限的传感器才做出响应。(多个并联)

RAM指令

指 令 约定代码 功 能
温度变换 44H 启动DS1820进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节RAM中。
读暂存器 0BEH 读内部RAM中9字节的内容
写暂存器 4EH 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
复制暂存器 48H 将RAM中第3 、4字节的内容复制到EEPROM中。
重调 EEPROM 0B8H 将EEPROM中内容恢复到RAM中的第3 、4字节。
读供电方式 0B4H 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”。

例程

51单片机

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned charsbit DSPORT = P3^7;   //DS18B20的DQ引脚/*************************************************************************
* 函 数 名         : Delay1ms
* 函数功能         : 延时函数
* 输    入         : 无
* 输    出         : 无
*************************************************************************/
void Delay1ms(uint y)  //晶振为11.0592MHz
{uint x;for( ; y>0; y--){for(x=110; x>0; x--);}
}
void Delay1us(uint y)  //一个机器周期差不多1us
{while(y--);
}/*************************************************************************
* 函 数 名         : DS18B20_Init
* 函数功能         : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*************************************************************************/
uchar DS18B20_Init()
{DSPORT = 0;           Delay1us(500);  //将总线拉低500us   DSPORT = 1; Delay1us(15); //然后拉高总线15uswhile(DSPORT) //等待DS18B20拉低总线{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失败}}return 1;//初始化成功
}/*************************************************************************
* 函 数 名         : DS18B20_WriteByte
* 函数功能         : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*************************************************************************/
void DS18B20_WriteByte(uchar dat)
{uint i, j;for(j=0; j<8; j++){DSPORT = 0;              //每写入一位数据之前先把总线拉低1usi++;DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始i=6;while(i--); //延时68us,持续时间最少60usDSPORT = 1;  //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值dat >>= 1;}
}/*************************************************************************
* 函 数 名         : DS18B20_ReadByte
* 函数功能         : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*************************************************************************/
uchar DS18B20_ReadByte()
{uchar byte, bi;uint i, j;  for(j=8; j>0; j--){DSPORT = 0;//先将总线拉低1usi++;DSPORT = 1;//然后释放总线i++;i++;//延时6us等待数据稳定bi = DSPORT;   //读取数据,从最低位开始读取/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/byte = (byte >> 1) | (bi << 7);                         i = 4;       //读取完之后等待48us再接着读取下一个数while(i--);}              return byte;
}/************************************************************************
* 函 数 名         : DS18B20_Transform
* 函数功能         : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*************************************************************************/
void  DS18B20_Transform()
{DS18B20_Init();Delay1ms(1);DS18B20_WriteByte(0xcc);        //跳过ROM操作命令      DS18B20_WriteByte(0x44);       //温度转换命令//Delay1ms(100);    //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
}/*************************************************************************
* 函 数 名         : DS18B20_ReadTempCom
* 函数功能         : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*************************************************************************/
void  DS18B20_ReadTempCom()
{DS18B20_Init()();Delay1ms(1);DS18B20_WriteByte(0xcc);   //跳过ROM操作命令DS18B20_WriteByte(0xbe);     //发送读取温度命令
}/*************************************************************************
* 函 数 名         : DS18B20_ReadTemp
* 函数功能         : 读取温度
* 输    入         : 无
* 输    出         : 无
*************************************************************************/
int DS18B20_ReadTemp()
{int temp = 0;uchar tmh, tml;DS18B20_Transform();          //先写入转换命令DS18B20_ReadTempCom();         //然后等待转换完后发送读取温度命令tml = DS18B20_ReadByte();        //读取温度值共16位,先读低字节tmh = DS18B20_ReadByte();      //再读高字节temp = tmh;temp <<= 8;temp |= tml;return temp;
}

  注意:如果通过CPU延时,是不够准确的,但可以通过Keil的软件调试功能来相对精确地得到延时函数执行时间。

【嵌入式模块】DS18B20 数字温度传感器相关推荐

  1. Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)

    温度传感器是指能感受温度并转换成可用输出信号的传感器.按测量方式分为接触式和非接触式,按照传感器材料及电子元件分为热电阻和热电偶两类,按照工作原理分为模拟式和数字式.本篇主要介绍数字温度传感器 DS1 ...

  2. 【正点原子FPGA连载】第二十七章DS18B20数字温度传感器实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  3. 【正点原子STM32连载】第三十九章 DS18B20数字温度传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  4. 温度传感器的c语言程序,DS18B20数字温度传感器C语言程序实例

    51单片机DS18B20数字温度传感器设计 与C程序 #include #define uchar unsigned char #define uint unsigned int #define DQ ...

  5. DS18B20数字温度传感器

    目录 一.基础知识 1.基础介绍: 2.DS18B20特点: 3.单总线时序 4.相关操作时序 5.部分ROM指令 二.相关代码 1. 使用步骤(单点总线情况) 2. 代码展示 数字温度传感器你会用了 ...

  6. 基于DS18B20数字温度传感器的温度计设计

    基于DS18B20数字温度传感器的温度计设计 本报告为哈尔滨工业大学电子与信息工程学院大二学期微机原理课程的课设报告.请注意,本文所述代码均在Quartus II 13.0程序内使用汇编语言运行. 一 ...

  7. DS18B20数字温度传感器及单总线协议规定

    1,DS18B20数字温度传感器的主要特点 通信采用1-Wire接口 每个DS18B20都有唯一的64位序列码储存在板载ROM中 无需外部元件 可从数据线供电,电源范围为3.0V ~ 5.5V. 可测 ...

  8. STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计

    STM32与DS18B20数字温度传感器寄生供电方式的优化方案与1-wire总线程序设计 DS18B20是常用的一种数字温度传感器,通过1-wire总线实现传感器内部寄存器的访问.传感器有两种供电方式 ...

  9. 【正点原子MP157连载】第二十六章 DS18B20数字温度传感器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  10. ESP32-IDF开发实例-传感器模块编程-DS18B20数字温度传感器

    DS18B20温度传感器 ESP32是一系列高度集成的.专为移动设备.可穿戴电子产品设计的物联网模块,其集成了天线开关.RF balun.功率放大器.低接收噪声放大器,滤波器.电源管理模块等,可以独立 ...

最新文章

  1. react中试用leaflet简单起步
  2. 互联网协议 — 动态路由协议类型
  3. java创建集合有的不用泛型_为什么在Java泛型右手边的集合类型没有任何影响?...
  4. 电脑home键在哪_电脑键盘各键的名称及使用方法
  5. python嵌套列表法实现树_python – 将嵌套的括号树转换为嵌套列表
  6. CA 授权码bug 将导致Let’s Encrypt撤销300万张有效证书
  7. mysql使用总结(C#)
  8. SYN6288语音合成模块
  9. ACM比赛代码文件读写调试方案
  10. 普林斯顿宣布开源 25 核处理器
  11. 【NOIP2014提高组】石头剪子布
  12. 前端自适应图片留白解决
  13. Apache PdfBox 2.0.X 版本解析PDF文档(文字和图片)
  14. java获取pdf文件首页图片,用来当做封面
  15. Java中long与float
  16. 暗影骑士vn7安装linux,宏碁暗影骑士一代(VN7-591G)拆机清灰教程
  17. webRTC(二十四):web远程多台android的实现
  18. 如何看产品之:价值链
  19. 重点用能单位与能耗在线监测系统了解
  20. php红包互助源码_分享朋友圈奖红包的微擎应用源码 php版 v2.0

热门文章

  1. 数据库设计的基本规范和原则
  2. python培训 首选马哥教育
  3. 51单片机(一)—— 51单片机简介
  4. c语言 除法优化,【小课堂】汇编级除法优化
  5. linux 有dll文件吗,linux上可以运行dll吗
  6. 在vscode中php语言配置,vscode配置go语言开发环境
  7. 大漠插件最新版7.2123
  8. beoplay耳机序列号查询_怎么鉴别 BO E8耳机真伪?【转】
  9. brctl 网桥配置
  10. PyTorch中文教程 | (4) 迁移学习教程