温度传感器DS18B20应用

DS18B20是由DALLAS半导体公司推出的一种“一线总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、使用电压宽、与微处理器接口简单的数字化温度传感器。一线总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55~+125度,精度为0.5度。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。它能直接独处被测温度,并且可以根据实际要求通过简单的编程实现912位的数字值读数方式。它工作在33.5V的电压范围,采用多种封装形式,从而使得系统 设计灵活,方便,设定分辨率及用户设定的报警温度存储在EEPROM中,掉电后依然保存。

DS18B20管脚排列:

  1. GND为电源地;
  2. DQ为数字信号输入/输出端;
  3. VDD为外接供电电源输入端(在寄生电源接线方式时接地)
    管脚排列
    内部结构:
    主要4部分组成:64位ROM,温度传感器、温度报警触发器TH和TL、配置寄存器。
    内部结构组成
    其中ROM中的64位序列号是出厂前固化好的,可以看作是DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排列是:前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码CRC(X8+X5+X4+1)。ROM作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20。
    ROM数据分布
    温度和数据对应关系
    DS18B20中的温度传感器完成对温度的测量,用16位的二进制表示,其中S为符号位。
    温度数据分布
    例如:
    07D0h 0000 0111 1101 0000对(取26到20)7dh = 125,表示+125度
    0191h 0000 0001 1001 0001 对(取26到20)19h = 25,小数部分0001即2^-4
    假如温度为负则将16进制数取反加1再转换 例如:FF5Eh 1111 1111 0101 1110 取反加1 0000 0000 1010 0010 (取26到20)0ah = 10, 小数部分0010为0.125,表示-10.125度
    数据转换温度示例
    DS18B20 MEMORY MAP
    存储映射
    高速暂存存储器由9字节组成,当收到温度转换命令后,经转换所得的温度值存放在第0和第1个字节。第二个字节为高温阈值;第三个字节为低温阈值;第4字节为配置;第5~7字节保留;第8字节为CRC校验值。

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)→ 连续读出两个字节数据(即温度) → 结束。

猜你喜欢

转载自blog.csdn.net/m0_37105371/article/details/88565308