一、DS18B20芯片
1、简介
DS18B20是一种数字温度传感器芯片,由美国芯片制造商Maxim Integrated公司生产。它可以通过单一的数字引脚进行通信,具有高精度的温度测量能力(精度可达±0.5°C),并且具有独特的64位ROM编程地址,可以在多个传感器之间进行区分。DS18B20芯片被广泛应用于温度监测和控制领域,例如智能家居、工业自动化、医疗设备等。
2、特点
DS18B20芯片的主要特点包括:
-
高精度:温度测量精度可达±0.5°C。
-
数字接口:通过单一的数字引脚进行通信,简化了接线和控制过程。
-
独特的64位ROM编程地址:可以在多个传感器之间进行区分,方便多传感器系统的应用。
-
无需外部元件:DS18B20芯片内部集成了温度传感器、模数转换器和序列通信引擎,无需外部元件即可实现温度测量。
-
低功耗:在温度测量过程中功耗很低,适合电池供电的应用。
-
多种封装形式:DS18B20芯片有TO-92、TO-92S、TO-92L、SOT-23等多种封装形式,适用于不同的应用场景。
-
可编程分辨率:可以通过软件设置不同的温度分辨率,从9位到12位不等,以满足不同应用的精度要求。
总体来说,DS18B20芯片具有精度高、易于使用、低功耗等特点,被广泛应用于各种温度监测和控制系统中。
4
DS18B20芯片有三个引脚,它们的功能如下:
-
VDD引脚(Pin 1):这是芯片的电源引脚,通常连接到3.0V至5.5V的电源供应。VDD引脚提供芯片所需的电源。
-
DQ引脚(Pin 2):这是数据引脚,也称为1-Wire总线。通过这个引脚可以与芯片进行通信,包括读取温度数据、发送命令等。DQ引脚是双向通信引脚,需要外部上拉电阻。
-
GND引脚(Pin 3):这是地引脚,连接到系统的地线,提供芯片的地连接。
通过这三个引脚,DS18B20芯片可以实现与微控制器或其他设备的通信,从而进行温度测量和控制。
4、DS18B20的时序
DS18B20芯片的通信是通过1-Wire总线进行的,其时序如下:
-
初始化:主机发送复位脉冲(reset pulse)来开始通信。复位脉冲持续至少480微秒,然后释放总线。
-
DS18B20响应:DS18B20芯片在接收到复位脉冲后会发出存在脉冲(presence pulse),持续15-60微秒,表示芯片已准备好进行通信。
-
主机发送命令:主机向DS18B20发送指令,包括温度转换命令、读取温度命令等。每个命令的时序和数据格式都是固定的。
-
DS18B20执行命令:DS18B20芯片在接收到命令后会执行相应的操作,比如进行温度转换。
-
读取数据:主机发送读取温度数据的命令,DS18B20芯片会将温度数据发送给主机。数据的格式是16位的二进制补码,主机需要将其转换为温度值。
-
结束通信:通信结束后,主机可以发送复位脉冲来结束通信过程。
以上是DS18B20芯片通信的基本时序,具体的时序和命令格式可以查阅DS18B20的数据手册以获取更详细的信息。
二、单总线温度测量实验
1、实验原理
DS18B20是一种数字温度传感器,采用单总线通信协议进行数据传输。其工作原理如下:
-
初始化:系统通过发送初始化信号来启动温度传感器。初始化信号包括一个低电平信号持续480微秒,然后释放总线并等待传感器的响应。
-
传感器响应:传感器接收到初始化信号后,会发送一个存在脉冲作为响应。存在脉冲的持续时间为60-240微秒,然后传感器开始发送其ROM代码。
-
发送ROM代码:传感器会发送其唯一的64位ROM代码,用于标识传感器的地址。系统可以通过这个ROM代码来识别和区分多个传感器。
-
发送指令:系统发送指令给传感器,以请求温度数据或进行其他操作。常用的指令包括温度转换指令、读取温度指令等。
-
温度转换:传感器接收到温度转换指令后,会进行温度测量并将结果存储在内部寄存器中。转换时间取决于传感器的分辨率设置,通常为750ms。
-
读取温度数据:系统发送读取温度指令给传感器,传感器会将存储的温度数据发送给系统。温度数据以16位二进制补码形式发送,系统可以将其转换为摄氏度或华氏度表示。
通过以上步骤,系统可以实现对DS18B20传感器的温度采集。由于采用单总线通信协议,多个传感器可以通过共享同一根总线进行数据传输,实现多个传感器的温度采集。
2、Proteus仿真图
3、C语言代码
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void);
void main(void)
{
uchar i,temp;
delay5(1000);
while(1)
{
temp=retemp();
for(i=0;i<10;i++)
{
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000);
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000);
}
}
}
void delay5(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
void init_ds18b20(void)
{
uchar x=0;
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
uchar readbyte(void)
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1;
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01;
delay5(12);
DQ = 1;
dat>>=1;
delay5(5);
}
}
uchar retemp(void)
{
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44);
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}