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的基本应用