小蜜蜂笔记
嵌入式开发与物联网应用教育践行者

单总线数字温度传感器DS18B20的基本原理及开发要点

DS18B20的基本概述

工作电压:3.0V~5.5V。
测量范围:-55摄氏度~+125摄氏度。
通信方式:单总线,数据线接上拉电阻,使总线空闲时处于高电平。
转换精度:9~12位分辨率可调,默认为12位,即分辨率是0.0625。
转换时间:典型值200ms。

DS18B20的内部存储结构

DS18B20的内部有64位的ROM单元和9字节的高速暂存器。64位ROM单元包含了DS18B20唯一的序列号。

第0字节:温度数据的低8位。
第1字节:温度数据的高8位。
第3字节:TH用户字节,设置报警温度最高值。
第4字节:TL用户字节,设置报警温度最低值。
第5字节:配置寄存器,设置转换精度,默认12位。
第6字节第7字节:保留,不用管。
第8字节:CRC码。
:上电后,第2字节、第3字节和第4字节的状态值为EEPROM中的数据。

DS18B20的温度数据格式与处理

DS18B20以16位带符号位扩展的二进制补码形式读出。
低4位为小数部分,中间7位为整数部分。
高5位为扩展符号位,即BIT15~BIT11为00000,读出的数据为正温度,若为11111,则为负温度。在应用开发中,首先要对读出的温度数据的符号位进行判断,再根据正负温度的不同,进行相应的处理。
输出数据和实际温度值之间的关系,可参考下表:

注意:在上电复位的时候,温度寄存器中的值为0x0550,即+85摄氏度。所以在应用开发中,有些朋友一直读到的数据都是85.5摄氏度,就说明DS18B20根本没有进行温度转换,你读到的是上电复位的初始值。

从输出数据与温度值的关系表中可知,DS18B20的分辨率为0.0625
读出数据为正温度时,将LSB和MSB整合成的16位整数,直接乘以0.0625即可
读出数据为负温度时,则需要将LSB和MSB整合成的16位整数,取反加1后,再乘以0.0625,因为温度数据是以补码形式表示的。
例如:
读出结果为00A2H,温度值 = 162×0.0625 = 10.125 摄氏度。
读出结果为FF5EH,取反加1就是00A2H,温度值则为 -10.125 摄氏度。

DS18B20的复位时序

【1】微处理器首先将总线拉低480us以上,然后释放总线。
【2】总线释放后,上拉电阻会将其拉至高电平。
【3】DS18B20发现总线有上升沿,等待15~60us后,拉低总线,表示应答。
【4】微处理器在DS18B20应答期间,读取总线上的电平,如果是低电平则表示复位成功。
【5】DS18B20在产生60~240us的应答信号后,会释放总线。

//DS18B20的复位底层驱动代码参考--51版
bit Init_DS18B20(void)
{
	bit initflag = 0;
	DQ = 0;
	Delay_OneWire(50);       //拉低总线480us以上 		
	DQ = 1;		         //释放总线							
	Delay_OneWire(5); 	 //等待15~60us		
	initflag = DQ;           //读取18B20的复位应答信号		
	Delay_OneWire(10);	 //等待60~240us		
  	return initflag;	 //应答信号为低电平,表示复位成功			
}

DS18B20的写时序(低位先发)

【1】微处理器将总线拉低10~15us。
【2】在接下来的15~45us直接,根据逻辑1或逻辑0,控制总线的高低电平。
【3】释放总线。

//DS18B20的写操作底层驱动代码参考--51版
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)             
	{
		DQ = 0;		     //先拉低总线电平10~15us						
		DQ = dat&0x01;	     //向总线写入一个位数据			
		Delay_OneWire(5);    //维持状态20~45us
		DQ = 1;	             //释放总线			
		dat >>= 1;           //准备发送下一个数据位			
	}
}

DS18B20的读时序(低位先读)

【1】微处理器先将总线拉低1us,然后释放总线。
【2】微处理器读取总线上的电平。
【3】微处理器读取电平后,延时约45us。

//DS18B20的读操作底层驱动代码参考--51版
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
	for(i=0;i<8;i++)
	{
		DQ = 0;              //先将总线电平拉低10~15us
		dat >>= 1;	     					
		DQ = 1;		     //然后释放总线						
		if(DQ)		     //读取总线上的电平状态						
		{
		    dat |= 0x80;
		}	    
		Delay_OneWire(5);    //延时45us左右,再度下一个数据位		
	}
	return dat;
}

DS18B20的几个重要指令

CCH跳过ROM指令。忽略64位ROM地址,直接向DS18B20发起各种执行指令。
44H温度转换指令。启动DS18B20进行温度转换。
BEH读取暂存器指令。DS18B20收到该指令后,会逐个输出高速暂存器中字节0到字节9的内容。如果要停止读取,必须进行复位操作。如果只需要读取温度数据,那么,在读完第0个字节和第1个字节数据后,不再理会DS18B20后面发出的数据即可。

DS18B20温度采样应用开发要点

微处理器访问DS18B20需要遵循以下的步骤:
DS18B20复位 –> 执行ROM指令 –> 执行DS18B20功能指令
DS18B20的复位操作,在某种意义上可以理解为一个访问DS18B20的开始。
ROM操作,主要有访问、搜索、匹配等,在单点传感器的应用中,可以直接跳过ROM指令。

微处理器读取单个DS18B20的温度数据,可参考以下步骤:
【1】DS18B20复位。
【2】写入字节0xCC,跳过ROM指令。
【3】写入字节0x44,开始温度转换。
【4】延时700~900ms。
【5】DS18B20复位。
【6】写入字节0xCC,跳过ROM指令。
【7】写入字节0xBE,读取高速暂存器。
【8】读取暂存器的第0字节,即温度数据的LSB。
【9】读取暂存器的第1字节,即温度数据的MSB。
【10】 DS18B20复位。,表示读取数据结束。
【11】将LSB和MSB整合成为一个16位数据。
【12】判断读取结果的符号,进行正负温度的数据处理。


float Read_Temperature()
{
  float temp;
  unsigned char LSB,MSB;      
  unsigned int dat = 0;      
  
  init_ds18b20();             //初始化DS18B20
  Write_DS18B20(0xcc);        //忽略ROM操作
  Write_DS18B20(0x44);        //启动温度转换
  Delay(1000);                //等待温度转换完成
  init_ds18b20();             //初始化DS18B20
  Write_DS18B20(0xcc);        //忽略ROM操作
  Write_DS18B20(0xbe);        //读出内部存储器
	
  LSB = Read_DS18B20();       //第0字节:温度低8位
  MSB = Read_DS18B20();       //第1字节:温度高8位
  //上述程序中插入多处数码管刷新,可使显示亮度充足
  dat = MSB;                  
  dat = (dat << 8) | LSB;     //合并为16位温度原始数据
  //判断符号,处理正温度
  if((dat & 0xf800) == 0x0000)    	
  {
    temp = dat * 0.0625;      //计算实际温度值
  }
  return temp;
}

DS18B20开发资源汇总

官方权威文档:DS18B20数据手册-英文版

应用参考案例链接:
【1】蓝桥杯单片机大赛-单总线温度传感器DS18B20的基本应用

赞(178)
未经允许不得转载:小蜜蜂笔记 » 单总线数字温度传感器DS18B20的基本原理及开发要点

小蜜蜂笔记 更专业 更方便 更高效

联系我们精品小店