DS18B20操作时序详解
- 格式:docx
- 大小:466.58 KB
- 文档页数:5
现在我们要做的是让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的一线工作协议流程是:初始化→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,因为每个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中有很多的应用(需要的话需要在书或者在网上查找资料),这里只进行简单的温度测试应用。
(这里的延时是很严厉的)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 原理与分析
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内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器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位温度数据占据第二字节。
分布式测温中传感器时序与温度读取研究(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进行复位操作,复位成功后发送一条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逻辑时序图及程序设计通过单线总线的所有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显得电平进行采样,获得总线上写入的数据。
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;
}。