DS18B20操作时序详解
ds18b20使用简介
![ds18b20使用简介](https://img.taocdn.com/s3/m/64f4f03431126edb6e1a1007.png)
现在我们要做的是让DS18B20进行一次温度的转换,那具体的操作就是1、主机先作个复位操作,2、主机再写跳过ROM的操作(CCH)命令,3、然后主机接着写个转换温度的操作命令,后面释放总线至少一秒,让DS18B20完成转换的操作。
在这里要注意的是每个命令字节在写的时候都是低字节先写//1111111111111111111111111111111111111111111111111111111111111111111111111111111111111读取RAM内的温度数据。
同样,这个操作也要接照三个步骤。
1、主机发出复位操作并接收DS18B20的应答(存在)脉冲。
2、主机发出跳过对ROM操作的命令(CCH)。
3、主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0一第8,共九个字节的数据。
如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可。
同样读取数据也是低位在前的。
整个操作的总线状态如下图:.初始化时序初始化时序:Muc :写0:拉低,480us(mimium)~960us(maxium) 释放总线15——60us Ds18b20 :写0:拉低,60~120us,总的应答时序(minimum)为480usMcu写18b20先拉高总线电平:写0,拉低电平60us~120us,(前15us,稳定数据,后45us供ds18b20采样) 先拉高总线电平:写1,拉低电平(1~15us),再拉高总线(在15us内必须让高点平稳定,后45us供ds18b20采样)Mcu 读18b20Ds18b20向mcu写入数据Mcu将总线拉高:写0:ds18b20拉低电平15us,后45us释放总线(mcu必须在15us内完成采样,自己规定11us时采样),Mcu将总线拉高:写1:ds18b20拉总线1us,之后释放总线,(mcu必须在15us内完成采样),///注:所有的数据读取都是从低位开始。
DS18B20的使用法解析
![DS18B20的使用法解析](https://img.taocdn.com/s3/m/52e5123a4b35eefdc8d33356.png)
DS18B20共有三种形态的存储器资源:
1、ROM 只读存储器,用于存放DS18B20的ID编码,其前8 位是单线系列编码(DS18B20的是 28H),后面48位是芯 片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。 数据在出产时设置不由用户更改。DS18B20共64位ROM。
2、RAM 数据暂存器,用于内部计算和数据存取,数据在掉 电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、 2个字节是温度转换后的数据值(温度寄存器),第3、4个字 节是用户EEPROM(温度报警值TH、TL储存)的镜像。在上 电复位时其值将被刷新。第5个字节则是用户第3个EEPROM 的镜像(配置寄存器)。第6、7、8个字节为计数寄存器,是 为了让用户得到更高的温度分辨率而设计的,同样也是内部温 度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。 3、EEPROM 非易失性记忆体,用于存放长期需要保存的数 据,上下限温度报警值和校验数据,DS18B20共3位 EEPROM,并在RAM都存在镜像,以方便用户操作。
这是向RAM中写入数据的指令,随后写入的两 个字节的数据将会被存到地址2(报警RAM之TH) 和地址3(报警RAM之TL)。写入过程中可以用复 位信号中止写入。
Read Scratchpad (从RAM中读数据)[BEH]
此指令从RAM中读数据,读地址从地址0开始, 一直可以读到地址9,完成整个RAM数据的读出。芯 片允许在读过程中用复位信号中止读取,即可以不 读后面不需要的字节以减少读取时间。
Read Power Supply(工作方式切换)[B4H]
此指令发出后发出读时间隙,芯片会返回它的 电源状态字,“0”为寄生电源状态,“1”为外部 电源状态。
18B20工作时序
![18B20工作时序](https://img.taocdn.com/s3/m/40e26d46336c1eb91a375d90.png)
DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括:初始化时序、写时序、读时序。
初始化时序DS18B20初始化时序主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答,若无低电平出现一直都是高电平说明总线上无器件应答。
作为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备,若没有检测到就一直在检测等待。
对DS18B20的写和读操作接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程,因此首先要搞清楚主机是如何进行写0、写1、读0和读1的。
写周期最少为60微秒,最长不超过120微秒,写周期一开始作为主机先把总线拉低1微秒表示写周期开始,随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。
而作为从机的DS18B20则在检测到总线被拉低后等待15微秒然后从15μs到45μs开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
DS18B20写操作对于读数据操作时序也分为读0时序和读1时序两个过程,读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若要送出1则释放总线为高电平。
主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0,采样期内总线为高电平则确认为1,完成一个读时序过程,至少需要60μs才能完成。
温度传感器DS18B20检测程序说明
![温度传感器DS18B20检测程序说明](https://img.taocdn.com/s3/m/40970cb3f121dd36a32d82c5.png)
DS18B20美国达拉斯公司生产的单总线协议的数字温度检测芯片,数据的写入与读取都在一根总线上进行操作,在总线上可以连接多个DS18B20,因为每个DS18B20都有唯一的光刻ROM序列号,所以可以进行ROM匹配,搜索指令进行选择相应的从机序列号。
编写DS18B20的检测程序主要包括:初始化函数(复位脉冲+存在脉冲),写数据函数,读取数据的函数。
对DS18B20的操作包括:初始化函数,ROM指令,RAM指令这三个部分。
接下来我先说一下这三个部分所对应的时序图的理解吧。
初始化:由于上拉电阻的存在,总线默认状态是高电平,接着主机将总线拉低,维持480us 到960us的时间,再接着就是释放总线,维持时间为15us到60us,接着就由从机发出一个低电平信号,将总线拉低,表示该DS18B20是正常地,或者说是存在的,其维持时间为60us 到240us。
上面一图是写入数据的时序图。
写时序:默认状态为高电平,先将总线拉低,至少维持1us 的延时时间,接着就往总线上进行写数据操作,接着DS18B20就开始采样数据了,整个过程时间为60us到120us。
下面一图是读取数据的时序图。
读时序:默认状态为高电平,先将总线拉低,接着在15us 之前,主机进行数据采样,其维持时间也为60us到120us。
下面是我在理解了DS18B20的原理之后所写的程序,调试成功了,且能实时读取外界温度的功能,这里是不读取小数部分的温度,只读取温度的正数值。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit DQ=P2^2;sbit duan=P2^6;sbit wei=P2^7;//是在11.0592M赫兹的频率下void delay_ms(uint t){uint i;for(;t>0;t--)for(i=110;i>0;i--);} //约为tms的延时程序void delay(uint x){while(x--);}void init_ds18b20(){uchar n;DQ=1;delay(2); //约为38usDQ=0;delay(80); //约为800usDQ=1;delay(4); //约为58usn=DQ;delay(10); //约为110us}void write_byte(uchar dat){uchar i;for(i=0;i<8;i++){DQ=0; //无论是写0或写1都要有至少1us的低电平DQ=dat&0x01;//总线直接等于写入的数据(低位在前,高位在后)delay(4); //约为58usDQ=1; //释放总线,为下一步的数据变换做准备dat>>=1;//数据进行移位操作}delay(4);}uchar read_byte(){uchar i,value;for(i=0;i<8;i++){DQ=0;value>>=1; //移位7次DQ=1; //先要释放总线,那样才能采样到有效数据if(DQ) //判断8次{value|=0x80;}delay(6); //约为78us}return value;}uchar read_temperature(){uchar a,b;init_ds18b20(); //每次操作指令前,都必须进行初始化设置write_byte(0xcc);//跳过ROM指令write_byte(0x44);//进行温度转换处理delay(300);//进行一定地延时约为3ms左右init_ds18b20();write_byte(0xcc);//跳过ROM操作write_byte(0xbe);//读取温度a=read_byte();//温度低字节b=read_byte();//温度高字节b<<=4;//b左移四位,低四位为0000b=b+(a&0xf0)>>4;//将a的低四位屏蔽,不取小数点,进行右移四位,合并成一个字节的数据return b;}void display(uchar aa,uchar bb) {duan=1;P0=table[aa];duan=0;P0=0xff;wei=1;P0=0xfe;wei=0;delay_ms(5);duan=1;P0=table[bb];duan=0;P0=0xff;wei=1;P0=0xfd;wei=0;delay_ms(5);}void main(){uchar num,shi,ge;while(1){num=read_temperature();shi=num/10; //分离出十位ge=num%10; //分离出个位display(shi,ge);}}。
DS18b20(时序)
![DS18b20(时序)](https://img.taocdn.com/s3/m/e85114dc49649b6648d747e5.png)
Ds18b20在ds18b20中有很多的应用(需要的话需要在书或者在网上查找资料),这里只进行简单的温度测试应用。
(这里的延时是很严厉的)1、复位:程序先将out拉低,然后延时一段时间(在下面有个图)再将out拉高,延时一段时间,之后再读取存在信号,将存在信号返回(0表示器件存在,1表示器件不存在)。
uchar reset () //复位{uchar existpulse;out = 0;delay_1820 (30);out = 1;delay_1820 (3);existpulse = out;delay_1820 (30);return existpulse;}2、位写入函数:拉低数据线out开始写时间隙。
然后,如果写入的是1,则out=1;如果写入的是0,则out=0,之后需要延时是之在时间隙内保持电平值。
最后拉高out。
void wbit (uchar value)//写一位值{out = 0;if (value == 1)out = 1;elseout = 0;delay_1820 (5);out = 1;}3、字节写入函数:一个字节8位,利用位写入函数一个一个的写入。
void wbyte (uchar value) //写字节{uchar i, temp;for (i=0; i<8; ++i){temp = value >> i;temp = temp & 0x01;wbit (temp);delay_1820 (5);}}4、位读取函数:程序首先拉低数据线out开始读时间隙,然后再将out置1.延时一段时间将out的值读出来,最后将读出来的值返回。
uchar rbit () //读一位数{uchar i;out = 0;out = 1;for (i=0; i<3; i++);/////??????????!!!!!!!!!!!!return out;}5、字节读取函数:一个字节8位,利用位读取函数一个一个的读取。
DS18B20工作原理及时序
![DS18B20工作原理及时序](https://img.taocdn.com/s3/m/bffbbee176eeaeaad1f3303d.png)
DS18B20 工作原理及时序
DS18B20 原理与分析
DS18B20 是美国DALLAS 半导体公司继DS1820 之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且
可根据实际要求通过简单的编程实现9~12 位的数字值读数方式。
可以分别
在93.75 ms 和750 ms 内完成9 位和12 位的数字量,并且从DS18B20 读出的信息或写入DS18B20 的信息仅需要一根口线(单线接口)读写,温度变换功率来
源于数据总线,总线本身也可以向所挂接的DS18B20 供电,而无需额外电
源。
因而使用DS18B20 可使系统结构更趋简单,可靠性更高。
他在测温精
度、转换时间、传输距离、分辨率等方面较DS1820 有了很大的改进,给用
户带来了更方便的使用和更令人满意的效果。
1.DS18B20 简介
(1)独特的单线接口方式:DS18B20 与微处理器连接时仅需要一条口线即可
实现微处理器与DS18B20 的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:+3.0~ +5.5 V。
(4)测温范围:-55 ~+125 ℃。
固有测温分辨率为0.5 ℃。
DS18B20工作过程及时序
![DS18B20工作过程及时序](https://img.taocdn.com/s3/m/745e676baf45b307e8719785.png)
DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。
在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。
这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±,即0.25℃。
温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。
测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。
时序解读ds18b20
![时序解读ds18b20](https://img.taocdn.com/s3/m/6455c42ecfc789eb172dc85f.png)
分布式测温中传感器时序与温度读取研究(1)2009-02-27 10:12:45 作者:王捷孙德辉来源:微计算机信息关键字:写时序读时序温度传感器温度采集1.引言在分布式测温系统中应用了大量的新型传感器DS18B20,DS18B20是单总线数字温度传感器其硬件接线简单,但时序非常复杂。
要实现温度的正确读取,既要有对DS18B20的ROM操作命令,又有一些功能命令。
这些命令的执行,既有一定顺序,又有特定含义。
都需要基于数字温度传感器初始化时序、写时序和读时序,按照严格的时序配合才能完成温度正确采集与读取。
因此要想正确使用单总线数字温度传感器,必须分析其时序关系,并且基于时序编制正确程序。
单总线数字温度传感器时序分析与应用研究具有及其重要意义。
2.数字温度传感器时序DS18B20与单片机只通过一条数据线连接,所以其数据的传输方式为串行方式。
为了正确读取温度值,必须严格按照时序配合关系,进行程序编制。
DS18B20有严格的通信协议来保证数据传输的正确性和完整性。
通信协议规定了总线上的多种信号的时序。
如:复位脉冲、响应脉冲、写0、写1、读0和读1等信号的时序。
DS18B20是在严格的时序控制下进行正常操作的。
换句话讲,就是用较为复杂的软件来换取简单的硬件接口。
因此要正确使用DS18B20,就必须了解其初始化时序、写时序和读时序。
2.1 数字温度传感器初始化时序初始化时序有时也称复位时序,它是数据线上所有传输过程的开始。
整个初始化过程由主设备发出的复位脉冲和DS18B20的响应脉冲组成。
在主设备初始化的过程中,主设备通过拉低数据线至少480μS,DS18B20即认为是接收到一个初始化脉冲,接着主设备释放数据线,在数据线上上拉电阻的作用下,数据线电平被拉高,并且主设备进入接收模式。
在DS18B20检测到上升沿后,延时15~60μS,接着通过拉低总线60~240μS以产生应答脉冲。
初始化时序如图2所示。
图1是图2、图3和图4的线型示意图。
ds18b20时序
![ds18b20时序](https://img.taocdn.com/s3/m/a40d58aa284ac850ad0242d0.png)
主机控制ds18b20完成温度转换必须经过三个步骤:每次读写之前都要对ds18b20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对ds18b20进行预订的操作复位操作复位要求主机CPU将数据线下拉500微秒,然后释放,当ds18b20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功ROM指令Read ROM【33H】读ROM命令,读ds18b20温度传感器ROM中的编码(即64位地址),只有在总线上存在单只ds18b20时才使用此命令。
Match ROM【55H】匹配ROM命令,发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的ds18b20使之作出响应,为下一步对该ds18b20的读写准备。
Scarch ROM【F0H】搜索ROM命令,该命令用于确定挂接在同一总线上ds18b20的个数和识别64位ROM地址,为操作各器件作好准备。
Skip ROM【CCH】跳过ROM命令,这条命令用于忽略64位ROM地址,直接向ds18b20发温度转换命令,以节省时间,简化过程,适用于单片机工作。
Alarm search 【ECH】告警搜索命令,该命令执行后只有温度超过设定值上限或下限的片子才能做出响应;RAM指令Coerert T 【44H】开始温度转换命令,启动ds18b20进行温度转换,12位转换时最长为750ms,9位为93.75ms,温度转换结果存入内部9字节RAM中Read 【BEH】读暂存器命令,用于读取ds18b20内部RAM中9字节的内容,其中头两个字节是温度值,如果不想读完,控制器可以在任何时间内发出复位命令来终止读取。
Write 【4EH】写暂存器命令,发出向内部RAM的BYTE2、BYTE3字节写上、下限温度数据命令。
Copy 【48H】复制暂存器命令,这条命令的作用是将RAM中BYTE2、BYTE3字节的内容复制到EEPROM中。
DS18B20逻辑时序图及程序设计
![DS18B20逻辑时序图及程序设计](https://img.taocdn.com/s3/m/7db426b2bed5b9f3f80f1c65.png)
DS18B20逻辑时序图及程序设计通过单线总线的所有ROM操作,都从一个初始化序列开始。
初始化就是由单片机首先拉低总线一段时间,至少480us,然后拉高总线,等待一段时间,读取总线上的电平值,若为“1”则无器件在线,为“0”则存在器件。
若为“0”,则延迟一段时间,一般为200us,然后继续下面的操作。
由于需要响应按键的中断,所以程序中有对按键值的判断。
初始化时序图图3.10 DS18B20unsigned char ow_reset(uint n){unsigned char presence;//SET TO OUTPUT P4DIR=0xff;P4OUT=0xff;//pull dQ line low P4OUT=0x00;_NOP();_NOP();// leave it low for 600us delay(100);// allow line to return high P4OUT=0xff;//SET TO INPUT P4DIR=0x00;while(P4IN!=0);while(P4IN==0){presence =0; // get presence signalreturn(presence); // presence signal returned}1 = no part} // 0=presence,温度传感器还有许多与温度转换,温度值读取,匹配序列号等相DS18B20而这些寄存器操作这些指令都是建立在对寄存器的操作的基础上的,关的指令,写操作实现的,每一个指令都是八个字节,而由于的读/都是通过对DS18B20次数据发送,所8DS18B20是单总线器件,所以每发出一条指令,都需要进行而且都需要判断发送或接收循环为主体的,for写操作的程序是以/以对器件的读的比特值是“1”还是“0”。
控制器写入时序图图3.11 DS18B20的一个字节//读取ds18b20uchar DS18B20_ReadByte(uint n){uchar u;uchar q ;P4DIR=0xff; //SET TO OUTPUTSwitch(n){case 0:for(q=0;q<8;q++){u=u>>1;P4OUT &=~BIT0;_NOP();_NOP();P4OUT |=BIT0;P4DIR &=~BIT0; //SET TO INPUT_NOP();_NOP();u=u|0x80; if((P4IN&0x08)==0x08)u=u&0x7f; elsedelay(20);P4DIR |=BIT0; //SET TO OUTPUTP4OUT |=BIT0;} break;return u; }}”时,首先要将总线拉低,”或“13.11由时序图可以看出,单片机在写“0根据总DS18B20”来确定是保持高电平还是低电平,”或者“然后根据是“01显得电平进行采样,获得总线上写入的数据。
ds18b20详解及程序
![ds18b20详解及程序](https://img.taocdn.com/s3/m/b859e63db5daa58da0116c175f0e7cd1842518dd.png)
ds18b20详解及程序最近都在学习和写单⽚机的程序, 今天有空⼜模仿DS18B20温度测量显⽰实验写了⼀个与DS18B20基于单总线通信的程序. DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应⽤)是DALLAS 公司⽣产的1-Wire,即单总线器件,具有线路简单,体积⼩的特点。
因此⽤它来组成⼀个测温系统,具有线路简单,在⼀根通信线,可以挂很多这样的数字温度计。
DS18B20 产品的特点:(1)、只要求⼀个I/O ⼝即可实现通信。
(2)、在DS18B20 中的每个器件上都有独⼀⽆⼆的序列号。
(3)、实际应⽤中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃; (5)、数字温度计的分辨率⽤户可以从9 位到12 位选择。
将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。
DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输⼊出引脚。
开漏单总线接⼝引脚。
当被⽤在寄⽣电源下,此引脚可以向器件提供电源;漏极开路, 常太下⾼电平.通常要求外接⼀个约5kΩ的上拉电阻.3、VDD可选择的VDD 引脚。
电压范围:3~5.5V; 当⼯作于寄⽣电源时,此引脚必须接地。
DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和⾼位字节;第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;第9字节是前⾯8个字节的CRC检验值.配置寄存器的命令内容如下:MSB LSBR0和R1是温度值分辨率位, 按下表进⾏配置.默认出⼚设置是R1R0 = 11, 即12位.温度值分辨率配置表4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低⼀位代表的温度值)12位分辨率时的两个温度字节的具体格式如下:⾼字节:其中⾼字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:, ⾼字节不变....由上表可看出, 当输出是负温度时, 使⽤补码表⽰, ⽅便计算机运算(若是⽤C语⾔, 直接将结果赋值给⼀个int变量即可).DS18B20 的使⽤⽅法:由于DS18B20 采⽤的是1-Wire 总线协议⽅式,即在⼀根数据线实现数据的双向传输,⽽对单⽚机来说,我们必须采⽤软件的⽅法来模拟单总线的协议时序来完成对DS18B20芯⽚的访问。
DS18B20详细时序
![DS18B20详细时序](https://img.taocdn.com/s3/m/8185afd7195f312b3169a59e.png)
今天弄DS18B20,发现按照DataSheet写的续写函数无法正常工作,估计是对DataSheet的理解不够。
找来一个例程,仔细对比发现了差异。
详细分析如下:一、先看写时间片。
根据上面的说明:写时间片在主机把数据线从高电平拉到低电平时开始。
不论是写0还是写1都必须持续至少60us,写周期之间需要有1us的恢复间隔。
DS18B20在DQ线被拉低后的15us到60us内对DQ线进行采样。
如果DQ线为高,则产生了一次写1操作,如果DQ线为0则产生了一次写0操作。
主机要发出一个写1时间片,数据线必须拉低并且接着被释放(?这里的释放应该怎样理解?),以此来允许数据线在写时间片开始后的15us内上升到高电平。
主机要发出一个写0时间片,数据线必须被拉低并且保持低电平60us。
根据以上说明和时序图,我写了如下的写字节函数。
程序:sbit DQ=P1^7;/*-----------------------------------------------------------------*/void delay(unsigned int i){while ((i--)!=1);}/*-----------------------------------------------------------------*/void TmWrByte(unsigned char dat) //读写都是从最低有效位开始{unsigned char k;for (k=1;k<=8;k++){DQ=1;DQ=0;_nop_();_nop_();DQ=dat&0x01;delay(6); //while( (i--)!=1 ); // 延时10*i个机器周期DQ = 1; //这里必须要拉高dat>>=1;}delay(5);}分析:DQ = 1; //这里必须要拉高,我不明白为什么应该有这一条语句,但是没有这条语句就不能正常写操作。
DS18B20操作时序
![DS18B20操作时序](https://img.taocdn.com/s3/m/57b144b90b4c2e3f5627633b.png)
(1)先将数据线置高电平“1”。
(2)延时(该时间要求的不是很严格,但是尽量可能短一点)
(3)数据线拉到低电平“0”。
(4)延时750微妙(该时间范围可以从480到960微秒)
(5)数据线拉到高电平“1”。
(6)延时等待。
如果初始化成功则在15到60微秒时间之内产生一个由DS18B20所返回的低电平“0”。
据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,起延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1”后结束。
(1)数据线先置低电平“0”。
(2)延时确定的时间为15微秒。
(3)按从低位到高位的顺序发送数据(一次只发送一位)。
(4)延时时间为45微秒。
(5)将数据线拉高到高电平。
(6)重复上1~5步骤,知道发送完整个字节。
(7)最后将数据线拉高。
(1)将数据线拉高“1”。
(2)延时2微秒。
(3)将数据线拉低“0”。
(4)延时6微秒。
(5)将数据线拉高“1”。
(6)延时4微秒。
(7)读数据线的状态得到1个状态位,并进行数据处理。
(8)延时30微秒。
(9)重复1~7步骤,直到读取完一个字节。
DS18B20数字温度传感器接口程序的时序 (1)
![DS18B20数字温度传感器接口程序的时序 (1)](https://img.taocdn.com/s3/m/301efa1afc4ffe473368ab7f.png)
相应的 C51 代码如下,假设 Delay15( a) 为延时 15 × a μs 的延时函数:
Init_DS18B20( void) {
DQ = 0; / / 主机置 0,复位脉冲 Delay15( 36) ; / / 延时 540μs,介于 480 ~ 960μs 之间 DQ = 1; / / 主机置 1 Delay15( 6) ; / / 延时 90μs,大于等待时长 60μs 又介于 60 ~ 240μs 之间
100 EIC Vol. 18 2011 No. 6
欢迎光临本刊网站 http: / / www. eic. com. cn
仪器仪表用户 doi: 10. 3969 / j. issn. 1671-1041. 2011. 06. 040
□经验交流□
浅析风力发电机组无功补偿问题
逯登龙1 ,邵联合2
( 1. 中广核( 尚义) 风力发电有限公司,张家口 076450; 2. 保定电力职业技术学院,保定 071051)
初始化脉冲序列包括一个由主机发出的复位脉冲及其后的一个由传感器发出的存在脉冲复位脉冲可理解为主机对传感器发出的一个请求而其后的存在脉冲为传感器对主机的应答经过此一问一答主机与传感器之间的联系通道被建立为下一步的交流数据读取或写入作好准备
仪器仪表用户 doi: 10. 3969 / j. issn. 1671-1041. 2011. 06. 039
□经验交流□
DS18B20 数字温度传感器接口程序的时序
黄文力1 ,邓小磊2
( 1. 郑州航空工业管理学院 机电工程学院,郑州 450015; 2. 襄城县供电局,许昌 461700)
摘要: DS18B20 属于单总线数字式温度传感器,相应的硬件接口电路非常简单,必须通过复杂的软件结构为与主机之间的数
DS18B20时序
![DS18B20时序](https://img.taocdn.com/s3/m/92dcd71bf18583d0496459f0.png)
为了保证数据可靠地传输,任一时刻单线上只能有一个控制信号或数据,进行通信时必须符合单总线通信协议。
DS18B20的操作顺序遵循以下三步。
1)初始化操作
通过单线总线的所有执行(处理)都从一个初始化序列开始。
初始化序列包括一个由总线控制器发出的复位脉冲和跟有其后由从机发出的存在脉冲。
存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。
初始化操作时序如图3.16所示。
图3.16 DS18B20初始化操作时序图
2)执行ROM操作命令
执行ROM操作命令,用于定位单总线上的DS18B20。
每一片DS18B20包含一个唯一的64位ROM编码具体编码格式如表3.3所示。
表3.3 DS18B20 ROM编码格式
表3.4 DS18B20 RO M操作命令表
3)执行功能操作命令
总线控制器通过执行ROM命令定位要操作的DS18B20,之后对其发送功能操作命令。
命令用于启动温度转换盒数据读/写等操作。
DS18B20逻辑时序图及程序设计
![DS18B20逻辑时序图及程序设计](https://img.taocdn.com/s3/m/23e21c5d04a1b0717fd5ddb7.png)
DS18B20逻辑时序图及程序设计通过单线总线的所有ROM操作,都从一个初始化序列开始。
初始化就是由单片机首先拉低总线一段时间,至少480us,然后拉高总线,等待一段时间,读取总线上的电平值,若为“1”则无器件在线,为“0”则存在器件。
若为“0”,则延迟一段时间,一般为200us,然后继续下面的操作。
由于需要响应按键的中断,所以程序中有对按键值的判断。
图3.10 DS18B20初始化时序图unsigned char ow_reset(uint n){unsigned char presence;P4DIR=0xff; //SET TO OUTPUTP4OUT=0xff;P4OUT=0x00; //pull dQ line low_NOP();_NOP();delay(100); // leave it low for 600usP4OUT=0xff; // allow line to return highP4DIR=0x00; //SET TO INPUTwhile(P4IN!=0);while(P4IN==0){presence =0; // get presence signalreturn(presence); // presence signal returned}} // 0=presence,1 = no partDS18B20温度传感器还有许多与温度转换,温度值读取,匹配序列号等相关的指令,这些指令都是建立在对寄存器的操作的基础上的,而这些寄存器操作都是通过对DS18B20的读/写操作实现的,每一个指令都是八个字节,而由于DS18B20是单总线器件,所以每发出一条指令,都需要进行8次数据发送,所以对器件的读/写操作的程序是以for循环为主体的,而且都需要判断发送或接收的比特值是“1”还是“0”。
图3.11 DS18B20 控制器写入时序图uchar DS18B20_ReadByte(uint n) //读取ds18b20的一个字节{uchar u;uchar q ;P4DIR=0xff; //SET TO OUTPUTSwitch(n){case 0:for(q=0;q<8;q++){u=u>>1;P4OUT &=~BIT0;_NOP();_NOP();P4OUT |=BIT0;P4DIR &=~BIT0; //SET TO INPUT_NOP();_NOP();if((P4IN&0x08)==0x08) u=u|0x80;else u=u&0x7f;delay(20);P4DIR |=BIT0; //SET TO OUTPUTP4OUT |=BIT0;} break;} return u;}由时序图3.11可以看出,单片机在写“0”或“1”时,首先要将总线拉低,然后根据是“0”或者“1”来确定是保持高电平还是低电平,DS18B20根据总显得电平进行采样,获得总线上写入的数据。
DS18B20时序详解
![DS18B20时序详解](https://img.taocdn.com/s3/m/76951f84f5335a8103d22099.png)
DS18B20时序详解初始化时序:DS18B20的所有通信都是以由复位脉冲组成的初始化序列开始的。
该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。
下图阐述了这一点。
DS18B20发出存在脉冲,以通知主机它在总线上并且准备好操作了。
在初始化时序中,总线上的主机通过拉低单总线至少480μs来发送复位脉冲。
然后总线主机释放总线并进入接收模式。
总线释放后,4.7kΩ的上拉电阻把单总线上的电平拉回高电平。
当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。
如上所述,主机将总线拉低最短480us,之后释放总线。
由4.7kΩ上拉电阻将总线恢复到高电平。
DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。
至此,初始化和存在时序完毕。
/*延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)*//*************************************函数:Delayxus_DS18B20功能:DS18B20延时函数参数:t为定时时间长度返回:无说明:延时公式:15n+15(近似),晶振12Mhz*******************************************/void Delayxus_DS18B20(unsigned int t){for(t;t>0;t--){_nop_();_nop_();_nop_();_nop_();}_nop_(); _nop_();}/*************************************函数:RST_DS18B20功能:复位DS18B20,读取存在脉冲并返回参数:无返回:1:复位成功;0:复位失败说明:拉低总线至少480us ;可用于检测DS18B20工作是否正常*******************************************/bit RST_DS18B20(){bit ret="1";DQ=0;/*拉低总线*/Delayxus_DS18B20(32);/*为保险起见,延时495us */DQ=1;/*释放总线,DS18B20检测到上升沿后会发送存在脉冲*/Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us后可以保证接受到的是存在脉冲*/ret=DQ;Delayxus_DS18B20(14);/*延时495us,让ds18b20释放总线,避免影响到下一步的操作*/DQ=1;/*释放总线*/return(~ret);}写时序:主机在写时隙向DS18B20写入数据,在读时隙从DS18B20读取数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.DS18B20复位程序分析
单片机发送复位脉冲低电平保持至少480us 释放总线进入接收状态,等待15us-60us DS18B20发出存在脉冲脉冲持续60-240us void reset()
{
uint i;//i 定义为uchar型
ds=0;
i=103;
while(i>0)i--;
ds=1;
while(i>0)i--;//在这里不做存在检测
}
2.DS18B20写程序
时序分析:
单片机由高电平拉低至低电平产生写时间隙
15us之后就需要将所需要写的位送到总线上面
DS18B20在开始之后的15-60us内对总线进行采样(注意采样时间)uint dswrite(uchar dat)
{
uchar i;
uint j;
sbit tempbyte;
for(i=0;i<8;i++)
{
tempbyte=dat&0x01;
dat>>=1;//从最低位开始每一位送到tempbyte临时位
//总线拉低为低电平
if(tempbyte)//写1
{
ds=0;
j++;
j++;//延时个13us
ds=1;
j=8;
while(j>0)j--//延时个71us
}
else
{
ds=0;
j=8;
while(j>0)j--;
ds=1;
j++;j++;//保证大于1us-
}
}
}
3.DS18B20读时序
时序分析
单片机从高电平拉低至低电平
低电平保持4us后将总线拉高产生读时间隙
读时间在4us后到15us之前(注意一定在15us之前)读时间才有效从拉低总线60us-120us之间释放总线(注意是在这个时间间隙之间,严格按照时序操作)
bit tempbit()
{
uint j;
bit dat;
ds=0;
j++;//延时个4us
ds=1;
j++;j++;//仿真结果在8.86us左右
dat=ds;//确保在15us之前
j=8;
while(j>0)j--;
ds=1;
return dat;
}
uchar dsread()//用uchar 来装读到的数据足够
{
uchar i,j,dat;
for(i=0;i<8;i++)
{
j=tempbit();
dat=(j<<7)|(dat>>1);//因为首先读到是低位的数据,后面读的数据加到高位,并依
//此往低位挪动}
return dat;
}。