ds18b20读温度
DS1820 数字温度计提供温度读数,指示器件的温度
注意事项!!!!!!!!
访问DS18B20的事件序列如下所示:
第一步:初始化
第二步:ROM命令(紧跟任何数据交换请求)
第三步:DS18B20功能命令(紧跟任何数据交换请求)
每次对DS18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则DS18B20将不会响应。除了ROM搜索命令[F0h]和报警搜索命令[ECh]之外。当执行完这些ROM命令之后,主设备必须回到上述步骤中的第一步。
每次对DS18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则DS18B20将不会响应。除了ROM搜索命令[F0h]和报警搜索命令[ECh]之外。当执行完这些ROM命令之后,主设备必须回到上述步骤中的第一步。
每次对DS18B20的访问都必须遵循这样的步骤来进行,如果这些步骤中的任何一个丢失或者没有执行,则DS18B20将不会响应。除了ROM搜索命令[F0h]和报警搜索命令[ECh]之外。当执行完这些ROM命令之后,主设备必须回到上述步骤中的第一步。
综述
DS1820 有三个主要的数据部件
1.64 位激光(lasered)ROM;
2.温度灵敏元件
3.非易失性温度告警触发器TH 和TL
器件从单线的通信线取得其电源在信号线为高电平的时间周期内把能量贮存在内部的电容器中在单信号线为低电平的时间期内断开此电源直到信号线变为高电平重新接上寄生电容电源为止作为另一种可供选择的方法
DS1820 也可用外部5V 电源供电
特性
- 独特的单线接口只需1 个接口引脚即可通信
- 内部温度采集精度可以由用户自定义为9-Bits至12-Bits。上电默认设置:12 位精度。
- 测量范围从-55℃至+125℃(-67℉至+257℉);温度范围超过-10℃至85℃之外时具有±0.5℃的精度。在1 秒典型值内把温度变换为数字
- 多点(multidrop )能力使分布式温度检测应用得以简化
- 可用数据线供电,不需备份电源,不需要–外部元件
- 用户可定义的非易失性的温度告警设置
针脚
供电方式
两种供电方式:寄生电源(数据线供电),和外部5v电源供电
使用寄生电源时(数据线供电),在寄生电源模式下,1-Wire总线和Cpp可以提供给DS18B20足够的电流来完成各种工作,但在进行温度转换或暂存寄存器中的值拷贝至EEPROM时,工作电流会高达1.5mA,这时需要通过1-Wire总线上的上拉电阻提供强有力的上拉。而在外部电源模式下,DS18B20可以直接通过VDD引脚供电,这种供电方式不需要上拉的MOSFET,且在温度转换期间1-Wire总线可以执行其他动作。另外,当温度超过+100℃时,不推荐使用寄生电源供电方式,因为会有较大的漏电流导致无法正常通信,此时应使用外部供电电源。
64位ROM
64位ROM 和ROM 操作控制部分允许DS18B20 作为一个单线器件工作并遵循单线总线系统一节中所
详述的单线协议直到ROM 操作协议被满足DS18B20 控制部分的功能是不可访问的此协议在ROM
操作中单线总线主机必须首先操作五种ROM 操作命令之一
-
Read ROM(读ROM) [33h]
-
Match ROM(匹配ROM) [55h]
-
Search ROM(搜索ROM) [F0h]
-
Skip ROM(跳过ROM) [CCh]
-
Alarm Search告警搜索 [ECh]
在成功地执行了ROM 操作序列之后DS18B20 特定的功能便可访问然后总线上主机
可提供六个存贮器和控制功能命令之一
存储器
DS18B20的存储器组织结构如图所示。该存储器包含了SRAM暂存寄存器和存储着过温和低温(TH和TL)温度报警寄存器及配置寄存器的非易失性EEPROM。值得注意的是当DS18B20的温度报警功能没有用到的时候,过温和低温(TH和TL)温度报警寄存器可以当做通用功能的存储单元。所有的存储命令在“功能命令”章节有详细描述。
暂存寄存器中的Byte 0和Byte 1分别作为温度寄存器的低字节和高字节。同时这两个字节是只读的。Byte 2和Byte 3作为过温和低温(TH和TL)温度报警寄存器。Byte 4保存着配置寄存器的数据。Byte 5、6、7作为内部使用的字节而保留使用,不可被写入。
暂存寄存器的Byte 8为只读字节,其中存储着该暂存寄存器中Byte 0至Byte 7的循环冗余校验(CRC)值
配置寄存器
用户通过改变表2中R0和R1的值来配置DS18B20的精度。
功能命令
初始化
1-Wire总线上的所有事件都必须以初始化为开始。初始化序列由总线上的主设备发出的复位脉冲以及紧跟着从设备回应的存在脉冲构成。该回应脉冲让总线上的主设备知道在该总线上有从设备(例如DS18B20),并且已经准备好进行操作。
复位脉冲时序图;
//初始化
//10us
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//1ms
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void ds18b20_reset(void)
{
DS18B20_PORT=0; //拉低DQ
delay_10us(75); //拉低750us
DS18B20_PORT=1; //DQ=1