单总线温度传感器DB18B20的原理
单总线温度传感器 DS18B20 是一种数字式温度传感器,具有较高的精度和稳定性。它采用的是 Dallas Semiconductor 公司独特的单总线通信协议,使得在系统中只需使用一个 I/O 引脚就能同时实现数据传输和供电。以下是 DS18B20 的工作原理:
温度感知:DS18B20 内部集成了温度传感器,其工作原理基于温度对半导体器件的影响。当温度变化时,半导体器件的电特性也会相应地改变,从而可以通过测量这些电特性的变化来确定温度的变化。
数字转换:DS18B20 内部有一个模数转换器(ADC),用于将温度传感器输出的模拟信号转换成数字信号。这个数字信号代表了当前测量到的温度值。
单总线通信:DS18B20 使用单总线通信协议与主控制器通信。这意味着它只需要一个数据线来进行通信。通信过程中,DS18B20 可以被主控制器发出的命令唤醒,并回应主控制器的请求,将温度数据发送给主控制器。
供电:DS18B20 在通信时也通过单总线从主控制器获取供电。这使得它在安装和布线时更加方便,因为只需一根线就可以同时传输数据和供电。
总的来说,DS18B20 的工作原理就是通过内部温度传感器感知温度变化,然后通过内部的数字转换器将模拟信号转换成数字信号,最后通过单总线通信协议将温度数据传输给主控制器。
运用
利用DS18B20和LED数码管实现单总线温度测量系统。原理电路见下图:
Keil代码如下:
#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++) //连续扫描数码管10次
{
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000); //延时5ms
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000); //延时5ms
}
}
}
void delay5(uchar n) //函数功能:延时5µs
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
void init_ds18b20(void) //函数功能:18B20初始化
{
uchar x=0;
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
uchar readbyte(void) //函数功能:读取1字节数据
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1; //15µs内拉释放总线
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date);
}
void writebyte(uchar dat) //函数功能:写1字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01; //写"1" 在15µs内拉低
delay5(12); //写"0" 拉低60µs
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);
}
小结:DS18B20 是一种简单易用、精度高的数字温度传感器,适用于各种温度测量场景,但本人对DB18B20时序方面还没有完全理解。