首页 > 办事核心 > 澳门新濠天地讲堂 >

51单片机分析进修系统之 DS18B20温度测验考试篇

2016-10-11 13:43
分享到:

51单片机分析进修系统之 DS18B20温度测验考试篇 《电子制造》2008年5月 站长原创,如需引用请说明出处
    大师好,经由以前的进修,咱们曾经对51单片机分析进修系统的使用方式及进修编制有所领会与熟悉,学会了步进电机节制的根底学问,体味到了分析进修系统的易用性与易学性,这一期咱们将一路进修数字温度传感器DS18B20的基来历根底理与使用方式。
先看一下咱们将要使用的51单片机分析进修系统能完成哪些测验考试与产物斥地工作:别离有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器吹打,继电器节制,IIC总线,SPI总线,PS/2测验考试,AD模数转换,光耦测验考试,串口通信,红外线遥控,无线遥控,温度传感,步进电机节制等等。

1 51单片机分析进修系统
上图是咱们将要使用的51单片机分析进修系统硬件平台,如图1所示,本期测验考试咱们用到了分析系统主机、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℃计数器所需要的计数个数。
DS18B20内部的比力器以四舍五入的量化编制确定温度寄放器的最低无效位。在计数器2遏制计数后,比力器将计数器1中的计数残剩值转换为温度值后与0.25℃进行比力,若低于0.25℃,温度寄放器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄放器的最低位就进位然后置0。多么,颠末比力后所得的温度寄放器的值便是最终读取的温度值了,其最后位代表0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。
温度寄放器中的温度值以9位数据格局暗示,最高位为符号位,其余8位以二进制补码形式暗示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占领第二字节。
DS18B20丈量温度时使用特有的温度丈量技术。DS18B20内部的低温度系数振荡器能发生不变的频次信号;同样的,高温度系数振荡器则将被测温度转换成频次信号。当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部又一次有斜率累加器,可对频次的非线性度加以弥补。丈量成果存入温度寄放器中。一般环境下的温度值该当为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。
DS18B20工作过程一般遵照以下和谈:初始化——ROM操作号令——存储器操作号令——处置数据
① 初始化
单总线上的所有处置均从初始化序列起头。初始化序列包罗总线主机发出一复位脉冲,接着由从属器件送出具有脉冲。具有脉冲让总线节制器晓得DS1820 在总线上且已预备好操作。
 ROM操作号令
一旦总线主机检测到从属器件的具有,它便能够发出器件ROM操作号令之一。所有ROM操作号令均为8位长。这些号令列表如下:
Read ROM(读ROM)[33h]
此号令答应总线主机读DS18B20的8位产物系列编码,独一的48位序列号,以及8位的CRC。此号令只能在总线上仅有一个DS18B20的环境下能够使用。若是总线上具有多于一个的从属器件,那么当所有从片诡计同时发送时将发生数据冲突的现象(漏极开路会发生线与的成果)。
Match ROM( 合适ROM)[55h]
此号令后继以64位的ROM数据序列,答应总线主机对多点总线上特定的DS18B20寻址。只需与64位ROM序列严酷相符的DS18B20才能对后继的存贮器操作号令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此号令在总线上有单个或多个器件的环境下均可使用。
Skip ROM( 跳过ROM )[CCh]
在单点总线系统中,此号令经由答应总线主机灿忠淮惟给64位ROM编码而拜候存储器操作来节流时间。若是在总线上具有多于一个的从属器件并且在Skip ROM号令之后发出读号令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会发生线与的成果)。
Search ROM( 搜刮ROM)[F0h]
当系统起头工作时,总线主机可能不晓得单线总线上的器件个数或者不晓得其64位ROM编码。搜刮ROM号令答应总线节制器用解除法识别总线上的所有从机的64位编码。
Alarm Search(告警搜刮)[ECh]
此号令的流程与搜刮ROM号令不异。可是,仅在比来一次温度丈量出现告警的环境下,DS18B20才对此号令作出响应。告警的前提定义为温度高于TH 或低于TL。只需DS18B20一上电,告警前提就保持在设置情况,直到另一次温度丈量显示出非告警值或者改变TH或TL的设置,使得丈量值再一次位于答应的范畴之内。储具有EEPROM内的触发器值用于告警。
③ 存储器操作号令
Write Scratchpad(写暂存存储器)[4Eh]
这个号令向DS18B20的暂存器中写入数据,起头位置在地址2。接上去写入的两个字节将被存到暂存器中的地址位置23。能够在任何时辰发出复位号令来中止写入。
Read Scratchpad(读暂存存储器)[BEh]
这个号令读取暂存器的内容。读取将从字节0起头,不断进行下去,直到第9(字节8,CRC)字节读完。若是不想读完所有字节,节制器能够在任何时间发出复位号令来中止读取。
Copy Scratchpad(复制暂存存储器)[48h]
这条号令把暂存器的内容拷贝到DS18B20的E2存储器里,即把温度报警触发字节存入非易失性存储器里。若是总线节制器在这条号令之后跟着发出读时间隙,而DS18B20又正在忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个“0”,若是拷贝结束的话,DS18B20 则输出“1”。若是使用寄生电源,总线节制器必需在这条号令发出后当即起动强上拉并最少保持10ms
Convert T(温度变换)[44h]
这条号令启动一次温度转换而无需其他数据。温度转换号令被施行,尔后DS18B20保持等待情况。若是总线节制器在这条号令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。若是使用寄生电源,总线节制器必需在发出这条号令后当即起动强上拉,并保持500ms。
Recall E2(从头调整E2)[B8h]
这条号令把储具有E2中温度触发器的值从头调至暂存存储器。这类从头调出的操作在对DS18B20上电时也主动发生,因而只需器件一上电,暂存存储器内就有了无效的数据。在这条号令发出之后,对于所发出的第一个读数据时间片,器件会输出温度转换忙的标识:“0=忙,“1=预备伏贴。
Read Power Supply(读电源)[B4h]
对于在此号令发送至DS18B20之后所发出的第一读数据的时间片,器件城市给出其电源编制的信号:“0”=寄生电源供电,“1”=外部电源供电。
 处置数据
DS18B20的高速暂存存储器由9个字节构成,其分派如图3所示。当温度转换号令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可经由单线接口读到该数据,读取时低位在前,高位在后。

3 高速暂存存储器分派图

温度/0C 二进制暗示 十六进制暗示
符号位(5位) 数据位(11位)
+125 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 07D0H
+25.0625 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0191H
+10.125 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 00A2H
+0.5 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0008H
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000H
-0.5 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 FFF8H
-10.125 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 FF5EH
-25.625 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 FE6FH
-55 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 FC90H
 
DS18B20温度数据表

    上表是DS18B20温度采集转化后获得的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的后面5位是符号位,若是测得的温度大于或等于0,这5位为0,只需将测到的数值乘于0.0625即可获得现实温度;若是温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可获得现实温度。

温度转换算计方式举例:
例如当DS18B20采集到+125℃的现实温度后,输出为07D0H,则:

现实温度=07D0H╳0.0625=2000╳0.0625=1250C
例如当DS18B20采集到-55℃的现实温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为算计),则:
现实温度=370H╳0.0625=880╳0.0625=550C

DS18B20软、硬件设想
本实例引见DS18B20与单片机之间的软、硬件接口,经由单片机来读取DS18B20的温度值,并将温度值经由数码管显示出来。在测验考试中先要将功能选择开关调到DS18B20位置上。


图4

5
 
硬件道理图

硬件道理图
法式流程图

法式流程图
软件代码
/***************************************************************************/
/*杭州澳门新濠天地电子有限公司 */
/* */
/*DS18B20演示法式 */
/*方针器件:AT89S51 */
/*晶振:11.0592MHZ */
/*编译环境:Keil 7.50A */
/***************************************************************************/

/*********************************包含头文件********************************/
#include <reg51.h>

/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

/*********************************端口定义**********************************/
sbit DQ=P3^3; //数据传输线接单片机的响应的引脚

/*********************************定义全局变量******************************/
unsigned char tempL=0; //姑且变量低位
unsigned char tempH=0; //姑且变量高位
float temperature; //温度值

/****************************************************************************
函数功能:延时子法式
入口参数:k
出口参数:
****************************************************************************/
void delay(unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}

/****************************************************************************
函数功能:数码管扫描延时子法式
入口参数:
出口参数:
****************************************************************************/
void delay1(void)
{
int k;
for(k=0;k<400;k++);
}

/****************************************************************************
函数功能:数码管显示子法式
入口参数:k
出口参数:
****************************************************************************/
void display(int k)
{
P2=0xfe;
P0=tab[k/1000];
delay1();
P2=0xfd;
P0=tab[k%1000/100];
delay1();
P2=0xfb;
P0=tab[k%100/10];
delay1();
P2=0xf7;
P0=tab[k%10];
delay1();
P2=0xff;
}

/****************************************************************************
函数功能:DS18B20初始化子法式
入口参数:
出口参数:
****************************************************************************/
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //延时
DQ=0; //发送复位脉冲
delay(85); //延时(>480ms)
DQ=1; //拉高数据线
delay(14); //等待(15~60ms)
}

/****************************************************************************
函数功能:DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}

/****************************************************************************
函数功能:DS18B20写一字节数据
入口参数:dat
出口参数:
****************************************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}

/****************************************************************************
函数功能:DS18B20读温度值
入口参数:
出口参数:temperature
****************************************************************************/
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄放器(头两个值别离为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
//温度转换,把凹凸位做响应的运算转化为现实温度
temperature=((tempH*256)+tempL)*0.0625;
delay(200);
return(temperature);
}

/****************************************************************************
函数功能:主法式
入口参数:
出口参数:
****************************************************************************/
void main()
{
float i;
while(1)
{
i=ReadTemperature();
display(i);
}
}
相信看到这里,你该当能够理解DS18B20数字温度传感器的道理是怎样样的了,你也能够按照本人的需要来写一下温度探测及相关节制的法式。由于篇幅有限,读者伴侣能够经由网站或电子@一下一路交换与进修。鄙人几期中,咱们将连续引见51单片机分析进修系统的其它功能道理与使用。