//----------------------------------------------------------------------------
// 復(fù)位 DS1820
//CPU將數(shù)據(jù)線拉低480us,然后釋放,
//當(dāng)DS18B20收到信號(hào)后等待16~60us左右,后發(fā)出60~240us的存在低脈沖,
//主CPU收到此信號(hào)表示復(fù)位成功。
//----------------------------------------------------------------------------
bit ResetDS18B20(void)
{
unsigned char i;
bit flag;
DS18B20=1;
i=1;while(--i);
DS18B20=0; // 保持低電平至少 480 uSec
i=255;while(--i); // 一個(gè)循環(huán) 2us
DS18B20=1;
i=30;while(--i); // 60us延時(shí),等DS18B20 完成采樣
flag=DS18B20;// 檢查DS1820 是否存在
i=180;while(--i); // 等 300 uSec
return flag; // flag=0復(fù)位成功,flag=1,復(fù)位不成功
}
//----------------------------------------------------------------------------
// 寫1個(gè)字節(jié)到DS18B20
// CPU將數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào);
//15us之內(nèi),將所寫的位送到數(shù)據(jù)線上;
//DS18B20在15us~60us之間接收位信息;
//寫下一個(gè)位之前要有1us以上的高電平恢復(fù);
//將以上過(guò)程重復(fù)8次,即完成一個(gè)字節(jié)的寫操作。
//----------------------------------------------------------------------------
void WRDS18B20(unsigned char da
{
unsigned char i,j;
for (j=0; j<8; j++)
{
DS18B20=0; // 數(shù)據(jù)線拉成低電平
i=1;while(--i);
DS18B20=da
da
i=30;while(--i);
DS18B20=1; //數(shù)據(jù)線恢復(fù)高電平
i=1;while(--i);
}
}
//----------------------------------------------------------------------------
// 從DS1820讀取1個(gè)字節(jié)
//CPU將數(shù)據(jù)線從高電平拉到低電平1us以上,再拉到高電平,產(chǎn)生讀起始信號(hào);
//15us之內(nèi),CPU讀一位;
//讀周期為60us,
//讀下一個(gè)位之前要有1us以上的高電平恢復(fù);
//將以上過(guò)程重復(fù)8次,即完成一個(gè)字節(jié)的讀操作。
//----------------------------------------------------------------------------
unsigned char RDDS18B20()
{
unsigned char i,j,da
bit temp;
for (j=0; j<8; j++)
{
DS18B20=0; // 數(shù)據(jù)線拉成低電平
i=1;while(--i);
DS18B20=1; //數(shù)據(jù)線拉到高電平
i=1;while(--i);
temp=DS18B20; // 讀取1位
da
if(temp==1) da
else da
i=30;while(--i);
DS18B20=1; //數(shù)據(jù)線恢復(fù)高電平
i=1;while(--i);
}
return da
}
//----------------------------------------------------------------------------
// 讀取溫度
// 返回溫度值*10后的結(jié)果
// (例 24.5 度 => 245 度)
//----------------------------------------------------------------------------
unsigned int GetTempDS18B20()
{
unsigned int i,j;
unsigned int k;
bit flag;
flag=ResetDS18B20(); //復(fù)位
if(flag) return 0x0000;
WRDS18B20(0xcc); // 跳過(guò)ROM
WRDS18B20(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
delaynms(750); // 延時(shí)750ms
flag=ResetDS18B20(); //復(fù)位
if(flag) return 0x0000;
WRDS18B20(0xcc); //跳過(guò)ROM
WRDS18B20(0xbe); // 發(fā)讀溫度命令
j=RDDS18B20(); //讀溫度低字節(jié)
j=j+(RDDS18B20()<<8); //讀溫度高字節(jié),然后加上溫度低字節(jié)
i=((j>>4)*10)+((((j&0x0008)>>3)*500)+(((j&0x0004)>>2)*250)+(((j&0x0002)>>1)*125)+((j&0x0001)*62))/100;
//溫度值*10
return i;
}