#include<intrins.h>
#ifndef _DS18B20_H_
#define _DS18B20_H_
sbit DS=P2^4;
void DS18B20_Delay(unsigned int x)
{
unsigned int a,b;
for(a=x;a>0;b--);
}
void DS18B20_reset(void)
{
unsigned int i;
DS=0;
i=103;
while(i>0) i--;
DS=1;
i=4;
while(i>0) i--;
}
bit DS18B20_bitread()
{
unsigned int i;
bit dat;
DS=0;_nop_();
DS=1;_nop_();_nop_();
dat=DS;
i=8;while(i>0) i--;
return (dat);
}
unsignedchar DS18B20_byteread()
{
unsigned char i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j= DS18B20_bitread();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void DS18B20_bytewrite(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
DS=0;
_nop_(); _nop_();
DS=1;
i=8;
while(i>0)i--;
}
else
{
DS=0;
i=8;while(i>0)i--;
DS=1;
_nop_(); _nop_();
}
}
}
void DS18B20_gettemp(unsigned char *integer,unsigned char *decimal, unsigned char *symbol)
{
unsigned char high,low,temp;
DS18B20_reset();
DS18B20_delay(1);
DS18B20_bytewrite(0xcc);
DS18B20_bytewrite(0x44);
DS18B20_reset();
DS18B20_delay(1);
DS18B20_bytewrite(0xcc);
DS18B20_bytewrite(0xbe);
low=DS18B20_bytewrite();
high=DS18B20_bytewrite();
temp=high>>4;
if(0==temp)
{
(*symbol)=1;
(*integer)=~((high<<4)|(low>>4));
(*decimal)=10-(low&0xf)*10/16;
if(10==*decimal)
{
(*integer)+=1;
(*decimal)=0;
}
}
}
#endif /*_DS18B20_H_*/
#ifndef _DS18B20_H_
#define _DS18B20_H_
sbit DS=P2^4;
void DS18B20_Delay(unsigned int x)
{
unsigned int a,b;
for(a=x;a>0;b--);
}
void DS18B20_reset(void)
{
unsigned int i;
DS=0;
i=103;
while(i>0) i--;
DS=1;
i=4;
while(i>0) i--;
}
bit DS18B20_bitread()
{
unsigned int i;
bit dat;
DS=0;_nop_();
DS=1;_nop_();_nop_();
dat=DS;
i=8;while(i>0) i--;
return (dat);
}
unsignedchar DS18B20_byteread()
{
unsigned char i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j= DS18B20_bitread();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void DS18B20_bytewrite(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
DS=0;
_nop_(); _nop_();
DS=1;
i=8;
while(i>0)i--;
}
else
{
DS=0;
i=8;while(i>0)i--;
DS=1;
_nop_(); _nop_();
}
}
}
void DS18B20_gettemp(unsigned char *integer,unsigned char *decimal, unsigned char *symbol)
{
unsigned char high,low,temp;
DS18B20_reset();
DS18B20_delay(1);
DS18B20_bytewrite(0xcc);
DS18B20_bytewrite(0x44);
DS18B20_reset();
DS18B20_delay(1);
DS18B20_bytewrite(0xcc);
DS18B20_bytewrite(0xbe);
low=DS18B20_bytewrite();
high=DS18B20_bytewrite();
temp=high>>4;
if(0==temp)
{
(*symbol)=1;
(*integer)=~((high<<4)|(low>>4));
(*decimal)=10-(low&0xf)*10/16;
if(10==*decimal)
{
(*integer)+=1;
(*decimal)=0;
}
}
}
#endif /*_DS18B20_H_*/