#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; //開中斷 }