DS18B20的工作原理及调试

概述

在基于51单片机的温度报警系统的学习中,我用到了DS18B20这款温度传感器。DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成,所以时序要求很严格,这也是DS18B20驱动编程的难点。

1.DS18B20的引脚分布图

DS18B20的工作原理及调试_第1张图片
DS18B20采用1-wire Bus所有数据都在一条线上传输,因此单总线协议对时序要求非常严格以确保数据的完整性。
单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0、读1。所有这些信号除存在脉冲由DS18B20发出的以外其他信号都由总线控制器发出。
需要注意的是: 数据传输总是从最低有效位开始。

2.字节暂存器结构图

DS18B20的工作原理及调试_第2张图片
以上是内部9 个字节的暂存单元(包括EEPROM)。
字节0~1 是温度存储器,用来存储转换好的温度。
字节2~3 是用户用来设置最高报警和最低报警值。这个可以用软件来实现。
字节4 是配置寄存器,用来配置转换精度,让它工作在9~12 位。
字节5~7 保留位。
字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。

3.配置寄存器

DS18B20的工作原理及调试_第3张图片

4.DS18B20初始化程序

1.初始化时序里面包含了复位DS18B20和接收DS18B20返回的存在信号。
主机和DS18B20做任何通讯前都需要对其初始化。初始化期间,总线控制器拉低总线并保持480us以上挂在总线上的器件将被复位,然后释放总线,等到15-60us,此时18B20将返回一个60-240us之间的低电平存在信号。
DS18B20的工作原理及调试_第4张图片

bit ds_init()
{
	bit i;
	DS = 1;
	_nop_();
	DS = 0;
	Delay500us(); 
	DS = 1; 
	Delay40us(); 
	i = DS;
	Delay140us();
	DS = 1;
	_nop_();
	return (i);
}

2.写时序分为写0时序和写1时序。
总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。
总线控制器要产生一个写时序,必须将总线拉低最少1us,产生写0时序时总线必须保持低电平60~120us之间,然后释放总线,产生写1时序时在总线产生写时序后的15us内允许把总线拉高。注意:2次写周期之间至少间隔1us
DS18B20的工作原理及调试_第5张图片

void write_byte(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		DS = 0;
		_nop_();
		DS = dat & 0x01;
	Delay75us();//76.95us
		DS = 1; 
		_nop_();
		dat >>= 1;
	}
}

3.读时序
读时序分为读0时序和读1时序
总线控制器通过读取由DS18B20控制的总线高低电平接收DS18B20数据。
总线控制器要产生一个读时序,必须将总线拉低至少1us,然后释放总线,在读信号开始后15us内总线控制器采样总线数据,读一位数据至少保持在60us以上。注意:2次读周期之间至少间隔1us。
DS18B20的工作原理及调试_第6张图片

uchar read_byte()
{
	uchar i, j, dat;
	for(i=0;i<8;i++)
	{
		DS = 0;
		_nop_();
		DS = 1;
		_nop_();
		j = DS;
		Delay75us();//75us
		DS = 1;
		_nop_();
		dat = (j<<7)|(dat>>1);	
	}
	return (dat);
}

接下来我们就可以在main函数中进行读写操作了。

你可能感兴趣的:(DS18B20的工作原理及调试)