DS18B20.C

DS18B20.C  

 


#include "DS18B20.h"ide

/*********************************************************************************************************
** 全局變量
********************************************************************************************************/
unsigned char Temperature;
/*********************************************************************************************************
** 函數名稱:Delay_us(unsigned char us)
** 函數功能:延時uS
** 入口參數:unsigned char us
** 出口參數:void
** 說    明:u,延時精度2us
********************************************************************************************************/
void Delay_us (unsigned char us)                
{函數

   while(--us);
}
/*********************************************************************************************************
** 函數名稱:unsigned char OWTouchReset(void)
** 函數功能:復位溫度傳感器,並返回是否檢測到信號
** 入口參數:void
** 出口參數:unsigned char,返回是否檢測到信號
** 說    明:  返回值爲1表明沒有檢測到,不然檢測到
********************************************************************************************************/
unsigned char OWTouchReset (void)
{
    unsigned char result;spa

    DQ = 0;                                        //低電平驅動
    Delay_us(TRSTL/2);          //600us復位低電平
 Delay_us(TRSTL/2); 
    DQ = 1;                                        //高電平驅動
    Delay_us(TPDHIGH);          //40us高電平存在檢測           
 _nop_();          
    result = DQ;                                   // 檢測信號
    Delay_us(TPDLOW);                             //160us低電平存在檢測
 DQ = 1;
    Delay_us(TTSTH );                             //160us低電平存在檢測
 
    return result;                                
}
/*********************************************************************************************************
** 函數名稱:void OWWriteBit (unsigned char BitData)
** 函數功能:往總線上寫1位數據
** 入口參數:unsigned char BitData
** 出口參數:void
** 說    明:分爲數據0和數據1
********************************************************************************************************/
void OWWriteBit (unsigned char BitData)
{
    if (BitData)            //數據位爲1
    {
        DQ = 0;                                    //低電平驅動
        Delay_us( TLOW1 );         //單線寫1低電平時間7us
        DQ = 1;                                    // 高電平驅動
        Delay_us(TSOLT );                          //時間間隙80us
  DQ = 1;     
    }
    else            //數據位爲0
    {
        DQ = 0;                                    // 低電平驅動
        Delay_us(TLOW0);       //單線寫0低電平時間80us
        DQ = 1;          //高電平驅動
    }
}
/*********************************************************************************************************
** 函數名稱:unsigned char OWReadBit (void)
** 函數功能:從總線讀取一個數據位
** 入口參數:void
** 出口參數:unsigned char
** 說    明:
********************************************************************************************************/
unsigned char OWReadBit (void)
{
    unsigned char result;blog

    DQ = 0;                                    // 低電平驅動
    Delay_us(TRDV);          //得到信號時間7us
    DQ = 1;                                    //高電平驅動
 _nop_();
    result = DQ;                               // 獲取信號
    Delay_us(TSOLT);                           //時間間隙80us
 DQ = 1;ip

    return result;
}
/*********************************************************************************************************
** 函數名稱:void OWWriteByte (unsigned char Data)
** 函數功能:往總線寫一字節
** 入口參數:unsigned char Data
** 出口參數:void
** 說    明:
********************************************************************************************************/
void OWWriteByte (unsigned char Data)
{
    unsigned char i;it

   //發送8位數據
    for (i=8;i!=0;i--)
    {
        OWWriteBit(Data & 0x01);
        Data = (Data >> 1);
    }
}
/*********************************************************************************************************
** 函數名稱:unsigned char OWReadByte (void)
** 函數功能:從總線讀取一個字節
** 入口參數:void
** 出口參數:unsigned char
** 說    明:
********************************************************************************************************/
unsigned char OWReadByte (void)
{
    unsigned char i,result=0;class

    for (i=8;i!=0;i--)
    {
        //從高位開始存取
        result = (result >> 1);
        if (OWReadBit()) result |= 0x80;
    }
    return result;
}
/*********************************************************************************************************
** 函數名稱:unsigned char DS18B20_Init (void)
** 函數功能:初始化溫度傳感器
** 入口參數:void
** 出口參數:unsigned char
** 說    明:
********************************************************************************************************/
unsigned char DS18B20_Init (void)
{
    EA = 0;                                     //關中斷變量

    if (OWTouchReset())          
    {
        EA = 1;                                 //若是沒有檢測到,開中斷
        return 0xE0;
    }配置


    OWWriteByte(OW_SkipROM);                     //跳過ROM
    OWWriteByte(OW_WriteScratchpad);             //寫暫存器
    OWWriteByte(0x3D);                          // TH=60  設置最高溫度
    OWWriteByte(0x00);                          // TL=0     設置最低溫度
    //精度設置爲12-BIT
 OWWriteByte(0x7F);                          // DS18B20配置寄存器R1,R0=11
 
    if (OWTouchReset())
    {
        EA = 1;                           //開中斷
        return 0xE0;
    }數據

    OWWriteByte(OW_SkipROM);     //跳過ROM
    OWWriteByte(OW_CopyScratchpad);             //複製暫存器


    EA = 1;                                     //關中斷

    return 0;
}
/*********************************************************************************************************
** 函數名稱:unsigned char ReadDS18B20 (void)
** 函數功能:讀取傳感器溫度
** 入口參數:void
** 出口參數:unsigned char
** 說    明:
********************************************************************************************************/
unsigned char ReadDS18B20 (void)
{
    unsigned char i,result=0;

    EA = 0;                                     //關中斷

    if (OWTouchReset())
    {
        EA = 1;                                 //開中斷
        return 0xE0;
    }

    OWWriteByte(OW_SkipROM);                 //跳過ROM
    OWWriteByte(OW_ReadScratchpad);          //讀取暫存器的值,9字節
   
    for (i=0;i <9;i++)
    {
        result = OWReadByte();
        if (0 == i)                        //溫度低字節
        {
            Temperature = result >> 4;   // 溫度不保留小數
        }
        else if (1 == i)    //溫度高字節
        {
                 if (result & 0xF8)
                 {
                     Temperature = 0;           // 負溫度歸零
                 }
    else
    {
                Temperature |= (( result&0x07)<<4 ); // 溫度保留8bit整數
    }
        }
    }
   
    EA = 1;                                     ////////////////

    return 0;
}
/*********************************************************************************************************
** 函數名稱:void DS18B20ConvT (void)
** 函數功能:轉換溫度
** 入口參數:void
** 出口參數:void
** 說    明:
********************************************************************************************************/
void DS18B20ConvT (void)
{
    EA = 0;                                     //關中斷
   
    if (OWTouchReset())
    {
        EA = 1;                                 //開中斷
        return;
    }

    OWWriteByte(OW_SkipROM);     //跳過ROM
    OWWriteByte(OW_ConvertT);                  //溫度轉換

    EA = 1;                                     //開中斷 }

相關文章
相關標籤/搜索