数字温度传感器DS18B20的原理与应用

单片机系统除了可以对电信号进行测量外,还可以通过外接传感器对温度信号进行测量。传统的温度检测大多以热敏电阻为传感器,但热敏电阻可靠性差、测量的温度不够准确,且必须经专门的接口电路转成数字信号后才能被单片机处理。DS18B20是一种集成数字温度传感器,采用单总线与单片机连接即可实现温度的测量。本节内容在先介绍DS18B20的工作原理、时序和指令后,然后设计完成一个数字温度计。温度计功能要求采用数码管显示温度,小数点后2位有效数字,实际温度高于某个值时用蜂鸣器报警。

3.1 DS18B20工作原理

DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供单片机处理,可实现温度的精度测量与控制。DS18B20性能特点见表3-1-1所示。

3-1-1  DS18B20性能指标

性能

参数

备注

电源

电压范围在3.0~5.5V,在寄生电源方式下可由数据线供电

测温范围

-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃

分辨率

9~12位,分别有0.5℃,0.25℃,0.125℃和0.0625℃

编程控制

转换速度

在9位时,小于93.75ms; 12位分辨率时, 小于750ms

总线连接点

理论248,实际视延时、距离和干扰限制,最多几十个

一、封装外形

根据应用领域不同,DS18B20有常见有TO-92、SOP8等封装外形,见图3-1-1所示,表3-1-2给出了TO-92封装的引脚功能,其中DQ引脚是该传感器的数据输入/输出端(I/O),该引脚为漏极开路输出,常态下呈高电平。DQ引脚是该器件与单片机连接进行数据传输单一总线,单总线技术是DS18B20的一个特点。

3-1-2  DS18B20引脚功能描述

引脚序号

名称

描述

1

GND

地信号

2

DQ

数据输入输出(I/O)引脚

3

Vdd

电源输入引脚,当工作于寄生电源模式时,此引脚必须接地

二、工作原理

DS18B20的内部主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据的高速贮存器、用于存储用户设定的温度上下限值、触发器存储与控制逻辑、8位循环冗余校验码发生器等7部分。

高速寄存器RAM由9个字节的存储器组成。见表3-1-3所示。其中,第0、1字节是温度转换有效位,第0字节的低3位存放了温度的高位,高5位存放温度的正负值;第1字节的高4位存放温度的低位,后4位存放温度的小数部分;第2和第3个字节是DS18B20的与内部E2PROM的有关的TH和TL,用来存储温度上限和下限,可以通过程序设计把温度的上下限从单片机中读到TH和TL中,并通过程序再复制到DS18B20内部E2PROM中,同时TH和TL在器件加电后复制E2PROM的内容;第4个字节是配置寄存器,第4个字节的数字也可以更新;第5,6,7三个字节是保留的。

3-1-3高速寄存器RAM

字节地址编号

寄存器内容

功能

0

温度值低位(LSB)

高5位是温度的正正负号,低3位为温度的高位

1

温度值高位(MSB)

高4位为温度的低位,低4位为温度小数部分

2

高温度值(TH)

设置温度上限

3

低温度值(TL)

设置温度下限

4

配置寄存器

5

保留

6

保留

7

保留

8

CRC校验值

三、硬件连接

DS18B20是单片机外设,单片机为主器件,DS18B20为从器件。图3-1-2的接法是单片机与一个DS18B20通信,单片机只需要一个I/O口就可以控制DS18B20,为了增加单片机I/O口驱动的可靠性,总线上接有上拉电阻。对如果要控制多个DS18B20进行温度采集,只要将所有DS18B20的DQ全部连接到总线上就可以了,在操作时,通过读取每个DS18B20

内部芯片的序列号来识别。

3.2 DS18B20工作时序

单总线协议规定一条数据线传输串行数据,时序有严格的控制,对于DS18B20的程序设计,必须遵守单总线协议。DS18B20操作主要分初始化、写数据、读数据。下面分别介绍操作步骤。

初始化是单片机对DS18B20的基本操作,时序见图3-1-3,主要目的是单片机感知DS18B20存在并为下一步操作做准备,同时启动DS18B20,程序设计根据时序进行。DS18B20初始化操作步骤为:

(1)先将数据线置高电平1,然后延时(可有可无);

(2)数据线拉到低电平0。然后延时750µs(该时间范围可以在480~960µs),调用延时函数决定。

(3)数据线拉到高电平1。如果单片机P1.0接DS18B20的DQ引脚,则P1.0 此时设置高电平,称为单片机对总线电平管理权释放。此时,P1.0的电平高低由DS18B20的DQ输出决定;

(4)延时等待。如果初始化成功则在15~60ms总线上产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在。但是应注意,不能无限地等待,不然会使程序进入死循环,所以要进行超时判断。

(5)若单片机读到数据线上的低电平0后,说明DS18B20存在并相应,还要进行延时,其延时的时间从发出高电平算起(第⑤步的时间算起)最少要480µs。

(6)将数据线再次拉到高电平1,结束初始化步骤。

从单片机对DS18B20的初始化过程来看,单片机与DS18B20之间的关系如同有人与人之间对话,单片机要对DS18B20操作,必须先证实DS18B20的存在,当DS18B2响应后,单片机才能进行下面的操作。

    二、对DS18B20写数据

(1)数据线先置低电平0,数据发送的起始信号,时序见图3-1-4

(2)延时确定的时间为15µs;

(3)按低位到高位顺序发送数据(一次只发送一位)。

(4)延时时间为45µs,等待DS18B20接收;

(5)将数据线拉到高电平1,单片机释放总线;

(6)重复①~⑤步骤,直到发送完整个字节;

(7)最后将数据线拉高,单片机释放总线。

 三、DS18B20读数据

(1)将数据线拉高,时序图见图3-1-5所示;

(2)延时2µs,

(3)将数据线拉低到0,

(4)延时6µs,延时时比写数据时间短;

(5)将数据线拉高到1,释放总线

(6)延时4µs

(7)读数据线的状态得到一个状态位,并进行数据处理。

(8)延时30µs。

(9)重复①~⑦步骤,直到读取完一个字节。

只有在熟悉了DS18B20操作时序后,才能对器件进行编程,由于DS18B20有器件编号、温度数据有低位高位、另外还有温度的上线限,读取的数据较多,所以DS18B20提供了自己的指令。

3.3 DS18B20指令

一、ROM操作指令

DS18B20指令主要有ROM操作指令、温度操作指令两类。ROM操作指令主要针对DS18B20的内部ROM。每一个DS18B20都有自己独立的编号,存放在DS18B20内部64位ROM中,ROM内容见表3-1-4所示。64位ROM中的序列号是出厂前已经固化好,它可以看做该DS18B20的地址序列码。其各位排列顺序是,开始8位为产品类型标号,接下来48位是该DS18B20自身的序列号,最后8位是前面56位的CRC循环冗余校验码(CRC=X8+X5+X4+1)。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一条总线上挂接多个DS18B20的目的。ROM操作指令见表3-1-5

3-1-4  64 ROM 定义

8位CRC码

48位序列号

8位产品类型标号

表3-1-5 ROM操作指令

指令代码

作用

33H

读ROM。读DS18B20温度传感器ROM中的编码(即64位地址)

55H

匹配ROM。发出此命令之后,接着发出64位ROM编码,访问单总线上,与该编码相对应的DS18B20并使之做出响应,为下一步对该DS18B20的读/写做准备

F0H

搜索ROM。用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,为操作各器件做好准备

CCH

跳过ROM。忽略64位ROM地址,直接向DS18B20发温度变换命令,适用于一个从机工作。

ECH

告警搜索命令。执行后只有温度超过设定值上限或下限的芯片才做出响应

在实际应用中,单片机需要总线上的多个DS18B20中的某一个进行操作时,事前应将每个DS18B20分别与总线连接,先读出读出其序列号;然后再将所有的DS18B20连接到总线上,当单片机发出匹配ROM命令(55H),紧接着主机提供的64位序列,找到对应的DS18B20后,之后的操作才是针对该器件得。

如果总线上只存在一个DS18B20,就不需要读取ROM编码以及匹配ROM编码了,只要跳过ROM(CCH)命令,就可进行如下温度转换和读取操作。

二、温度操作指令

温度操作指令见表3-1-6所示,DS18B20在出厂时温度数值默认为12位,其中最高位为符号位,即温度值共11位,单片机在读取数据时,依次从高速寄存器第0、1地址读2字节共16位,读完后将低11位的二进制数转转换为实际温度值。0地址对应的1个字节的前5个数字为符号位,这5位同时变化,前5位为1时,读取的温度为负值;前5位为0时,读取的温度为正值,且温度为正值时,只要将测得的数值乘以0.0625即可得到实际温度值。

表3-1-6温度操作指令

指令代码

作用

44H

启动DS18B20进行温度转换,12位转换时最长为750ms(9位为93.75ms),结果存入内部9字节的RAM中

BEH

读暂存器。读内部RAM中9字节的温度数据

4EH

写暂存器。发出向内部RAM的第2,3字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。

48H

复制暂存器。将RAM中第2,3字节的内容复制到E2PROM中

B8H

重调E2PROM。将E2PROM中内容恢复到RAM中的第3,4字节。

B4H

读供电方式。读DS18B20的供电模式。寄生供电时,DS18B20发送0;外接电源供电时,DS18B20发送1。

3.4数字温度计

一、电路原理

STC89C51单片机和DS18B20的硬件连接图如图3-1-6所示,单片机的P10和DS18B20的数据口相连接。单片机通过P10口对DS18B20进行初始化,DS18B20将转换后的数字温度值通过P10口传给单片机。

一、程序设计

编程思路:首先单片机通过I/O口调用初始化函数Init_DS18B20( )对DS18B20按照初始化时序进行初始化,启动温度的转换,再将转换后的数字传给单片机,单片机通过计算将数字温度转换成实际的温度值,通过数码管显示出来,数码管显示采取在定时器0中动态显示,P0端驱动共阳七段数码管,P20~P25端通过非门接共阳数码管的公共端,应用程序清单如下:

/*****************************************************************

        程序描述:温度超过35度,继电器吸合

P0端驱动共阳七段数码管,P2端接共阳数码管的公共端

******************************************************************/

#include<reg51.h>         

#define uchar unsigned char

#define uint unsigned int

sbit DQ = P1^0;        //DS18B20的DQ和单片机的P10脚连接

sbit jdq = P2^6;         //继电器的控制端和单片机的P26脚连接

code  uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

code  uchar seven_bit[] = {0xfe,0xfd,0xfb,0x7f};

uchar a,b,c,d,i,T;

/*******************延迟函数***************/

void delay(uint x)

{

while(x)  

x--;

}

/**************初始化DS18B20函数***********/

Init_DS18B20(void)

{

        unsigned char x = 0;

        DQ = 1;         //DQ复位

        delay(8);       //稍做延时

        DQ = 0;        //单片机将DQ拉低

        delay(80);     //精确延时 大于 480us

        DQ = 1;        //拉高总线

        delay(14);

        x = DQ;          //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

        delay(20);

}

/*******************从18B20中读一个字节***************/

uchar read_OneChar(void)

{

        uchar i = 0;

        uchar dat = 0;

        for (i=8;i>0;i--)

        {

      DQ = 0;          // 给脉冲信号

      dat >>= 1;

      DQ = 1;          // 给脉冲信号

      if(DQ)

      dat |= 0x80;

      delay(4);

        }

        return(dat);

}

/**********************向18B20中写一个字节**************/

void write_OneChar(uchar dat)

{

        uchar i = 0;

        for (i = 8; i>0; i--)

        {

        DQ = 0;

        DQ = dat&0x01;

        delay(5);

        DQ = 1;

        dat >> = 1;

        }

        delay(4);

}

/***********************读取温度*************************/

uchar Read_Temperature(void)

{

        uchar i = 0,t = 0;

        Init_DS18B20();

        Write_OneChar(0xcc); // 跳过读序号列号的操作

        Write_OneChar(0x44); // 启动温度转换

        Init_DS18B20();

        Write_OneChar(0xcc); //跳过读序号列号的操作

        Write_OneChar(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度

        i = Read_OneChar();   //读取温度值低位

        t = Read_OneChar();   //读取温度值高位

        a = i & 0x0f;

        b = t;

        i = i >> 4;             //低位右移4位,舍弃小数部分

        t = t << 4;             //高位左移4位,舍弃符号位

        t = t | i;            

        return(t);

}

/******************* T0初始化函数***************/

void timer0_init(void)     

{

        TMOD = 0x01;

        TH0 = (65536-5000)/256;   //0xec;

        TL0 = (65536-5000)%256;  //0x78;

        TR0 = 1;

        EA = 1;

        ET0 = 1;

}

/*****************中断函数**********************/

void timer0_isr(void) interrupt 1             

{

        uchar j;

        TR0 = 0;

        EA = 0;

        TH0 = 0xec;

        TL0 = 0x78;

        TR0 = 1;

        EA = 1;

        i++;

        if(i == 200)   //刚好1秒

   {

        T = Read_Temperature();

        i = 0;

        }

        switch(j)

        {

        case 0:P0 = seven_seg[a*10/16];break;

        case 1:P0 = 0x7f & seven_seg[T%10];break;

        case 2:P0 = seven_seg[T/10];break;

        case 3:if(b & 0x80 == 0x80)P0 = 0xbf;break;

        }

        P2 = seven_bit[j];

        j++;

        if(j == 3) j=0;

}

void main(void)

{

        Init_DS18B20();

        timer0_init();

        while(1)

        {

         if(T >= 35)jdq = 0;

         else jdq = 1;

        }

}     

    三、仿真

思考题

1. 请在本节程序的基础上进行修改,用继电器模拟某个电器的开关如空调,使DS18B20转换的温度值精确到小数点后三位,当环境温度高于某个值时闭合继电器以启动空调制冷,并在实验板上面进行验证。

2. 编写程序并在实验板上实现在一个IO口上接有两个DS18B20的时候如何读取这两个DS18B20的温度值。

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GJZGRB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值