光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
<2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
DS18B20内部结构主要由四部分组成:
64位光刻ROM,温度传感器,温度报警触发器TH和TL,配置寄存器。
DS18B20内部结构图如图4.5所示。
4.3.2存储器
DS18B20的存储器包括高速暂存器RAM和可电擦除RAM,可电擦除RAM又包括温度触发器TH和TL,以及一个配置寄存器。
存储器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器,接着也可以用读寄存器的命令来确认这些数字。
当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除RAM中。
当修改过寄存器中的数时,这个过程能确保数字的完整性。
高速暂存器RAM是由8个字节的存储器组成;第一和第二个字节是温度的显示位。
第三和第四个字节是复制TH和TL,同时第三和第四个字节的数字可以更新;第五个字节是复制配置寄存器,同时第五个字节的数字可以更新;六、七、八三个字节是计算机自身使用。
用读寄存器的命令能读出第九个字节,这个字节是对前面的八个字节进行校验。
存储器的结构图如图4.6所示。
64位光刻ROM的前8位是DS18B20的自身代码,接下来的48位为连续的数字代码,最后的8位是对前56位的CRC校验。
64-位的光刻ROM又包括5个ROM的功能命令:
读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。
64-位光刻ROM的结构图如图4.7所示。
4.3.4DS18B20外部电源的连接方式
DS18B20可以使用外部电源VDD,也可以使用内部的寄生电源。
当VDD端口接3.0V—5.5V的电压时是使用外部电源;当VDD端口接地时使用了内部的寄生电源。
无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。
连接图如图4.8、图4.9所示。
.4.1配置寄存器
配置寄存器是配置不同的位数来确定温度和数字的转化。
配置寄存器的结构图如图4.10所示。
图4.10配置寄存器的结构图
由图4.9可以知道R1,R0是温度的决定位,由R1,R0的不同组合可以配置为9位,10位,11位,12位的温度显示。
这样就可以知道不同的温度转化位所对应的转化时间,四种配置的分辨率分别为0.5℃,0.25℃,0.125℃和0.0625℃,出厂时以配置为12位。
温度的决定配置图如图8所示。
4.3.4.2温度的读取
DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度,还需要判断正负。
前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。
16位数字摆放是从低位到高位,温度的关系图如图4.12所示。
4.3.4.3.DS18B20控制方法
指令约定代码操作说明
温度转换44H启动DS18B20进行温度转换
读暂存器BEH读暂存器9个字节内容
写暂存器4EH将数据写入暂存器的TH、TL字节
复制暂存器48H把暂存器的TH、TL字节写到E2RAM中
重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节
读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU
4.3.4.4DS18B20的初始化
<1)先将数据线置高电平“1”。
<2)延时<该时间要求的不是很严格,但是尽可能的短一点)
<3)数据线拉到低电平“0”。
<4)延时750微秒<该时间的时间范围可以从480到960微秒)。
<5)数据线拉到高电平“1”。
<6)延时等待<如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
<7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起<第<5)步的时间算起)最少要480微秒。
<8)将数据线再次拉高到高电平“1”后结束。
4.3.4.5DS18B20的写操作
<1)数据线先置低电平“0”。
<2)延时确定的时间为15微秒。
<3)按从低位到高位的顺序发送字节<一次只发送一位)。
<4)延时时间为45微秒。
<5)将数据线拉到高电平。
<6)重复上<1)到<6)的操作直到所有的字节全部发送完为止。
<7)最后将数据线拉高。
图4.14DS18B20的写操作时序图
4.3.4.6DS18B20的读操作
<1)将数据线拉高“1”。
<2)延时2微秒。
<3)将数据线拉低“0”。
<4)延时15微秒。
<5)将数据线拉高“1”。
<6)延时15微秒。
<7)读数据线的状态得到1个状态位,并进行数据处理。
<8)延时30微秒。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////应用介绍//////////////////////////////////////////////
DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持“一线总线”接口的温度传感器。
一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
DS18B20、DS1822“一线总线”数字化温度传感器同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
DS1822的精度较差为±2°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小。
DS18B20、DS1822的特性DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。
可选更小的封装方式,更宽的电压适用范围。
分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20的性能是新一代产品中最好的!
性能价格比也非常出色!
DS1822与DS18B20软件兼容,是DS18B20的简化版本。
省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。
继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。
DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。
DS18B20的内部结构
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列如下:
DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端<在寄生电源接线方式时接地)。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
64位光刻ROM的排列是:
开始8位<28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:
用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。
DS18B20温度传感器的存储器
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。
暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。
第三个和第四个字节是TH、TL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。
第六、七、八个字节用于内部计算。
第九个字节是冗余检验字节。
该字节各位的意义如下:
TMR1R011111
低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要去改动。
R1和R0用来设置分辨率,如下表所示:
分辨率设置表:
R1
R0
分辨率
温度最大转换时间
0
0
9位
93.75ms
0
1
10位
187.5ms
1
0
11位
375ms
1
1
12位
750ms
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:
每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
DS1820使用中注意事项
DS1820虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
(1>较小的硬件开销需要相对复杂的软件进行补偿,因为DS1820与微处理器间采用串行数据传送,因此,在对DS1820进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。
在使用PL/M、C等高级语言进行系统程序设计时,对DS1820操作部分最好采用汇编语言实现。
(2>在DS1820的有关资料中均未提及单总线上所挂DS1820数量问题,容易使人误认为可以挂任意多个DS1820,在实际应用中并非如此。
当单总线上所挂DS1820超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。
(3>连接DS1820的总线电缆是有长度限制的。
实验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。
当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每M绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。
这种情况主要是由总线分布电容使信号波形产生畸变造成的。
因此,在用DS1820进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。
(4>在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。
这一点在进行DS1820硬件连接和软件设计时也要给予一定的重视。
测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。
点击这里可以下载到DS18B20的原厂英文资料
这是我们用网站提供的AT89C51实验开发板做的温度测量实验,DS18B20的正电源就是红线接+5伏,兰线接地,棕色线接P2.2,<注意:
四位拨码开关的第3位不能处于ON的位置,否则实验无法成功!
)+5V和信号线之间有一个4.7K的上拉电阻,硬件就这么简单,网友可以加15元向我邮购DS18B20测温电缆,可以直接插在实验板上,就能使用。
//////////////////////////////ds18b20模块////////////////////////////////////////////////////
DS18B20是美国DALLAS半导体公司生产的可组网的一线式数字温度传感器,因为DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
以下是常见的DS18B20的测温程序,其正确性笔者已经通过仿真实验和实际电路验证过。
在程序设计时,只要将ds18b20.c和主程序放在同一个项目中,且在主程序中包含头文件ds18b20.h即可。
DS18B20头文件:
ds18b20.h
#ifndef__DS18B20_H__
#define__DS18B20_H__
voiddelay_18B20(unsignedinti>。
Init_DS18B20(void>。
ReadOneChar(void>。
WriteOneChar(unsignedchardat>。
ReadTemperature(void>。
#endif
测温C程序:
ds18b20.c
#include
sbitDQ=P1^0。
//定义通信端口
unsignedcharsign。
voiddelay_18B20(unsignedinti>
{
while(i-->。
}
//初始化函数
Init_DS18B20(void>
{
unsignedcharx=0。
DQ=1。
//DQ复位
delay_18B20(8>。
//稍做延时
DQ=0。
//单片机将DQ拉低
delay_18B20(80>。
//精确延时大于480us
DQ=1。
//拉高总线
delay_18B20(14>。
x=DQ。
//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20>。
}
//读一个字节
ReadOneChar(void>
{
unsignedchari=0。
unsignedchardat=0。
for(i=8。
i>0。
i-->
{
DQ=0。
//给脉冲信号
dat>>=1。
DQ=1。
//给脉冲信号
if(DQ>
dat|=0x80。
delay_18B20(4>。
}
return(dat>。
}
//写一个字节
WriteOneChar(unsignedchardat>
{
unsignedchari=0。
for(i=8。
i>0。
i-->
{
DQ=0。
DQ=dat&0x01。
delay_18B20(5>。
DQ=1。
dat>>=1。
}
}
//读取温度
ReadTemperature(void>
{
unsignedchara=0。
unsignedcharb=0。
unsignedintt=0,temp=0。
Init_DS18B20(>。
WriteOneChar(0xCC>。
//跳过读序号列号的操作
WriteOneChar(0xBE>。
//读取温度寄存器等<共可读9个寄存器)前两个就是温度
delay_18B20(100>。
a=ReadOneChar(>。
b=ReadOneChar(>。
Init_DS18B20(>。
WriteOneChar(0xCC>。
//跳过读序号列号的操作
WriteOneChar(0x44>。
//启动温度转换
//传感器返回值除16得实际温度值
//为了得到2位小数位,先乘100,再除16,考虑整型数据长度,
//技巧处理后先乘25,再除4,除4用右移实现
temp=b&0xf0。
if(temp==0xf0>
{
sign=0x40。
a=~a。
b=~b。
}
else
sign=0x3f。
b=b&0x0f。
t=(b*256+a>*25/4。
return(sign,t>。
}
/////////////////////////////////////////////////////////网上程序//////////////////////////////////////////////////
就算是用软件的方式提高精度也只是虚拟的温度,18B20精度就是0.0625度,符合你的要求了,下面是我写的程序,有兴趣你可以参考一下。
带报警设置
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetabl