|
#include <STC89C5xRC.H>
#include <intrins.h>
sbit DATA_IO = P3^2;
/* 软件延时函数,延时时间(t*10)us */
void DelayX10us(unsigned char t)
{
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--t);
}
bit GetACK()
{
bit ack;
EA = 0;
DATA_IO = 0;
DelayX10us(60);
DATA_IO = 1;
DelayX10us(6);
ack = DATA_IO;
while(!DATA_IO);
EA = 1;
return ack;
}
void DS18B20_Write(unsigned char dat)
{
unsigned char mask;
EA = 0;
for(mask=0x01;mask!=0;mask<<=1)
{
DATA_IO = 0;
_nop_();
_nop_();
if((dat&mask)!= 0)
DATA_IO = 1;
else
DATA_IO = 0;
DelayX10us(6);
DATA_IO = 1;
}
EA = 1;
}
unsigned char DS18B20_Read()
{
unsigned char dat;
unsigned char mask;
EA = 0;
for(mask=0x01;mask!=0;mask<<=1)
{
DATA_IO = 0;
_nop_();
_nop_();
DATA_IO = 1;
_nop_();
_nop_();
if(!DATA_IO)
dat &= ~(mask);
else
dat |= mask;
DelayX10us(6);
}
EA = 1;
return dat;
}
bit DS18B20_Start()
{
bit ack;
ack = GetACK();
if(ack == 0)
{
DS18B20_Write(0xCC);
DS18B20_Write(0x44);
}
return ~ack;
}
bit GetTemp(int *temp)
{
bit ack;
unsigned char LSB,MSB;
ack = GetACK();
if(ack==0)
{
DS18B20_Write(0xCC);
DS18B20_Write(0xBE);
LSB = DS18B20_Read();
MSB = DS18B20_Read();
}
*temp = ((int)MSB<<8) + LSB;
return ~ack;
}
|
|