DS18B20的工作原理及应用可编辑修改word版.docx
- 文档编号:3894948
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:33
- 大小:271.74KB
DS18B20的工作原理及应用可编辑修改word版.docx
《DS18B20的工作原理及应用可编辑修改word版.docx》由会员分享,可在线阅读,更多相关《DS18B20的工作原理及应用可编辑修改word版.docx(33页珍藏版)》请在冰豆网上搜索。
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;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20 工作 原理 应用 编辑 修改 word