DS18B20操作时序详解

合集下载

ds18b20使用简介

ds18b20使用简介

现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是1、主机先作个复位操作,2、主机再写跳过ROM的操作(CCH)命令,3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。

在这里要注意的是每个命令字节在写的时候都是低字节先写//1111111111111111111111111111111111111111111111111111111111111111111111111111111111111读取RAM内的温度数据。

同样,这个操作也要接照三个步骤。

1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。

2、主机发出跳过对ROM操作的命令(CCH)。

3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。

如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。

同样读取数据也是低位在前的。

整个操作的总线状态如下图:.初始化时序初始化时序:Muc :写0:拉低,480us(mimium)~960us(maxium) 释放总线15——60us Ds18b20 :写0:拉低,60~120us,总的应答时序(minimum)为480usMcu写18b20先拉高总线电平:写0,拉低电平60us~120us,(前15us,稳定数据,后45us供ds18b20采样) 先拉高总线电平:写1,拉低电平(1~15us),再拉高总线(在15us内必须让高点平稳定,后45us供ds18b20采样)Mcu 读18b20Ds18b20向mcu写入数据Mcu将总线拉高:写0:ds18b20拉低电平15us,后45us释放总线(mcu必须在15us内完成采样,自己规定11us时采样),Mcu将总线拉高:写1:ds18b20拉总线1us,之后释放总线,(mcu必须在15us内完成采样),///注:所有的数据读取都是从低位开始。

DS18B20的使用法解析

DS18B20的使用法解析


DS18B20共有三种形态的存储器资源:
1、ROM 只读存储器,用于存放DS18B20的ID编码,其前8 位是单线系列编码(DS18B20的是 28H),后面48位是芯 片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。 数据在出产时设置不由用户更改。DS18B20共64位ROM。
2、RAM 数据暂存器,用于内部计算和数据存取,数据在掉 电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、 2个字节是温度转换后的数据值(温度寄存器),第3、4个字 节是用户EEPROM(温度报警值TH、TL储存)的镜像。在上 电复位时其值将被刷新。第5个字节则是用户第3个EEPROM 的镜像(配置寄存器)。第6、7、8个字节为计数寄存器,是 为了让用户得到更高的温度分辨率而设计的,同样也是内部温 度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。 3、EEPROM 非易失性记忆体,用于存放长期需要保存的数 据,上下限温度报警值和校验数据,DS18B20共3位 EEPROM,并在RAM都存在镜像,以方便用户操作。
这是向RAM中写入数据的指令,随后写入的两 个字节的数据将会被存到地址2(报警RAM之TH) 和地址3(报警RAM之TL)。写入过程中可以用复 位信号中止写入。
Read Scratchpad (从RAM中读数据)[BEH]
此指令从RAM中读数据,读地址从地址0开始, 一直可以读到地址9,完成整个RAM数据的读出。芯 片允许在读过程中用复位信号中止读取,即可以不 读后面不需要的字节以减少读取时间。
Read Power Supply(工作方式切换)[B4H]
此指令发出后发出读时间隙,芯片会返回它的 电源状态字,“0”为寄生电源状态,“1”为外部 电源状态。

18B20工作时序

18B20工作时序

DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括:初始化时序、写时序、读时序。

初始化时序DS18B20初始化时序主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答,若无低电平出现一直都是高电平说明总线上无器件应答。

作为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备,若没有检测到就一直在检测等待。

对DS18B20的写和读操作接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程,因此首先要搞清楚主机是如何进行写0、写1、读0和读1的。

写周期最少为60微秒,最长不超过120微秒,写周期一开始作为主机先把总线拉低1微秒表示写周期开始,随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。

而作为从机的DS18B20则在检测到总线被拉低后等待15微秒然后从15μs到45μs开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

DS18B20写操作对于读数据操作时序也分为读0时序和读1时序两个过程,读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。

DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若要送出1则释放总线为高电平。

主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0,采样期内总线为高电平则确认为1,完成一个读时序过程,至少需要60μs才能完成。

温度传感器DS18B20检测程序说明

温度传感器DS18B20检测程序说明

DS18B20美国达拉斯公司生产的单总线协议的数字温度检测芯片,数据的写入与读取都在一根总线上进行操作,在总线上可以连接多个DS18B20,因为每个DS18B20都有唯一的光刻ROM序列号,所以可以进行ROM匹配,搜索指令进行选择相应的从机序列号。

编写DS18B20的检测程序主要包括:初始化函数(复位脉冲+存在脉冲),写数据函数,读取数据的函数。

对DS18B20的操作包括:初始化函数,ROM指令,RAM指令这三个部分。

接下来我先说一下这三个部分所对应的时序图的理解吧。

初始化:由于上拉电阻的存在,总线默认状态是高电平,接着主机将总线拉低,维持480us 到960us的时间,再接着就是释放总线,维持时间为15us到60us,接着就由从机发出一个低电平信号,将总线拉低,表示该DS18B20是正常地,或者说是存在的,其维持时间为60us 到240us。

上面一图是写入数据的时序图。

写时序:默认状态为高电平,先将总线拉低,至少维持1us 的延时时间,接着就往总线上进行写数据操作,接着DS18B20就开始采样数据了,整个过程时间为60us到120us。

下面一图是读取数据的时序图。

读时序:默认状态为高电平,先将总线拉低,接着在15us 之前,主机进行数据采样,其维持时间也为60us到120us。

下面是我在理解了DS18B20的原理之后所写的程序,调试成功了,且能实时读取外界温度的功能,这里是不读取小数部分的温度,只读取温度的正数值。

#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit DQ=P2^2;sbit duan=P2^6;sbit wei=P2^7;//是在11.0592M赫兹的频率下void delay_ms(uint t){uint i;for(;t>0;t--)for(i=110;i>0;i--);} //约为tms的延时程序void delay(uint x){while(x--);}void init_ds18b20(){uchar n;DQ=1;delay(2); //约为38usDQ=0;delay(80); //约为800usDQ=1;delay(4); //约为58usn=DQ;delay(10); //约为110us}void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0; //无论是写0或写1都要有至少1us的低电平DQ=dat&0x01;//总线直接等于写入的数据(低位在前,高位在后)delay(4); //约为58usDQ=1; //释放总线,为下一步的数据变换做准备dat>>=1;//数据进行移位操作}delay(4);}uchar read_byte(){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1; //移位7次DQ=1; //先要释放总线,那样才能采样到有效数据if(DQ) //判断8次{value|=0x80;}delay(6); //约为78us}return value;}uchar read_temperature(){uchar a,b;init_ds18b20(); //每次操作指令前,都必须进行初始化设置write_byte(0xcc);//跳过ROM指令write_byte(0x44);//进行温度转换处理delay(300);//进行一定地延时约为3ms左右init_ds18b20();write_byte(0xcc);//跳过ROM操作write_byte(0xbe);//读取温度a=read_byte();//温度低字节b=read_byte();//温度高字节b<<=4;//b左移四位,低四位为0000b=b+(a&0xf0)>>4;//将a的低四位屏蔽,不取小数点,进行右移四位,合并成一个字节的数据return b;}void display(uchar aa,uchar bb) {duan=1;P0=table[aa];duan=0;P0=0xff;wei=1;P0=0xfe;wei=0;delay_ms(5);duan=1;P0=table[bb];duan=0;P0=0xff;wei=1;P0=0xfd;wei=0;delay_ms(5);}void main(){uchar num,shi,ge;while(1){num=read_temperature();shi=num/10; //分离出十位ge=num%10; //分离出个位display(shi,ge);}}。

DS18b20(时序)

DS18b20(时序)

Ds18b20在ds18b20中有很多的应用(需要的话需要在书或者在网上查找资料),这里只进行简单的温度测试应用。

(这里的延时是很严厉的)1、复位:程序先将out拉低,然后延时一段时间(在下面有个图)再将out拉高,延时一段时间,之后再读取存在信号,将存在信号返回(0表示器件存在,1表示器件不存在)。

uchar reset () //复位{uchar existpulse;out = 0;delay_1820 (30);out = 1;delay_1820 (3);existpulse = out;delay_1820 (30);return existpulse;}2、位写入函数:拉低数据线out开始写时间隙。

然后,如果写入的是1,则out=1;如果写入的是0,则out=0,之后需要延时是之在时间隙内保持电平值。

最后拉高out。

void wbit (uchar value)//写一位值{out = 0;if (value == 1)out = 1;elseout = 0;delay_1820 (5);out = 1;}3、字节写入函数:一个字节8位,利用位写入函数一个一个的写入。

void wbyte (uchar value) //写字节{uchar i, temp;for (i=0; i<8; ++i){temp = value >> i;temp = temp & 0x01;wbit (temp);delay_1820 (5);}}4、位读取函数:程序首先拉低数据线out开始读时间隙,然后再将out置1.延时一段时间将out的值读出来,最后将读出来的值返回。

uchar rbit () //读一位数{uchar i;out = 0;out = 1;for (i=0; i<3; i++);/////??????????!!!!!!!!!!!!return out;}5、字节读取函数:一个字节8位,利用位读取函数一个一个的读取。

DS18B20工作原理及时序

DS18B20工作原理及时序

DS18B20 工作原理及时序
DS18B20 原理与分析
DS18B20 是美国DALLAS 半导体公司继DS1820 之后最新推出的一种改进型智能温度传感器。

与传统的热敏电阻相比,他能够直接读出被测温度并且
可根据实际要求通过简单的编程实现9~12 位的数字值读数方式。

可以分别
在93.75 ms 和750 ms 内完成9 位和12 位的数字量,并且从DS18B20 读出的信息或写入DS18B20 的信息仅需要一根口线(单线接口)读写,温度变换功率来
源于数据总线,总线本身也可以向所挂接的DS18B20 供电,而无需额外电
源。

因而使用DS18B20 可使系统结构更趋简单,可靠性更高。

他在测温精
度、转换时间、传输距离、分辨率等方面较DS1820 有了很大的改进,给用
户带来了更方便的使用和更令人满意的效果。

1.DS18B20 简介
(1)独特的单线接口方式:DS18B20 与微处理器连接时仅需要一条口线即可
实现微处理器与DS18B20 的双向通讯。

(2)在使用中不需要任何外围元件。

(3)可用数据线供电,电压范围:+3.0~ +5.5 V。

(4)测温范围:-55 ~+125 ℃。

固有测温分辨率为0.5 ℃。

DS18B20工作过程及时序

DS18B20工作过程及时序

DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。

高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。

初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。

初始时,计数器1预置的是与-55℃DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。

高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。

初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。

初始时,计数器1预置的是与-55℃相对应的一个预置值。

以后计数器1每一个循环的预置数都由斜率累加器提供。

为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。

计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。

DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。

在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。

这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±,即0.25℃。

温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。

测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。

时序解读ds18b20

时序解读ds18b20

分布式测温中传感器时序与温度读取研究(1)2009-02-27 10:12:45 作者:王捷孙德辉来源:微计算机信息关键字:写时序读时序温度传感器温度采集1.引言在分布式测温系统中应用了大量的新型传感器DS18B20,DS18B20是单总线数字温度传感器其硬件接线简单,但时序非常复杂。

要实现温度的正确读取,既要有对DS18B20的ROM操作命令,又有一些功能命令。

这些命令的执行,既有一定顺序,又有特定含义。

都需要基于数字温度传感器初始化时序、写时序和读时序,按照严格的时序配合才能完成温度正确采集与读取。

因此要想正确使用单总线数字温度传感器,必须分析其时序关系,并且基于时序编制正确程序。

单总线数字温度传感器时序分析与应用研究具有及其重要意义。

2.数字温度传感器时序DS18B20与单片机只通过一条数据线连接,所以其数据的传输方式为串行方式。

为了正确读取温度值,必须严格按照时序配合关系,进行程序编制。

DS18B20有严格的通信协议来保证数据传输的正确性和完整性。

通信协议规定了总线上的多种信号的时序。

如:复位脉冲、响应脉冲、写0、写1、读0和读1等信号的时序。

DS18B20是在严格的时序控制下进行正常操作的。

换句话讲,就是用较为复杂的软件来换取简单的硬件接口。

因此要正确使用DS18B20,就必须了解其初始化时序、写时序和读时序。

2.1 数字温度传感器初始化时序初始化时序有时也称复位时序,它是数据线上所有传输过程的开始。

整个初始化过程由主设备发出的复位脉冲和DS18B20的响应脉冲组成。

在主设备初始化的过程中,主设备通过拉低数据线至少480μS,DS18B20即认为是接收到一个初始化脉冲,接着主设备释放数据线,在数据线上上拉电阻的作用下,数据线电平被拉高,并且主设备进入接收模式。

在DS18B20检测到上升沿后,延时15~60μS,接着通过拉低总线60~240μS以产生应答脉冲。

初始化时序如图2所示。

图1是图2、图3和图4的线型示意图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.DS18B20复位程序分析
单片机发送复位脉冲低电平保持至少480us 释放总线进入接收状态,等待15us-60us DS18B20发出存在脉冲脉冲持续60-240us void reset()
{
uint i;//i 定义为uchar型
ds=0;
i=103;
while(i>0)i--;
ds=1;
while(i>0)i--;//在这里不做存在检测
}
2.DS18B20写程序
时序分析:
单片机由高电平拉低至低电平产生写时间隙
15us之后就需要将所需要写的位送到总线上面
DS18B20在开始之后的15-60us内对总线进行采样(注意采样时间)uint dswrite(uchar dat)
{
uchar i;
uint j;
sbit tempbyte;
for(i=0;i<8;i++)
{
tempbyte=dat&0x01;
dat>>=1;//从最低位开始每一位送到tempbyte临时位
//总线拉低为低电平
if(tempbyte)//写1
{
ds=0;
j++;
j++;//延时个13us
ds=1;
j=8;
while(j>0)j--//延时个71us
}
else
{
ds=0;
j=8;
while(j>0)j--;
ds=1;
j++;j++;//保证大于1us-
}
}
}
3.DS18B20读时序
时序分析
单片机从高电平拉低至低电平
低电平保持4us后将总线拉高产生读时间隙
读时间在4us后到15us之前(注意一定在15us之前)读时间才有效从拉低总线60us-120us之间释放总线(注意是在这个时间间隙之间,严格按照时序操作)
bit tempbit()
{
uint j;
bit dat;
ds=0;
j++;//延时个4us
ds=1;
j++;j++;//仿真结果在8.86us左右
dat=ds;//确保在15us之前
j=8;
while(j>0)j--;
ds=1;
return dat;
}
uchar dsread()//用uchar 来装读到的数据足够
{
uchar i,j,dat;
for(i=0;i<8;i++)
{
j=tempbit();
dat=(j<<7)|(dat>>1);//因为首先读到是低位的数据,后面读的数据加到高位,并依
//此往低位挪动}
return dat;
}。

相关文档
最新文档