一、DS18B20的初始化
(1) 先将数据线置高电平“1”。
(2) 延时(该时刻要求的不是很严厉,可是尽可能的短一点)
(3) 数据线拉到低电平“0”。
(4) 延时750微秒(该时刻的时刻规模能够从480到960微秒)。
(5) 数据线拉到高电平“1”。
(6) 延时等候(假如初始化成功则在15到60毫秒时刻之内发生一个由DS18B20所回来的低电平“0”。据该状况能够来确认它的存在,可是应留意不能无限的进行等候,否则会使程序进入死循环,所以要进行超时操控)。
(7) 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时刻从宣布的高电平算起(第(5)步的时刻算起)最少要480微秒。
(8) 将数据线再次拉高到高电平“1”后完毕。
二、 DS18B20的写操作
(1) 数据线先置低电平“0”。
(2) 延时确认的时刻为15微秒。
(3) 按从低位到高位的次序发送字节(一次只发送一位)。
(4) 延时时刻为45微秒。
(5) 将数据线拉到高电平。
(6) 重复上(1)到(6)的操作直到一切的字节悉数发送完停止。
(7) 最终将数据线拉高。
三、DS18B20的读操作
(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时15微秒。
(5)将数据线拉高“1”。
(6)延时15微秒。
(7)读数据线的状况得到1个状况位,并进行数据处理。
(8)延时30微秒。
四、DS18B20读写操作程序
//———————————————————-
// 模块称号:DS18B20.h
// 模块功用:DS18B20 读写操作
//———————————————————-
sbit DS = P1^0;
//———————————————————-
// 函数称号:void DelayTmp(unsigned int count)
// 函数功用:延时
//———————————————————-
void DelayTmp(unsigned int count)
{
unsigned int i;
while(count)
{
i=200;while(i》0)i–;
count–;
}
}
//———————————————————-
// 函数称号:void DsReset(void)
// 函数功用:复位
//———————————————————-
void DsReset(void)
{
unsigned int i;
DS=0;
i=103; while(i》0)i–;
DS=1;
i=4;while(i》0)i–;
}
//———————————————————-
// 函数称号:bit TmpReadBit(void)
// 函数功用:读取一位
//———————————————————-
bit TmpReadBit(void)
{
unsigned int i;
bit dat;
DS=0;i++;
DS=1;i++;i++;
dat=DS;
i=8;while(i》0)i–;
return (dat);
}
//———————————————————-
// 函数称号:unsigned char TmpRead(void)
// 函数功用:读取一字节
//———————————————————-
unsigned char TmpRead(void)
{
unsigned char i,j,dat;
dat=0;
for(i=1;i《=8;i++)
{j=TmpReadBit();
dat=(j《《7)|(dat》》1); }
return(dat);
}
//———————————————————-
// 函数称号:void TmpWriteByte(unsigned char dat)
// 函数功用:写入一字节
//———————————————————-
void TmpWriteByte(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) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i》0)i–;
}
else
{
DS=0; //write 0
i=8;while(i》0)i–;
DS=1;
i++;i++;
}
}
}
//———————————————————-
// 函数称号:void TmpChange(void)
// 函数功用:温度转化
//———————————————————-
void TmpChange(void)
{
DsReset();
DelayTmp(1);
TmpWriteByte(0xcc);
TmpWriteByte(0x44);
}
//———————————————————-
// 函数称号:unsigned int Tmp()
// 函数功用:获取温度
//———————————————————-
unsigned int Tmp()
{
float tt;
unsigned char a,b;
unsigned int temp;
DsReset();
DelayTmp(1);
TmpWriteByte(0xcc);
TmpWriteByte(0xbe);
a=TmpRead();
b=TmpRead();
temp=b;
temp《《=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
//———————————————————-
// 函数称号:void RefreshTmp()
// 函数功用:改写温度
//———————————————————-
void RefreshTmp()
{
TmpChange();
DisplayTmp(Tmp());
}