ds18b20详解及程序

  • 格式:doc
  • 大小:676.50 KB
  • 文档页数:17

最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.

DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS

公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计.DS18B20 产品的特点:

(1)、只要求一个I/O 口即可实现通信。

(2)、在DS18B20 中的每个器件上都有独一无二的序列号。

(3)、实际应用中不需要外部任何元器件即可实现测温。

(4)、测量温度范围在-55 到+125℃之间; 在—10 ~ +85℃范围内误差为±5℃;

(5)、数字温度计的分辨率用户可以从9 位到12 位选择.将12位的温度值转换为数字量所需时间不超过750ms;

(6)、内部有温度上、下限告警设置.

DS18B20引脚分布图

DS18B20 详细引脚功能描述:

1、GND 地信号;

2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平。 通常要求外接一个约5kΩ的上拉电阻.

3、VDD可选择的VDD 引脚。电压范围:3~5。5V; 当工作于寄生电源时,此引脚必须接地。

DS18B20存储器结构图

暂存储器的头两个字节为测得温度信息的低位和高位字节; 第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;

第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;

第9字节是前面8个字节的CRC检验值.

配置寄存器的命令内容如下:

0 R1 R0 1 1 1 1 1

MSB LSB

R0和R1是温度值分辨率位, 按下表进行配置。默认出厂设置是R1R0 = 11, 即12位.

温度值分辨率配置表

R1 R0 分辨率 最大转换时间(ms)

0 0 9bit 93。75(tconv/8)

0 1 10bit 183.50(tconv/4)

1 0 11bit 375(tconv/2)

1 1 12bit 750 (tconv)

4种分辨率对应的温度分辨率为0。5℃, 0.25℃, 0.125℃, 0。0625℃(即最低一位代表的温度值)

12位分辨率时的两个温度字节的具体格式如下:

低字节:

2^3 2^2 2^1 2^0 2^-1 2^—2 2^-3 2^-4

高字节:

S S S S S 2^6 2^5

2^4

其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:

2^3 2^2 2^1 2^0 2^-1 2^—2 0

0

, 高字节不变.。..

一些温度与转换后输出的数字参照如下:

温度 数字输出 换成16进制

+125℃ 00000111

11010000 07D0H

+85℃ 00000101

01010000 0550H +25。0625℃ 00000001

10010001 0191H

+10.125℃ 00000000

10100010 00A2H

+0.5℃ 00000000

00001000 0008H

0℃ 00000000

00000000 0000H

—0。5℃ 11111111

11111000 FFF8H

—10。125℃ 11111111

01011110 FFE5H

—25.0625℃ 11111110

01101111 FF6FH

-55℃ 11111100

10010000 FC90H

由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).

DS18B20 的使用方法:

由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求.

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性.

该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte())、写时序(writeByte()).

所有时序都是将主机作为主设备,单总线器件作为从设备.而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先.

DS18B20与单片机连接电路图:

利用软件模拟DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序

1。 初始化

单线总线上的所有操作都是从初始化开始的。 过程如下:

1)请求: 主机通过拉低单线480us以上, 产生复位脉冲, 然后释放该线, 进入Rx接收模式。 主机释放总线时, 会产生一个上升沿脉冲。

DQ : 1 —〉 0(480us+) —〉 1

2)响应: DS18B20检测到该上升沿后, 延时15~60us, 通过拉低总线60~240us来产生应答脉冲.

DQ: 1(15~60us) —〉 0(60~240us)

3)接收响应: 主机接收到从机的应答脉冲后, 说明有单线器件在线. 至此, 初始化完成。

DQ: 0

2。 ROM操作命令

当主机检测到应答脉冲, 便可发起ROM操作命令。 共有5类ROM操作命令, 如下表

命令类型 命令功能 字节

Read

Rom 读ROM 33H 读取激光ROM中的64位,只能用于总线上单个DS18B20器件情况, 多挂时会发数据冲突

Match Rom匹配ROM 55H 此命令后跟64位ROM序列号,寻址多挂总线上的对应DS18B20.只有序列号完全匹配的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲。可用于挂或多挂两种情况。

Skip Rom 跳过ROM CCH 可无须提供64位ROM序列号即可运行内存操作命令, 只能用于单挂.

Search Rom搜索ROM F0H 通过一个排除法过程, 识别出总线上所有器件的ROM序列号

Alarm Search告警搜索 ECH 命令流程与Search Rom相同, 但DS18B20只有最近的一次温度测量时满足了告触发条件的, 才会响应此命令.

3. 内存操作命令

在成功执行ROM操作命令后, 才可使用内存操作命令。 共有6种内存操作命令:

命令类型 命令字节 功能

Write

Scratchpad

写暂存器 4EH 写暂存器中地址2~地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前个字节都必须要写。

Read

Scratchpad

读暂存器 BEH 读取暂存器内容,从字节0~一直到字节8, 共9个字节,主机可随时发起复位脉冲,止此操作,通常我们只需读前5个字节。

Copy

Scratchpad

复制暂存器 48H 将暂存器中的内容复制进EERAM, 以便将温度告警触发字节存入非易失内存。 如果命令后主机产生读时隙, 那么只要器件还在进行复制都会输出0, 复制完成后输出1Convert T

温度转换 44H 开始温度转换操作。 若在此命令后主机产生时隙, 那么只要器件还在进行温度转换就会输出0, 转换完成后输出1。

Recall E2

重调E2暂存器 B8H 将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在DS18B20加电时自动产生.

Read Power

Supply

读供电方式 B4H 主机发起此命令后每个读数时隙内,DS18B20会发信号通知它的供电方式:0寄生电源, 1外部供电.

4。 数据处理 DS18B20要求有严格的时序来保证数据的完整性。 在单线DQ上, 有复位脉冲, 应答脉冲, 写0, 写1, 读0, 读1这6种信号类型。 除了应答脉冲外, 其它都由主机产生。

数据位的读和写是通过读、写时隙实现的。

1) 写时隙: 当主机将数据线从高电平拉至低电平时, 产生写时隙。所有写时隙都必须在60us以上, 各写时隙间必须保证1us的恢复时间。

写”1” : 主机将数据线DQ先拉低, 然后释放15us后, 将数据线DQ拉高;

写”0” : 主机将DQ拉低并至少保持60us以上。

2)读时隙: 当主机将数据线DQ从高电平拉至低电平时, 产生读时隙. 所有读时隙最短必须持续60us, 各读时隙间必须保证1us的恢复时间。

读: 主机将DQ拉低至少1us,。 此时主机马上将DQ拉高, 然后就可以延时15us后,

读取DQ即可。

源代码: (测量范围: 0 ~ 99度)

DS18B20

1#include 〈reg51。H〉

2//通过DS18B20测试当前环境温度, 并通过数码管显示当前温度值

3sbit wela = P2^7; //数码管位选

4sbit dula = P2^6; //数码管段选

5sbit ds = P2^2;

6//0—F数码管的编码(共阴极)

7unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,

8 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

9//0-9数码管的编码(共阴极), 带小数点

10unsigned char code tableWidthDot[]={0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,

11 0x87, 0xff, 0xef};

12

13//延时函数, 例i=10,则大概延时10ms。

14void delay(unsigned char i)

15{

16 unsigned char j, k;

17 for(j = i; j 〉 0; j--)

18 {

19 for(k = 125; k > 0; k——);

20 }

21}

22

23//初始化DS18B20

24//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动

25void dsInit()

26{

27 //一定要使用unsigned int型, 一个i++指令的时间, 作为与DS18B20通信的小时间间隔