DS18B20 以单总线协议工作
- 格式:doc
- 大小:52.50 KB
- 文档页数:3
达拉斯DS18B20半导体可编程分辨率的单总线®数字温度计特征引脚排列l独特的单线接口仅需一个端口引脚进行通讯l每个器件有唯一的64位的序列号存储在内部存储器中l简单的多点分布式测温应用l无需外部器件l可通过数据线供电。
供电范围为3.0V到5.5V。
l测温范围为-55~+125℃(-67~+257℉)l在-10~+85℃范围内精确度为±5℃l温度计分辨率可以被使用者选择为9~12位l最多在750ms内将温度转换为12位数字l用户可定义的非易失性温度报警设置l报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件l与DS1822兼容的软件l应用包括温度控制、工业系统、消费品、温度计或任何热感测系统引脚说明GND -地DQ -数据I/OVDD -可选电源电压NC -无连接说明DS18B20数字温度计提供9-12位摄氏温度测量而且有一个由高低电平触发的可编程的不因电源消失而改变的报警功能。
DS18B20通过一个单线接口发送或接受信息,因此在中央处理器和DS18B20之间仅需一条连接线(加上地线)。
它的测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。
除此之外,DS18B20能直接从单线通讯线上汲取能量,除去了对外部电源的需求。
每个DS18B20都有一个独特的64位序列号,从而允许多只DS18B20同时连在一根单线总线上;因此,很简单就可以用一个微控制器去控制很多覆盖在一大片区域的DS18B20。
这一特性在HVAC环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。
详细的引脚说明表18引脚SOIC封装* TO-9封装符号说明5 1 GND 接地。
4 2 DQ 数据输入/输出引脚。
对于单线操作:漏极开路。
当工作在寄生电源模式时用来提供电源(建“寄生电源”节)。
3 3 VDD 可选的VDD引脚。
工作与寄生电源模式时VDD必须接地。
*所有上表未提及的引脚都无连接。
DS18B20原理及程序编写(一)概述DS18B20为单总线12位(二进制)温度读数。
内部有64位唯一的ID编码。
工作电压从3.0~5.5V。
测量温度范围从-55℃~125℃。
最高±0.0625℃分辩率。
其内部结构如下图所示。
DS18B20的核心功能是直接数字温度传感器。
温度传感器可以配置成9、10、11和12位方式。
相应的精度分别为:0.5℃、0.25℃、0.125℃和0.0625℃。
默认的分辨率为12位。
DS18B20在空闲低功耗状态下加电(寄生电源工作方式)。
主机必须发出Convert T [44h]命令使其对测量温度进行A-D转换。
接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗状态。
如果DS18B20在外部VDD供电方式下,单片机可以在发出Convert T 命令并总线为1时(总线为0表示正在转换)发出“read time slots”命令。
DS18B20芯片内部共有8字节的寄存器,其中地址编号0,1为温度寄存器,里面存储着DS18B20温度转换后的AD值,其格式如表1所示。
地址编号2,3为温度报警寄存器,里面为报警设定值,地址编号4为配置寄存器(这三个寄存器在读取之前请使用“重新调入EEPROM”命令将存储在EEPROM里的内容调出,同样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令48H将温度报警寄存器内的内容存入EEPROM当中,以免掉电丢失数据)。
DS18B20内部寄存器映射如下图所示。
配置寄存器的格式如表2和表3所示。
DS18B20内部寄存器映射表1 温度寄存器的格式表2 配置寄存器的格式表3 温度分辨率配置DS18B20使用单总线工作方式,其通信协议以电平的高平时间作为依据,其基本时序有复位时序,写时序、读时序。
//********************************************************************** //** 文件名:DS18B20.c//** 说明:DS18B20驱动程序文件//----------------------------------------------------------------------//** 单位://** 创建人:张雅//** 创建时间:2010-01-20//** 联系方式:QQ:276564402//** 版本:V1.0//----------------------------------------------------------------------//**********************************************************************//----------------------------------------------------------------------//** 芯片:AT89S52//** 时钟:11.0592MHz//** 其它:这个文档为18B20的驱动程序,引用了数码管的驱动。
单总线控制DS18B20温度传感器一DS18B20通过单总线初始化时序如下:由上图可见,当主机要操作DS18B20时,需要把总线打底,并持续480us以960us 然后释放总线(即拉高),当时间流逝15-60us的时候,DS18B20若存在且没有坏的话,它会把总线拉低,并持续60-240us .在这段时间主机可以查看总线状态,来确定初始化完成 .二DS18B20通过单总线读写时序如下:由上图可以看出,主机要读或写DS18B20时,需要要将总线接低并持续15us,上面的两个时序是写的时序,主机在接低总线的15us后继续拉低总线,持续15-30us. 在这个时间内DS18B20采样0,完成0的写入.主机拉低总线15us后拉高总线然后持续15-30us等待DS18B20采样完成 1的写入.下面的两个图是读的时序图.主机拉低总线并持续15us后,释放总线.如果DS18B20要输出0就继续拉低总线,若要输出1 就拉高总线,并持续15-30us,等待主机查询总线状态完成 0或者1的读写.三DS18B20的ROM操作命令如下:四DS18B20的存储器操作命令如下:五DS18B20内部9个字节存储器以及E2RAM:六DS18B20内部存储温度字节格式:七DS18B20操作的C语言程序:/*************************此部分为18B20的驱动程序*************************************/#include <reg52.H>#include <intrins.h>sbit D18B20=P3^7;#define NOP() _nop_() /* 定义空指令 */#define _Nop() _nop_() /*定义空指令*/void TempDelay (unsigned char idata us);void Init18b20 (void);void WriteByte (unsigned char idata wr); //单字节写入void read_bytes (unsigned char idata j);unsigned char CRC (unsigned char j);void GemTemp (void);void Config18b20 (void);void ReadID (void);void TemperatuerResult(void);bit flag;unsigned int idata Temperature,D[10];unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节unsigned char idata id_buff[8];unsigned char idata *p,TIM;unsigned char idata crc_data;unsigned char code CrcTable [256]={0, 94,188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102,229, 187, 89, 7,219, 133,103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 1 96, 154,217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,248, 166,68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 2 31, 185,140, 210,48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,175, 241,19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148,118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 2 13, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};///*************************************************************Function:延时处理*parameter:*Return:*Modify:*************************************************************/void TempDelay (unsigned char idata us){while(us--);}/*************************************************************Function:18B20初始化*parameter:*Return:*Modify:*************************************************************/void Init18b20 (void){_nop_();D18B20=0;TempDelay(50); //delay 530 uS//80_nop_();D18B20=1;TempDelay(10); //delay 100 uS//14_nop_();_nop_();_nop_();if(D18B20==0)flag = 1; //detect 1820 success!elseflag = 0; //detect 1820 fail!TempDelay(15); //20_nop_();_nop_();D18B20 = 1;}/************************************************************ *Function:向18B20写入一个字节*parameter:*Return:*Modify:*************************************************************/ void WriteByte (unsigned char idata wr) //单字节写入{unsigned char idata i;for (i=0;i<8;i++){D18B20 = 0;_nop_();D18B20=wr&0x01;TempDelay(3); //delay 45 uS //5_nop_();_nop_();D18B20=1;wr >>= 1;}}/************************************************************ *Function:读18B20的一个字节*parameter:*Return:*Modify:*************************************************************/ unsigned char ReadByte (void) //读取单字节{unsigned char idata i,u=0;for(i=0;i<8;i++){D18B20 = 0;u >>= 1;D18B20 = 1;if(D18B20==1)u |= 0x80;TempDelay (2);_nop_();}return(u);}/************************************************************ *Function:读18B20*parameter:*Return:*Modify:*************************************************************/ void read_bytes (unsigned char idata j){unsigned char idata i;for(i=0;i<j;i++){*p = ReadByte();p++;}}/************************************************************ *Function:CRC校验*parameter:*Return:*Modify:*************************************************************/ unsigned char CRC (unsigned char j){unsigned char idata i,crc_data=0;for(i=0;i<j;i++) //查表校验crc_data = CrcTable[crc_data^temp_buff[i]];return (crc_data);}/************************************************************ *Function:读取温度*parameter:*Return:*Modify:*************************************************************/ void GemTemp (void){read_bytes (9);if (CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];// Temperature *= 0.625;Temperature /= 16;TempDelay(1);}}/************************************************************ *Function:内部配置*parameter:*Return:*Modify:*************************************************************/ void Config18b20 (void) //重新配置报警限定值和分辨率{Init18b20();WriteByte(0xcc); //skip romWriteByte(0x4e); //write scratchpadWriteByte(0x19); //上限WriteByte(0x1a); //下限WriteByte(0x7f); //set 11 bit (0.125)Init18b20();WriteByte(0xcc); //skip romWriteByte(0x48); //保存设定值Init18b20();WriteByte(0xcc); //skip romWriteByte(0xb8); //回调设定值}/************************************************************ *Function:读18B20ID*parameter:*Return:*Modify:*************************************************************/ void ReadID (void)//读取器件 id{Init18b20();WriteByte(0x33); //read romread_bytes(8);}/************************************************************ *Function:18B20ID全处理*parameter:*Return:*Modify:*************************************************************/ void TemperatuerResult(void){p = id_buff;ReadID();Config18b20();Init18b20 ();WriteByte(0xcc); //skip romWriteByte(0x44); //Temperature convertInit18b20 ();WriteByte(0xcc); //skip romWriteByte(0xbe); //read Temperaturep = temp_buff;GemTemp();}unsigned int TempTick=0;void GetTemp(){if(TIM==1){ TIM=0;TemperatuerResult();D[5]=Temperature;}}/*************************************[ t1 (0.5ms)中断] 中断中做 PWM 输出------------1000/(0.02ms*250)=200Hz*************************************/void T1zd(void) interrupt 3{TH1 = 0xfe; //11.0592TL1 = 0x33;TIM++;}。
DS18B20的工作原理DS18B20是一种数字温度传感器,可以通过一根单线串行总线与微处理器或者其他设备进行通信。
它采用了数字温度传感技术,可以准确地测量环境温度,并将温度数据以数字形式传输给主设备。
DS18B20的工作原理如下:1. 温度测量原理:DS18B20使用了一个精确的温度传感器,该传感器基于温度对半导体材料电阻值的影响。
在DS18B20中,温度传感器是由一对金属电极和一个细丝电阻器组成的。
当温度升高时,电阻值增加,反之亦然。
通过测量电阻值的变化,可以确定环境温度。
2. 单线串行总线通信:DS18B20通过单线串行总线与主设备通信,这意味着只需要一根数据线就可以实现数据传输。
通信过程中,主设备发送指令给DS18B20,DS18B20将温度数据以数字形式传输回主设备。
这种通信方式简化了硬件连接,降低了成本。
3. 温度转换和精度:DS18B20将温度数据转换为数字形式,并以12位精度表示。
它可以测量的温度范围为-55℃至+125℃,精度为±0.5℃。
DS18B20还具有可编程的分辨率功能,可以选择9位、10位、11位或者12位的温度分辨率。
4. 供电和工作模式:DS18B20可以通过总线路线提供供电,也可以通过外部电源提供供电。
它还具有多种工作模式,包括连续转换模式和温度警报模式。
在连续转换模式下,DS18B20可以周期性地测量温度并发送数据。
在温度警报模式下,DS18B20可以设置上下限温度阈值,当温度超过或者低于设定阈值时,会触发警报信号。
总结:DS18B20是一种数字温度传感器,采用了数字温度传感技术。
它通过测量温度对半导体材料电阻值的影响来测量环境温度,并将温度数据以数字形式传输给主设备。
DS18B20具有单线串行总线通信、温度转换和精度、供电和工作模式等特点。
它在许多领域中被广泛应用,如气象监测、工业自动化、家用电器等。
其高精度和简单的硬件连接使其成为一种理想的温度传感器。
ds18b20温度传感器工作原理
DS18B20是一种数字温度传感器,它基于一种叫做“单总线协议”的通信方式工作。
其工作原理如下:
1. 外部因素引起的温度变化会导致DS18B20内部的微处理器
产生微小的电压变化。
2. DS18B20将这个微小的电压变化转换为数字信号,并通过
单总线协议发送给外部设备。
3. 在单总线协议中,DS18B20通过发送一系列的脉冲来传递
数字信号。
这些脉冲的频率和持续时间表示数字信号的不同值。
通信的开始和结束由特殊的脉冲来标识。
4. 外部设备通过单总线协议接收和解析DS18B20发送的数字
信号,并将其转换为实际的温度值。
外部设备可以是微控制器、计算机或其他支持单总线协议的设备。
总的来说,DS18B20温度传感器通过将温度变化转换为数字
信号,并通过单总线协议发送给外部设备来实现温度测量。
DS18B20的工作原理DS18B20是一种数字温度传感器,广泛应用于各种温度测量场合。
它采用一线通信协议,具有高精度和可编程分辨率等优点。
本文将介绍DS18B20的工作原理,以帮助读者更好地理解这种传感器的工作机制。
一、DS18B20的基本结构1.1 DS18B20传感器由温度传感器、存储器和控制逻辑电路组成。
1.2 温度传感器采用数字式温度传感器,具有高精度和快速响应特性。
1.3 存储器用于存储传感器的唯一标识号和温度数据。
二、DS18B20的工作原理2.1 DS18B20采用单总线通信协议,通过一根数据线进行数据传输。
2.2 传感器通过内部ADC将模拟温度信号转换为数字信号,并存储在存储器中。
2.3 控制逻辑电路通过单总线协议与主控器通信,读取存储器中的温度数据并传输给主控器。
三、DS18B20的精度和分辨率3.1 DS18B20具有高精度,温度测量精度可达±0.5°C。
3.2 传感器的分辨率可通过配置寄存器进行设置,可选9位、10位、11位或12位分辨率。
3.3 高分辨率能够提供更精确的温度测量结果,但会增加传输数据的长度和时间。
四、DS18B20的应用领域4.1 DS18B20广泛应用于温度监测系统、气象站、温室控制等领域。
4.2 由于其数字化输出和高精度特性,DS18B20在工业自动化和实验室测量中也得到广泛应用。
4.3 DS18B20传感器的小尺寸和低功耗使其适用于需要长期监测温度的场合。
五、DS18B20的优势和劣势5.1 DS18B20具有高精度、数字输出和可编程分辨率等优点。
5.2 传感器的单总线通信协议简化了系统设计和布线。
5.3 传感器的劣势是在极端条件下可能会受到干扰,影响温度测量的准确性。
综上所述,DS18B20是一种功能强大的数字温度传感器,具有高精度和可编程分辨率等优点。
通过深入了解其工作原理和特性,可以更好地应用于各种温度测量场合,为工程和科研提供可靠的温度数据支持。
单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
1.DS18B20的工作原理① DS18B20数字温度传感器概述DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20产品的特点●只要求一个端口即可实现通信。
●在DS18B20中的每个器件上都有独一无二的序列号。
●实际应用中不需要外部任何元器件即可实现测温。
●测量温度范围在-55.C到+125.C之间。
●数字温度计的分辨率用户可以从9位到12位选择。
●内部有温度上、下限告警设置。
TO-92封装的DS18B20的引脚排列见右图,其引脚功能描述见表表3-2DS18B20详细引脚功能描述②DS18B20的内部结构DS18B20的内部框图下图所示,DS18B20 的内部有64 位的ROM 单元,和9 字节的暂存器单元。
64位ROM存储器件独一无二的序列号。
暂存器包含两字节(0和1字节)的温度寄存器,用于存储温度传感器的数字输出。
暂存器还提供一字节的上线警报触发(T H)和下线警报触发(TL)寄存器(2和3字节),和一字节的配置寄存器(4字节),使用者可以通过配置寄存器来设置温度转换的精度。
暂存器的5、6和7字节器件内部保留使用。
第八字节含有循环冗余码(CRC )。
使用寄生电源时,DS18B20不需额外的供电电源;当总线为高电平时,功率由单总线上的上拉电阻通过DQ引脚提供;高电平总线信号同时也向内部电容CPP充电,CPP 在总线低电平时为器件供电。
(字节5~8 就不用看了)。
图为暂存器A.温度寄存器(0和1字节)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
达拉斯DS18B20半导体可编程分辨率的单总线®数字温度计特征引脚排列l独特的单线接口仅需一个端口引脚进行通讯l每个器件有唯一的64位的序列号存储在内部存储器中l简单的多点分布式测温应用l无需外部器件l可通过数据线供电。
供电范围为3.0V到5.5V。
l测温范围为-55~+125℃(-67~+257℉)l在-10~+85℃范围内精确度为±5℃l温度计分辨率可以被使用者选择为9~12位l最多在750ms内将温度转换为12位数字l用户可定义的非易失性温度报警设置l报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件l与DS1822兼容的软件l应用包括温度控制、工业系统、消费品、温度计或任何热感测系统引脚说明GND -地DQ -数据I/OVDD -可选电源电压NC -无连接说明DS18B20数字温度计提供9-12位摄氏温度测量而且有一个由高低电平触发的可编程的不因电源消失而改变的报警功能。
DS18B20通过一个单线接口发送或接受信息,因此在中央处理器和DS18B20之间仅需一条连接线(加上地线)。
它的测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。
除此之外,DS18B20能直接从单线通讯线上汲取能量,除去了对外部电源的需求。
每个DS18B20都有一个独特的64位序列号,从而允许多只DS18B20同时连在一根单线总线上;因此,很简单就可以用一个微控制器去控制很多覆盖在一大片区域的DS18B20。
这一特性在HVAC环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。
详细的引脚说明表18引脚SOIC封装* TO-9封装符号说明5 1 GND 接地。
4 2 DQ 数据输入/输出引脚。
对于单线操作:漏极开路。
当工作在寄生电源模式时用来提供电源(建“寄生电源”节)。
3 3 VDD 可选的VDD引脚。
工作与寄生电源模式时VDD必须接地。
*所有上表未提及的引脚都无连接。
DS18B20 以单总线协议工作,测温分机首先发送复位脉冲命令,使信号线上所有的
DS18B20 芯片都被复位,接着发送ROM 操作命令,使序列号编码匹配的DS18B20 被激活进入接收内存访问命令状态;内存访问命令完成温度转换、温度读取等工作(单总线在ROM 命令发送之前存储命令和控制命令不起作用)。
DS18B20 工作流程见图3 所示。
图3 DS18B20 工作流程图
系统以ROM 命令和存储器命令的形式对DS18B20 操作。
ROM 操作命令均为8 位,命令代码分别为:读ROM(0x33H)、匹配ROM(0x55H)、跳过ROM(0xCCH) 、搜索ROM(0xF0H) 和告警搜索(0xECH) 命令;存储器操作命令为:写暂存存储器(0x4EH) 、读暂存存储器(0xBEH)、复制暂存存储器(0x48H)、温度变换(0x44H)、重新调出EERAM(0xB8H)以及读电源供电方式(0xB4H)命令。
其对时序及电特性参数要求较高,必须严格按照它的时序要求去操作。
DS18B20 的数据读写由测温分机来完成,包括初始化、读数据和写数据。
系统软件采用模块化程序设计,主从式结构通信方式。
规定总线上有一个测温主机和64台分机,分机地址唯一。
初始化完成后各分机均处于监听状态,采用中断方式工作,测温分机接受上位机命令,向DS18B20发出地址匹配命令帧,进入等待状态,每一帧数据位都对应着不同意义,若地址匹配成功则进行响应分机,否则继续等待,直到等待超时而重发命令。
温度采集模块负责数据的采集工作。
当缓冲区有数据时产生中断,程序转向中断服务子程序入口,中断子程序如下:
void SerialInterrupt() interrupt 4 //中断服务子程序
{loop0:if(RI);SlaveNo=SBUF;
RI=0; while (! RI); //等待下一个命令
loop1:RI=0;
SensorNo=SBUF;
if(SlaveNo==0x81&SensorNo<0x80) //判别数据是否合法
{while(1)
{Gettemp(SensorNo); if(RI) goto loop1;} }
else goto loop0; }//否则继续等待
3.2 DS18B20的时延及读写时序问题
为保证DS18B20的严格I/O时序,需要作较精确的延时。
在DS18B20的操作中,短时间延时是指10us以下的延时,在汇编语言下采用若干个NOP指令即可。
因C51编译器提供了若干内部函数,(_nop_()函数为其中之一)其编译结果就是在对应位置嵌入一个nop 汇编指令,所以短时间延时可利用_nop_()函数实现。
较长时间延时指10us以上的延时。
在DS18B20操作中,用到的较长时间延时有15us、90us、270us、540us等。
因这些延时均为15us的整数倍,可编写一个Delayl5(n)函数,该函数可实现约15us×n的延时。
DS18B20的初始化包括测温分机发送的复位脉冲和其向测温分机返回的存在脉冲。
总线在开始时刻发出一个最短为480us的低电平复位脉冲,接着在该时刻释放总线并进入接收状态,DS18B20在接收到总线的电平上升沿,等待15—60us后在下一时刻发出60—240us 时延的低电平存在脉冲信号,表明器件已接在总线上。
时序如图4所示。
图4 初始化图
当总线于该时刻从高电平拉至低电平时,就产生“写”的时间间隙。
从该时刻开始15us之内,应将所需写的位送到总线上,DS18B20在该时刻后的15—45us期间内对总线采样,低电平写入0,高电平写入1。
连续写两位之间的间隙应大于1us。
写时序如图5所示。
图5 读写时序图
起始时刻将总线从高电平拉至低电平,持续15us之后将总线释放,就产生读时间间隙。
测温分机必须在该时刻之后的15us之内完成读总线状态,并在45us内释放总线,连续读两位之间的间隙应大于1us。
读时序如图5所示。
4 总结
本文论述了以DS18B20 为传感器,AT89C51 单片机为控制核心组成的远程粮仓温控系统。
由于DS18B20 采用数字单总线技术,使得系统电路简单,易于扩展,加上总线数字化,使得系统的抗干扰性能好,可靠性高,测温范围比较宽(-55~125℃),与传统的温控系统相比还具有较高的性价比。
此外,系统的应用范围不仅仅局限于粮仓领域,稍作改动还可作为其它自控领域的解决方案,如烟叶烘烤箱控制系统等。
本文作者创新观点:采用新型数字温度传感器DS18B20,并将其与51 单片机、RS-485总线技术有机的结合在一起,组成抗干扰性能较强的温控系统。
系统具有较高的性价比,已
成功应用于许昌、尉氏等中型粮库中。
该系统避免了因温度过高而导致大量粮食发霉变质所造成的损失,对于中型粮库可产生经济效益百万元以上,在粮食储藏技术领域内具有广阔的市场前景。
参考文献:
[1] 来清民.基于CAN总线的多功能大型粮仓远程监测系统[J].微计算机信息,2005,(07)
[2] 李虹,温秀梅,高振天.基于MSP430单片机和DS18B20的小型测温系统[J].微计算机信息,2006, (20)。