天天看點

51單片機第八講(DS18B20溫度晶片)

1.單總線通信初始化

初始化時序包括:主機發出的複位脈沖和從機發出的應答脈沖。主機通過拉低單總線480-960μs産生複位脈沖;然後由主機釋放總線,并進入接收模式。主機釋放總線時,會産生一由低電平跳變為高電平的上升沿,單總線器件檢測到該上升沿後,延時15~60μs,接着單總線器件通過拉低總線60~240μsμ來産生應答脈沖。主機接收到從機的以應答脈沖後,說明有單總線器件線上,到此初始化完成。然後主機就可以開始對從機進行ROM指令和功能指令操作。

51單片機第八講(DS18B20溫度晶片)
void Init_DS18B20(void)
{
    DQ = ;                       //DQ拉低
    Delay480us();                 //延時480~960us
    DQ = ;                       //DQ拉高
    Delay60us();                  //延時15~60us
    if(DQ == )//器件應答正确       //如果DQ等于0,則從機應答正确
    {
        Delay240us();             //延時240us
        DQ = ;                   //DQ拉高
    }  
}
           

2.寫時序:

當主機把資料線從邏輯高電平拉到邏輯低電平的時候,寫時間隙開始。有兩種寫時間隙:寫1的時間隙和寫0時間隙。所有寫時間隙必須最少持續60us,包括兩個寫周期間至少1us的恢複時間。DQ引腳上的電平變低後,DS18B20在一個15us到60us的時間視窗内對DQ引腳采樣。如果DQ引腳是高電平,就是寫1,如果DQ引腳是低電平,就是寫0。主機要生成一個寫1時間隙,必須把資料線拉到低電平然後釋放,在寫時間隙開始後的15us内允許資料線拉到高電平。主機要生成一個寫0時間隙,必須把資料線拉到低電平并保持60us。

51單片機第八講(DS18B20溫度晶片)
/******************************************************************/
/*                 寫一個位元組    先寫低位                         */
/******************************************************************/
void WriteOneByte(unsigned char dat)
{
    unsigned char i;
    for(i = ; i < ; i++)
    {
        DQ = ;             //DQ先拉低
        _nop_();            //在15us以内寫對應值,從機進行采樣
        if(dat & )      //如果是寫1則DQ變為1
        {
            DQ = ;         
        }   
        else
        {
            DQ = ;         //否則DQ為0
        }
        Delay60us();        //延時60us
        DQ = ;             //釋放總線
        dat >>= ;          //寫下一位資料
    }     
}
           

3.讀時序:

當主機把總線從高電平拉低,并保持至少1us後釋放總線;并在15us内讀取從DS18B20輸出的資料。

51單片機第八講(DS18B20溫度晶片)
/******************************************************************/
/*                    讀一個位元組  , 低位開始                     */
/******************************************************************/
unsigned char ReadOneByte(void)
{
    unsigned char i;
    unsigned char value = ;
    for(i = ; i < ; i++)
    {
        value >>= ;
        DQ = ;
        _nop_();
        DQ = ;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();

        if(DQ)
        {
            value |= ;
        }
        Delay60us();
    }  

    return value;
}
           

4.溫度處理過程

1.初始化

2.0XCC

3.0X44

4.延時一段時間

5.初始化

6.0XCC

7.0XBE

8.讀取溫度寄存器低位元組和高位元組值

9.數值處理

/******************************************************************/
/*                   讀取溫度                                     */
/******************************************************************/
unsigned int ReadTemperature(void)
{
    unsigned int a, b, t;
    Init_DS18B20();        
    WriteOneByte(0xcc);
    WriteOneByte(0x44);
    delay_ms(200);
    Init_DS18B20();
    WriteOneByte(0xcc);
    WriteOneByte(0xbe);
    a = ReadOneByte(); //低位元組
    b = ReadOneByte(); //高位元組
    b = b << 8;
    t = a + b;

    return t;
}
           

繼續閱讀