温度模块DS18B20

温度模块DS18B20

DS18B20简介:
DS18B20 单线数字温度传感器,即“一线器件”,DS18B20的总线只有一根,数据的交换和控制都由这根线完成,其具有独特的优点:
( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
( 2 )测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C 范围内,精度为 ± 0.5°C 。
( 4 )多个DS1820可以存在于同一.条单线总线上。这允许在许多不同的地方放置温度灵敏器件。此特性的应用范围包括HVAC环境控制,建筑物、设备或机械内的温度检测,以及过程监视和控制中的温度检测。
( 5 )供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。
( 6 )测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。
DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
原理图:
在这里插入图片描述DS18B20的存储形式:
DS18B20存储的温度值是以补码的形式存储的,所以读出来的温度值是实际温度值的补码,要把的转换为原码。
正温度的话,原码就是补码本身,所以在12位分辨率下,温度的计算公式是:温度值=读取值*0.0625
负温度的话,原码是补码减1再取反,所以在12位分辨率下,计算公式为:
温度值= -(读取值减1再取反)*0.0625

引脚功能:
在这里插入图片描述
DS18B20单总线的工作方式
(1)DS18B20的初始化
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。  做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待
初始化时序图:
在这里插入图片描述

(2)写操作命令
主机发出各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。
写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则将总线置为低电平,若主机想写1,则将总线置为高电平,持续时间最少60微秒直至写周期结束,然后释放总线为高电平至少1微秒给总线恢复 。而DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
写操作命令时序图:
在这里插入图片描述
(3)读操作命令
对于读数据操作时序也分为读0时序和读1时序两个过程。
读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。作为从机DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60微秒才能完成
读操作命令时序图:
在这里插入图片描述
DS18B20的内部存储结构:
DS18B20的存储器由一个高速暂存RAM和一个非易失性、电可擦除(E2)RAM组成。
在这里插入图片描述
在这里插入图片描述

寄存器:
在这里插入图片描述
在这里插入图片描述
出场设置默认R0、R1为11。也就是12位分辨率,也就是1位代表0.0625摄氏度。
操作命令
在这里插入图片描述
在这里插入图片描述函数程序示例:
初始化:

unsigned char Ds18b20Init()
{
 unsigned int i;
 DSPORT=0;    //将总线拉低480us~960us
 i=70; 
 while(i--);//延时642us
 DSPORT=1;   //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
 i=0;
 while(DSPORT) //等待DS18B20拉低总线
 {
  i++;
  if(i>5000)//等待>5MS
   return 0;//初始化失败 
 }
 return 1;//初始化成功
}

向DS18B20写入一个字节:

void Ds18b20WriteByte(unsigned char dat)
{
 unsigned int i,j;
 for(j=0;j<8;j++)
 {
  DSPORT=0;   //每写入一位数据之前先把总线拉低1us
  i++;
  DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
  i=6;
  while(i--); //延时68us,持续时间最少60us
  DSPORT=1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  dat>>=1;
 }
}

读取一个字节:

unsigned char Ds18b20ReadByte()
{
 unsigned char byte,bi;
 unsigned int i,j; 
 for(j=8;j>0;j--)
 {
  DSPORT=0;//先将总线拉低1us
  i++;
  DSPORT=1;//然后释放总线
  i++;
  i++;//延时6us等待数据稳定
  bi=DSPORT;  //读取数据,从最低位开始读取
  /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  byte=(byte>>1)|(bi<<7);        
  i=4;  //读取完之后等待48us再接着读取下一个数
  while(i--);
 }    
 return byte;
}

开始转化温度命令:

void  Ds18b20ChangTemp()
{
 Ds18b20Init();
 Delay1ms(1);
 Ds18b20WriteByte(0xcc);  //跳过ROM操作命令   
 Ds18b20WriteByte(0x44);     //温度转换命令
// Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}

开始读取温度命令:

void  Ds18b20ReadTempCom()
{ 
 Ds18b20Init();
 Delay1ms(1);
 Ds18b20WriteByte(0xcc);  //跳过ROM操作命令
 Ds18b20WriteByte(0xbe);  //发送读取温度命令
}

读取温度:

int Ds18b20ReadTemp()
{
 int temp=0;
 unsigned char tmh,tml;
 Ds18b20ChangTemp();     //先写入转换命令
 Ds18b20ReadTempCom();   //然后等待转换完后发送读取温度命令
 tml=Ds18b20ReadByte();  //读取温度值共16位,先读低字节
 tmh=Ds18b20ReadByte();  //再读高字节
 temp=tmh;
 temp<<=8;
 temp|=tml;
 return temp;
}
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值