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

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

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

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

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

void write_byte(uchar dat)
{uchar i;for(i=0;i<8;i++){DS = 0;_nop_();DS = dat & 0x01;Delay75us();//76.95usDS = 1; _nop_();dat >>= 1;}
}
3.读时序
读时序分为读0时序和读1时序
总线控制器通过读取由DS18B20控制的总线高低电平接收DS18B20数据。
总线控制器要产生一个读时序,必须将总线拉低至少1us,然后释放总线,在读信号开始后15us内总线控制器采样总线数据,读一位数据至少保持在60us以上。注意:2次读周期之间至少间隔1us。

uchar read_byte()
{uchar i, j, dat;for(i=0;i<8;i++){DS = 0;_nop_();DS = 1;_nop_();j = DS;Delay75us();//75usDS = 1;_nop_();dat = (j<<7)|(dat>>1); }return (dat);
}
接下来我们就可以在main函数中进行读写操作了。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
