您的位置 首页 被动

DS18B20的时序及代码解析

本站为您提供的DS18B20的时序及代码解析,DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位(所以最后获取的数据要乘以0.0625得到实际温度)。DS18B20启动后保持低功耗等待状态;当需要执行温度测量(和AD转换)时,总线控制器必须发出[44h]命令。

  DS18B20的中心功用是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,别离以0.5℃,0.25℃,0.125℃和0.0625℃增量递加。在上电状况下默许的精度为12位(所以最终获取的数据要乘以0.0625得到实践温度)。DS18B20发动后坚持低功耗等候状况;当需求履行温度丈量(和AD转化)时,总线控制器有必要宣布[44h]指令。

  在那之后,发生的温度数据以两个字节的方法被存储到高速暂存器的温度寄存器中(所以后期获取数据时,有必要接连读取两次数据),下面介绍时序及相应代码(以12MHz的晶振为例,数据线界说为DQ),其间DS18B20的一切通讯都是以由复位脉冲组成的初始化序列开端的,并选用的是单总线协议。

  操作次序:初始化——》写相应的控制指令(用写数据函数完结)——》读取DS18B20所收集到的数据(用读数据函数完结)———》把收集的数据转化成实践的温度。

  时序图及代码剖析如下

  一、初始化

  在初始化序列期间,总线控制器拉低总线并坚持480us(改延时能够在480~960us之间,但需求在480us以内开释总线)以宣布一个复位脉

  冲,然后开释总线,进入接纳状况(等候DS18B20应对)。总线开释后,单总线由上拉电阻拉到高电平。当DS18B20探测到I/O引脚上的上升沿后,等候15-60us,然后其以拉低总线60-240us的方法宣布存在脉冲。至此,初始化时序完毕。

  DS18B20的时序及代码解析

  初始化代码,初始化代码写至此,其实咱们便能够用数码管显现来查验初始化是否成功(即DS18B20有应对),数码管显现”0“,初始化失利,显现”1“,则初始化成功。

  bit DS18B20_init()

  {

  bit ack = 1;

  DQ = 0; //主机拉低总线

  delay_us(32); //延时495us

  DQ = 1; //开释总线,一起IO口发生的上升沿能被DS18B20所检测到

  delay_us(4); //延时大于60us,确保接下来DS18B20能宣布60~240us的存在脉冲应对

  ack = DQ; //在此60~240us之内DQ被DS18B20所占用,若存在,则其会发送一个低电平信号,DQ被DS18B20拉低,则ack为0,反之为1

  delay_us(15); //延时达240us,让DS18B20开释总线

  DQ = 1;

  return(ack);

  }

  二、DS18B20的写时序

  主机在写时隙向DS18B20写入数据,其间分为写”0”时隙,和写”1”时隙。总线主机运用写“1”时空隙向DS18B20写入逻辑1,运用写“0”时空隙向DS18B20写入逻辑0.一切的写时隙有必要有最少60us的持续时刻,相邻两个写时隙有必要要有最少1us的康复时刻。两种写时隙都经过主机拉低总线发生(见下图)为了发生写1时隙。

  在拉低总线后主机有必要在15μs内开释总线。在总线被开释后,因为上拉电阻将总线康复为高电平。为了发生写”0”时隙,在拉低总线后主机有必要持续拉低总线以满意时隙持续时刻的要求(至少60μs)。

  在主机发生写时隙后,DS18B20会在这以后的15~60us的一个时刻段内采样单总线(DQ)。在采样的时刻窗口内,假如总线为高电平,主时机向DS18B20写入1;假如总线为低电平,主时机向DS18B20写入0。

  综上所述,一切的写时隙有必要至少有60us的持续时刻。相邻两个写时隙有必要要有最少1us的康复时刻。一切的写时隙(写0和写1)都由拉低总线发生。

  DS18B20的时序及代码解析

  DS18B20的写时序代码 :写字节函数、由低位至高位,向DS18B20写入一个字节的数据。无返回值,形参byte是待写入的字节数据,读取8次,移位8次,确保每位都传输至DQ。

  void DS18B20_write_byte(uchar byte)

  {

  uchar i;

  for(i=0 ; i《8 ; i++)

  {

  DQ = 0; //拉低总线,发生写时隙

  _nop_();

  _nop_(); //大于1us的延时

  DQ = 1; //15us之内开释总线

  _nop_();

  _nop_(); //恰当延时

  DQ = byte & 0x01; //将字节低位写入单总线

  delay_us(3); //在15~60us内等候DS18B20来收集信号

  DQ = 1; //开释总线

  byte 》》= 1; //每次讲要读取的数据位移至最低位,

  }

  }

  三、DS18B20的读时序

  主机建议读时序时,DS18B20仅被用来传输数据给控制器。因而,总线控制器在宣布读暂存器指令[0xBE]或读电源形式指令[0xB4]后有必要马上开端读时序,DS18B20能够供给恳求信息。除此之外,总线控制器在宣布发送温度转化指令[0x44] (或召回EEPROM指令[0xB8])之后读时序,详见DS18B20 的芯片手册上的功用指令。

  一切读时序有必要最少60us,包含两个读周期间至少1us的康复时刻。当总线控制器把数据线从高电平拉到低电平时,读时序开端,数据线有必要至少坚持1us,然后总线被开释。DS18B20 经过拉高或拉低总线上来传输”1”或”0”。当传输逻辑”0”完毕后,总线将被开释,经过上拉电阻回到上升沿状况。从DS18B20输出的数据在读时序的下降沿呈现后15us 内有效。因而,总线控制器在读时序开端后有必要中止把I/O口驱动为低电15us,以读取I/O口状况。

  DS18B20的时序及代码解析

  DS18B20的读时序的代码 :读字节函数、由低位至高位,读取DS18B20所收集到的数据。带返回值,可结合前面的写时序,对写、读数据函数进行查验(后面会说到查验进程及作用)byte 是读取到的字节数据。其间,此函数读取8次,移位7次(实践移位8次)。

  uchar DS18B20_read_write()

  {

  uchar i;

  uchar byte; //byte为要接纳到的数据

  for(i=0 ; i《8 ; i++)

  {

  DQ = 0; //发生读时序

  _nop_();

  _nop_(); //简略延时

  DQ = 1; //开释总线,有从机DS18B20占用

  byte 》》= 1; //先进行移位

  if(DQ) //让DS18B20占用总线,宣布收集到的信号

  byte |= 0x80; //若DQ=1,则让当时byte最高位为1,在下次循环中移位至次高位,最终到达从低位到高位接纳的意图;若DQ=0,则可越过此句子,直接在下次循环对byte进行移位补0。以上操作15us以内完结

  delay_us(3); //延时60us

  DQ = 1; //开释总线

  _nop_();

  }

  }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/64078.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部