#ifndef __DS18B20_H__
#define __DS18B20_H__
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^5;
uchar tab[5];
uint temp;// 温度值
bit tflag;
/****************
延时1 微秒**********/
void delay_18B20(uint i)
{
while(i--);
}
/*******************
ds1820 复位************/
void ds1820rst()
{
uchar x=0;
DQ=1; //DQ 复位
delay_18B20(8); // 延时
DQ=0; //DQ 拉低
delay_18B20(80); // 精确延时大于480us
DQ=1; // 拉高
delay_18B20(14);
x=DQ; // 稍做延时后如果
//x=0则初始化成功 x=1 则初始化失败
while(!DQ);
delay_18B20(20);
}
/********************
读一个字节********************/
uchar ds1820rd()
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
dat>>=1;
DQ=1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/***************
写一个字节***************/
void ds1820wr(uchar dat)
{
uchar i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************** 读取温度
值并转换***************/
read_temp()
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);// 跳过读序列号
ds1820wr(0x44);// 启动温度转换
delay_18B20(100);
ds1820rst();
ds1820wr(0xcc);// 跳过读序列号
ds1820wr(0xbe);// 读取温度
delay_18B20(100);
a=ds1820rd();
b=ds1820rd();
temp=b;
temp<<=8;
temp=temp|a;
if(temp<0x0fff)
tflag=0;
else
{
temp=~temp+1;
tflag=1;
}
temp=temp*(0.625);// 温度值扩大10倍,
//精确到1 位小数
return(temp);
}
/*****************
温度值显示****************/
void ds1820disp()
{
uchar flagdat;
read_temp();
tab[0]=temp%1000/100+0x30; //
//十位数
tab[1]=temp%100/10+0x30; //
//个位数
tab[2]=temp%10+0x30; //
//小数位
if(tflag==0)
flagdat=0x20;// 正温度不显示符号
else
flagdat=0x2d;// 负温度显示负号:-
if(tab[0]==0x30) { tab[0]=0x20; }// 如果十位为0,不显示
write_com(0x80+0x40+6);
write_dat(flagdat); // 显示正负
write_dat(tab[0]); // 显示十位
write_dat(tab[1]); // 显示个位
write_dat(0x2e); // 显示小数
//点
write_dat(tab[2]); // 显示小数位
write_dat(0xdf);
write_dat(0x43);
}
#endif
|