DS18B20溫度傳感器驅動(單線通信)

 

/*****************************************************************************
FileName : DS18B20.c
Function : DS18B20溫度傳感器驅動程序
Author   : mike
Email    : [email protected]	
Version  : V1.0
Date     : 2019-07-12
Note     :

主控:STC12C5A60S2
*****************************************************************************/
#include "include.h"
#include "DS18B20.h"

sbit DQ = P3^6;	

void delayus(int m)//1T--->STC12C5A60S2
{
    for(;m>0;m--)	
    {
        _nop_();
        _nop_();
    }
}

u8 ds18b20_init(void)//初始化ds18B20
{
    u8 retry = 0;
    DQ = 1;    		//DQ復位
    delayus(8);  	//稍做延時
    DQ = 0;    		//單片機將DQ拉低
    delayus(250); 	//精確延時 大於 480us
    DQ = 1;    		//拉高總線
    delayus(15);
	
    while((!DQ) && (retry++ < 250))
    {
        delayus(2);
    }
    delayus(20);
	
    if(retry >= 250)
        return 1;	//1初始化失敗
	
    return 0;	//0初始化成功
}
//******************************************************************************
u8 readonechar(void)//讀一字節
{
    u8 i=0;
    u8 dat = 0;
    for (i=8;i>0;i--)
    {
        DQ = 0; // 給脈衝信號
        dat >>= 1;
        DQ = 1; // 給脈衝信號
        if(DQ)
            dat |= 0x80;
        delayus(15);
    }
    return dat;
}

//******************************************************************************
void writeonechar(u8 dat)//寫一字節
{
    u8 i = 0;
    for (i = 8;i > 0;i--)
    {
        DQ = 0;
        DQ = dat&0x01;
        delayus(5); //不能延時過久
        DQ = 1;
        dat >>= 1;
    }
}
//******************************************************************************
u16 read_temperature(void)//讀取溫度
{
    u8 TPL = 0;
    u8 TPH = 0;
    u16 temp = 0;

    u8 retry = 0;	
	
    ds18b20_init();
    writeonechar(0xCC); // 跳過讀序號列號的操作
    writeonechar(0x44); // 啓動溫度轉換
	
    //while(!DQ);        //等待轉換完成
    while((!DQ) && (retry++ < 250))
    {
        delayus(2);
    }
	
    ds18b20_init();
    writeonechar(0xCC); //跳過讀序號列號的操作
    writeonechar(0xBE); //讀取溫度寄存器
    TPL = readonechar();//讀低8位
    TPH = readonechar();//讀高8位

    temp = ((u16)TPH << 8) | (u16)TPL;  //高8位和低8位轉化爲u16 	

//溫度在寄存器中爲12位,分辨率爲0.0625,放大10倍輸出並四捨五入
    temp = 	(u16)((float)temp*0.0625*10+0.5);
    return temp;
}

u16 temp_disp(void)//顯示溫度---消抖計算,使溫度更準確
{
    u16 read_dat = 0;

    read_dat = read_temperature();

    //printf("DS18B20讀出dat = %d",read_dat);
    //printf("℃\n");

    return read_dat;
}

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章