|
unsigned char resetDS18B20(void)
{
unsigned char errTime=0;
rls_dq; //釋放總線
_NOP();
hold_dq; //Maga16控制總線
dq_clr; //強制拉低
delay_nus(480);
//以上延時大于480us
rls_dq; //釋放總線,總線自動上拉
_NOP();
while(stu_dq)
{
delay_nus(5); //5us
errTime++;
if(errTime>12)
return(0x00); //如果等帶大于約 5*12就返回0x00,報告復位失敗(實際上只要等待15-60us)
}
errTime=0;
while(!(stu_dq))
{
delay_nus(5); //5us
errTime++;
if(errTime>50)
return(0x00); //如果等帶大于約 5us*50就返回0x00,報告復位失敗(實際上只要等待60-240us)
}
return(0xff);
}
unsigned char readByteDS18B20(void)
{
unsigned char i;
unsigned char retVal=0;
rls_dq; //釋放總線
for(i=8;i>0;i--)
{
retVal>>=1;
hold_dq; //Maga16控制總線
dq_clr; //強制拉低
delay_nus(8); //延時大于1us
dq_set; //釋放總線,DS18B20會將總線強制拉低
rls_dq; //釋放總線
if(stu_dq)
retVal|=0x80;
delay_nus(30); //30us
hold_dq; //釋放總線
dq_set; //釋放總線,DS18B20會將總線強制拉低
}
delay_nus(5); //2.71us(大于1us就行了)
return(retVal);
}
void writeByteDS18B20(unsigned char wb)
{
unsigned char i;
unsigned char temp;
rls_dq; //釋放總線
for(i=0;i<8;i++)
{
hold_dq; //Maga16控制總線
dq_clr; //強制拉低
delay_nus(4);
temp=wb>>i;
temp&=0x01;
if(temp)
dq_set; //釋放總線
else
dq_clr; //強制拉低
delay_nus(50);
dq_set; //釋放總線
delay_nus(4); //(大于1us就行了)
}
}
|
|