DS18B20读写操作程序详解
一、DS18B20的复位
(1) 先将手机充电线置上拉电阻“1”。
(2) 延迟(该時间规定的没有很严苛,可是尽量的短一点)
(3) 手机充电线拉到低电频“0”。
(4) 延迟750微秒(该時间的时间段能够从480到960微秒)。
(5) 手机充电线拉到上拉电阻“1”。
(6) 延迟等候(假如复位完成则在15到60ms時间以内造成一个由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)读手机充电线的情况获得一个情况位,并开展数据处理方法。
(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());
}
上一篇:ds18b20系统结构框图和接线
最新更新
猜你喜欢
电工推荐
![电工技术基础_电工基础知识_电工之家-电工学习网](/skin/images/guanzhu.jpg)