概述
DS18B20为单总线12位(二进制)温度读数。内部有位唯一的ID编码。工作电压从3.0~5.5V。测量温度范围从-55℃~125℃。最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。温度传感器可以配置成9、10、11和12位方式。相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。默认的分辨率为12位。DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射
表1 温度寄存器的格式
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | |
Ls byte | 23 | 22 | 21 | 20 | 2-1 | 2-2 | 2-3 | 2-4 |
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | |
Ms byte | S | S | S | S | S | 26 | 25 | 24 |
Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 | |
配置寄存器 | 0 | R1 | R0 | 1 | 1 | 1 | 1 | 1 |
R1 | R0 | 分辩率 | 最大转换时间 | |
0 | 0 | 9-bit | 93.75ms | (tCONV/8) |
0 | 1 | 10-bit | 187.5ms | (tCONV/4) |
1 | 0 | 11-bit | 375ms | (tCONV/2) |
1 | 1 | 12-bit | 750ms | (tCONV) |
//**********************************************************************//** 文件名:DS18B20.c
//** 说 明:DS18B20驱动程序文件
//---------------------------------------------------------------------//** 单 位:
//** 创建人:张雅
//** 创建时间:2010-01-20
//** 联系方式:QQ:2765402
//** 版 本:V1.0
//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯 片:ATS52
//** 时 钟:11.0592MHz
//** 其 它:这个文档为18B20的驱动程序,引用了数码管的驱动。//** 使用时请注明出处。
//**********************************************************************#include #ifndef UCHAR #define UCHAR unsigned char #endif #ifndef UINT #define UINT unsigned int #endif sbit DQ = P1^0; //DS18B20单总线引脚定义 #include "DS18B20.h" #include "LED8.h" //**********************************************************************//函数功能:11us延时 //输入参数:t :延时长度,单位11us //输出参数:无 //**********************************************************************void _delay(UINT t){ //11us for(;t>0;t--); } //**********************************************************************//函数功能:DS18B20复位操作函数 //输入参数:无 //输出参数:为1说明器件不存在,为0说明器件存在 //**********************************************************************UCHAR _DS18B20Reset(void){ DQ = 1; _delay(1); DQ = 0; _delay(50); DQ = 1; _delay(10); if(!DQ) { _delay(50); return 0; } else { return 1; } } //**********************************************************************//函数功能:DS18B20写操作函数 //输入参数:待写入的数据 //输出参数:无 //**********************************************************************void _DS18B20Write(UCHAR d){ UCHAR i; for(i=0;i<8;i++){ DQ = 0; _delay(1); DQ = d&0x01; //最低位先发送出去 _delay(4); DQ = 1; d >>=1; } } //**********************************************************************//函数功能:DS18B20读操作函数 //输入参数:无 //输出参数:读取的数据 //**********************************************************************UCHAR _DS18B20Read(void){ UCHAR i,d; d=0; for(i=0;i<8;i++){ DQ = 0; d >>=1; _delay(1); DQ = 1; if(DQ){ d|=0x80; //最低位先接收到 } _delay(4); DQ = 1; } return d; } //**********************************************************************//函数功能:DS18B20读寄存器操作函数 //输入参数:无 //输出参数:读取的温度数据 // 高8位为温度值整数部分 // 低8位为温度值小数部分 //**********************************************************************UINT DS18B20ReadTemp(void){ static UCHAR TH,TL; UCHAR *pp; UINT TEM; static enum _s{s1,s11,s12,s2,s3,s4}s; bit EAflag; EAflag = EA; EA = 0; switch(s){ case s1: while(_DS18B20Reset()){ //无芯片连接时,显示“no-18b20” pp = LED8GetRam(); *pp++ =22; *pp++ =0; *pp++ =11; *pp++ =1; *pp++ =8; *pp++ =23; *pp++ =2; *pp++ =0; LED8Display(); } s=s11; break; case s11: _DS18B20Write(0xCC); //跳过ROM操作命令 _DS18B20Write(0xBE); //读中间寄存器 s=s12; break; case s12: TL = _DS18B20Read(); TH = _DS18B20Read(); TH = (TH<<4)|(TL>>4); TL = (TL&0x0F); s=s2; break; case s2: _DS18B20Reset(); _DS18B20Write(0xCC); //跳过ROM命令 _DS18B20Write(0x44); //开始转换 s=s3; break; case s3: if(DQ){ s=s1; } break; default: s = s1; break; } EA = EAflag; TEM=TH; TEM=(TEM<<8)+TL; return TEM; }