DS18B20时序分析详细步骤

发布者:创意火舞最新更新时间:2019-12-17 来源: eefocus关键字:DS18B20  时序分析 手机看文章 扫描二维码
随时随地手机看文章

  1、过程1、2是初始化过程,每次读取都要初始化,否则18b20处于待机状态,无法成功读取。过程1:拉低信号线480-700us,使它复位,然后释放总线15-60us,18b20会拉低总线60-240us,然后它释放总线。所以初始化成功的一个标志就是能否读到18b20这个先低后高的操作时序。


  (注意:黑色部分表示主机操作,蓝色部分表示18b20操作,每次主机操作完成之后等待18b20状态时,必须要释放总线,比如将IO设置为高阻态什么的。否则18B20没法把状态写到线上)


  2、过程3、4是写1bit数据过程。过程3是写0 ,过程4是写1。过程3:拉低总线60us,然后抬高总线5us,完成。过程4:拉低总线5us,然后抬高总线60us,完成


  3、过程5、6是读1bit过程。过程5是读0,过程6是读1。过程5、6:拉低总线5us,然后释放总线,读取总线,如果为0,则读入0,如果为1,则读入1。


  DS18B20时序


  初始化序列——复位和存在脉冲


  DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。下图(插图13,即如下截图)阐述了这一点。当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。

  在初始化步骤中,总线上的主机通过拉低单总线至少480μs来产生复位脉冲。然后总线主机释放总线并进入接收模式。


  当总线释放后,5kΩ的上拉电阻把单总线上的电平拉回高电平。当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。


  如文档所述,主机将总线拉低最短480us,之后释放总线。由于5kΩ上拉电阻的作用,总线恢复到高电平。DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。至此,初始化和存在时序完毕。


  根据上述要求编写的复位函数为:


  首先是延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)


  /*


  ************************************


  函数:Delayxus_DS18B20


  功能:DS18B20延时函数


  参数:t为定时时间长度


  返回:无


  说明: 延时公式:15n+15(近似),晶振12Mhz


  ******************************************


  */


  voidDelayxus_DS18B20(unsigned int t)


  {


  for(t;t>0;t--)


  {


  _nop_();_nop_();_nop_();_nop_();


  }


  _nop_(); _nop_();


  }


  延时函数反汇编代码(方便分析延时公式)


  C:0x0031 7F01 MOV R7,#0x01


  C:0x0033 7E00 MOV R6,#0x00


  C:0x0035 1206A6 LCALLdelayxus(C:06A6)


  38: voidDelayxus_DS18B20(unsigned int t)


  39: {


  40: for(t;t>0;t--)


  C:0x06A6 D3 SETB C


  C:0x06A7 EF MOV A,R7


  C:0x06A8 9400 SUBB A,#0x00


  C:0x06AA EE MOV A,R6


  C:0x06AB 9400 SUBB A,#0x00


  C:0x06AD 400B JC C:06BA


  41: {


  42:_nop_();_nop_();_nop_();_nop_();


  C:0x06AF 00 NOP


  C:0x06B0 00 NOP


  C:0x06B1 00 NOP


  C:0x06B2 00 NOP


  43: }


  C:0x06B3 EF MOV A,R7


  C:0x06B4 1F DEC R7


  C:0x06B5 70EF JNZDelayxus_DS18B20 (C:06A6)


  C:0x06B7 1E DEC R6


  C:0x06B8 80EC SJMPDelayxus_DS18B20 (C:06A6)


  44: _nop_(); _nop_();


  C:0x06BA 00 NOP


  C:0x06BB 00 NOP


  45: }


  C:0x06BC 22 RET


  分析上述反汇编代码,可知延时公式为15*(t+1)


  /*


  ************************************


  函数: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的恢复时间。两种写时隙都通过主机拉低总线产生(见插图14)。

  为产生写1时隙,在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于5kΩ上拉电阻的作用,总线恢复为高电平。为产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。


  在主机产生写时隙后,DS18B20会在其后的15到60us的一个时间窗口内采样单总线。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。


  如文档所述,所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。


  为产生写1时隙,在拉低总线后主机必须在15us内释放总线(拉低的电平要持续至少1us)。由于上拉电阻的作用,总线电平恢复为高电平,直到完成写时隙。


  为产生写0时隙,在拉低总线后主机持续拉低总线即可,直到写时隙完成后释放总线(持续时间60-120us)。


  写时隙产生后,DS18B20会在产生后的15到60us的时间内采样总线,以此来确定写0还是写1。


  满足上述要求的写函数为:


  /*


  ************************************


  函数:WR_Bit


  功能:向DS18B20写一位数据


  参数:i为待写的位


  返回:无


  说明: 总线从高拉到低产生写时序


  ******************************************


  */


  void WR_Bit(bit i)


  {


  DQ=0;//产生写时序


  _nop_();


  _nop_();//总线拉低持续时间要大于1us


  DQ=i;//写数据 ,0和1均可


  Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取


  DQ=1;//释放总线


  }


  /*


  ***********************************


  函数:WR_Byte


  功能:DS18B20写字节函数,先写最低位


  参数:dat为待写的字节数据


  返回:无


  说明:无


  ******************************************


  */


  void WR_Byte(unsigned chardat)


  {


  unsigned chari="0";


  while(i++<8)


  {


  WR_Bit(dat&0x01);//从最低位写起


  dat>>=1; //注意不要写成dat>>1


  }


  }


  读时序:


  DS18B20只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令 [BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。另外,主机可在发出温度转换命令T [44h]或Recall命令E 2[B8h]后产生读时隙,以便了解操作的状态(在 DS18B20操作指令这一节会详细解释)。


  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20开始发送0或1到总线上。DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。


  插图15表明了对于读时隙,TINIT(下降沿后低电平持续时间), TRC(上升沿)和TSAMPLE(主机采样总线)的时间和要在15μs以内。


  插图16显示了最大化系统时间宽限的方法:让TINIT 和TRC尽可能的短,把主机采样总线放到15μs这一时间段的尾部。

  由文档可知,DS18B20只有在主机发出读时隙时才能发送数据到主机。因此,主机必须在BE命令,B4命令后立即产生读时隙以使DS18B20提供相应的数据。另外,在44命令,B8命令后也要产生读时隙。


  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。DS18B20输出的数据在下降沿产生后15us后有效。因此,释放总线和主机采样总线等动作要在15us内完成。


  满足以上要求的函数为:


  /*


  ***********************************


  函数: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 chardat="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);// skip


  WR_Byte(0x44);//启动温度转换


  }


  /*


  ************************************


  函数:Read_Tem


  功能:读取温度


  参数:无


  返回:int型温度数据,高八位为高八位温度数据,低八位为低八位温度数据


  说明: 复位后写BE命令


  ******************************************


  */


  int Read_Tem()


  {


  int tem="0";


  RST_DS18B20();


  WR_Byte(0xcc);// skip


  WR_Byte(0xbe);//发出读取命令


  tem=Read_Byte();//读出温度低八位


  tem|=(((int)Read_Byte())<<8);//读出温度高八位


  return tem;


  }


  注: DS18B20官方文档中没有说明读写数据位的顺序,查了下资料,DS18B20读写数据都是从最低位读写的。

关键字:DS18B20  时序分析 引用地址:DS18B20时序分析详细步骤

上一篇:stm8的IIC库的使用
下一篇:STM8L之按键中断

推荐阅读最新更新时间:2024-11-17 05:46

PIC16F877A驱动DS18B20温度采集芯片
今天开始驱动DS18B20温度采集芯片! 从网上收集的资料 DS18B20的内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下: DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。 光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的
[单片机]
PIC16F877A驱动<font color='red'>DS18B20</font>温度采集芯片
STM32F407开发板DS18B20应用案例
【1】DS18B20介绍 DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。 以下是DS18B20温度传感器的主要特点和操作时序: (1)特点: 单总线接口:DS18B20使用单一的数据线进行通信,简化了连接和控制。 高精度测量:具有12位的温度分辨率,可测量范围为-55°C至+125°C。 数字输出:温度值以二进制形式传输,便于处理和解析。 内部存储:传感器可内部存储温度数据和配置信息。 低功耗:在非活动状态下,传感器可以进入睡眠模式以降低功耗消耗。 (2)操作时序: DS18B20的
[单片机]
STM32F407开发板<font color='red'>DS18B20</font>应用案例
基于DS18B20的家用温度测量器方案设计
一、设计概况   本制作采用USB口作为供电端口,用DS18B20温度传感器进行温度信息采集,用AT89C2051单片机进行控制,采用四位共阳数码管显示,从而实现对温度的测量显示(系统框图如图1所示)。本设计可培养学生对单片机学习的兴趣,提高其制作与编程能力。 图1 系统框图 二、电路原理   采用PROteUS仿真软件进行原理图设计与程序仿真。电路如图2所示。 图2 电路图 1、电源   采用USB口供电,可将USB适配器接人电路板的USB口或直接接计算机USB口。这样,既节省了资源,又能够获得较为理想的工作电压。USB口的外形及电源口定义如图3所示。 图3 USB口的外形及电源口定义   2、温度
[单片机]
基于<font color='red'>DS18B20</font>的家用温度测量器方案设计
关于DS18B20在温度检测系统中的应用
  1.背景   在现代化的工业生产中人们需要对温度进行检测和控制。采用51单片机来对温度进行控制,具有控制方便、组态简单和灵活性大等优点;本论文设计方案根据实际经验讨论关于DS18B20数字温度传感器在温度测量中的应用;其具有较高的测量精度,适合对温度精度要求较高的化工生产、电力工程等行业。   2.温度控制系统   美国DALLAS公司生产的DS18B20数字温度传感器,可以直接将被测温度转化为串行数字信号供微机处理,通过简单的编程实现9位的温度读数。并且多个DS18B20可以并接到多个地址线上与单片机实现通信。   DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单
[单片机]
关于<font color='red'>DS18B20</font>在温度检测系统中的应用
DS18B20单片机数字温度计
①采用单片机设计电子温度计,选择适合的感温元件,温度测量范围-50℃~110℃; ②测量误差小于0.1℃; ③LED数码直读显示; 1.2总体方案分析 在单片机电路设计中,大多都是使用传感器,所以本次设计采用温度传感器DS18B20。整个系统由单片机控制,温度传感器采用DS18B20。DS18b20采用单总线方式与单片机相连.把采集到得温度信息传给单片机。单片机采集到的温度输出到四个数码管上进行显示。当四位数码管显示的温度超过上限值时可以实现报警功能。系统总体方案如图1-1所示。 图1-1 系统总体方案 2 电路设计2.1电路原理图 电路原理图如图2-1所示; 图2-1 电路原理图 2.2电路PCB图 电路PCB图底层
[单片机]
<font color='red'>DS18B20</font>单片机数字温度计
DS18B20协议解码
DS18B20作为一种数字温度传感器,其接口所遵循的数字传输协议即所谓的DS18B20协议,它是一种单总线协议,抗干扰能力强,精度高,适合恶劣环境的现场温度测量。ZDS2022示波器毫无疑问地将其加入了免费开放的21种协议触发与解码行列!   如何进行DS18B20协议解码操作呢?按下【Decode】键,将解码类型设为DS18B20,开启协议触发,在示波器前面板上的触发控制区内按下【Auto/Normal】键,将触发方式设为普通触发,按下协议参数软键,可对该协议的总线设置和触发模式进行相关设置,信源选择通道1,ZDS2022示波器的DS18B20协议支持4种温度分辨率,可以选择12位、11位、10位和9位,我们选择12位,触发
[测试测量]
<font color='red'>DS18B20</font>协议解码
基于DS18B20和89C2051组成的温度显示电路
由单总线数字温度传感器DS18B20和89C2051组成的经济型家庭用测温系统。其温度显示为“-XXC”,精度±0.5℃,测温范围-55℃~+125℃。下面详细分析系统构成及汇编语言对DS18B20操作时序的实现方法。图1为本系统电路图,图中DSP为四只数码LED显示器的简化。    1.DS18B20的初始化与读写程序   DS18B20是“一总线”接口温度传感器,测温范围为-55℃~+125℃,在-10℃~+85℃范围内精度为±0.5℃。DS18B20可以程序设定9~12位的分辨率,在出厂时被设置为12位的分辨率。通过和单片机系统的结合,可以构建经济的测温系统。DS18B20的管脚排列如图2所示,DQ为数字信号输入,输
[工业控制]
基于<font color='red'>DS18B20</font>和89C2051组成的温度显示电路
数码管显示51单片机DS18B20温度测量源程序及仿真
这是一款数码管显示51单片机DS18B20温度测量源程序及仿真资料,特别适合单片机初学者学习参考,这款数码管显示51单片机DS18B20温度测量源程序使用模块化编程,方便移置,单片机使用AT89C51单片机,数码使用四位共阴数码管,这样简化了硬件电路,降低了硬件的制作难度。这款数码管显示51单片机DS18B20温度测量源程序是在Keil4环境下编译通过,并在Proteus7.8仿真软件下仿真通过。温度测量范围是:-55-125度。由于源程序直接贴出来会丢后些重要内容,所以特别将这款数码管显示51单片机DS18B20温度测量源程序及仿真资料打包后放在百度网盘上,需要的爱好者可以自己去下载。更多单片机源程序与仿真请到电子乐屋。 数
[单片机]
数码管显示51单片机<font color='red'>DS18B20</font>温度测量源程序及仿真
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved