DS18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、使用电压宽、与微处理器接口简单的数字化温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55~+125度,精度为0.5度。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接独处被测温度,并且可以根据实际要求通过简单的编程实现912位的数字值读数方式。它工作在33.5V的电压范围,采用多种封装形式,从而使得系统 设计灵活,方便,设定分辨率及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
DS18B20管脚排列:
ROM 功能命令
Read Rom[33h] 读取DS18B20中ROM的内容
该命令允许总线主机读取DS18B20的8位c产品家族码,唯一的48位序列号和8位CRC。 只有在总线上有一个DS18B20时才能使用此命令。 如果总线上存在多个从机,当所有从机同时尝试往主机发送时,将发生数据冲突时(会产生线与结果)。
Match Rom[55h] ROM匹配
匹配ROM命令后跟64位ROM地址,允许总线主机在多点总线上寻址特定的DS18B20。 只有与64位ROM地址完全匹配的DS18B20才响应总线主机的命令。 所有与64位ROM序列不匹配的从器件将等待复位脉冲。 此命令可用于总线上的单个或多个从机。
Skip Rom[CCh] 跳过ROM
该命令允许总线主机可以不提供64位ROM序列也能访问存储器,从而可以节省单个总线系统中的时间。如果总线上存在多个从机并且主机在发出Skip ROM命令之后发出读命令,则当多个从机同时发送时,总线上将发生数据冲突(会产生线与结果)。
Search Rom[F0h] 搜索ROM
当系统刚启动时,总线上的主机可能不知道单总线上的从机数量和它们的64位ROM序列号。搜寻ROM命令使总线主机识别总线上所有从机的64位ROM序列号。
Alarm Search[ECh] 警报搜索
该命令的流程图与Search ROM命令相同,但是,只有在最后一次温度测量中遇到报警条件时,DS18B20才会响应这个命令。
存储功能命令
Write Scratchpad[4Eh] 写暂存器
发出数据向内部RAM的第2,3,4字节写,内容是上限温度数据命令、下限温度数据命令。
Read Scratchpad [BEh] 读暂存器
读内部RMA中的9字节的内容
Copy Scratchpad [48h] 复制暂存器
将RAM中的第2,3,4字节的内容复制到EEPROM中
Convert T [44h] 温度转换
启动DS18B20进行温度转换,转换时间最长为500ms(典型为200ms),结果存入内部9字节RAM中
Recall E2 [B8h] 重调EEPROM
EEPROM中的内容恢复到RAM中的第2,3,4字节
Read Power Supply [B4h] 读供电方式
读DS18B20的供电模式,寄生供电时DS12B20发送“0”,外接电源供电时DS12B20发送“1”
DS18B20的工作时序
所有的单总线器件都要求采用严格的信号时序:以保证数据的完整性。DS18B20共有6中信号类型:复位脉冲、应答脉冲、写0、写1、读0、读1。所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。
1)复位脉冲和应答脉冲
主机首先发出一个480us~960us的低电平脉冲,然后释放总线变为高电平,并在随后的480us时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。
做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960us的低电平出现,如果有,在总线转为高电平后等待15-60us后将总线电平拉低60us~240us做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。
//复位DS18B20
void DS18B20_Rst(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_DQ_OUT=0; //ÀµÍDQ
delay_us(750); //ÀµÍ750us
DS18B20_DQ_OUT=1; //DQ=1
delay_us(15); //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20
//返回0:存在
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PG11 INPUT
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)return 1;
return 0;
}
2)写时序
写时序包含了两种写时序:写0时序和写1时序。所有写时序至少需要60us,且每个写时序之间至少需要1us的恢复时间。
主机产生0时序:DQ line 拉低,延时60us,然后释放总线为高电平,延时2us。
主机长生1时序:DQ line 拉低,延时2us,然后释放总线为高电平,延时60us
做为从机的DS18B20则在检测到总线被拉底后等待15us然后从15us到60us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
//写入1个字节
//data为要写入的字节
void DS18B20_Write_Byte(u8 data)
{
u8 j;
u8 temp;
DS18B20_IO_OUT();
for (j=1;j<=8;j++)
{
temp=data&0x01;
data=data>>1;
if (temp)
{
DS18B20_DQ_OUT=0;// Write 1
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
else
{
DS18B20_DQ_OUT=0;// Write 0
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
3)读时序
单总线期间仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。
对于读数据时序也分为读0时序和读1时序。所有读时序至少需要60us才能完成,且2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。书记在读时序期间必须释放总线,并且在时序起使后的15us之内采样总线数据。典型的读时序过程为:主机输出低电平延时 2us,然后主机转入输入模式延时 12us,然后读取单总线当前的电平,然后延时 50us。
//从DS18B20读取一个位
//返回值:1或0
u8 DS18B20_Read_Bit(void) // read one bit
{
u8 data;
DS18B20_IO_OUT();
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN();
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
//DS18B20 Read One Byte
//返回值:读取到的数据
u8 DS18B20_Read_Byte(void)
{
u8 i,j,data;
data=0;
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
data=(j<<7)|(data>>1);
}
return data;
}
DS18B20的典型温度读取过程:
复位 → 发 SKIP ROM 命令(0XCC)→ 发开始转换命令(0X44) → 延时 → 复位 → 发送 SKIP ROM 命令(0XCC) → 发读存储器命令(0XBE)→ 连续读出两个字节数据(即温度) → 结束。