温度传感器 DS18B20 的驱动方法
在这一小节中将对DS18B20 温度传感器进行介绍,包括其功能、结构、驱动方法等内
容。
(1)DS18B20 温度传感器简介
DS18B20 数字温度计提供 9 位到 12 位(可配置)的温度读取,指示设备上的温度。数
据信息是通过一线接口(1Wire Interface),即只需要一条线就可以把很多DS18B20 连接到
中央处理器上。同时,用以读取数据和温度转换的电源也可以通过数据线来提供,而无需外
部电源。由于每一个DS18B20 内部都有一个唯一的序列号,所以多个DS18B20 可以同时存
在于一线总线上。这样就可以把多个温度传感器放置于不同的位置。可以广泛应用于环境控
制,建筑物、设备或机器内部温度的测量及进程监控与控制。
DS18B20 的引脚定义:
引脚功能详细描述:
(在
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中没有提到的引脚可以不接。)
8PIN SOIC TO92 符号 描述
5 1 GND 地
4 2 DQ 数据输入输出
3 3 VDD 可选的电源输入
(2)DS18B20 的硬件结构及功能详述
DS18B20 的硬件结构请看如下框图:
通过对配置寄存器进行配置,可以使其工作在 9 位~12 位四种模式下。以下是配
置寄存器的功能介绍:
D4~D0 总为 1,D7 总为 0。
R1,R0:工作模式选择。各位工作模式下,温度测量所需时间不同。
如下表所示:
配置寄存器位于 SCRATCHPAD 寄存器组中,此寄存器组的定义如下:
D7 D6 D5 D4 D3 D2 D1 D0
0 R1 R0 1 1 1 1 1
SCRATCHPAD 字节偏移
测量所得温度的低位 0
测量所得温度的高位 1
用户设定温度上限 2
用户设定温度下限 3
R1 R0 工作模式 最大的测量时间
0 0 9 位 93.75 ms
0 1 10 位 187.5 ms
1 0 11 位 375.0 ms
1 1 12 位 750.0 ms
其中第一个与第二个字节就是测量所得的温度的数量,乘以相应工作模式下的分辨
率就是所要求的温度值。
以 12 位模式为例,予以说明:
上电后默认值为+85 摄氏度。
(3)DS18B20 的驱动方法:
这里将对一线接口时序进行介绍,一线接口对时间比较敏感,下面的例程运行于
22.1184 的外部振荡频率下。其中使用的延时函数在此振荡频率下的实测延时时间约为:(参
数×5+8)us。
1)初始化
初始化时序图如下:
配置寄存器 4
保留 5
保留 6
保留 7
八位循环冗余校验码 8
温度(摄氏度) 数字输出(二进制) 数字输出(十六进制)
+125 0000 0111 1101 0000 07D0H
+85 0000 0101 0101 0000 0550H
+25.0625 0000 0001 1001 0001 0191H
+10.125 0000 0000 1010 0010 00A2H
+0.5 0000 0000 0000 1000 0008H
0 0000 0000 0000 0000 0000H
0.5 1111 1111 1111 1000 FFF8H
10.125 1111 1111 0101 1110 FF5EH
25.0625 1111 1110 0110 1111 FF6FH
55 1111 1100 1001 0000 FC90H
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ 复位
Ldelay(8); //稍做延时
DQ = 0; //单片机将 DQ 拉低
Ldelay(100); //精确延时 大于 480us
DQ = 1; //拉高总线
Ldelay(14);
x=DQ; //稍做延时后 如果 x=0 则初始化成功 x=1 则初始化失败
Ldelay(20);
}
2)写一个字节
写 1:
写 0:
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i)
{
DQ = 0;
DQ = dat&0x01;
Ldelay(5);
DQ = 1;
dat>>=1;
}
}
3)读取一个字节
//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Ldelay(4);
}
return(dat);
}
4)读取温度
测量所得的温度位于 SCRATCHPAD 寄存器组前两个字节,读取过程中涉及到
三个命令。
//读取温度
unsigned int ReadTemperature()
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Ldelay(1000);
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
WriteOneChar(0xBE); //读取温度寄存器等(共可读 9 个寄存器) 前两
个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
命令码 功能描述
CCH 跳过对 ROM 的读取
44H 开始温度测量
BEH 读取 SCRATCHPAD 寄存器组
t=t|a;
tt=t*0.0625;
t=tt*100;
return(t);
}
以上介绍了DS18B20 温度传感器的基本驱动方法。在进行单总线多点测量时,根据每
个 DS18B20 内 ROM 中固化的序列号对某一个传感器选中。程序中直接跳过了ROM 信息的
读取,如果不跳过,则读出来的就是序列号信息,共64 位,格式如下表所示。
8BIT CRC 校验码 48BIT 序列号 8BIT 家族号(28H)