第11章 使用ds18b20温度传感器测温_第1页
第11章 使用ds18b20温度传感器测温_第2页
第11章 使用ds18b20温度传感器测温_第3页
第11章 使用ds18b20温度传感器测温_第4页
第11章 使用ds18b20温度传感器测温_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论