|
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就行了)
}
}
|
|