数字温度计实验

  • 格式:doc
  • 大小:152.00 KB
  • 文档页数:8

实验十九 DS18B20 温度检测实验

一、实验目的

1.熟习1-WIRE接口的工作原理、电路设计以及编程方法。

2.了解数字式温度传感器DS18B20的结构及使用方法。

二、实验原理

1、DS18B20介绍:DS18B20是DALLAS公司生产的一线式数字温度传感器。它将地址线、数据线和控制线合为一根双向串行传输信号线,并允许在这根信号线上挂接多个DS18B20。因此单片机只需通过一根I/O线就可以与多个DS18B20通信。在每个DS18B20芯片内部有一个64位的ROM,其中存有各个器件自身的序列号,作为器件独有的ID号码。由于DS18B20简化了测温器件与计算机的接口电路,使用更加方便。

2、DS18B20的特性如下:

测温范围:-55~+125℃;

转换精度:9~12位二进制数(包括1位符号位),通过编程确定转换精度的位数;

测温分辨率:9位精度为0.5℃,12位精度为0.0625℃

转换时间:9位精度为93.75ms,10位精度为187.5ms,12位精度为750ms

具有非易失性上、下限报警功能

图 DS18B20封装

DS18B20内部有一个64位的存储器,存储器结构如下:

高速缓冲存储器

地址编号 存储内容 高速缓冲存储器

地址编号 存储内容

字节0 温度值的低8位(D7~D0) 字节5 保留(FFH)

字节1 温度值的高8位(D15~D8) 字节6 保留(0CH)

字节2 高温报警触发(TH) 字节7 保留(10H)

字节3 低温报警触发(TL) 字节8 CRC校验

字节4 配置寄存器(CONFIG)

配置寄存器格式如下:

0 R1 R0 1 1 1 1 1

配置寄存器中R1、R0设置测温的分辨率:

R1 R0 分辨率设置/位 测温精度/℃ 转换时间/ms

0 0 9 0.5 93.75

0 1 10 0.25 187.5

1 0 11 0.125 375

1 1 12 0.0625

750

温度值用16位二进制补码形式表示如下:

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

温度值的低字节 23 22 21 20 2-1 2-2 2-3 2-4

Bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8

温度值的高字节 S S S S S 26 25 24

温度值的两个字节中,S为符号位,S=1,温度为负值;S=0,温度为正值。2-4为最低位,其温度值为0.0625℃。20相当于1℃。当选择9位分辨率时,bit3 bit2 bit0没有意义;10位分辨率时,bit2 bit0没有意义;11位分辨率时,bit0没有意义。

使用DS18B20时,主机应先向DS18B20送出复位信号,主机将数据线拉低并保持480~960μs;再释放数据线,由上拉电阻拉高15~60μs;然后由DS18B20发出低电平60~240μs,就完成了复位操作。复位时序图如下:

主机发复位脉冲 电阻上拉 DS18B20发响应脉冲

在主机对DS18B20写数据时,应先将数据线拉低1μs以上,再写入数据(写1为高,写0为低)。待主机写入的数据变化15~60μs以后,DS18B20将数据写入。要求主机写入的数据保持时间应为60~120μs.两次写入的间隙应大于1μs.

写数据时序图如下:

读数据前,主机主机应先将数据线拉低,再释放。DS18B20在数据线从高电平变低后15μs内将数据送到数据线上。主机在15μs后读取数据线。读时序如下:

DS18B20功能表如下:

命令 功能描述 代码

温度转换 启动温度转换 44H

读暂存器 读温度寄存器等的内容(共可读9个寄存器) BEH

读序列号 读DS18B20的序列号 33H

写暂存器 将数据写入到暂存器的bit2 bit3 bit4(TH TL和配置寄存器) 4EH

复制暂存器 将暂存器bit2 bit3 bit4(TH TL和配置寄存器)的数据复制到EEPROM 48H

回读EEPROM 把TH TL和配置寄存器的数据从EEPROM回读到暂存器中 B8H

跳过ROM 跳过读序列号的操作 CCH

读供电方式 把DS18B20的电源模式发信号给主机 B$H

3、实验原理图

三、实验内容和步骤

1、按实验原理图接线,DS18B20的DQ接89C51的P3.2;89C51的P1.0-P1.7接并行数码管的段码a-dp;P3.7-P3.4接数码管的位码选择端S0-S3。

2、编程,采集DS18B20转换的室内温度数据显示在数码管上,用手捏住DS18B20看温度有没有变化。

四、实验参考程序: DS18B20.ASM

N EQU 8 ;读出ROM的位数

DQ EQU P3.2 ;单总线的数据线

TH EQU 40 ;最高极限温度

TL EQU 10 ;最低极限温度

SROMC EQU 0F0H ;搜索ROM命令

MROMC EQU 55H ;匹配ROM命令

LROMC EQU 0CCH ;跳过读ROM命令

RROMC EQU 33H ;读ROM命令

CTC EQU 44H ;转换温度命令

WREGC EQU 4EH ;写暂存器命令

RREGC EQU 0BEH ;读暂存器命令

CONFIG EQU 1FH ;配置寄存器的值,9位温度值

DSEG AT 30H

DAT: DS 1 ;温度值存储单元

POINT: DS 1 ;小数点后温度值的存储单元

ROMA: DS 8 ;器件A的ROM存储单元

BUF: DS 9 ;暂存器中数据存储单元

BUFT: DS 4 ;数码管动态显示的4个数据缓冲单元

BTH: DS 1 ;显示ROM中某一字节高四位

BTL: DS 1 ;显示ROM中某一字节低四位

CSEG AT 0000H

LJMP MAIN

ORG 0100H

MAIN: MOV SP,#70H

MOV PSW,#00H

LCALL Initial

MOV A,#LROMC ;写跳过ROM命令

LCALL W8BIT

MOV A,#WREGC ;写暂存器命令,可写入TH,TL,Configuration

LCALL W8BIT

MOV A,#TH ;写18B20的TH寄存器

LCALL W8BIT

MOV A,#TL ;写18B20的TL寄存器

LCALL W8BIT

MOV A,#CONFIG ;写18B20的配置寄存器,9位温度值

LCALL W8BIT

RETN: LCALL Initial ;18B20初始化

MOV A,#LROMC ;写跳过ROM命令

LCALL W8BIT

MOV A,#CTC ;写转换温度命令

LCALL W8BIT

BUSY: LCALL Disply ;显示温度

CLR DQ ;读18B20的忙位

NOP

SETB DQ

NOP

MOV C,DQ

LCALL DLY70 ;延时70微秒

JNC BUSY ;如果18B20忙,转BUSY

LCALL Initial ;初始化

MOV A,#LROMC ;写跳过ROM命令

LCALL W8BIT

MOV A,#RREGC ;写读18B20暂存器命令

LCALL W8BIT

MOV R3,#2 ;设置计数器R3=2,从18B20读2个字节的温度值

MOV R1,#BUF ;置R1温度值缓冲区

RER: LCALL R8BIT ;读温度值

MOV @R1,A ;将温度值存入缓冲区

INC R1 ;温度值缓冲区地址加1

DJNZ R3,RER ;如2个字节温度值没读完,转RER

LCALL STORE ;温度转换并存储子程序

LCALL Disply ;温度显示子程序,只所以调用2次该子程序

;是为了增强数码管的亮度

SJMP RETN

;18B20初始化子程序,使用R7

Initial:CLR DQ ;数据线为低700微秒

LCALL DLY700

SETB DQ ;置数据线为高,以便接收18B20信号

I1: MOV C,DQ ;等待数据线为低

JC I1

LCALL DLY700 ;延时700微秒

RET

;向18B20写8位子程序,被写的数在ACC中

;使用R2、R7

W8BIT: MOV R2,#8 ;设置计数器R2为8

W1: CLR DQ ;使数据线为低 RRC A ;右移将被写位移如进位C

JNC W2 ;被写位为0,转W2

SETB DQ ;被写位为1,使数据线为高

W2: LCALL DLY70 ;延时70微秒

SETB DQ ;使数据线为高

DJNZ R2,W1 ;如果8位数据没写完,转W1

RET

;读8位子程序,读的数在ACC中

;使用R2、R7

R8BIT: MOV R2,#8 ;设置计数器R2为8

RR1: CLR DQ ;使数据线为低,启动读过程

NOP ;等待4微秒

SETB DQ ;使数据线为高,以便从18B20读数据

NOP ;等待4微秒

MOV C,DQ ;将数据读入进位C

RRC A ;通过右移将进位C送入ACC

LCALL DLY70 ;延时70微秒

DJNZ R2,RR1 ;如果8位数据没读完,转RR1

RET

;温度值存储子程序,使用R0

STORE: MOV R0,#BUF ;将温度缓冲区首址送R0

MOV A,@R0

MOV B,A

ANL A,#08H ;保留小数位

MOV POINT,A

MOV A,B

ANL A,#0F0H ;保留高4位

MOV B,A

INC R0

MOV A,@R0

ANL A,#0FH ;保留低4位

ORL A,B ;组成1个字节

SWAP A

MOV R0,#BUFT

JB ACC.7,NEG ;如果温度为负,转NEG

MOV DAT,A ;温度为正值,直接存到DAT里

MOV A,#00H ;正号显示

MOV @R0,A

JMP NST

NEG: CPL A ;将相应的负值转换为其绝对值