/
uchar resetDS18B20(void)
{
uchar errTime=0;
RLS_DS18B20; //釋放總線
_NOP();
HLD_DS18B20; //Maga16控制總線
CLR_DS18B20; //強(qiáng)制拉低
delayUs(255); //209.42us
delayUs(255); //209.42us
delayUs(255); //83.28us
//以上的三個(gè)延時(shí)大于480us
RLS_DS18B20; //釋放總線,總線自動(dòng)上拉
_NOP();
while(STU_DS18B20)
{
delayUs(4); //5.15us
errTime++;
if(errTime>20)
return(0x00); //如果等待大于約 5.15us*20就返回0x00,報(bào)告復(fù)位失?。▽?shí)際上只要等待15-60us)
}
errTime=0;
while(!(STU_DS18B20))
{
delayUs(4); //5.15us
errTime++;
if(errTime>50)
return(0x00); //如果等帶大于約 5.15us*50就返回0x00,報(bào)告復(fù)位失?。▽?shí)際上只要等待60-240us)
}
return(0xff);
}
/
uchar readByteDS18B20(void)
{
uchar i;
uchar retVal=0;
RLS_DS18B20; //釋放總線
for(i=8;i>0;i--)
{
retVal>>=1;
HLD_DS18B20; //Maga16控制總線
CLR_DS18B20; //強(qiáng)制拉低
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP(); //延時(shí)大于1us
RLS_DS18B20; //釋放總線,DS18B20會(huì)將總線強(qiáng)制拉高
NOP();
NOP();
NOP();
if(STU_DS18B20)
retVal|=0x80;
delayUs(16); //14.92us
delayUs(16); //14.92us
RLS_DS18B20; //釋放總線
delayUs(35); //30.38us
}
delayUs(1); //2.71us(大于1us就行了)
return(retVal);
}
/
void writeByteDS18B20(uchar wb)
{
uchar i;
uchar temp;
RLS_DS18B20; //釋放總線
for(i=0;i<8;i++)
{
HLD_DS18B20; //Maga16控制總線
CLR_DS18B20; //強(qiáng)制拉低
delayUs(16); //14.92us
temp=wb>>i;
temp&=0x01;
if(temp)
RLS_DS18B20; //釋放總線
else
CLR_DS18B20; //強(qiáng)制拉低
delayUs(16); //14.92us
delayUs(35); //30.38us
RLS_DS18B20; //釋放總線
delayUs(1); //2.71us(大于1us就行了)
}
}
/
unsigned int readTempDS18B20(void)
{
uchar tempL,tempH;
uint x;
resetDS18B20();
writeByteDS18B20(0xcc); //跳過(guò)ROM
writeByteDS18B20(0x44); //啟動(dòng)溫度轉(zhuǎn)換
delayUs(1);
resetDS18B20();
writeByteDS18B20(0xcc); //跳過(guò)ROM
writeByteDS18B20(0xbe); //讀數(shù)據(jù)
tempL=readByteDS18B20();
tempH=readByteDS18B20();
x=(tempH<<8)|tempL;
return(x);
}
評(píng)論