DS18B20时序详解

合集下载

DS18B20的工作时序

DS18B20的工作时序
DS18B20的复位时序
DS18B20的读时序分为读0时序和读1时序两个过程。 对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60μs才能完成。DS18B20的写时序 对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。 对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60μs,保证DS18B20能够在15μs到45μs之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15μs之内就得释放单总线。
DS18B20的存储器包括高速暂存器RAM和可电擦除RAM,可电擦除RAM又包括温度触发器TH和TL,以及一个配置寄存器。存储器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器,接着也可以用读寄存器的命令来确认这些数字。当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除RAM中。当修改过寄存器中的数时,这个过程能确保数字的完整性。
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式。单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。DS18B20可以使用外部电源VDD,也可以使用内部的寄生电源。当VDD端口接3.0V—5.5V的电压时是使用外部电源;当VDD端口接地时使用了内部的寄生电源。无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

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中有很多的应用(需要的话需要在书或者在网上查找资料),这里只进行简单的温度测试应用。

(这里的延时是很严厉的)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编程实现(1-时序分析)

DS18b20编程实现(1-时序分析)

基于FS4412的DS18B20温度采集编程实现一、DS18B20简介DS18B20是常用的数字温度计。

DS18B20数字温度计提供9至12位(可配置)温度读数,表明该设备的温度。

信息通过单总线接口被发送到DS18B20或从DS18B20发出,因此从中央微处理器到DS18B20只有需要一个线(和地线)。

读,写和进行温度转换所需要的电源,可以由数据线本身来提供,无需外部电源。

由于每个DS18B20含有唯一的序列号,多个DS18B20可以挂载在一条单总线上。

这允许在许多不同的地方,放置温度传感器。

这个功能是非常有用的,可以应用在包括HV AC环境控制,建筑物内部的温度感应,设备或机械,过程监测和控制等领域。

二、DS18B20硬件连接DS18B20引脚图 DS18B20 原理图DS18B20 有三个引脚。

根据原理图可知,DS18B20采用了外部供电的连接方式,而DQ引脚上拉10k电阻。

DQ引脚连接在4412芯片的GPK1_1 引脚上面。

GND 地DQ 数据线VDD 电源(可选)三、DS18B20时序分析DS18B20是一个单总线,输入和输出都是通过DQ引脚,我们需要根据时序图,不断的操作DQ这个引脚,实现具体的功能。

(一)ds18b20复位时序和函数实现通过复位信号,可以检测DS18B20是否工作正常,并通知DS18B20准备通信。

(1)4412拉低DQ引脚,复位周期开始。

(2)DQ引脚上的低电平保持480us—960us 的时间,然后释放总线。

(3)4412延时16us—60us等待DS18B20应答。

(4)DS18B20拉低DQ引脚60us—240us,表示应答。

4412读取DQ引脚电平,如果是低电平,表示初始化完成。

(5)DS18B20应答信号结束后,释放总线,DQ引脚被上拉电阻拉高,复位周期结束。

实现ds18b20的复位代码:void DS18_Reset(){GPK1.PUD = 0; //GPK1_1 禁止上下拉GPK1.CON = (GPK1.CON & ~(0xF << 4)) | 0x1 << 4; //设置GPK1_1为输出引脚GPK1.DA T &= ~(0x1 << 1); //设置GPK1_1 输出‘0’,拉低DQ引脚delay_us(700); //延时600usGPK1.DA T |= 0x1 << 1; //GPK1_1释放总线GPK1.CON &= ~(0xF << 4); //设置GPK1_1为输入引脚while(GPK1.DA T & (0x1 << 1)); //等待DS18B20应答信号(DQ引脚低电平)while(!(GPK1.DA T & (0x1 << 1))); //等待DS18B20应答信号结束(DQ引脚高电平)}(二)ds18b20写时序和函数实现当我们需要写DS18B20写数据的时候,必须严格DS18B20的写时序,进行操作。

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的线型示意图。

ds18b20时序

ds18b20时序

主机控制ds18b20完成温度转换必须经过三个步骤:每次读写之前都要对ds18b20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对ds18b20进行预订的操作复位操作复位要求主机CPU将数据线下拉500微秒,然后释放,当ds18b20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功ROM指令Read ROM【33H】读ROM命令,读ds18b20温度传感器ROM中的编码(即64位地址),只有在总线上存在单只ds18b20时才使用此命令。

Match ROM【55H】匹配ROM命令,发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的ds18b20使之作出响应,为下一步对该ds18b20的读写准备。

Scarch ROM【F0H】搜索ROM命令,该命令用于确定挂接在同一总线上ds18b20的个数和识别64位ROM地址,为操作各器件作好准备。

Skip ROM【CCH】跳过ROM命令,这条命令用于忽略64位ROM地址,直接向ds18b20发温度转换命令,以节省时间,简化过程,适用于单片机工作。

Alarm search 【ECH】告警搜索命令,该命令执行后只有温度超过设定值上限或下限的片子才能做出响应;RAM指令Coerert T 【44H】开始温度转换命令,启动ds18b20进行温度转换,12位转换时最长为750ms,9位为93.75ms,温度转换结果存入内部9字节RAM中Read 【BEH】读暂存器命令,用于读取ds18b20内部RAM中9字节的内容,其中头两个字节是温度值,如果不想读完,控制器可以在任何时间内发出复位命令来终止读取。

Write 【4EH】写暂存器命令,发出向内部RAM的BYTE2、BYTE3字节写上、下限温度数据命令。

Copy 【48H】复制暂存器命令,这条命令的作用是将RAM中BYTE2、BYTE3字节的内容复制到EEPROM中。

DS18B20中文资料(有时序图)

DS18B20中文资料(有时序图)

18B20温度传感器应用解析温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。

超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。

对于我们普通的电子爱好者来说,DS18B20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。

了解其工作原理和应用可以拓宽您对单片机开发的思路。

DS18B20的主要特征:全数字温度转换及输出。

先进的单总线数据通信。

最高12位分辨率,精度可达土0.5摄氏度。

12位分辨率时的最大工作周期为750毫秒。

可选择寄生工作方式。

检测温度范围为–55°C ~+125°C (–67°F ~+257°F)内置EEPROM,限温报警功能。

64位光刻ROM,内置产品序列号,方便多机挂接。

多样封装形式,适应不同硬件系统。

DS18B20芯片封装结构:DS18B20引脚功能:·GND 电压地·DQ 单数据总线·VDD 电源电压·NC 空引脚DS18B20工作原理及应用:DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。

其一个工作周期可分为两个部分,即温度检测和数据处理。

在讲解其工作流程之前我们有必要了解1 8B20的内部存储器资源。

18B20共有三种形态的存储器资源,它们分别是:ROM 只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。

数据在出产时设置不由用户更改。

DS18B20共64位ROM。

RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,D S18B20共9个字节RAM,每个字节为8位。

第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPRO M(常用于温度报警值储存)的镜像。

DS18B20详细时序

DS18B20详细时序

今天弄DS18B20,发现按照DataSheet写的续写函数无法正常工作,估计是对DataSheet的理解不够。

找来一个例程,仔细对比发现了差异。

详细分析如下:一、先看写时间片。

根据上面的说明:写时间片在主机把数据线从高电平拉到低电平时开始。

不论是写0还是写1都必须持续至少60us,写周期之间需要有1us的恢复间隔。

DS18B20在DQ线被拉低后的15us到60us内对DQ线进行采样。

如果DQ线为高,则产生了一次写1操作,如果DQ线为0则产生了一次写0操作。

主机要发出一个写1时间片,数据线必须拉低并且接着被释放(?这里的释放应该怎样理解?),以此来允许数据线在写时间片开始后的15us内上升到高电平。

主机要发出一个写0时间片,数据线必须被拉低并且保持低电平60us。

根据以上说明和时序图,我写了如下的写字节函数。

程序:sbit DQ=P1^7;/*-----------------------------------------------------------------*/void delay(unsigned int i){while ((i--)!=1);}/*-----------------------------------------------------------------*/void TmWrByte(unsigned char dat) //读写都是从最低有效位开始{unsigned char k;for (k=1;k<=8;k++){DQ=1;DQ=0;_nop_();_nop_();DQ=dat&0x01;delay(6); //while( (i--)!=1 ); // 延时10*i个机器周期DQ = 1; //这里必须要拉高dat>>=1;}delay(5);}分析:DQ = 1; //这里必须要拉高,我不明白为什么应该有这一条语句,但是没有这条语句就不能正常写操作。

DS18B20时序详解

DS18B20时序详解

DS18B20时序详解初始化时序:DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的。

该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。

下图阐述了这一点。

DS18B20发出存在脉冲,以通知主机它在总线上并且准备好操作了。

在初始化时序中,总线上的主机通过拉低单总线至少480μs来发送复位脉冲。

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

总线释放后,4.7kΩ的上拉电阻把单总线上的电平拉回高电平。

当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。

如上所述,主机将总线拉低最短480us,之后释放总线。

由4.7kΩ上拉电阻将总线恢复到高电平。

DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。

至此,初始化和存在时序完毕。

/*延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)*//*************************************函数:Delayxus_DS18B20功能:DS18B20延时函数参数:t为定时时间长度返回:无说明:延时公式:15n+15(近似),晶振12Mhz*******************************************/void Delayxus_DS18B20(unsigned int t){for(t;t>0;t--){_nop_();_nop_();_nop_();_nop_();}_nop_(); _nop_();}/*************************************函数:RST_DS18B20功能:复位DS18B20,读取存在脉冲并返回参数:无返回:1:复位成功;0:复位失败说明:拉低总线至少480us ;可用于检测DS18B20工作是否正常*******************************************/bit RST_DS18B20(){bit ret="1";DQ=0;/*拉低总线*/Delayxus_DS18B20(32);/*为保险起见,延时495us */DQ=1;/*释放总线,DS18B20检测到上升沿后会发送存在脉冲*/Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us后可以保证接受到的是存在脉冲*/ret=DQ;Delayxus_DS18B20(14);/*延时495us,让ds18b20释放总线,避免影响到下一步的操作*/DQ=1;/*释放总线*/return(~ret);}写时序:主机在写时隙向DS18B20写入数据,在读时隙从DS18B20读取数据。

DS18B20时序

DS18B20时序

为了保证数据可靠地传输,任一时刻单线上只能有一个控制信号或数据,进行通信时必须符合单总线通信协议。

DS18B20的操作顺序遵循以下三步。

1)初始化操作
通过单线总线的所有执行(处理)都从一个初始化序列开始。

初始化序列包括一个由总线控制器发出的复位脉冲和跟有其后由从机发出的存在脉冲。

存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。

初始化操作时序如图3.16所示。

图3.16 DS18B20初始化操作时序图
2)执行ROM操作命令
执行ROM操作命令,用于定位单总线上的DS18B20。

每一片DS18B20包含一个唯一的64位ROM编码具体编码格式如表3.3所示。

表3.3 DS18B20 ROM编码格式
表3.4 DS18B20 RO M操作命令表
3)执行功能操作命令
总线控制器通过执行ROM命令定位要操作的DS18B20,之后对其发送功能操作命令。

命令用于启动温度转换盒数据读/写等操作。

DS18B20编程

DS18B20编程
*************************/
uint8 read_byte(void)
{
uint8 tem=0;
uint8 i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
tem=tem>>1;
DQ=0;
nops();
DQ=1;
nops();
if(DQ)
tem|=0x80;
delay_us(6);
write_byte(0x44); //发转换命令
}
/****************************
*读温度*
*****************************/
uint16 read_temp(void)
{
uint8 temp_data[2];
uint16 temp;
DS18B20_reset();
{
uint8 i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();
DQ=0;
nops();
DQ=byte & 0x01;
delay_us(6);//nops();
byte=byte>>1;
}
DQ=1;
delay_us(1);
}
/**********************
对DS18B20读1字节
ans=read_temp();
a=ans/10%10;
b=ans%10;
refresh_led();
}
{
DQ = 1;
delay_us(1);
DQ = 0;

精确把握DS18B20读写时序延长连接距离

精确把握DS18B20读写时序延长连接距离

精确把握DS18B20读写时序延长连接距离单线智能温度传感器DS18B20无需外部电路和其他变换电路就可以直接输出被测温度,测温范围宽、精度高、转换时间快并可适配各种单片机或系统机等众多优点,在各种领域已得到了广泛的应用。

我公司采用DS18B20温度传感器制作四路温度巡检控制的温控仪。

在对温控仪进行各种环境适应验证试验中发现一个问题:DS18B20传感器采用10m长连接线时工作不正常,而采用3m长连接线时工作正常。

DS18B20传感器的连接线缆长度一般可达到50,100m,当采用双绞线芯的屏蔽电缆时,其最大长度可达150m。

图1为温控仪传感器连接部分电路图,传感器采用单独供电,接在P1口上。

后经对DS18B20传感器的读写子程序分析及对传感器读写时序波形分析得出的结论,是因为读写子程序对DS18B20传感器的读写的时序把握不够准确造成的。

下面就DS18B20传感器的读写的时序把握度进行分析,希望能对初步接触该传感器的人员有所帮助。

DSl8B20传感器对读写时序的要求首先对DS18B20传感器的读写时序的要求进行分析和了解。

按D S 1 8 B 2 0 器件手册介绍,对DSl8B20写数据时,主机产生读时间片。

当主机把I,O数据总线从逻辑高电平拉至逻辑低电平时,低电平持续时间最少1μs,就产生写时间片。

在变为低电平15μs之后,DSl8B20在15,45μs之间对线采样,如果线为高电平,写1就发生,如果线为低电平,便发生写0。

时间片必须有最短为60μs的持续期,各写周期之间必须有最短为1μs的恢复时间。

图2为DS18B20生产厂家提供的读写时序图。

从DSl8B20读数据时,主机产生读时间片。

当主机把数据线从逻辑高电平拉至低电平时,产生读时间片。

低电平持续时间至少1μs;来自DS18B20 的输出数据在读时间片下降沿之后15μs有效,因此,在产生读时间片15μs后主机必须停止把I/O线驱动至低电平,由上拉电阻拉回至高电平,主机在15μs末期对数据线采样,如果线为高电平,就读为1,如果线为低电平,便读为0。

DS18B20时序

DS18B20时序

1.先将数据线置高电平“1”
2.延时(该时间要求的不是很严格,但是尽可能的短一点,我们用2us)
3.数据线拉到低电平“0”
4.延时750us(该时间的范围是从480us到960us,我们取中间值)
5.数据线拉高到高电平“1”。

6.延时等待。

如果初始化成功则在15-60us内产生一个由DS18b20所返回的低电平“0”。

根据该状态可以来确定他的存在,但是应该注意不能无限的进行等待,不然会是程序进入死循环,所以要进行超时判断。

(我们等待70us)。

7.若CPU读到了数据线上的低电平“0”以后,还要做延时,其延时的时间从发出的高电
平算起(第5步的时间算起)至少要480us。

(我们延时500us)
8.将数据线再次拉高到“1”后结束。

1.将数据线拉高到“1”
2.延时2us
3.将数据线拉低“0”,告诉18B20发送数据
4.延时6us
5.将数据线拉高“1”,准备接收18B20的数据
6.延时4us
7.读数据线的状态得到1个状态位,并进行数据处理。

8.延时30us
9.重复1-7的步骤,直到读取完一个字节。

DS18B20的写时序
1.数据线先至低电平“0”
2.延时的时间为15us
3.按照从低位到高位的顺序发送数据(一次只发一位)。

4.延时时间为45us。

5.将数据线拉到高电平“1”
6.重复以上1-5步骤,直到发完整个字节。

7.最后将总线拉高。

DS18B20逻辑时序图及程序设计

DS18B20逻辑时序图及程序设计

DS18B20逻辑时序图及程序设计通过单线总线的所有ROM操作,都从一个初始化序列开始。

初始化就是由单片机首先拉低总线一段时间,至少480us,然后拉高总线,等待一段时间,读取总线上的电平值,若为“1”则无器件在线,为“0”则存在器件。

若为“0”,则延迟一段时间,一般为200us,然后继续下面的操作。

由于需要响应按键的中断,所以程序中有对按键值的判断。

图3.10 DS18B20初始化时序图unsigned char ow_reset(uint n){unsigned char presence;P4DIR=0xff; //SET TO OUTPUTP4OUT=0xff;P4OUT=0x00; //pull dQ line low_NOP();_NOP();delay(100); // leave it low for 600usP4OUT=0xff; // allow line to return highP4DIR=0x00; //SET TO INPUTwhile(P4IN!=0);while(P4IN==0){presence =0; // get presence signalreturn(presence); // presence signal returned}} // 0=presence,1 = no partDS18B20温度传感器还有许多与温度转换,温度值读取,匹配序列号等相关的指令,这些指令都是建立在对寄存器的操作的基础上的,而这些寄存器操作都是通过对DS18B20的读/写操作实现的,每一个指令都是八个字节,而由于DS18B20是单总线器件,所以每发出一条指令,都需要进行8次数据发送,所以对器件的读/写操作的程序是以for循环为主体的,而且都需要判断发送或接收的比特值是“1”还是“0”。

图3.11 DS18B20 控制器写入时序图uchar DS18B20_ReadByte(uint n) //读取ds18b20的一个字节{uchar u;uchar q ;P4DIR=0xff; //SET TO OUTPUTSwitch(n){case 0:for(q=0;q<8;q++){u=u>>1;P4OUT &=~BIT0;_NOP();_NOP();P4OUT |=BIT0;P4DIR &=~BIT0; //SET TO INPUT_NOP();_NOP();if((P4IN&0x08)==0x08) u=u|0x80;else u=u&0x7f;delay(20);P4DIR |=BIT0; //SET TO OUTPUTP4OUT |=BIT0;} break;} return u;}由时序图3.11可以看出,单片机在写“0”或“1”时,首先要将总线拉低,然后根据是“0”或者“1”来确定是保持高电平还是低电平,DS18B20根据总显得电平进行采样,获得总线上写入的数据。

DS18B20 测温程序完全解读

DS18B20 测温程序完全解读

硬件:51板(1)单线ds18b20接P2.2(2)使用外部电源给ds18b20供电,没有使用寄生电源奥软件:Kei uVision 2刚开始对时序把握不好,可是在论坛里没找到比较详细的解释,所以俺倒塌了这个东东,就把俺的经验贴上来,供大家参考,呵呵……如有错误请指正#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uchar flag ;uint temp; //参数temp一定要声明为int 型uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点数字编码/*延时函数*/void TempDelay (uchar us){while(us--);}void delay(uint count) //延时子函数{uint i;while(count){i=200;while(i&gt0)i--;count--;}}/*串口初始化,波特率9600,方式1 */void init_com(){TMOD=0x20; //设置定时器1为模式2TH1=0xfd; //装初值设定波特率TL1=0xfd;TR1=1; //启动定时器SM0=0; //串口通信模式设置SM1=1;// REN=1; //串口允许接收数据PCON=0; //波特率不倍频// SMOD=0; //波特率不倍频// EA=1; //开总中断//ES=1; //开串行中断}/*数码管的显示*/void display(uint temp){uchar bai,shi,ge;bai=temp/100;shi=temp%100/10;ge=temp%100%10;dula=0;P0=table[bai]; //显示百位dula=1; //从0到1,有个上升沿,解除锁存,显示相应段dula=0; //从1到0再次锁存wela=0;P0=0xfe;wela=1;wela=0;delay(1); //延时约2msP0=table1[shi]; //显示十位dula=1;dula=0;P0=0xfd;wela=1;wela=0;delay(1);P0=table[ge]; //显示个位dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(1);}/*****************************************时序:初始化时序、读时序、写时序。

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

DS18B20时序详解初始化时序:DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的。

该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。

下图阐述了这一点。

DS18B20发出存在脉冲,以通知主机它在总线上并且准备好操作了。

在初始化时序中,总线上的主机通过拉低单总线至少480μs来发送复位脉冲。

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

总线释放后,4.7kΩ的上拉电阻把单总线上的电平拉回高电平。

当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。

如上所述,主机将总线拉低最短480us,之后释放总线。

由4.7kΩ上拉电阻将总线恢复到高电平。

DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。

至此,初始化和存在时序完毕。

/*延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)*//*************************************函数:Delayxus_DS18B20功能:DS18B20延时函数参数:t为定时时间长度返回:无说明:延时公式:15n+15(近似),晶振12Mhz*******************************************/void Delayxus_DS18B20(unsigned int t){for(t;t>0;t--){_nop_();_nop_();_nop_();_nop_();}_nop_(); _nop_();}/*************************************函数:RST_DS18B20功能:复位DS18B20,读取存在脉冲并返回参数:无返回:1:复位成功;0:复位失败说明:拉低总线至少480us ;可用于检测DS18B20工作是否正常*******************************************/bit RST_DS18B20(){bit ret="1";DQ=0;/*拉低总线*/Delayxus_DS18B20(32);/*为保险起见,延时495us */DQ=1;/*释放总线,DS18B20检测到上升沿后会发送存在脉冲*/Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us后可以保证接受到的是存在脉冲*/ret=DQ;Delayxus_DS18B20(14);/*延时495us,让ds18b20释放总线,避免影响到下一步的操作*/DQ=1;/*释放总线*/return(~ret);}写时序:主机在写时隙向DS18B20写入数据,在读时隙从DS18B20读取数据。

在单总线上每个时隙只传送一位数据。

有两种写时隙:写“0”时间隙和写“1”时间隙。

总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。

两种写时隙都通过主机拉低总线产生(见下图)。

为了产生写1时隙,在拉低总线后主机必须在15μs内释放总线。

在总线被释放后,由于4.7kΩ上拉电阻将总线恢复为高电平。

为了产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。

在主机产生写时隙后,DS18B20会在其后的15到60us的一个时间窗口内采样单总线。

在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。

如上所述,所有的写时隙必须至少有60us的持续时间。

相邻两个写时隙必须要有最少1us的恢复时间。

所有的写时隙(写0和写1)都由拉低总线产生。

写函数为:/*************************************函数:WR_Bit功能:向DS18B20写一位数据参数:i为待写的位返回:无说明:总线从高拉到低产生写时序*******************************************/void WR_Bit(bit i){DQ=0;//产生写时序_nop_();_nop_();//总线拉低持续时间要大于1usDQ=i;//写数据,0和1均可Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取DQ=1;//释放总线}/*/************************************函数:WR_Byte功能:DS18B20写字节函数,先写最低位参数:dat为待写的字节数据返回:无说明:无*******************************************/void WR_Byte(unsigned char dat){unsigned char i="0";while(i++<8){WR_Bit(dat&0x01);//从最低位写起dat>>=1; //注意不要写成dat>>1}}读时序:DS18B20只有在主机发出读时隙后才会向主机发送数据。

因此,在发出读暂存器命令[BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。

另外,主机可在发出温度转换命令T [44h]或Recall命令E 2[B8h]后产生读时隙,以便了解操作的状态。

所有的读时隙必须至少有60us的持续时间。

相邻两个读时隙必须要有最少1us的恢复时间。

所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。

在主机产生读时隙后,DS18B20开始发送0或1到总线上。

DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。

DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。

因此,主机释放总线和采样总线等动作要在15μs内完成。

/************************************函数:Read_Bit功能:向DS18B20读一位数据参数:无返回:bit i说明:总线从高拉到低,持续至1us以上,再释放总线为高电平空闲状态产生读时序******************************************unsigned char Read_Bit(){unsigned char ret;DQ=0;//拉低总线_nop_(); _nop_();DQ=1;//释放总线_nop_(); _nop_();_nop_(); _nop_();ret=DQ;//读时隙产生7 us后读取总线数据。

把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求DQ=1;//释放总线return ret; //返回读取到的数据}/************************************函数:Read_Byte功能:DS18B20读一个字节函数,先读最低位参数:无返回:读取的一字节数据说明:无*******************************************/unsigned char Read_Byte(){unsigned char i;unsigned char dat="0";for(i=0;i<8;i++){dat>>=1;//先读最低位if(Read_Bit())dat|=0x80;}return(dat);}/*************************************函数:Start_DS18B20功能:启动温度转换参数:无返回:无说明:复位后写44H命令******************************************void Start_DS18B20(){DQ=1;RST_DS18B20();WR_Byte(0xcc);// skipWR_Byte(0x44);//启动温度转换}/*************************************函数:Read_Tem功能:读取温度参数:无返回:int型温度数据,高八位为高八位温度数据,低八位为低八位温度数据说明:复位后写BE命令*******************************************/int Read_Tem(){int tem="0";RST_DS18B20();WR_Byte(0xcc);// skipWR_Byte(0xbe);//发出读取命令tem=Read_Byte();//读出温度低八位tem|=(((int)Read_Byte())<<8);//读出温度高八位return tem;}注:DS18B20官方文档中没有说明读写数据位的顺序,查了下资料,DS18B20读写数据都是从最低位读写的。

相关文档
最新文档