打印
[51单片机]

10分钟理解DS18B20数字温度计模块

[复制链接]
1594|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ppptalk|  楼主 | 2018-4-11 17:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1. 明确目的


DS18B20是美国DALLAS半导体公司推出的一种数字化单总线器-数字温度计。既然是数字温度计,那么它一定具备这样的能力-把周围环境的温度信号转换成数字信号。那么这个转换的结果放到哪里去了呢?存放到了一个叫做Scratchpad的上面,这个Scratchpad是什么意思不用去管它,只需要知道它是一个SRAM就可以了。这个Scratchpad一共有9个字节(BYTE0~BYTE8),转换的数字信息就存放在BYTE0和BYTE1,如下图所示。所以,目的就很明确了,对于DS18B20模块就是去读Scratchpad的BYTE0和BYTE1.



2. 思路分析

现在目的已经知道了,就是读Scratchpad(read scratchpad)的BYTE0和BYTE1. 那么怎么样Read Scratchpad呢?当然是去查看DS18B20的芯片手册了。阅读说明书你会发现Read Scratchpad是一个功能命令(DS18B20 FUNCTION COMMANDS),类似的还有其他很多功能命令,如下图所示:



说明书上已经讲的非常清楚了,要求每次在访问DS18B20的时候一定要遵循以下步骤,如下所示,



简单的讲,你想发送一个功能命令Read Scratchpad, 那必须在它前面加两步,初始化命令(Initialization)和ROM命令(ROM Command)。初始化命令只有一个,很容易确定,但是ROM命令有多个,需要找到一个与功能命令Read Scratchpad相匹配的ROM命令。如果总线上只有一个DS18B20模块,选择Skip ROM就可以了。


这样整个步骤就很简单了,先初始化,然后发送skip rom命令,紧接着发送read scratchpad命令,然后开始接收DS18B20传送的数据,第0和第1个字节就是我们所需要的。这样读出来的全部是0和1组成的信号,我们还需要将这些0和1组成的信号翻译成“温度值”。怎么样翻译,去查看说明书上的温度-数据对应表就可以了,如下所示:




注意这个表中的数据是补码形式,如果你只是考虑温度为正的情况,那么就不用去管原码,反码和补码了。因为对于正数的原码,反码和补码都是一样的。




如果读写操作正确的话,此时计算出来的温度应该是+85摄氏度。通过这个值可以判断你的读写程序和温度计算过程是否正确。那么为什么是+85摄氏度呢?在一上电的时候,DS18B20处在一个"idle state",简单的讲就是它没有工作,没有采集周围环境的温度。Scratchpad的BYTE0和BYTE1里面放的默认值是+85,所以你读到的其实是它的默认值。如果你想让DS18B20开始工作,那么很简单,发送一个Convert T命令就可以了。注意Convert T也是一个功能命令(Function Command),同样的按照前面的规则,给它添加初始化命令和ROM命令。




这样整个过程是不是完了呢?注意DS18B20完成温度的采集和转换是需要时间的,好比你敲隔壁的门,那你发出“敲门”这个命令后,你同学过来开门是需要时间的,在这个过程中你要做的事情就是等待。同样的,当你发送一个Convert T命令后,你需要等待DS18B20完成温度采集和转换的工作。那么等待多长呢,这个与你设置精度有关,精度越高,需要的时间越长,最多不超过750ms。当然这个过程中,你也可以采用忙信号检测的方式来判断

3. 操作步骤

这样整个操作步骤就非常简单了,
(1) initial                       (DS18B20初始化)
(2) skip rom
(3) convert T                 (让DS18B20开始工作采集周围温度)
(4) busy check              (等待DS18B20完成采集)
(5)  initial                        (DS18B20初始化)
(6) skip rom
(7) read scratchpad       (发送读scratchpad命令)
(8) rcv data                     (接收DS18B20传过来的数据)
(9) cal                             (计算温度值)
(10) display                    (把这个值显示出来)

4. 参考代码


DS18B20参考代码.rar (50.62 KB)


上一篇:

10分钟理解OLED显示模块

10分钟理解LCD1602如何显示自定义字符


10分钟理解LCD1602液晶显示模块


相关帖子

沙发
广东梁百万| | 2018-4-11 21:55 | 只看该作者
2016年底为了学用这个18B20,我花了差不多20个晚上才写出程序,首先买了一个18B20回来,我原则是:有了实物才更容易学会。
跟着网上找资料,基本理解了,于是找网上的例程,网上能找到汇编程序的例程只有两个,而且不能在我的STC15W单片机上直接用,到STC官网下载的例程也不能用。于是修改,改端口,改时序,----修改-测试-修改-测试-----反复了十个晚上都不成功。
无奈只有上网求助,有网友提示我买简易逻辑分析仪。 我于是买了一个,35包邮。
逻辑分析仪到手后,两个晚上就成功读出了温度数。

下面是我自己总结的操作流程。


使用特权

评论回复
板凳
ppptalk|  楼主 | 2018-4-11 22:51 | 只看该作者
广东梁百万 发表于 2018-4-11 21:55
2016年底为了学用这个18B20,我花了差不多20个晚上才写出程序,首先买了一个18B20回来,我原则是:有了实物 ...

百万哥搞汇编啊

使用特权

评论回复
地板
ppptalk|  楼主 | 2018-4-11 22:56 | 只看该作者
广东梁百万 发表于 2018-4-11 21:55
2016年底为了学用这个18B20,我花了差不多20个晚上才写出程序,首先买了一个18B20回来,我原则是:有了实物 ...

个人觉得这个笔记中的第二步是最麻烦的,最容易出错。释放总线后,延时60~75us,然后读DQ信号,是比较保险的。过去这么久了,你居然还能保存这个笔记。

使用特权

评论回复
5
广东梁百万| | 2018-4-11 23:11 | 只看该作者
ppptalk 发表于 2018-4-11 22:56
个人觉得这个笔记中的第二步是最麻烦的,最容易出错。释放总线后,延时60~75us,然后读DQ信号,是比较保 ...

这个总结是我去年写的,拍照留存在电脑上。

使用特权

评论回复
6
广东梁百万| | 2018-4-11 23:13 | 只看该作者
ppptalk 发表于 2018-4-11 22:51
百万哥搞汇编啊

只懂汇编,而且只是初级水平

使用特权

评论回复
7
y15067805290| | 2018-4-12 15:40 | 只看该作者

怎么没有高手留言呢,不能让帖子沉下去,顶上

使用特权

评论回复
8
y15067805290| | 2018-4-12 16:03 | 只看该作者


怎么没有高手留言呢,不能让帖子沉下去,顶上

使用特权

评论回复
9
mcuzone| | 2018-4-19 16:19 | 只看该作者
这颗料出来那么多年了(2001年的时候就用过),有精仿的国货了没?

使用特权

评论回复
10
广东梁百万| | 2018-4-22 12:38 | 只看该作者
mcuzone 发表于 2018-4-19 16:19
这颗料出来那么多年了(2001年的时候就用过),有精仿的国货了没?

应该有,淘宝上的商家都标榜自己卖的是正品,说别家卖的是假货,并有几张对比图片。

话说能仿制出这货的厂家也算是技术能力很强的了。完全有能力研发出自已的类似产品,只是专利问题和推广问题而已

使用特权

评论回复
11
wsmysyn| | 2018-4-22 17:14 | 只看该作者
mcuzone 发表于 2018-4-19 16:19
这颗料出来那么多年了(2001年的时候就用过),有精仿的国货了没?

之前听说某科研单位反向出来过,据说还不错。不过有没有别的公司买去量产就不知道了。估计应该有吧。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝