/* ds18b20 常量*/
/* ds18b20 configuration register : Thermometer Resolution */
#define ds18b20_TR_9 0x1f
#define ds18b20_TR_10 0x3f
#define ds18b20_TR_11 0x5f
#define ds18b20_TR_12 0x7f
#define ds18b20_TH_VAL 80
#define ds18b20_TL_VAL 40
#define ds18b20_TR_VAL ds18b20_TR_9
/* ds18b20 ROM function commands18b20 */
#define ds18b20_ReadR 0x33
#define ds18b20_MatchR 0x55
#define ds18b20_SkipR 0xcc
#define ds18b20_SearchR 0xf0
#define ds18b20_AlarmSearch 0xec
/* ds18b20 memory command function */
#define ds18b20_WriteSP 0x4e
#define ds18b20_ReadSP 0xbe
#define ds18b20_CopySP 0x48
#define ds18b20_ConvertT 0x44
#define ds18b20_RecallE2 0xb8
#define ds18b20_ReadPS 0xb4
//12M晶振0
void delay_100us(uchar opd)
{uchar data i1;
while(opd)
{opd--;
for(i1=0;i1<10;i1++) _nop_();
}
}
void delay_10us(uchar opd)
{ while(opd)
{opd--;_nop_();_nop_();_nop_();_nop_();}
}
void delay_ms(uchar opdata)
{ uchar data i1 ;
while(opdata)
{for(i1=0;i1<248;i1++) {_nop_();}
opdata--;
}
}
bit ds18b20_reset(void)
{bit ib;
ds18b20_dq=1;
ds18b20_dq=0;
delay_100us(6);
ds18b20_dq=1;
delay_10us(6);
ib=ds18b20_dq;
delay_10us(20);
return ib;
}
void ds18b20_bitwrite(uchar opcode)
{ uchar data i1;
ds18b20_dq=1;
for(i1=0;i1<8;i1++)
{ ds18b20_dq=0;
_nop_();_nop_();
if(opcode & 0x01) {ds18b20_dq=1;}
else {ds18b20_dq=0;}
opcode>>=1;
delay_10us(6);
ds18b20_dq=1;
}
}
uchar ds18b20_bitread(void)
{uchar data i1,i2;
i2=0;
ds18b20_dq=1;
for(i1=0;i1<8;i1++)
{ ds18b20_dq=0;
_nop_();_nop_();
i2>>=1;
ds18b20_dq=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
if(ds18b20_dq) {i2|=0x80;}
delay_10us(3);
ds18b20_dq=1;
}
return i2;
}
// *********TEMP CONVERT***********
void main(void)
{...............
{EA=0;
tempb1=ds18b20_reset();
if(tempb1==NOTPRESENCE)
{EA=1;error_flag=ERROR;error_mode=ERROR_PRESENCE;goto markerror;}
ds18b20_bitwrite(0xcc); //SKIP ROM
ds18b20_bitwrite(0xbe); //READ SP
i1=ds18b20_bitread();
i2=ds18b20_bitread();
ds18b20_reset();
EA=1;
i1>>=4;i2<<=4; // 数据处理
i1|=i2;i1++;
if(i1 & 0x80) {temp_tst=0;}
else {temp_tst=i1;}
EA=0;
ds18b20_reset();
ds18b20_bitwrite(0xcc); //SKIP ROM
ds18b20_bitwrite(0x44); //CONVERT TEMP
EA=1;
delay_ms(30); //确保可靠,延时
}
..................
}