微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DS18B20的原理与应用

DS18B20的原理与应用

时间:11-21 来源:互联网 点击:

成的,他有严格的时隙概念,如果出现序列混乱, 1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3个步骤 :
(1)每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。
(2)发送一条 ROM 指令

(3)发送存储器指令


具体操作举例:
现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是:
1、主机先作个复位操作,
2、主机再写跳过ROM的操作(CCH)命令,
3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“零、零、壹、壹、零、零、壹、壹”。整个操作的总线状态如下图。


读取RAM内的温度数据。同样,这个操作也要接照三个步骤。
1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。
2、主机发出跳过对ROM操作的命令(CCH)。
3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。同样读取数据也是低位在前的。整个操作的总线状态如下图:




C语言代码

sbit DQ=P3^3;
uchar t; //设置全局变量,专门用于延时程序

bit Init_DS18B20(void)
{
bit flag;
DQ=1;
_nop_(); //??????????????? for(t=0;t<2;t++);
DQ=0;
for(t=0;t<200;t++);
DQ=1;
for(t=0;t<15;t++);//????????????????? for(t=0;t<10;t++);
flag=DQ;
for(t=0;t<200;t++);
return flag;
}

uchar ReadOneChar(void)
{
uchar i=0;
uchar dat;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1; //人为拉高,为单片机检测DS18B20的输出电平做准备
for(t=0;t<3;t++);//延时月9us????????????????????????? for(t=0;t<2;t++);
dat>>=1;
if(DQ==1)
{
dat|=0x80;
}
else
dat|=0x00;
for(t=0;t<1;t++);//延时3us,两个个读时序间至少需要1us的恢复期??????????for(t=0;t<8;t++);
}
return dat;
}

void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
DQ=0;
_nop_();// ??????????????????????????????????????????????
DQ=dat&0x01;
for(t=0;t<15;t++);//延时约45us,DS18B20在15~60us对数据采样 ???????????????for(t=0;t<10;t++);
DQ=1; //释放数据线
for(t=0;t<1;t++); //延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;
}
for(t=0;t<4;t++);
}

void ReadyReadTemp(void)
{
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44);
delaynms(1000);//?????????????????????????? delaynms(200);
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe);
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top