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

目录

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.rhkb.cn/news/257216.html

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

相关文章

OpenAI ChatGPT 记忆功能怎么实现?

你的聊天助手现在能“记住”你的对话了! 2月14日凌晨,OpenAI宣布正在测试ChatGPT的新功能——记住用户提问内容,并自由控制内存。这意味着,ChatGPT能帮你记住那些重要的聊天内容,让你的对话更流畅、更自然。 想象一下…

高效的工作学习方法

1.康奈尔笔记法 在这里插入图片描述 2. 5W2H法 3. 鱼骨图分析法 4.麦肯锡7步分析法 5.使用TODOLIST 6.使用计划模板(年月周) 7. 高效的学习方法 成年人的学习特点: 快速了解一个领域方法 沉浸式学习方法: 沉浸学习的判据&am…

2024年 前端JavaScript入门到精通 第一天

主要讲解JavaScript核心知识,包含最新ES6语法,从基础到API再到高级。让你一边学习一边练习,重点知识及时实践,同时每天安排大量作业,加深记忆,巩固学习成果。 1.1 基本软件与准备工作 1.2 JavaScript 案例 …

EsayExcel文件导入导出

目录 准备工作 监听器类 导入测试 导出测试 上传Excel 下载Excel 混合导出模板导出 headRowNumber(1)&#xff1a;从第几行开始读 准备工作 导入依赖 <!--easyexcel--> <dependency><groupId>com.alibaba</groupId>x<artifactId>easye…

小白水平理解面试经典题目LeetCode 102 Binary Tree Level Order Traversal【二叉树】

102. 二叉树层次顺序遍历 小白渣翻译 给定二叉树的 root &#xff0c;返回其节点值的层序遍历。 &#xff08;即从左到右&#xff0c;逐级&#xff09;。 例子 小白教室做题 在大学某个自习的下午&#xff0c;小白坐在教室看到这道题。想想自己曾经和白月光做题&#xff0c…

Spring Boot 笔记 017 创建接口_新增文章

1.1实体类增加校验注释 1.1.1 自定义校验 1.1.1.1 自定义注解 package com.geji.anno;import com.geji.validation.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload; import jakarta.validation.constraints.NotEmpty;import jav…

vuex中Actions详解,代码示例

Vuex 中的 Actions 是用于触发mutations 的一种方式&#xff0c;它可以包含异步操作&#xff0c;并通过提交(commit)mutations 来改变 store 的状态。以下是 Actions 的详细介绍、使用步骤和示例代码&#xff1a; Actions 的介绍&#xff1a; Actions 是 Vuex 中的一个重要概…

Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

Java微服务学习Day2

文章目录 Nacos配置管理统一配置管理配置热更新![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c8a2d17baeef411980b44b432eb9692a.png)配置共享搭建Nacos集群 Feign远程调用介绍自定义配置性能优化最佳实践 Gateway服务网关介绍搭建网关服务路由断言工厂路由过滤器…

CTFshow web(文件上传151-154)

web151 哈&#xff0c;都直接送嘴边了&#xff0c;前端检测领域的问题&#xff0c;那就改前端啊&#xff0c;作者都直接提示了&#xff01; 第一种方法也是最好用的就是直接把前端内容的png改成php就好 这里教大家一个非常好用的技巧&#xff0c;可以极大节省你的时间&#xf…

单片机学习路线(简单介绍)

学习单片机对于电子爱好者和未来的嵌入式系统工程师来说是一段激动人心的旅程。单片机因其强大的功能、灵活性以及在各种智能设备中的广泛应用&#xff0c;成为了电子和计算机科学领域一个不可或缺的组成部分。如果你对如何开始这段旅程感到好奇&#xff0c;那么你来对地方了。…

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结&#xff1a; 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准&#xff0c;大家在实现时&#xff0c;只要符合规范标准&#xff0c;就可以通用。 在Java中&#xff0c;接口可以看成…

统计图饼图绘制方法(C语言)

统计图饼图绘制方法&#xff08;C语言&#xff09; 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图绘制较难。今值此介绍饼图的绘制方法。 本方法采用C语言的最基本功能&#xff1a; &#xff08; 1.&#xff09…

Pytorch+NCCL源码编译

目录 环境1. 安装cudnn2. 使用pytorch自带NCCL库进行编译3. 修改NCCL源代码并重新编译后测试&#xff0c;体现出源码更改 环境 Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic x86_64)cuda 11.8 cudnn 8python 3.10torch V2.0.1 nccl 2.14.3NVIDIA GeForce RTX 4090 *2 1.…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

538. 把二叉搜索树转换为累加树

给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#…

bugku 2

社工-初步收集 购买辅助--下载辅助 得到一个zip文件 里面有exe 不知道有啥用 先用dirsearch扫一下 找到/admin/login.php 随便用了个弱口令登录失败 后面看了要用wireshrak抓包 找到邮箱和pass 把pass解码 本来以为后台直接登录 但是登录失败 就是要用邮箱登录 找到账…

[NISACTF 2022]easyssrf

它提示我们输入 那我们输入file:///flag file:// 访问本地文件系统 它提醒我们输file:///fl4g 它提醒我们输ha1x1ux1u.php 看到代码stristr($file, “file”)当我们输入file它会提示我们输了 啥意思可以前面加个/ 也可以通过read读取 思路都是前面加/不等于flag绕过 filephp://…

Rust 格式化输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出&#xff0c;包括fmt::Debug&…

[NSSCTF]-Web:[SWPUCTF 2021 新生赛]easyrce解析

先看网页 代码审计&#xff1a; error_reporting(0); &#xff1a;关闭报错&#xff0c;代码的错误将不会显示 highlight_file(__FILE__); &#xff1a;将当前文件的源代码显示出来 eval($_GET[url]); &#xff1a;将url的值作为php代码执行 解题&#xff1a; 题目既然允许…