DS18B20的工作原理及应用可编辑修改word版.docx

上传人:b****3 文档编号:3894948 上传时间:2022-11-26 格式:DOCX 页数:33 大小:271.74KB
下载 相关 举报
DS18B20的工作原理及应用可编辑修改word版.docx_第1页
第1页 / 共33页
DS18B20的工作原理及应用可编辑修改word版.docx_第2页
第2页 / 共33页
DS18B20的工作原理及应用可编辑修改word版.docx_第3页
第3页 / 共33页
DS18B20的工作原理及应用可编辑修改word版.docx_第4页
第4页 / 共33页
DS18B20的工作原理及应用可编辑修改word版.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

DS18B20的工作原理及应用可编辑修改word版.docx

《DS18B20的工作原理及应用可编辑修改word版.docx》由会员分享,可在线阅读,更多相关《DS18B20的工作原理及应用可编辑修改word版.docx(33页珍藏版)》请在冰豆网上搜索。

DS18B20的工作原理及应用可编辑修改word版.docx

DS18B20的工作原理及应用可编辑修改word版

1.DS18B20的工作原理

●①DS18B20数字温度传感器概述

●DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

DS18B20产品的特点

●只要求一个端口即可实现通信。

●在DS18B20中的每个器件上都有独一无二的序列号。

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

●测量温度范围在-55.C到+125.C之间。

●数字温度计的分辨率用户可以从9位到12位选择。

●内部有温度上、下限告警设置。

TO-92封装的DS18B20的引脚排列见右图,其引脚功能描述见表

序号

名称

引脚功能描述

1

GND

地信号

2

DQ

数字输入输出引脚,开漏单总线接口引脚,当使用寄生电源时,可向电源提供电源

3

VDD

可选择的VDD引脚,当工作于寄生电源时,该引脚必须接地

表3-2DS18B20详细引脚功能描述

②DS18B20的内部结构

DS18B20的内部框图下图所示,DS18B20的内部有64位的ROM单元,和9字节的暂存器单元。

64位ROM存储器件独一无二的序列号。

暂存器包含两字节(0和1字节)的温度寄存器,用于存储温度传感器的数字输出。

暂存器还提供一字节的上线警报触发(TH)和下线警报触发(TL)寄存器(2和3字节),和一字节的配置寄存器(4字节),使用者可以通过配置寄存器来设置温度转换的精度。

暂存器的5、6和7字节器件内部保留使用。

第八字节含有循环冗余码(CRC)。

使用寄生电源时,DS18B20不需额外的供电电源;当总线为高电平时,功率由单总线上的上拉电阻通过DQ引脚提供;高电平总线信号同时也向内部电容CPP充电,CPP在总线低电平时为器件供电。

(字节5~8就不用看了)。

图为暂存器

A.温度寄存器(0和1字节)

DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:

用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

DS18B20的温度操作是使用16位,也就是说分辨率是0.0625。

BIT15~BIT11是符号位,为了就是表示转换的值是正数还是负数。

█要求出正数的十进制值,必须将读取到的LSB字节,MSB字节进行整合处理,然后乘以0.0625即可。

Eg:

假设从,字节0读取到0xD0赋值于Temp1,而字节1读取到0x07赋值于Temp2,然后求出十进制值。

unsignedintTemp1,Temp2,Temperature;Temp1=0xD0;//低八位

Temp2=0x07;//高八位

Temperature=((Temp2<<8)|Temp1)*0.0625;//又或者Temperature=(Temp1+Temp2*256)*0.0625;//Temperature=125

█在这里我们遇见了一个问题,就是如何求出负数的值呢?

很遗憾的,单片机不像人脑那样会心算,我们必须判断BIT11~15是否是1,然后人为置一负数标志。

Eg.假设从,字节0读取到0x90赋值于Temp1,而字节1读取到0xFC赋值于Temp2,然后求出该值是不是负数,和转换成十进制值。

unsignedintTemp1,Temp2,Temperature;unsignedcharMinus_Flag=0;

Temp1=0x90;//低八位Temp2=0xFC;//高八位

//Temperature=(Temp1+Temp2*256)*0.0625;//Temperature=64656

//很明显不是我们想要的答案if(Temp2&0xFC)//判断符号位是否为1

{

Minus_Flag=1;//负数标志置一

Temperature=((Temp2<<8)|Temp1)//高八位第八位进行整合Temperature=((~Temperature)+1);//求反,补一

Temperature*=0.0625;//求出十进制

}//Temperature=55;else

{

Minus_Flag=0;

Temperature=((Temp2<<8)|Temp1)*0.0625;

}

█如果我要求出小数点的值的话,那么我应该这样做。

Eg:

假设从,字节0读取到0xA2赋值于Temp1,而字节1读取到0x00赋值于Temp2,然后求出十进制值,要求连同小数点也求出。

unsignedintTemp1,Temp2,Temperature;Temp1=0x90;//低八位

Temp2=0xFC;//高八位

//实际值为10.125

//Temperature=((Temp2<<8)|Temp1)*0.0625;//10,无小数点Temperature=((Temp2<<8)|Temp1)*(0.0625*10);//101,一位小数点

//Temperature=((Temp2<<8)|Temp1)*(0.0625*100);//1012,二位小数点

█如以上的例题,我们可以先将0.0625乘以10,然后再乘以整合后的Temperature变量,就可以求出后面一个小数点的值(求出更多的小数点,方法都是以此类推)。

得出的结果是101,然后再利用简单的算法,求出每一位的值。

unsingedcharTen,One,Dot1Ten=Temperature/100;//1One=Temperature%100/10;//0Dot1=%10;//1

求出负数的思路也一样,只不过多出人为置一负数标志,求反补一的动作而已。

自己发挥想象力吧。

B.字节2~3:

TH和TL配置

TH与TL就是所谓的温度最高界限,和温度最低界限的配置。

其实这些可以使用软件来试验,所以就

无视了。

C字节4:

配置寄存器

BIT7出厂的时候就已经设置为0,用户不建议去更改。

而R1与R0位组合了四个不同的转换精度,00为9位转换精度而转换时间是93.75ms,01为10位转换精度而转换时间是187.5ms,10为11位转换精度而转换时间是375ms,11为12位转换精度而转换时间是750ms(默认)。

该寄存器还是留默认的好,毕竟转换精度表示了转换的质量。

低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。

在DS18B20出厂时该位被设置为0,用户不要去改动。

R1和R0用来设置分辨率,如下表所示:

(DS18B20出厂时被设置为12位)

表3-6R1与R0确定传感器分辨率设置表

R1

R0

传感器精度/bit

转换时间/ms

0

0

9

93.75

0

1

10

187.5

1

0

11

375

1

1

12

750

D.字节5~7,8:

保留位,CRC无视,无视吧。

③光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。

64位光刻ROM的排列是:

开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。

光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

④DS18B20温度传感器的存储器

DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

2DS18B20的工作过程

DS18B20一般都是充当从机的角色,而单片机就是主机。

单片机通过一线总线访问DS18B20的话,需要经过以下几个步骤:

①DS18B20复位(初始化),DS18B20复位。

在某种意义上就是一次访问DS18B20的开始,或者可说成是开始信号。

②执行ROM指令(ROM命令跟随着需要交换的数据);ROM指令,也就是访问,搜索,匹配,DS18B20个别的64位序列号的动作。

在单点情况下,可以直接跳过ROM指令。

而跳过ROM指令的字节是0xCC

③执行DS18B20功能指令(RAM指令),功能命令跟随着需要交换的数据。

DS18B20功能指令有很多种,我就不一一的介绍了,数据手册里有更详细的介绍。

这里仅列出比较常用的几个DS18B20功能指令。

0x44:

开始转换温度。

转换好的温度会储存到暂存器字节0和1。

0xEE:

读暂存指令。

读暂存指令,会从暂存器0到9,一个一个字节读取,如果要停止的话,必须写下DS18B20复位。

访问DS18B20必须严格遵守这一命令序列,如果丢失任何一步或序列混乱,DS18B20都不会响应主机

(除了SearchROM和AlarmSearch这两个命令,在这两个命令后,主机都必须返回到第一步)。

一般上我们都是使用单点,也就是说单线总线上仅有一个DS18B20存在而已。

所以我们无需刻意读取ROM里边的序列号来,然后匹配那个DS18B20?

而是更直接的,跳过ROM指令,然后直接执行DS18B20功能指令。

a.初始化,DS18B20复位:

在初始化过程中,主机通过拉低单总线至少480µs,以产生复位脉冲(TX)。

然后主机释放总线并进入接收(RX)模式。

当总线被释放后,5kΩ的上拉电阻将单总线拉高。

DS18B20检测到这个上升沿后,延时15µs~60µs,通过拉低总线60µs~240µs产生应答脉冲。

初始化波形如图3-8所示。

DS18B20的复位时序如下:

1.单片机拉低总线480us~950us,然后释放总线(拉高电平)。

2.这时DS18B20会拉低信号,大约60~240us表示应答。

3.DS18B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示复位成功。

4.DS18B20拉低电平60~240us之后,会释放总线。

C语言代码:

//DS1302复位函数

voidDS1302_Reset()

{

DDRA|=BIT(DQ);//DQ为输出状态PORTA&=~BIT(DQ);//输出低电平Delay_1us(500);//延迟500微妙PORTA|=BIT(DQ);//示范总线Delay_1us(60);//延迟60微妙DDRA&=~BIT(DQ);//DQ位输出状态

while(PINA&BIT(DQ));//等待从机DS18B20应答(低电平有效)

while(!

(PINA&BIT(DQ)));//等待从机DS18B20释放总线

}

DS18B20所有的数据交换都由一个初始化序列开始。

由主机发出的复位脉冲和跟在其后的由DS18B20发出的应答脉冲构成。

当DS18B20发出响应主机的应答脉冲时,即向主机表明它已处在总线上并且准备工作。

b.ROM命令:

ROM命令通过每个器件64-bit的ROM码,使主机指定某一特定器件(如果有多个器件挂在总线上)与之进行通信。

DS18B20的ROM如表3-4所示,每个ROM命令都是8bit长。

c.功能命令:

主机通过功能命令对DS18B20进行读/写Scratchpad存储器,或者启动温度转换。

DS18B20的功能命令如表3-7所示。

指令

协议

功能

读ROM

33H

读DS18B20中的编码(即64位地址)

符合ROM

55H

发出此命令后,接着发出64位ROM编码,访问单总线上与

该编码相对应的DS18B20,使之作出响应,为下一步对该DS18B20的读写作准备

搜索ROM

0F0H

用于确定挂接在同一总线上DS18B20的个数和识别64位

ROM地址,为操作各器件作好准备

跳过ROM

0CCH

忽略64位ROM地址,直接向DS18B20V温度转换命令,适

用于单个DS18B20工作

报警搜索命

0ECH

执行后,只有温度超过庙宇值上限或下限的片子才做出响

温度转换

44H

启动DS18B20进行温度转换,转换时间最长为500ms(典型

为200ms),结果丰入内部9字节RAM中

读暂存器

BEH

读内部RAM中9字节的内容

写暂存器

4EH

发出向内部RAM的第3、4字节写上、下温度数据命令,紧

该温度命令之后,传达两字节的数据

复制暂存器

48H

将RAM中第3、4字内容复制到E2PROM中

重调E2PROM

0B8H

将E2PROM中内容恢复到RAM中的第3、4字节

读供电方式

0B4H

读DS18B20的供电模式,寄生供电时DS18B20发送“0”,

外部供电时DS18B20发送“1”

表3-7

(6)DS18B20的信号方式

DS18B20采用严格的单总线通信协议,以保证数据的完整性。

该协议定义了几种信号类型:

复位脉冲、应答脉冲、写0、写1、读0和读1。

除了应答脉冲所有这些信号都由主机发出同步信号。

总线上传输的所有数据和命令都是以字节的低位在前。

a.初始化序列:

复位脉冲和应答脉冲

在初始化过程中,主机通过拉低单总线至少480µs,以产生复位脉冲(TX)。

然后主机释放总线并进入接收(RX)模式。

当总线被释放后,5kΩ的上拉电阻将单总线拉高。

DS18B20检测到这个上升沿后,延时15µs~60µs,通过拉低总线60µs~240µs产生应答脉冲。

初始化波形如图3-8所示。

b.读和写时序

在写时序期间,主机向DS18B20写入指令;而在读时序期间,主机读入来自DS18B20的指令。

在每一个时序,总线只能传输一位数据。

读/写时序如图3-9所示。

l写时序

存在两种写时序:

“写1”和“写0”。

主机在写1时序向DS18B20写入逻辑1,而在写0时序向DS18B20写入逻辑0。

所有写时序至少需要60µs,且在两次写时序之间至少需要1µs的恢复时间。

两种写时序均以主机拉低总线开始。

产生写1时序:

主机拉低总线后,必须在15µs内释放总线,然后由上拉电阻将总线拉至高电平。

产生写0时序:

主机拉低总线后,必须在整个时序期间保持低电平(至少60µs)。

在写时序开始后的15µs~60µs期间,DS18B20采样总线的状态。

如果总线为高电平,则逻辑1被写入

DS18B20;如果总线为低电平,则逻辑0被写入DS18B20。

l写时序

DS18B20写逻辑0的步骤如下:

1.单片机拉低电平大约10~15us,。

2.单片机持续拉低电平大约20~45us的时间。

3.释放总线

DS18B20写逻辑1的步骤如下:

1.单片机拉低电平大约10~15us,。

2.单片机拉高电平大约20~45us的时间。

3.释放总线

写时序

 

DS18B20读逻辑0的步骤如下:

1.在读取的时候单片机拉低电平大约1us

2.单片机释放总线,然后读取总线电平。

3.这时候DS18B20会拉低电平。

4.读取电平过后,延迟大约40~45微妙

DS18B20读逻辑1的步骤如下:

1.在读取的时候单片机拉低电平大约1us

2.单片机释放总线,然后读取总线电平。

3.这时候DS18B20会拉高电平。

4.读取电平过后,延迟大约40~45微妙

如果要读或者写一个字节,就要重复以上的步骤八次。

如以下的C代码,使用for循环,和数据变量的左移和或运算,实现一个字节读与写。

//DS18B20写字节函数

voidDS1302_Write(unsignedcharData)

{

unsignedchari;DDRA|=BIT(DQ);//DQ为输出

for(i=0;i<8;i++)

{

PORTA&=~BIT(DQ);//拉低总线

Delay_1us(10);//延迟10微妙(最大15微妙)

if(Data&0x01)PORTA|=BIT(DQ);elsePORTA&=~BIT(DQ);

Delay_1us(40);//延迟40微妙(最大45微妙)

PORTA|=BIT(DQ);//释放总线Delay_1us

(1);//稍微延迟Data>>=1;

}

}

//DS18B20读字节函数

unsignedcharDS1302_Read()

{

unsignedchari,Temp;for(i=0;i<8;i++)

{

Temp>>=1;//数据右移DDRA|=BIT(DQ);//DQ为输出状态

PORTA&=~BIT(DQ);//拉低总线,启动输入PORTA|=BIT(DQ);//释放总线DDRA&=~BIT(DQ);//DQ为输入状态if(PINA&BIT(DQ))Temp|=0x80;

Delay_1us(45);//延迟45微妙(最大45微妙)

}

returnTemp;

}

就是这么建档而已,不过这里有一个注意点,就是Delay_1us();函数延迟的时间,必须模拟非常

确,因为单线总线对时序的要求敏感点。

DS18B20只能在主机发出读时序时才能向主机传送数据。

所以主机在发出读数据命令后,必须马上产生读时序,以便DS18B20能够传送数据。

所有读时序至少60µs,且在两次独立的读时序之间至少需要1µs的恢复时间。

每次读时序由主机发起,拉低总线至少1µs。

在主机发起读时序之后,DS18B20开始在总线上传送1或0。

若DS18B20发送1,则保持总线为高电平;若发送0,则拉低总线。

当传送0时,DS18B20在该时序结束时释放总线,再由上拉电阻将总线拉回空闲高电平状态。

DS18B20发出的数据在读时序下降沿起始后的15µs内有效,因此主机必须在读时序开始后的15µs内释放总线,并且采样总线状态。

DS18B20在使用时,一般都采用单片机来实现数据采集。

只需将DS18B20信号线与单片机1位I/O线相连,且单片机的1位I/O线可挂接多个DS18B20,就可实现单点或多点温度检测。

(7)DS18B20的温度计算

DS18B20允许通过程序对传感器的分辨率,温度报警的上、下限等参数进行配置。

它的内部存储器包括一个高速暂存存储器和一个非易失性可擦除E²PROM。

速暂存存储器共有8个字节(byte),每个字节8位(bit)。

根据温度的计算方法如下:

SSSSS=11111b温度值:

T=[(MSBand7)×256+LSB]×0.0625℃

SSSSS=00000b温度值:

T=-[(256-MSB)×256-LSB]×0.0625℃

如果,存储器高位寄存器MS的SSSSS均为1,则被测温度为正值,用上面第1个公式来计算温度。

如果存储器高位寄存器MSB的SSSSS均为0,则被测温度为负值,用上面第2个公式来计算温度在。

这里,有两点应当注意:

一是公式中中括号内的数值为二进制,在计算口号内计算完成后应转化为十进制;二是这里的7与0.0625是假设传感器的分辨率设置0.0625时的计算值。

如果分辨率的设置值不是0.0625,那么就应当作相应的变化。

第3和第4个字节分别用来存放温度报警的上限(TH)和下限值(TL)。

DS18B20在完成温度变换后,会将所测温度值与贮存在TH和TL内的上下限值相比较,如果测温结果高于TH或低于TL,DS18B20内部的告警标志就会被置位,表示温值超出了测量范围。

并且该值在掉电后不会丢失,而是记忆其设定的上下限值。

第5字节是配置寄存器,如表2.3所示,该寄存器用于对温度转换值的分辨率进行设置。

其中,最高位用于设置传感器是工作模式还是测试模式,是生产厂家为便于检验使

用。

其出厂时的默认值为0,为工作模式(即用户使用时的模式)。

并且在用户使用中,该位总是保持为0。

R1与R0确定传感器的分辨率,如表2.4所示,DS18B20有4种分辨率可供选择。

使用时可以根据实际需要来设置,出厂时的默认设置是12位。

最后5位总保持为1

简单归纳

实验开始之前,简单的归纳一些重点。

单线总线高电平为闲置状态。

单片机访问DS18B20必须遵守,DS18B20复位-->执行ROM指令-->执行DS18B20功能指令。

而在单点上,可以直接跳过ROM指令。

DS18B20的转换精度默认为12位,而分辨率是0.0625。

DS18B20温度读取函数参考步骤:

DS18B20开始转换:

1.DS18B20复位。

2.写入跳过ROM的字节命令,0xCC。

3.写入开始转换的功能命令,0x44。

4.延迟大约750~900毫秒DS18B20读暂存数据:

1.DS18B20复位。

2.写入跳过ROM的字节命令,0xCC。

3.写入读暂存的功能命令,0xee。

4.读入第0个字节LSByte,转换结果的低八位。

5.读入第1个字节MSByte,转换结果的高八位。

6.DS18B20复位,表示读取暂存结束。

数据求出十进制:

1.整合LSByte和MSByte的数据

2.判断是否为正负数(可选)

3.求得十进制值。

正数乘以0.0625,一位小数点乘以0.625,二位小数点乘以6.25。

4.十进制的“个位”求出。

ds18b20c程序

//DS1820C51子程序

//这里以11.0592M晶体为例,不同的晶体速度可能需要调整延时的时间

//sbitDQ=P2^1;//根据实际情况定义端口

typedefunsignedcharbyte;typedefunsignedintword;

//延时

voiddelay(worduseconds)

{

for(;useconds>0;useconds--);

}

//复位

byteow_reset(void)

{

bytepresence;

DQ=0;//pullDQlinelow时序中delay(29);//leaveitlowfor480us

DQ=1;//

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1