单片机学习笔记---DS18B20温度传感器

news2025/1/19 22:19:46

目录

DS18B20介绍

模拟温度传感器的基本结构

数字温度传感器的应用

引脚及应用电路

DS18B20的原理图

DS18B20内部结构框图

暂存器内部

单总线介绍

单总线电路规范

单总线时序结构

初始化

发送一位

发送一个字节

接收一位

接收一个字节

DS18B20操作流程

指令介绍

ROM指令

功能指令

DS18B20数据帧

温度变换

温度读取

温度存储格式


DS18B20介绍

DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点

测温范围:-55°C 到 +125°C

通信接口:1-Wire(单总线)

其它特征:可形成总线结构(可以在一条通信线上挂很多设备,这样就可以节省IO口,这样单片机一个IO口就可以读很多个温度传感器)、内置温度报警功能可寄生供电因为数字温度传感器的三个引脚当中,有两个是供电的,一个是数据输入输出的,如果使用寄生供电的话,那么VCC电源正极就不用接了,直接一个数据线和一个GND就可以实现数据通信,这样十分省线路

 DS18B20这个模块就在我们开发板上的这个位置:

这个温度传感器是可以拔下来的

模拟温度传感器的基本结构

通过上图我们知道模拟温度传感器的结构比较复杂,我们最后读取到的温度只是正比于我们的温度,我们还得对这个数据进行一定的系数配比,才能测出我们真正的温度。

数字温度传感器的应用

那数字温度传感器又是怎样应用的呢?

比如下面的这个DS18B20:

它里面集成了模拟温度传感器和微控制器。其实它里面也是有芯片的,它相当于把整个模拟温度传感器的结构合起来变成一个芯片,然后它内部读取内部的模拟温度传感器,然后通过内部转化(内部有一些控制器把温度数据读出来),把温度存在里面的RAM里面。我们只需要通过引脚和单总线(1-Wire)通信协议把这个温度给转化读取出来。而且整个转化的过程中都是数字量输入输出的,所以也不需要我们的单片机有AD转换这个功能,也不需要外部AD芯片,因此应用起来比较简单。

引脚及应用电路

这个数字温度传感器的封装跟三极管一样的封装,叫做TO92封装。

PS:VDD和VCC的意思基本一样

DS18B20所接的上拉电阻和I2C所接的上拉电阻功能是一样的,都是为了实现总线操作。

DS18B20的原理图

原理图上这个模块没有接上拉电阻是因为我们单片机的IO口上已经接了上拉电阻

DS18B20内部结构框图

PS:64-BIT ROM:作为器件地址,用于总线通信的寻址;

SCRATCHPAD(暂存器):用于总线的数据交互;

EEPROM:用于保存温度触发阈值和配置参数。

其中这部分是寄生供电电路,有了它可以省去VDD,省去VDD之后总得有电源的正极吧,那个电源就是从DQ进来的。

比如,正常的来说这个电路就是上图所画的路径,但是如果说那个VDD没有接的话,那这条路显然是没有电源正极的,这时它就会从DQ取出电源正极然后通过这个二极管,然后向内部的控制器供电。

这个电容是相当于一个电池,如果DQ是高电平时,则就可以给这个电容充电,当DQ是低电平是,这个cpp就提取电源给内部。

如果采用这种寄生供电的话,对于内部比较耗电的操作,我们还需要给这个DQ一个强上拉,因为我们的上拉电阻比较弱,通过的电流比较小,不能达到温度传感器强电流工作时的需要。

给它一个强上拉就相当于给它一个非常高的电源正极,以达到内部供电的稳定。

这里是一个电源供给的供应,它可以感应那个外部VDD是否存在,如果不存在,它会调节内部的结构来省电,或者调节内部的一些执行操作逻辑。

当然这个寄生供电的结构是自动运行的,我们不需要对程序进行任何的配置。如果采用寄生供电,直接把这个外部VDD接到GND就行了。

这次我们的程序将不会用到寄生供电,因为寄生供电还需要一个强上拉,而我们的电路板没有强上拉的电路。我们直接使用这个外部VDD供电,就不用考虑寄生供电的部分了。

DQ的数据端口过来的时候首先要经过64位的ROM(只读存储器)和1-Wire port,这里的ROM真的是只读存储器,是一种光刻ROM,标识着ID号(每一个DS18B20都有一个全球唯一的ID号,用来表明它的身份),在通信的时候作为器件的地址,用于总线的一个通信选址(就像上一节所讲的I2C总线也有一个选址一样,比如固定地址1010和三位可编程地址,这就是器件的地址),但是这里我们没有可编程地址,它所有的地址都是存在了这个64位的ROM里面,而且是不可更改的。

DQ首先进来时是到1-Wire接口这里来,就像I2C一样刚要通信时就要发出地址,1-Wire接口就像是整个DS18B20通信的一个大门,外部发送正确的地址,才能通过这个大门。当然我们后面还会学习它可以选择指令跳过这个大门(如果只有一个设备在总线上的话我们可以选择跳过这个大门)。

至此,我们知道1-Wire接口这里是用来寻址的,当它选址进来之后就会进到内存的一个控制逻辑,我们可以把它理解为一个房子的管家,如果我们通过大门就会与它进行交互,它直接掌管着内部的一个RAM。

这个RAM这里的英文叫做Scratch Pad,这个东西叫作暂存器,实际上就是一种RAM,里面存的就是温度等等一些配置的参数。它也就是数据交互的寄存器,用于总线的数据交互,就相当于当我们想要通信的时候跳过大门和管家进行交流,管家就会知道我们想要干什么,如果是想要读取,它就会把这个暂存器或是说这个RAM的东西放到总线上,如果是想要写入的话,它就会把我们的数据写到这个暂存器里面,或者是执行一些指令,都是由这一部分(管家)来完成的。

这个RAM只是一个存数据的一个盒子,它跟这些设备进行关联:

这是它内部的一些设备(实实在在的设备)。其中第一个就是Temperature Sensor温度传感器。它相当于内部的一个模拟温度传感器,它自动把这些温度转换。当我们发出指令让它开始温度转换的时候,这个温度传感器就工作,然后把它的数据放在我们的RAM里面,然后再进行数据交互,就可以把温度值拿出来了。

其他的这些设备是用于更高阶的功能。比如alarm high Trigger报警高触发寄存器,用来存储温度的上限阈值,用来温度报警的,它的一个存储器是E2PROM(掉电不丢失数据)

接着下面那个设备就是与alarm high Trigger对应的报警低触发寄存器,也是E2PROM

再下来就是配置寄存器,这个寄存器里面存的就一个东西,就是设备分辨率和精度,分辨率是可以调的,出厂默认最高分辨率是0.0625摄氏度,我们可以通过配置这个寄存器里面的两位(其他位没有用),配置之后可以把精度降低,分辨率就会最低是0.5摄氏度,温度转换的速度就会提升。它也是E2PROM。

最后一个就是8位的CRC Generator(CRC生成器),CRC在我们这个领域里面是一个比较出名的一种校验码的算法,它会通过一种特殊的格式把我们这个RAM之前的一些数据进行一个校验,然后得到一个校验码放在后面,用于通信时判断数据是否正确。举个例子,我们身份证的最后一位就是校验码,是把我们前面的数字做一个运算得到的一个校验码,当输身份证输错了的时候,它都能校验出来,而且这个CRC校验是一个校正率比较高的一个校验码。

当然本节的代码演示并不会涉及到这个内容,我们只需要把暂存器的温度读出来。

暂存器内部

我们接下来看一下这个暂存器(红色标识)内部是怎么存的和左边的三个EEPROM(蓝色标识)是怎么交互的,绿色标识的两个设备是实实在在的设备,是不会变的,所以我们先不用介绍。

那我们来具体介绍一下这个暂存器,它内部总共是9个字节,其中前两位存的分别是最低有效位和最高有效位,这两个字节共同组成温度的一个数据。括号里面的是一个默认值,如果上电直接读的话,默认就是85摄氏度。

接下来是暂存器的字节2~字节4和EEPROM上的字节一样,为什么呢?因为当我们往暂存器里写东西的时候,我们要发送一条指令把暂存器里的东西复制到EEPROM里面。当然我们也可以发送指令将EEPROM里面的东西回调到暂存器里面。

其实暂存器是运行的时候实实在在参考的,EEPROM只做一个永久存储。在上电的时候会自动把EEPROM三个字节搬到RAM里面,方便里面判断。

再往下三个字节时保留位,在本节没有使用,以后如果器件升级的话可能会用到。

最后一位是CRC校验,就是把前面八个字节做一个运算,算出来一个校验位跟在后面。

我们把整个校验位读出来之后,可以进行相同的运算,我们在程序里运算,看看是不是得到这个校验位。如果是的话证明数据是正确的,否则是有问题的。

总结我们最后的操作流程就是:我们最后会发送一条温度转换指令,我们的硬件(实实在在的传感器)就会把我们的这个温度值放在我们的暂存器RAM里面,然后我们再发送一条读暂存器的指令,紧接着跟着我们的读时序就会把我们的暂存器给读出来。这样我们就可以根据这两个字节得到我们的温度。

那么我们的问题就转变为下一个问题就是如何通过我们的单总线来发送指令,来接收我们的暂存器。发送指令本身也是发送数据,接收暂存器就是接收数据,咋么来解决这两个问题?

单总线介绍

单总线(1-Wire BUS)是由Dallas公司开发的一种通用数据总线

一根通信线:DQ

异步(没有单独磁通线)、半双工(只有一根线,要在这根线上负责数据的来回,及发送又接收)

单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线

上图左边是DS18B20,右边的那个是温湿度传感器(可以测湿度和温度),这两种设备都利用了单总线。

工程项目上,一般单总线的使用比I2C总线少。

单总线电路规范

设备的DQ均要配置成开漏输出模式

DQ添加一个上拉电阻,阻值一般为4.7KΩ左右

若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路

不使用寄生供电时的电路(本节代码主要用这种独立供电模式):

使用寄生供电时的电路(稍作了解):

将VDD接到GND上,只需要GND和DQ两根线,然后主机还接上一个强上拉输出电路

这里有个电子开关,当左边给个低电平时,开关闭合,就是强上拉

当左边给个高电平时,开关断开,就是弱上拉,这时满足它基本的操作还是可以的,但是在温度转换或者EEPROM读写的时候这些耗电操作是必须要强上拉才能满足内部的工作要求的。

单总线时序结构

初始化

初始化:主机将总线拉低至少480us,然后释放总线,等待15~60us(可以取中间值)后,存在的从机会拉低总线60~240us(可以取中间值)以响应主机,之后从机将释放总线

可以将这个时序分成两个部分

发送一位

发送一位:主机将总线拉低60~120us(最大不能超过120us),然后释放总线,表示发送0;主机将总线拉低1~15us,然后释放总线,表示发送1。从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于60us

这个也可以分为两部分

发送一个字节

发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前)

接收一位

接收一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0,读取为高电平则为接收1 ,整个时间片应大于60us

接收一个字节

接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前)

DS18B20操作流程

初始化:从机复位,主机判断从机是否响应

ROM操作:ROM指令+本指令需要的读写操作

(ROM操作就相当于我们前面说的要进入这个大门)

功能操作:功能指令+本指令需要的读写操作

(功能操作就相当于RAM操作,访问里面的数据,对里面的数据进行读写)

指令介绍

ROM指令

SEARCH ROM [F0h]:搜寻ROM,具体的操作流程是比较复杂的,本节不用管

READ ROM [33h]:读ROM

MATCH ROM [55h]:匹配ROM,相当于I2C想要读写操作时首先要发从机地址,那匹配ROM紧跟着就会发送设备ROM的地址,我们就可以选择得到对应的开门的钥匙,和某一个设备单独通信了。

SKIP ROM [CCh]:跳过ROM,本节就是使用这个,因为我们只有一个设备连在上面,所以根本不需要绳子,先跟谁交流还不知道吗?当然如果线上有多个设备,就不能使用跳过ROM。

ALARM SEARCH [ECh]:报警ROM,这个也是在多个设备时使用,我们的温度有上限阈值和下限阈值,如果某个设备处于报警状态,那我可以报警搜索获取哪个设备会有报警。这个操作和搜寻ROM一样比较复杂,本节不会使用。

功能指令

CONVERT T [44h]:温度变换,我们想要读取温度之前,首先要执行温度变换,但我们执行完ROM指令之后,如果发送这条指令,它就会在这里(如下图所示)启动温度变化,然后把这个温度传感器的数值读取出来放到暂存器里面,相当于暂存器温度值更新:

WRITE SCRATCHPAD [4Eh]:写暂存器,如果调用这条指令,再跟写的一个时序,它就会把我们的字节写入到中间三个字节

READ SCRATCHPAD [BEh]:读暂存器,在温度读取的时候会用到这条指令,如果调用这条指令,再调用接收字节这个时序,那DS18B20就会依次将暂存器的内容读出来,最后会读出来CRC,然后这个指令也解出来。我们得到这么多字节后就可以进行数据的操作处理了

但我们本节只想读取温度,所以读两个字节,这个时序就不需要继续执行了,后面都不需要,只需要这两个字节就可以获取温度了

COPY SCRATCHPAD [48h]:复制暂存器,当从机接收到这条指令的时候,它就会暂存器里面的这三个字节给写入到这个EEPROM里面。如果接收这条指令就相当于左边三个值就会覆盖原来的值(右边)。如果我们想要掉电不丢失,我们先写暂存器,把放在里面,然后再调用这条指令,复制暂存器,它就会把左边三个值写入EEPROM里面。

RECALL E2 [B8h]:recall EEPROM,和上一条复制暂存器指令是相反的过程,如果发这条指令,它就会把EEPROM的三个字节给覆盖到暂存器里的那三个字节里面去。

READ POWER SUPPLY [B4h]:读取设备的供电模式,发完这条指令后,后面会跟着读取一位的时序,它就会响应我们的供电到底是寄生供电还是独立供电

也就是我们之前之前讲的这里,会感应供电模式是寄生供电还是独立供电

我们为什么要读取这里是寄生供电还是独立供电呢?

因为在寄生供电的时候,温度变换之后需要强上拉,那么什么时候需要呢?我们就可以先读一下这个位,看看是不是在寄生供电,如果不是在寄生供电就不需要了强上拉了。本节是独立供电模式,所以也不需要这条指令。

这些所有的指令中重点是三个指令:跳过ROM,温度变换,读暂存器。

DS18B20数据帧

温度变换

温度变换:初始化→跳过ROM →开始温度变换

PS:CCH就是0xCC字节,H是16进制的后缀

温度读取

温度读取:初始化→跳过ROM →读暂存器→连续的读操作

温度存储格式

高字节和低字节合起来成了这16位数据

这16位数据的前5位表示符号位,如果是负的,那么这5位全是1,如果是正的,这5位全是0

后四位是存小数的,

bit3是1的话,代表存的是0.5,

bit2是1的话,代表存的是0.25,

bit1是1的话,代表存的是0.125,

bit0是1的话,代表存的是0.0625

所以最低位变化一次,整个温度值变化的是0.0625

剩下的bit4到bit10都是温度的整数部分

我们这张表上的数值都是例子

注意:存储是以二进制的补码形式来存储的。对负数的补码的整个位进行取反加1就能得到相应的正数值,比如-0.5度的二进制取反的话就是0000 0000 0000 0111,加1就变成0000 0000 0000 1000,结果正好是正0.5的二进制数值

以上就是本节内容,下一节开始代码演示!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ matplotlib 画图 Linux

Matplotlib-cpp画图 命令行下载matplotlibcpp git clone https://github.com/lava/matplotlib-cpp将matplotlibcpp.h移动到自己所用的工程 CMakeList.txt文件如下所示 cmake_minimum_required(VERSION 3.0.2) project(huatu)set(CMAKE_CXX_STANDARD 11)file(GLOB_RECURSE P…

假期作业 10

1.整理磁盘操作的完整流程,如何接入虚拟机,是否成功识别,对磁盘分区工具的使用,格式化,挂载以及取消挂载 U盘接入虚拟机 在虚拟机--->可移动设备--->找到U盘---->连接 检测U盘是否被虚拟机识别 ls /dev/s…

java数据结构前置知识以及认识泛型

目录 什么是集合框架 容器 时间复杂度 空间复杂度 包装类 装箱 拆箱 引出泛型 泛型类的使用 类型推导 泛型如何编译的 泛型的上界 泛型方法静态泛型方法以及泛型上界 什么是集合框架 Java 集合框架 Java Collection Framework ,又被称为容器 containe…

机器学习12-基本感知器

感知器(Perceptron)是一种最简单的人工神经网络结构,由美国心理学家Frank Rosenblatt在1957年提出。它是一种单层的前馈神经网络,通常用于二分类问题。 基本感知器由多个输入节点、一个输出节点和一组权重参数组成。每个输入节点都与输出节点连接,并且具有一个对应的权重参…

html的格式化标签和图片(img)标签

格式化标签 加粗: strong标签和b标签倾斜: em标签和i标签删除线: del标签和s标签下划线: ins标签和u标签 <strong>stong 加粗</strong><b>b 加粗</b><em>倾斜</em><i>倾斜</i><del>删除线</del><s>删除线…

Linux操作系统基础(十三):Linux安装、卸载MySQL

文章目录 Linux安装、卸载MySQL 一、卸载系统自带的mariadb-lib 二、上传安装包并解压 三、按顺序安装 错误1: 错误2: 错误3: 错误4: 四、初始化数据库 五、目录授权&#xff0c;否则启动失败 六、启动msyql服务 七、查看msyql服务的状态 八、在/var/log/mysqld.l…

C语言—基础数据类型(含进制转换)

进制转换不多&#xff0c;但我觉得适合小白(我爱夸自己嘿嘿) 练习 1. 确认基础类型所占用的内存空间(提示&#xff1a;使用sizeof 运算符)&#xff1a; 在这里我说一下&#xff0c;long 类型通常占用 4 字节。在 64 位系统上&#xff0c;long 类型通常也可为 8 字节。 格式…

Windows搭建docker+k8s

安装Docker Desktop 从官网下载&#xff0c;然后直接安装即可&#xff0c;过程很简单&#xff0c;一直Next就行。 有一点需要注意就是要看好对应的版本&#xff0c;因为后边涉及到版本的问题。 https://www.docker.com/products/docker-desktop 安装完成&#xff0c;双击图…

C++,stl,map/multimap详解

目录 1.map的构造和赋值 2.map的大小和交换 3.map的插入和删除 4.map的查找和统计 5.map的排序 1.map的构造和赋值 #include<bits/stdc.h> using namespace std;void print(map<int,int> &mp) {for(map<int,int>::iterator it mp.begin(); it ! m…

泛型(Java)

一、定义 定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff0c;成为泛型类、泛型接口、泛型方法&#xff0c;统称为泛型。 如下需要的结果类型是String&#xff0c;实际的是obj&#xff0c;那么我们来看看强制类型转换以后会发生什么&#xff1a; 报…

深入了解JavaScript混淆工具:jsjiami.v6

JavaScript混淆工具在前端开发中发挥着重要的作用&#xff0c;帮助开发者保护源代码&#xff0c;减少代码被轻易破解的风险。其中&#xff0c;jsjiami.v6 是一款备受开发者关注的混淆工具之一。本文将深入介绍jsjiami.v6的基本原理和使用方法&#xff0c;并通过案例代码演示其效…

《A++ 敏捷开发》- 8 获取高层支持

我&#xff1a;对过程改进来说&#xff0c;最重要的成功要素是什么&#xff1f; 客户&#xff1a;最难的是如何得到高层的支持&#xff0c;这不仅仅是嘴巴说说而已&#xff0c;而是要切实地给人、给时间。高层往往不清楚什么是质量改进的重点&#xff0c;但他们对员工的人均收入…

【Web】CVE-2021-31805 s2-062漏洞复现学习

目录 Struts2介绍 漏洞概况 OGNL与Struts2 简单原理 漏洞复现 正向rce 反弹shell payload分析 Struts2介绍 Struts 2 是一个流行的用于构建 Java Web 应用程序的开源 Web 应用程序框架。它是 Apache 软件基金会下的一个顶级项目&#xff0c;是 Struts 框架的升级版本。…

29.方法引用

方法引用 1. 概述2.引用静态方法2.1 概述2.2 代码示例 3. 引用成员方法3.1 概述3.2 分类3.2.1 其他类3.2.2 本类3.2.3 父类 3.3 代码示例 4. 引用构造方法4.1 概述4.2 代码示例 5. 使用类名引用成员方法5.1 概述5.2 代码示例 6. 引用数组的构造方法6.1 概述6.2 代码示例 7. 注意…

【Vue】computed与watch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue⛺️稳重求进&#xff0c;晒太阳 计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来新的属性&#xff0c;依赖的数据变化&#xff0c;自动重新计算 语法&#xff1a; 声明…

蓝牙BLE学习-安全

1.基本概念 蓝牙标准规定了5种基本的安全服务 身份验证:根据通信设备的蓝牙地址验证其身份。蓝牙不提供本地用户身份验证。保密性:确保只有授权的设备才能访问和查看传输的数据&#xff0c;防止窃听造成的信息泄露。授权(Authorization):在允许设备使用某项服务之前&#xff…

Vue-自定义属性和插槽(五)

目录 自定义指令 基本语法 (全局&局部注册) 指令的值 练习&#xff1a;v-loading 指令封装 总结&#xff1a; 插槽&#xff08;slot&#xff09; 默认插槽 插槽 - 后备内容&#xff08;默认值&#xff09; 具名插槽 具名插槽基本语法: 具名插槽简化语法: 作…

可视化工具:将多种数据格式转化为交互式图形展示的利器

引言 在数据驱动的时代&#xff0c;数据的分析和理解对于决策过程至关重要。然而&#xff0c;不同的数据格式和结构使得数据的解读变得复杂和困难。为了解决这个问题&#xff0c;一种强大的可视化工具应运而生。这个工具具有将多种数据格式&#xff08;包括JSON、YAML、XML、C…

调用讯飞火星AI大模型WebAPI

调用讯飞火星AI大模型 记录一次调用讯飞AI大模型的过程 官方文档 首先&#xff0c;去官网申请资格&#xff0c;获得必要秘钥等 再编写url&#xff0c;该url存在编码要求&#xff0c;具体看官网url编写 具体代码如下&#xff1a; getWebsocketUrl() {return new Promise((resol…

格式化字符串的简单学习

文章目录 Format String格式化字符串函数格式化字符串参数原理 这几天学的少&#xff0c;过完年就一直在走亲戚&#xff08;现在看到肉就犯恶心 Format String 格式化字符串函数可以接受可变数量的参数&#xff0c;并将第一个参数作为格式化字符串&#xff0c;根据其来解析之…