1. 程式人生 > >詳解溫度感測器DS18B20程式設計與使用

詳解溫度感測器DS18B20程式設計與使用

DS18B20是由DALLAS半導體公司推出的一種的“一線匯流排”介面的溫度感測器, 與傳統的熱敏電阻等測溫元件相比,它是一種新型的體積小、適用電壓寬、與微處理器介面簡單的數字化溫度感測器。

1.測量溫度範圍:-55~+125℃
2.精度:±0.5℃
3.資料傳輸:“一線匯流排”的數字方式傳輸
在這裡插入圖片描述
圖1 硬體連線圖

DS18B20共有6種訊號型別:復位脈衝、應答脈衝、寫0、寫1、讀0和讀1

1.復位操作:
引腳拉低——延時480-960us——引腳高——延時15-60us
在這裡插入圖片描述
圖2 紅框為復位操作時序

void DS18B20_Rst(void)    
{                
   DS18B20_IO_OUT();     
   DS18B20_DQ_OUT=0;  
   delay_us(750);    
   DS18B20_DQ_OUT=1;   
   delay_us(15);     
}

2.應答操作
將引腳設定為輸入模式——判斷引腳低電平時間是否大於60us、小於240us——返回應答結果
在這裡插入圖片描述
圖3 紅框為應答操作時序

u8 DS18B20_Check(void)           
{  
    u8retry=0;
    DS18B20_IO_IN();   //SET PG11 INPUT    
    while (DS18B20_DQ_IN&&retry<200)
    {
       retry++;
       delay_us(1);
    };        
    if(retry>=200)return1;
         elseretry=0;
    while (!DS18B20_DQ_IN&&retry<240)
    {
         retry++;
         delay_us(1);
    }
    if(retry>=240)return1;       
         return0;
}

3. 讀0、讀1操作
將引腳設定為輸出模式——引腳拉低——延時2us——引腳拉高——設定為輸入模式——延時2us——讀取引腳狀態——返回讀取結果
在這裡插入圖片描述
圖4 讀操作

u8 DS18B20_Read_Bit(void)   
{
   u8 data;
   DS18B20_IO_OUT();        //SET PG11 OUTPUT
   DS18B20_DQ_OUT=0;
   delay_us(2);
   DS18B20_DQ_OUT=1;
   DS18B20_IO_IN();   //SET PG11 INPUT
   delay_us(12);
   if(DS18B20_DQ_IN)data=1;
   else data=0;      
   delay_us(50);          
   return data;
}

4.寫1操作
設定引腳為輸出模式——引腳拉低——延時2us——引腳拉高——延時大於60us
在這裡插入圖片描述
圖5 紅框為寫操作

void DS18B20_Write_Zero(void)
{
    DS18B20_IO_OUT();        //SET PG11 OUTPUT;
   DS18B20_DQ_OUT=0;    
   delay_us(2);                           
   DS18B20_DQ_OUT=1;
   delay_us(60);
}

5.寫0操作
設定引腳為輸出模式——引腳拉低——延時60-120us——引腳拉高——延時2us
在這裡插入圖片描述
圖6 紅框為寫1操作

void DS18B20_Write_One(void)
{
   DS18B20_IO_OUT();        //SET PG11 OUTPUT;
   DS18B20_DQ_OUT=0;    
   delay_us(60);                           
   DS18B20_DQ_OUT=1;
   delay_us(2);
}

基本的操作完成後,再寫4個功能函式

6.讀取一個位元組

u8 DS18B20_Read_Byte(void)    
{       
   u8 i,j,dat;
   dat=0;
   for(i=1;i<=8;i++)
   {
       j=DS18B20_Read_Bit();
       dat=(j<<7)|(dat>>1);
   }                                                          
   return dat;
}

7.寫一個位元組

void DS18B20_Write_Byte(u8 dat)    
 {            
   u8 j;
   u8 testb;
   DS18B20_IO_OUT();        //SET PG11 OUTPUT;
   for (j=1;j<=8;j++)
   {
       testb=dat&0x01;
       dat=dat>>1;
       if (testb)
           DS18B20_Write_One();
       else
          DS18B20_Write_Zero();
   }
}

8.開始讀取資料

void DS18B20_Start(void)
{                                                                  
   DS18B20_Rst();          
   DS18B20_Check();    
   DS18B20_Write_Byte(0xcc);   // skiprom
   DS18B20_Write_Byte(0x44);  //convert
}

9.初始化DS18B20

u8 DS18B20_Init(void)
{
    GPIO_Init();     //此引腳需根據相應的微控制器進行配置
    DS18B20_Rst();
    return DS18B20_Check();
} 

10.獲取溫度值
在這裡插入圖片描述
圖7 程式流程圖

short DS18B20_Get_Temp(void)
{
   u8 temp;
   u8 TL,TH;
   short tem;
   DS18B20_Start ();           //開始轉換
   DS18B20_Rst();
   DS18B20_Check();    
   DS18B20_Write_Byte(0xcc);   //skip rom
   DS18B20_Write_Byte(0xbe);   //convert       
   TL=DS18B20_Read_Byte();     //LSB  
   TH=DS18B20_Read_Byte();     //MSB  
   if(TH>7)
   {
       TH=~TH;
       TL=~TL;
       temp=0;//溫度為負 
   }
   else 
       temp=1;//溫度為正                 
   tem=TH; //獲得高八位
   tem<<=8;   
   tem+=TL;//獲得底八位
   tem=(double)tem*0.625;//轉換    
   if(temp)
   	return tem; //返回溫度值
   else
   	return -tem;   
}

參考文獻:
STM32F103開發指南-標準庫版本_V1.1
DS18B20資料手冊