基于51单片机的多点温度测量系统设计.docx
《基于51单片机的多点温度测量系统设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的多点温度测量系统设计.docx(24页珍藏版)》请在冰点文库上搜索。
基于51单片机的多点温度测量系统设计
第一章摘要…………………………………………………………………2
第二章引言…………………………………………………………………2
第三章DS18B20温度传感器相关介绍……………………………………3
3.1DS18B20的特点………………………………………………3
3.2DS18B20工作过程及时序……………………………………3
3.3DS18B20结构图………………………………………………5
第四章LED数码管介绍……………………………………………………8
第五章硬件的设计……………………………………………………10
5.1温度采集模块………………………………………………11
5.2温度显示模块………………………………………………11
第六章软件的设计…………………………………………………………12
6.1读18B20的ROM系列号程序………………….……..……12
6.2温度的转换与读取程序………………………………………17
6.3温度在数码管显示的程序……………………………………23
第七章心得体会……………………………………………………………26
参考资料……………………………………………………………27
第一章摘要
本次课程设通过基于MCS-51系列单片机SST80C51和DS18B20温度传感器检测温度,熟悉芯片的使用,温度传感器的功能,LED数码管的使用,汇编语言的设计;并且把我们这一年所学的数字和模拟电子技术、检测技来掌握相关知识。
第二章引言
在人类的生活环境中,温度扮演着极其重要的角色。
无论你生活在哪里,从事什么工作,无时无刻不在与温度打着交道。
自18世纪工业革命以来,工业发展对是否能掌握温度有着绝对的联系。
在冶金、钢铁、石化、水泥、玻璃、医药等等行业,可以说几乎80%的工业部门都不得不考虑着温度的因素。
温度对于工业如此重要,由此推进了温度传感器的发展。
进入21世纪后,温度传感器正朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展。
在工农业生产中,温度检测及其控制占有举足轻重的地位,随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测和显示系统已经应用于诸多领域。
要达到较高的测量精度需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差等问题,使温度检测复杂化。
单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,成为自动化和各个测控领域中必不可少且广泛应用的器件,尤其在日常生活中也发挥越来越大的作用。
采用单片机对温度采集进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控数据的技术指标,从而能够大大提高产品的质量和数量。
第三章DS18B20温度传感器相关介绍
3.1DS18B20的特点:
(1)独特的单线接口方式:
DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
(2)在使用中不需要任何外围元件。
(3)可用数据线供电,电压范围:
+3.0~+5.5V。
(4)测温范围:
-55-+125℃。
固有测温分辨率为0.5℃。
(5)通过编程可实现9-12位的数字读数方式。
(6)用户可自设定非易失性的报警上下限值。
(7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温.
(8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
3.2DS18B20工作过程及时序
DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,计数器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位长。
这些命令列表如下:
ReadROM(读ROM)[33h]此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48位序列号,以及8位的CRC。
此命令只能在总线上
仅有一个DS18B20的情况下可以使用。
如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。
MatchROM(符合ROM)[55h]此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。
只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。
所有与64位ROM序列不符的从片将等待复位脉冲。
此命令在总线上有单个或多个器件的情况下均可使用。
SkipROM(跳过ROM)[CCh]在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。
如果在总线上存在多于一个的从属器件而且在SkipROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生线与的效果)。
SearchROM(搜索ROM)[F0h]当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。
搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。
AlarmSearch(告警搜索)[ECh]此命令的流程与搜索ROM命令相同。
但是,仅在最近一次温度测量出现告警的情况下,DS18B20才对此命令作出响应。
告警的条件定义为温度高于TH或低于TL。
只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。
贮存在EEPROM内的触发器值用于告警。
存储器操作命令
WriteScratchpad(写暂存存储器)[4Eh]这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。
接下来写入的两个字节将被存到暂存器中的地址位置2和3。
可以在任何时刻发出复位命令来中止写入。
ReadScratchpad(读暂存存储器)[BEh]这个命令读取暂存器的内容。
读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。
如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
ConvertT(温度变换)[44h]这条命令启动一次温度转换而无需其他数据。
温度转换命令被执行,而后DS18B20保持等待状态。
如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。
如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。
处理数据:
DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
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。
3.3DS18B20结构图
图1管脚排列图
在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:
1(GND):
地
2(DQ):
单线运用的数据输入输出引脚
3(VDD):
可选的电源引脚
第四章LED数码管的介绍
LED数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母a,b,c,d,e,f,g,dp来表示。
当数码管特定的段加上电压后,这些特定的段就会发亮。
一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。
发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。
常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
图2数码管引脚定义图
八段LED数码显示管原理和结构:
数码管分为共阳型和共阴型,共阳极型就是发光管的正极都连在一起,作为一条引线,负极分开。
八段数码发光管就是8个发光二极管组成的,在空间排列成为8字型带个小数点,只要将电压加在阳极和阴极之间相应的笔画就会发光。
8个发光二极管的阳极并接在一起,8个阴极分开,因此称为共阳八段数码管。
相反则为共阴八段数码管。
共阴极八段译码管显码表:
(输入为sp、g、f、e、d、c、b、a)
输入
输出
输入
输出
3FH
0
7FH
8
06H
1
6FH
9
5BH
2
77H
A
4FH
3
7CH
B
66H
4
39H
C
6DH
5
5EH
D
7DH
6
79H
E
07H
7
71H
F
动态显示驱动:
数码管动态显示介面是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制。
当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码
管就不会亮。
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
第五章硬件的设计
温度采集系统的硬件部分主要是由温度采集模块、MSC51处理模块、温度显示模块组成:
图3系统硬件框图
5.1温度采集模块:
图4温度采集模块电路原理图
两个18B20的输入/输出端口接在同一根总线上,GND接地,VCC端口接+5V电源,DQ端口接单片机的P2.0口
5.2温度显示模块:
图5温度显示模块电路原理图
51单片机通过CH452驱动八共阴极数码管显示,其中CH452的SCL输入端口接单片机的P2.2,SDA输入输出端口接P2.1口。
第六章软件的设计
程序的编写主要分为读18B20的ROM系列号的程序,温度的转换与读取程序,温度在数码管显示的程序。
6.1读18B20的ROM系列号的程序
在编写读18B20的ROM系列号的程序的过程中需要分为几个子程序如:
初始化,写时序,读时序,读ROM系列号等过程
图6读ROM序列号流程图
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharbusf[8];
sbitDQ=P2^0;
/*22.11484MHz时微秒级延时*****************/
voiddelayus(ucharus)
{
while(us--);
}
/*22.11484MHz时毫秒级延时*****************/
voiddelayms(uintxms)
{
uintx,y;
for(x=xms;x>0;x--)
for(y=229;y>0;y--);
}
voidDQ_Init(void)
{
DQ=1;
_nop_();_nop_();
DQ=0;
delayus(150);//492us
DQ=1;
delayus(30);//103us
while(DQ==1);
delayus(150);//492us
}
ucharDQ_read(void)
{
uchari,rdata;
for(i=0;i<8;i++)
{
rdata=rdata>>1;
DQ=1;
_nop_();_nop_();
_nop_();_nop_();
DQ=0;
_nop_();_nop_();
_nop_();_nop_();
DQ=1;
delayus
(2);
if(DQ==1)
{
rdata=rdata|0x80;
}
else
{
rdata=rdata&0x7F;
}
delayus(12);//45us
}
DQ=1;
returnrdata;
}
voidDQ_write(ucharsdata)
{
uchari;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();_nop_();
_nop_();_nop_();
DQ=0;
_nop_();_nop_();
_nop_();_nop_();
if((sdata&0x01)==1)
DQ=1;
else
DQ=0;
delayus(17);//60+us
sdata=sdata>>1;
}
DQ=1;
}
voidget_num()
{
uchari;
DQ_Init();
DQ_write(0x33);
for(i=0;i<8;i++)
{
busf[i]=DQ_read();
}
}
voidmain()
{
delayms(1000);
while
(1)
{
get_num();
delayms(1000);
P0=busf[0];
}
}
6.2温度的转换与读取程序
二.温度的读取与相应转换程序中主要包括初始化,跳过ROM,温度转换,匹配ROM,写入指令读暂存器温度,温度值的转换成实际温度等过程。
图7温度读取与转换流程图
#include
#include"C_Delay.h"
#include"PIN.h"
#include"DS18B20.h"
ucharTH,TL;
uintTEMP;
/*18b20的ROM地址:
单个连接读取*/
unsignedcharrom1[8]={0x28,0xfe,0x97,0x4a,0x03,0x00,0x00,0x86};
unsignedcharrom2[8]={0x28,0xe6,0x7b,0x79,0x02,0x00,0x00,0xec};
/*1-wire通信初始化***********************/
voidDQ_Init(void)
{
DQ=1;
_nop_();_nop_();
DQ=0;
delayus(150);//492us
DQ=1;//释放总线
delayus(30);//103us
while(DQ==1);//等到18B20
delayus(150);//492us
}
/*1-wire通信读1字节***********************/
ucharDQ_read(void)
{
uchari,rdata;
for(i=0;i<8;i++)
{
rdata=rdata>>1;
DQ=1;
_nop_();_nop_();
_nop_();_nop_();
DQ=0;
_nop_();_nop_();
_nop_();_nop_();
DQ=1;
delayus
(2);//12us,加上前面DQ之后的时间,大约14-15us
if(DQ==1)
{
rdata=rdata|0x80;
}
else
{
rdata=rdata&0x7F;
}
delayus(12);//45us
}
DQ=1;
returnrdata;
}
/*1-wire通信写1字节***********************/
voidDQ_write(ucharsdata)
{
uchari;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();_nop_();
_nop_();_nop_();
DQ=0;
_nop_();_nop_();
_nop_();_nop_();
if((sdata&0x01)==1)
DQ=1;
else
DQ=0;
delayus(17);//60+us
sdata=sdata>>1;
}
DQ=1;//释放总线
}
uintget_Temp(ucharon)
{uchari;
DQ_Init();
DQ_write(0xcc);//跳过ROM
DQ_write(0x44);//开始转换温度
delayms(750);
DQ_Init();
DQ_write(0x55);//matchROM
if(on==1)
{
for(i=0;i<8;i++)
{
DQ_write(rom1[i]);
}
}
if(on==2)
{
for(i=0;i<8;i++)
{
DQ_write(rom2[i]);
}
}
DQ_write(0xBE);
TL=DQ_read();
TH=DQ_read();
TEMP=TH;
TEMP=(TEMP<<8)|TL;
TEMP=(unsignedint)(TEMP*0.0625*100+0.5);
returnTEMP;
},
6.3温度在数码管显示的程序
三.温度显示部分程序主要包括初始化,通过CH452进行温度—代码的转换,通过按键逐一显示在LED数码管上等过程。
图8温度显示流程图
#include
#include
#include"CH452CMD.h"
#include"C_Delay.h"
//#include"DS1302.h"
#include"DS18b20.h"
//#include"AD_TLC549.h"
#include"PIN.h"
#defineuintunsignedint
#defineucharunsignedchar
//位定义
//sbitLED=P0^0;
//sbitLED1=P0^1;
//sbitFMQ=P3^3;
//全局变量定义
ucharkeyValue;//键值
//bitisRTCSet=0;//1302是否调时模式
//ucharTimeOn;
//显示缓冲区
ucharDISBUF[8]={0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
//DS1302时间缓冲区
ucharDATETIME[7]={0,0x27,0x21,0x19,0x08,0x02,0x11};
//显示数据类型
enumRTCMode{
time=0,
date=1
}RTC_Display=time;
/*CH452显示程序*****************************************/
voidCH452_Fresh_Display(void)
{//配置CH452:
采用BCD译码方式,8个数码管
CH452_Write(CH452_SYSON2);
CH452_Write(CH452_BCD);//BCD译码,8个数码管
CH452_Write(CH452_DIG7|DISBUF[4]);
CH452_Write(CH452_DIG6|DISBUF[5]);
CH452