#include "ds18b20.h"
sbit ds18b20_data=P1^6;
//延時5us
#ifdef MCU_STC12
void ds18b20_delay(unsigned char i)
{
unsigned char j=0;
for(j=0;j<i;j++);
}
#endif
#ifdef MCU_STC89
void ds18b20_delay(unsigned char i)
{
while(i--);
}
#endif
void ds18b20_init()
{
ds18b20_data=0;
ds18b20_delay(120); //>480us
ds18b20_data=1;
ds18b20_delay(8); //40us
ds18b20_delay(100); //wait
}
void ds18b20_write(unsigned char cmd)
{
char i=0;
for(i=0;i<8;i++)
{
ds18b20_data=0;
ds18b20_data=cmd&0x01;
ds18b20_delay(15); //>60us
ds18b20_data=1;
cmd>>=1;
}
}
unsigned char ds18b20_read()
{
char i=0;
unsigned char tmp=0;
for(i=0;i<8;i++)
{
ds18b20_data=0;
tmp>>=1;
ds18b20_data=1;
if(ds18b20_data) tmp+=0x80;
ds18b20_delay(15); //>60us
}
return tmp;
}
//傳感器初始化
void init_ds18b20()
{
unsigned char tmp = 0;
tmp = ds18b20_read_temp();
while(tmp == 85)//顯示85為沒初始化完畢,需要初始化
{
tmp = ds18b20_read_temp();
ds18b20_delay(100);
ds18b20_delay(100);
ds18b20_delay(100);
}
}
//返回數值為攝氏度,耗時8.25ms@12MHZ@STC89C52
unsigned int ds18b20_read_temp()
{
unsigned char a=0;
unsigned char b=0;
unsigned int c=0;
//EA=0;
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0x44);
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0xbe);
a=ds18b20_read();
b=ds18b20_read();
//EA=1;
c=b;
c<<=8;
c+=a;
c=c >> 4;
//c=c*0.0625;//浮點占用將近1ms
return c;
}
|