/***********************************
* DS18B20温度读取函数*
* 晶振12M*
* 返回double,精确到小数点后4位 *
* 只需调用read_temperature函数即可 *
***********************************/
sbit DQ =P2^7; //定义连接DS18B20的数据口
//延时函数
void delay(unsigned int i)
{
while(i--);
}
//初始化函数
void init_DS18B20(void)
{
bit flag=1;
while(flag==1)
{
DQ = 1; //DQ复位
DQ = 0; //DQ拉低
//delay(80); //延时约500us
delay(70);
DQ = 1; //释放DQ
delay(10); //DS18B20收到下拉信号后延时
flag=DQ; //读取DQ值(为0表示DS18B20复位成功)
delay(20);
}
//P3++;
}
//串行读取一个字节
unsigned char read_DS18B20(void)
{
unsigned char i = 0, dat = 0;
for (i=0; i<8; i++)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay(4);
}
return dat;
}
//串行写入一个字节
void write_DS18B20(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ = 0;
DQ = dat&0x01;
delay(3);
DQ = 1;
dat>>=1;
}
delay(5);
}
//读取温度
double read_temperature(void)//返回double
{
unsigned int temp=0;
double d;
init_DS18B20();
write_DS18B20(0xCC); //忽略读序列号
write_DS18B20(0x44); //启动温度转换
init_DS18B20();
write_DS18B20(0xCC); //忽略读序列号
write_DS18B20(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
temp=read_DS18B20(); //读取温度值低位
temp=temp+read_DS18B20()*0x100; //读取温度值高位
if(temp<0xf000)
{
d=temp*0.0625;
}
else //零下
{
temp=~temp+1;
d=-(temp*0.0625);
}
return d;
}