DS18B20电路解析

一:功能要求

(1)DS18B20正确测量温度,小数点后保留一位;

(2)数码管显示芯片测得的数据,然后每2秒一次,发送给串口;

 

二:原理图

三:程序流程图及流程解析

 

 

 

 

 

 

四:时序图

(1)初始化时序图

是不是觉得DS8B20程序好简单,轻轻松松就能解决?

也许现在的你看到该时序认为极为简单,但是写文档的我之前是何等的纠结

 

首先讲讲芯片复位的问题

主机发送复位脉冲:

(A)480us≤Master_TX≤960us

(B)数据线SDA释放后慢慢回升时间; 15us≤T_SDA≤60us

(C)60us之后,从机自动拉低,表示从机回应了主机(如果从机没有拉低,可能芯片坏了)

(D)第三步骤操作:SDA=1;delayus(100);present=SDA; //此时从机肯定拉低了,我们可以提取此时SDA的数据,作为判定依据

//presence的判定,需要在 等于0的区域才行,所以 大于60us后再判定

(E)注意,关键点到了,    480us≤ Master_RX;  //必须满足该条件,不然复位会失败;

 

 

(2)‘写’时序图  +   ‘读’时序图

再讲讲读写数据的关键点

写数据:

  • SDA=0;
  • delayus(2)//大于1us即可;
  • SDA=1;//释放总线
  • 判定需要写入的数据是1,还是0;//  SDA=1  SDA=0;
  • 延时超过60us即可;

读数据:(在此处栽过跟头)

  • SDA=0;
  • delayus(2)//大于1us即可;
  • SDA=1;//释放总线
  • 重点来了;延时最好15us以内;最大20us(我编写程序的经验值,已经实践过)_nop_();
  • Ds18b20_value=SDA;
  • delayus(45);

 

五:引脚说明

DQ

IN_OUT数据输入,数据输出 端口

VCC

电源端

Vss(GND)

地端

 

 

 

 

 

 

六:详细解析

1)DS18B20芯片,测量的温度范围为 -55℃~~125℃(在-10℃~~85℃范围内,误差为5℃)

2)数字温度计的分辨率,用户可以选择 9bit~12bit中,任意一个。

3)根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换须经过三个步骤才,能对DS18B20进行预定的操作:

(1)每一次读写之前都要对DS18B20进行 复位操作,

(2)复位成功后发送一条ROM指令,

(3)发送RAM指令,

 

6)掉电后,TH,TL里面的值,仍然保存

如果测量的温度高于TH的值,或者小于TL的值,DS18B20内部的警告标志将被置位

7)内部高速暂存器的第五个byte,配置寄存器,用于确定DS18b20的分辨率,默认是12bit

9)DS18B20,64位ROM

0~~~~~7                      8~~~~55                        56~63

单线系列编码         芯片唯一序列号                CRC冗余校验码

 

5)DS18B20内部有两个存储器,高速暂存器RAM+非易失性可擦除E2PRAM。

高速暂存器RAM,存放

非易失性可擦除E2PRAM

3)如下为,DS18B20高速暂存器RAM的结构

4)DS18B20输出的数据,bit位是:低位在前,高位在后,byte位是低位在前,高位

在后;

比如:温度值低位 (LS Byte)   温度值高位 (MS Byte)

6)ROM指令

7)RAM指令

八,我不明白,为何在 复位脉冲之前,需要将暂存器中TH,TL,配置寄存器的值都写完???

 

九:存在一个误区,读暂存器0BEH,是读取暂存器RAM中的九个数据分别为:

  1. 读出 温度的低8bit数据
  2. 读出 温度的高8bit数据
  3. 读出 温度的上限报警TH(8bit数据)---掉电后不保存(上电时,自动将非易失性RAM(E2PRAM)中存放的TH值拷贝到暂存器RAM中)
  4. 读出 温度的下限报警TL(8bit数据)---掉电后不保存(上电时,自动将非易失性RAM(E2PRAM)中存放的TH值拷贝到暂存器RAM中)
  5. 读出 配置寄存器内部数值                  ---掉电后不保存(上电时,自动将非易失性RAM(E2PRAM)中存放的TH值拷贝到暂存器RAM中)
  6. 读出 1byte的保留字节
  7. 读出 1byte的保留字节
  8. 读出 1byte的保留字节
  9. 读出 前面8个byte的CRC校验字节

 

十:

在DS18b20复位后,释放数据总线,60us后,DS18b20反馈回一个低电平,该低电平可以判断 复位时间是否充足或者DS18b20是否断开或者是否损坏的;

 

十一:

ds1820精度是0.5度。      ds1820温度=(Temperature  REG)*0.5
ds18b20精度是0.0625度.     ds18b20温度=(Temperature  REG)*0.0625

十二:

Ds18b20的转换分辨率问题(分辨率为9bit,10bit,11bit,12bit,四种可选)

TM是测试模式位,用于设置DS18B20在工作模式还是测试模式。

DS18B20出厂时,TM被设置为1,用户不要去更改,默认的转换分辨率为12bit

 

十三:

连接 DS1820 的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过 50m 时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达 150m ,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用 DS1820 进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。测温电缆线建议采用屏蔽 4 芯双绞线,其中一对线接地线与信号线,另一组接 VCC 和地线,屏蔽层在源端单点接地。

 

十四

在 DS1820 测温程序设计中,向 DS1820 发出温度转换命令后,程序总要等待 DS1820 的返回信号,一旦某个 DS1820 接触不好或断线,当程序读该 DS1820 时,将没有返回信号,程序进入死循环。这一点在进行 DS1820 硬件连接和软件设计时也要给予一定的重视。

 

//======================================================================================//

 

我还有几个问题:

1:数据读 数据写  是否 低位在前

2:精度调节,12bit  11bit 10bit 9bit

3:读完暂存器可以不延时,直接读取 两个 8bit数据;

4:presence的判定,需要在 等于0的区域才行,所以 大于60us后再判定

5:我想用delayus(1),去掉   _nop_();_nop_();,晚上回来验证

事实证明,delayus(1)是22.7us,时序图里要求1us以外,15us内,采集数据,最大20us,

所以用delayus(1),ds18b20读不出数据,固定显示某一值或者数值跳动,临界状态

6:void  ReadTempCmd()

{

       ds18b20_reset();

       dsWriteByte(0xcc);//skip ROM  跳过读DS18B20中的ROM序列号

       dsWriteByte(0xbe); //读 暂存器

//     delayus(10);  //我不知道为何读完暂存器就可以直接读数据,不需要延时

7:

数据写入,单bit写入,程序如何;并转串,形成自己写程序的段子

数据读出,单bit读出,程序如何;串转并,形成自己写程序的段子

8:转换时间别忘记了

我还有几个问题:

2:数据读 数据写  是否 低位在前

3:精度调节,12bit  11bit 10bit 9bit

5:读完暂存器可以不延时,直接读取 两个 8bit数据;

6:presence的判定,需要在 等于0的区域才行,所以 大于60us后再判定

7:我想用delayus(1),去掉   _nop_();_nop_();,晚上回来验证

事实证明,delayus(1)是22.7us,时序图里要求1us以外,15us内,采集数据,最大20us,

所以用delayus(1),ds18b20读不出数据,固定显示某一值或者数值跳动,临界状态

8:void  ReadTempCmd()

{

       ds18b20_reset();

       dsWriteByte(0xcc);//skip ROM  跳过读DS18B20中的ROM序列号

       dsWriteByte(0xbe); //读 暂存器

//     delayus(10);  //我不知道为何读完暂存器就可以直接读数据,不需要延时

9:

数据写入,单bit写入,程序如何;并转串,形成自己写程序的段子

数据读出,单bit读出,程序如何;串转并,形成自己写程序的段子

10:转换时间别忘记了