-
第
11
章使用
DS18
B20
温度传感器测温
11.1
概述
现实生产生活中,小到测量体温
的温度计,大到航天飞机的温控系统,处处都离不开
温度测量。工业生产中的三大指标<
/p>
<
流量、压力、温度)之一就是温度,温度测量可以说
是无处不在,遍布了我们生活生产的方方面面。
DS18B20
温度传感器是美国
DALLAS
半导体公司生产的数字化温度传感器,它与以
往模拟量温度传感器不同,数字化
是其一大特点,它能将被测环境温度直接转化为数字
量,并以串行数据流的形式传输给单
片机等微处理器去处理。
DS18B20
温度传感器的另一
p>
个主要特点是它是单总线的,即它与单片机等微处理器连接时,只需占用一个
I/O
管脚,
并且不再需要其它任何外部元器件,这大
大简化了它与但单片机之间的接口电路。
11.2DS18B
20
温度传感器介绍
目前,使用最普
遍的
DS18B20
温度传感器是三脚
TO-92
直插式封装这一种,这种封
装的
DS18B20
实物如图
11-1
所示。可以看到它体积很小,只有三只管脚,外形与一般的
三极管极其相似。图
11-2
是其三脚
TO-92
< br>直插式封装图,表
11-1
列出了
DS18B20
各个引
脚的定义。
如图
11-1
如图
11-2
表
11-1
DS18B20
引脚定义。
引脚号
1
2
3
引脚
GND
DQ
V
DD
定义
接地端
数据输入输出端
电源端
1
、
DS18B20
温
度
< br>◆
独特的单总线
<
一
理器通信只需一个
I/O
需其它外部元件;
传感器特性简介
条线)接口,与微处
管脚,且硬件连接无
◆
测量结果直接输出数字量,可直接与微处理器通信;
◆<
/p>
供电电压范围
3.0V~5.5V
;在寄
生电源方式下可有数据线供电;
◆
测
温范围
-55
℃
~+125
℃;在
-10
℃
~+85
℃范围内,测量精度可达±
0.5
℃;
◆
可编程的
9~12
位测温分辨率,对应的可分辨温度值分别为
0.5
p>
℃,
0.25
℃,
0.125
℃,
0.0625
℃;
p>
12
位分辨率时的温度测量转换最长时间
<
上限)只有
750ms
;
◆
每一片
DS18B20
都有自己独一无二的芯片号码;多片
DS18B20
可以并联在一条数据总
线上实现不同地点的多点组网;
◆
应用范围包括温度调控,工业现场测温,消费类产品,
温度计及热敏系统等。
2
、
DS18B20
温度传感器测温工作原理
p>
DS18B20
的核心功能就是测量被测环境温度并直接转换成为数
字量。我们使用
DS18B20
测温,就是要将
DS18B20
转换成的数字量温度值从
DS18B2
0
内部读出,送入单
片机进行处理,所以了解
< br>DS18B20
内部的存储器的结构和组成是必要的。另外,控制
DS18B20
测温和读取温度值的指令也是必不可少的。以下就从这两个方面
逐个说明。
⑴
DS18B20
内部的存储器
笼统而言,可以说
DS18B20
内部的存储器有三个。一个是
64
位光刻
ROM
;另一个是
中间结果暂存
RAM
;第三个是
E
2
RAM
。
①
64
位光刻
< br>ROM
1 / 17
前面已经提及,每一片
DS18B20
都有一个独一无二的号码,用于唯一标识当前这片
DS18B20
。这个号码是
DS18B20
的生产厂家
DALLAS
公司在生产该
片
DS18B20
时固化在
其内部
p>
ROM
中的,共有
64
位,所以称为
64
位光刻
ROM<
/p>
号码,其数据格式如图
11-3
所
示。
图
11-3 64
位光刻
ROM
数据格式
这
p>
64
位号码由三部分组成,分别是
64
p>
位号码中的最低
8
位,
64
位号码中的中间
48
位和
p>
64
位号码中的最高
8
位。其中,
64
位号码中的最低
8
位对每一片
DS18B20
而言都相<
/p>
同,其值是
0x28H
,称为家族代码。
这个值是专门分配给
DS18B20
家族的,用以区别不同
p>
的单总线设备家族。
64
位号码中的中间<
/p>
48
位是唯一标识当前这片
DS18B2
0
的产品序列
号。任意两片
DS18B
20
的家族代码都是
0x28H
,但它
们的
48
位产品序列号绝对不相同,
这
48
位一般称为
48
< br>位序列号。
64
位号码中的最高
8
位是从前面的
56
位
<8
位
+48
位
=56
位)计算出的
CRC
码,这
8
位一般不大用,所以此处一笔带过,读者可以不予理睬
。
②中间结果暂存
RAM
中间结果暂存
RAM
共有
8
个字节,其结构如图
11-4
所示
。
图
11
-4
中间结果暂存
RAM
其中,字节
地址
0
是所测温度数值的低
8
位,字节地址
1
是所测温度数值的高
8
位,
字节地址
2
是设定温度的上限值,字节地址
3
是设定温度
的下限值,字节地址
4
是配置寄
存器字
节。字节地址
5,6,7
保留。这
8<
/p>
个字节中,除字节地址
0,1,4
以外的
5
个字节几乎不
使用,所以可以忽略,
重点掌握字节地址
0,1,4
就足够了。
字节地址
0
和字节地址
1
中存放的就是测量的温度值,字节地址
1
中存放的是高
8
位,字节地址
0
中存放的是低
8
位。它们中
的温度数据存储格式如图
11-5
所示。其中,高
5
位是符号位
S
。若
5
个
S
全为
0
则表示温度是正值,因为是正值,补码与原码相同,余下
的
11
位按图示各位的权重计算所得数值就是所测温
度值;若
5
个
S
全为
1
,则余下
11
位的
补码对应的数值就是所测温度值,这个温度值自然是零度以下,是负值。在
实际计算温度
值时,在得到
11
位数值
原码值以后,再乘以
0.0625
就得到所测的温度值。这样计
算的原
因是:可以将图
11-5
中的小
数点
<
在权重
2
0
和
2
-1
之间)向右移动
4
位,即整个数值扩大了
2 / 17
2
4
=16
倍,要使与原值相等,自然需要再除以
16
,即
相当于乘以
0.0625
。
图
11-5
温度数据存储格式
字节地址
4
是配置寄存器字节。前面已经提及,
DS18
B20
的测温有
9
位,
10
位,
11
位,
12
位四种分辨率,实际测温时选用哪种分辨率是可以通过具体编程来设定
,
DS18B20
出厂时设定的默认测温分辨率是
12
位。字节地址
4
配置寄
存器字节的数据格式如图
11-6
所示。其中的
R1
和
R0
的四种组合一一对
应
9
位,
10
位,
11
位,
12
位四种分辨率。对应
关系如表
11-2
所示。附带说明的是,一般选用出厂时设定的默认测温分辨率
12
< br>位,不用
改动。
图
11-6
配置寄存器字节的数据格式
表
11-2 R1
和
R0
的四种组合与测温分辨率的关系
③
E
2
RAM
E
2
RAM
的
结构如图
11-7
所示。可以看到,
E
2
RAM
是中间结果暂存
RAM
中字节地址
位
2,3
,4
的三个字节内容的拷贝或者说是备份,以备数据的完备性需要。这个存储器一般不<
/p>
使用,故可以忽略不予考虑。
图
11-7
E2RAM
的结构
综上所述,在不改
变测温出厂分辨率
<12
位)的前提下,
DS18B20
内部存储器中,我
们需关注的就只有
64
位光刻
ROM
和中
间结果暂存
RAM
中用于存放温度值的字节地址
0
和字节地址
1
了。
⑵
DS18B20
的
指令
DS18B20
的指令可分为三
大类,第一类是与
64
位光刻
ROM<
/p>
相关联的一系列指令,第
二类是与中间结果暂存
< br>RAM
相关联的温度值读取等一些相关指令,第三类就是控制温度
转换的控制类指令。上面刚刚提到,在不改变测温出厂分辨率
<12
位)的前提下,
3 / 17
DS18B20<
/p>
内部存储器中,我们只需关注
64
位光刻
ROM
和中间结果暂存
RAM
中字节地址
0
和字节地址
1
中的温度值。考虑到
DS18B20
的指令集中,部分指令极少使用,此处仅就
常用的、关键指令做解释说明,其余指令请
读者查阅参考其它相关资料。
①与
6
4
位光刻
ROM
相关的指令
◆读
64
位光刻
ROM
号码指令【
0x33H
】
本条指令用于读取唯一
标识当前这片
DS18B20
的
64<
/p>
位号码,但要求总线上只能有一
片
DS1
8B20
,否则会出现多片
DS18B20
冲突的问题;
◆匹配
64
位光刻
ROM
号码指令【
0x55H
】
本条指令主要用在
单总线上挂接多片
DS18B20
的情况下,此时,执行本指令
0x55H
后,紧跟其后的是一
64<
/p>
位光刻
ROM
号码
<
特别注意:在输入
64
位光刻
p>
ROM
号码时,低
位在前)
,这一
64
位光刻
ROM
p>
号码将与单总线上每一片
DS18B20
的
64
位光刻
ROM
号
码进行比对,号码匹配的那一片
DS18B20
将执行后续的指令,例如转换温度、读取温度值
等指令;而号码不匹配的
那些
DS18B20
将不执行任何指令,继续等待下去,直到总
线复位
后再等待下一次被匹配的机会。
◆跳过
64
位光刻
ROM
号码匹配指令【
0xCCH
】
可以设想,如果总线上只有一片
DS18B20
挂接其上,执行温度转换指令、读取温度
值指令等只能是针对这一片
p>
DS18B20
而言。如果先读取其
64<
/p>
位光刻
ROM
号码,再去匹
配
64
位光刻
ROM
号码,显然是画蛇添足,多此一举,所以完全可以跳过
64
位光刻
ROM
号码的匹配环节,直接执行转换温度
、读取温度值等指令。需要说明的是,不需要执行匹
配时,不用执行上一条
0x55H
指令,但必须执行跳过指令,即执行
0x
CCH
指令完成跳过
功能。
◆搜索
64
位光刻
RO
M
指令【
0xF0H
】
当总线上挂接多片
DS1
8B20
芯片时,执行本指令可以搜索当前挂接在总线上的
DS
18B20
芯片的个数,并识别它们的
64
位光刻
ROM
号码,便于后续方便操作各个
DS18B20
芯片。
②与
中间结果暂存
RAM
相关的温度数值读取指令
< br>
◆读中间结果暂存
RAM
指令
【
0xBEH
】
单片机发出并执行读中间结果暂存
RAM
指令
0xBEH
后,就可以从字节地址
0
开
始,每次读取一个字节,依次读取中间结果暂存
RA
M
的
8
个字节中的数据。因为温度值<
/p>
只保存在前面两个字节中,所以实际读取中只读取两个字节就可以了。
③控制温度转换指令
◆启动温
度转换指令【
0x44H
】
本指令是启动温度转换指令,转换结束后的温度值被存入中间结果暂存
R
AM
的字节
地址
0<
< br>低
8
位)和字节地址
1<
高
8
位)中。然后就可以从中读取温度值了。
⑶
DS18B20
< br>的通信规则
仅用一条线通信的
DS18B20
的系统,在与微处理器通信时,其数据的传输规则不同
< br>于一般芯片,其数据传输规则的特殊性表现在每次操作都要按部就班的执行以下四个步
骤:
第一步初始化
DS18B2
0
;
第二步向
DS18B20
发送与
64
位光刻<
/p>
ROM
相关的指令;
< br>第三步执行与中间结果暂存
RAM
相关指令
<
包括控制温度转换指令);
第四步是数据处理。
以下针对主要的
三个操作:读取
64
位光刻
ROM
p>
号码操作,启动
DS18B20
温度转换<
/p>
操作,读取温度操作,细化上述四个步骤。
4 / 17
①读取
64
位光刻
ROM
号码操作
第一步:初始化
DS18B20
;
p>
第二步:单片机向
DS18B20
发送读
64
位光刻
R
OM
号码指令
0x33H
;
第三步:因为读取
64
位光刻
ROM
号码操作不涉及中间结果暂存
RAM
,此步骤就什
么都不做;
第四步:单片机从单总线上一位接着一位地读取,共
64
位,得到
64
位光刻
ROM
号
码
<
注意:低位在前
)。
②启动
DS18B20
温度转换操作
第一步:初始化
DS18B20
;
第二步:单片机向
DS18B20
发送跳过
64
位光刻
ROM
号码匹配指令
0xCCH<
假设只有
一片
DS18B20
挂接在总线上);
第三步:单片机向
DS18B20
发送启动
温度转换指令
0x44H
< br>;
第四步:本操作只启动温度转换,无数据处理,故本
步骤什么都不做。
③读取温度操作
第一步:初始化
DS18B20
;
p>
第二步:单片机向
DS18B20
发送跳过
64
位光刻
ROM
号码匹配指令
0xCCH<
假设
只有
一片
DS18B20
挂接在总线上
);
第三步:单片机向
DS18B2
0
发送读
中间结果暂存
RAM
指令
0xBEH
;
<
/p>
第四步:单片机从单总线上一位接着一位地读取,连续读取两个字节的数据
<
低字节
在前,高位在前),得到温度值的低字节和高
字节数据。
此处还需要解释说明两点:
1
、
DS18B20
的操作时序很严格,特别是
延时,要比较精确才行。所以以上每一步骤
后都紧跟一段延时,具体延时时间多长,后面
的初始化、读写操作等时序会给出详细说
明。
2
、因为
DS18B20
是单
总线的,只有一条线与单片机的一个
I/O
管脚相连接。初始<
/p>
化、指令数据、
64
位光刻
ROM
号码、温度值等等数据,这些数据中,有些是从单片机到
DS18B20
,有些是从
DS18B20
到单片机,但都是
<
也只能)借助这一条总线在
传输,所以
数据是在单片机与
DS18B20
< br>之间一位一位地串行传输的。
⑷
DS18B20
的初始化、数据读写操作时序
前面已经提及,因为
DS18B20
是单总线的,所
以其操作时序很严格,特别是延时,
要比较精确才行。
①
DS18B20
的初始化
< br>
DS18B20
的初始化时序如图
11-8
所示。
图
11-8
DS18B20
的初始化时序
DS18B20
的初始化时序是:
5 / 17
◆首先是单片机发送一低电平到单一数据总线上
,将单总线拉低,拉低的时间至少是
480
μ
< br>s
,但不能超过
960
μ
s
。实际中一般取
750
μ
s
左右;
◆然后,单片机释放单总线的控制权,转而准备被动地去接收
DS18B20
发送来的数
据。此时,焊接在单总线上
5K<
/p>
Ω
的上拉电阻将单总线由低电平拉高到高电平,此电平从低
到高的上升沿被
DS18B20
捕捉到以后,
单总线转而由
DS18B20
控制了;
◆当
DS18B20
控制了总线时,在
等待
15~60
μ
s
< br>以后,
DS18B20
将单总线再次拉低,
作为向单片机做出的回应,表明自己
DS18B20
<
br>750 <
br>右,这 是单片机将总线拉低所需的最少时
<
br> <
br>< 低电平,即数据 60 线更改为单片机将单总线拉高,都是高电平,无所谓是谁拉高的。同样,此拉高的延时时 间最大也是 内;
)已经就绪,准备接收后续的指令等等。
DS18B20
将单
总线拉低的时间至少是
60
μ
s
,但不能超过
240
μ
s
。
◆随后,
释放但总线,单总线上
5K
Ω
的上拉电阻再次将将单总线由低电平拉
高到高电平。
此时
DS18B20
的初始化完成。
具体到程序设计时,可以简化初始化过程。实现如下:
◆首先,单片机发送一低电平到单一数据总线上,将单总线拉低,拉低的时间
μ
s
左
750
μ
s=
480
μ
s+40
μ<
/p>
s+230
μ
s
,其中
480
μ
s
间,
40
μ
s
是单片机释放总线后
DS
18B20
等待时间
<
大约)),
p>
230
μ
s
是
p>
DS18B20
的反馈
回应的低电平时间。
这样处理的目的是忽略
DS18B20
的反馈回应,改为延时处
理,原因是
单片机将总线拉低后,何时释放总线不太好把握,自然不太好确定何时接收<
/p>
DS18B20
的反
馈回应的低电平,采
用延时以后,至于单片机何时释放总线、
DS18B20
等待多
长时间、
DS18B20
发回应低电平多长一段时间后又释放总
线,使总线又被上拉电阻拉高,这期间的
细节可以不考虑。但这些过程结束后,单总线是
高电平就行,所以进入下一步骤:
拉高总
线。
◆然后,单片机发送一高电平到单一数据总线上,将单总线拉高,拉高的时间<
/p>
500
μ
s
左<
/p>
右;
②单片机向
DS18B20
写数据
单片机向
DS18B20
写一位数据的时序图如
图
11-9
所示。
图
11-9
单片机向
DS18B20
写一位数据的时序
单片机向
DS18B20
写一位
数据的时序:
◆首先,单片机将单总线拉低
延时时间小于
15
μ
s
)
◆然后,如果单
片机向
DS18B20
写的数是二进制数
0
,则单片机继续将单总线拉低,
让
DS18B20
采样当前单总线上的数据
<
0
),此总线拉低的延时时间最大
45
μ
s
,因为单片机
向
DS18B20
写一位数据的时间必须在
μ
s
内完成;如果单片机向<
/p>
DS18B20
写的数是二进制数
1
p>
,则单片机释放总线,由外接上拉电阻将单总线拉高供
DS18B2
0
采样当前单总线上的数据
<
高电平,
即数据
1
)。实际编程中将上拉电阻拉高总
45
μ
s
,以此保证单片机向
DS18B20
写一位数据的时
间必须在
60
μ
s
◆最后,单片机再次将单总线拉高,准备下一位数据
写入
DS18B20
,一般在总线拉高
6 / 17
后延时
10
μ
s
左右。
具体程序设计时,实现如下:
◆单片
机将单总线拉低,延时
15
μ
s
;
◆如果写
0
p>
:单片机将单总线拉低,延时
60
μ
s
;
如果写
1
:单片机将单总线拉高,延时
40
μ
s
;
◆单片机将单总线拉高,延时
10
μ
s
;
< br>③单片机从
DS18B20
读数据
单片机从
DS18B20
读一位数
据的时序如图
11-10
所示。
图
11-10
单片机从
DS18B20
读一位数据的时序
< br>
从图
11-10
可以看到,单
片机从
DS18B20
读一位数据时序比较严格,留给单片机采
样
窗口很窄,单片机从
DS18B20
读取一位二进制数据的时间必须要控制在开始读以后的
15
μ<
/p>
s
以内。具体分析如下:
◆首先,单片机将单总线拉低,拉低后的延时时间极短,一般在
1
μ
s
以内;
◆然后,单片机释放单总线,由
DS18B20
将
单总线拉低,或者由外接上拉电阻将单
总线拉高,共单片机去采样
0
或者
1
。需要强调的是:此时单总
线被拉低或者拉高不是由
单片机控制拉低或者拉高,单片机此时是读取这些高低电平的。
整个拉低或者拉高电平的
持续时间只有
15-2=13
μ
s
左右,单片机此时应抓紧时间去读取,否则
电平就要发生变化。
具体程序设计时,实现如下:
◆首先
,单片机将单总线拉低,拉低后的延时时间极短,一般在
1
μ<
/p>
s
以内;
◆然
后,单片机将单总线拉高,这一点
不是
单片机从
DS18B20
读一位数据的时序要
求决定的,而是<
/p>
51
单片机的
I/O
口在输入数据前必须先写
1
决定的。为了使单片机
I/O
口
读取数据稳定,此处一般延时
8
μ
s
左右;
◆最后,单片机读取单总线上的数据。
11.3
DS18B20
温度传感器测温实例
1
功能要求:
单片机与一片
DS18B20
连接,在
1602
液晶屏第一行显示所测的温度值
<
数据已处理过)及中间结果暂存
RAM
的字节地址
0
和字节地址
1
的温度值
<
数据未处
理),在
1602
液晶屏第二行显示该片
DS18B20
的
64
位光刻
ROM
号码。
7 / 17
#include
#include
#define uchar unsigned
char
#define uint unsigned int
sbit RS=P2^0
。
sbit RW=P2^1
。
sbit E=P2^2
。
sbit DQ=P2^3
。
uint temp
。
uchar wdL,wdH
。
static uchar
sn[8]={0}
。
uchar
code b2hex[]=
。
//************************************
void wrcmd1602(uchar cmd>
{
uchar m
。
RW=0
。
RS=0
。
P1=cmd
。
for(m=0
。
< br>m<=7
。
m++>
。
//
延时
25us
E=1
。
for(m=0
。
m<=7
。
m++>
。
//
延时
25us
E=0
。
}
void wrdata1602(uchar shuju>
{
uchar
m
。
RW=0
。
RS=1
。
P1=shuju
。
8 / 17
-
-
-
-
-
-
-
-
-
上一篇:(完整版)四字成语解释
下一篇:(完整)四字成语大全及解释1000个,推荐文档