基于单总线的实时温度监控系统.docx

上传人:b****4 文档编号:5472487 上传时间:2022-12-16 格式:DOCX 页数:34 大小:177.91KB
下载 相关 举报
基于单总线的实时温度监控系统.docx_第1页
第1页 / 共34页
基于单总线的实时温度监控系统.docx_第2页
第2页 / 共34页
基于单总线的实时温度监控系统.docx_第3页
第3页 / 共34页
基于单总线的实时温度监控系统.docx_第4页
第4页 / 共34页
基于单总线的实时温度监控系统.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

基于单总线的实时温度监控系统.docx

《基于单总线的实时温度监控系统.docx》由会员分享,可在线阅读,更多相关《基于单总线的实时温度监控系统.docx(34页珍藏版)》请在冰豆网上搜索。

基于单总线的实时温度监控系统.docx

基于单总线的实时温度监控系统

基于单总线的实时温度监控系统

2硬件电路设计

在硬件电路设计时,应着重考虑电子器件的供电方式,以及对器件的限压和限流保护。

因为本次设计要求利用单总线技术,所以可以考虑使用寄生供电方式。

设计的电路图如下。

 

图2基于单总线的温度实时监控系统硬件电路总图

2.3软件设计

2.3.1设计窗体

本次设计要求软件的可视化窗体中包含实时温度显示、数据记录、存储管理和ROM数据,并且能将测得的数据保存到指定的数据库中。

窗体界面如下。

图3窗体界面

实时温度显示中可以看到当前室温,并且可以显示摄氏温度和华氏温度。

数据记录包含温度曲线和温度日志,可以显示一天内的温度变化曲线。

存储管理和ROM数据用来对数据库中已经保存的温度数据进行管理,如删除、转移等操作。

2.3.2软件编程

本系统软件部分采用Delphi来实现初始化、数据采集处理、温度报表管理,其主程序的流程图见图4。

 

图4主程序流程图

本系统软件部分共分为3个部分,分别是:

1)初始化程序。

a.设置串行通信波特率;

b.串行通讯方式的初始化;

c.对TO,T1两个计数器的初始化;

d.中断控制程序的初始化。

此外,还负责从E2PROM中调出以前的采样参数,使器件能够以它采样温度数据。

2)当监控到ONTIME1和NTIME2标记时作相应温度的存储、转换、发送处理。

ONTIME1和NTIME2的标记主要有定时电路决定,当到达采样间隔时,做出相应的处理。

3)采用动态显示方式即时显示温度,以节省电路规模,使得整个系统的体积变小。

3元器件的选择

3.1主要元器件知识

3.1.1DS18B20

DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。

以上特点使DS18B20非常适用于远距离多点温度检测系统。

1)DS18B20的内部结构

DS18B20内部结构如图5所示,主要由4部分组成:

64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20的管脚排列如图7-1-2所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端,在寄生电源接线方式时接地,见图6。

 

图5DS18B20的内部结构

 

图6DS18B20的管脚排列

ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。

64位ROM的排的循环冗余校验码(CRC=X8+X5+X4+1)。

ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

DS18B20中的温度传感器完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。

例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。

高低温报警触发器TH和TL、配置寄存器均由一个字节的EEPROM组成,使用一个存储器功能命令可对TH、TL或配置寄存器写入。

其中配置寄存器的格式如下:

0

R1

R0

1

1

1

1

1

MSBLSB

R1、R0决定温度转换的精度位数:

R1R0=“00”,9位精度,最大转换时间为93.75ms;R1R0=“01”,10位精度,最大转换时间为187.5ms;R1R0=“10”,11位精度,最大转换时间为375ms;R1R0=“11”,12位精度,最大转换时间为750ms;未编程时默认为12位精度。

  高速暂存器是一个9字节的存储器。

开始两个字节包含被测温度的数字量信息;第3、4、5字节分别是TH、TL、配置寄存器的临时拷贝,每一次上电复位时被刷新;第6、7、8字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。

2)DS18B20的工作时序

DS18B20的一线工作协议流程是:

初始化→ROM操作指令→存储器操作指令→数据传输。

其工作时序包括初始化时序、写时序和读时序,如图7(a)(b)(c)所示。

 

 

(a)初始化时序

 

 

(b)写时序

 

(c)读时序

图7DS18B20的工作时序图

3)DS18B20与微处理器的连接

DS18B20与微处理器的连接如下图8所示。

(a)寄生电源工作方式

(b)外接电源工作方式

图8DS18B20与微处理器的典型连接图

3.1.2DS2480B

1)DS2480B主要特性

串口UART/RS232至单总线通信协议的转接桥,可直接连到UART和5VRS232系统中,支持Dallas全系列单总线器件,如数字温度传感器DS18B20、A/D转换器DS2450等;

将主机从单总线时序控制中解脱出来,提供规范的、灵活的和强驱动的单总线定时;

支持标准UART通信,支持9.6(默认)、19.2、57.6和115.2kbps速率;

具有较强的总线驱动能力,通信距离可达300m;

可编程下拉摆率控制和有源上拉,工作范围5V,-40~+85℃,8引脚SOIC封装。

2)管脚图及引脚说明

 

图9DS2480B的封装和引脚

DS2480B为8脚贴片式封装,如图9所示。

引脚功能如表1所列

引脚号

引脚名称

引脚功能

1

GND

地线

2

1-W

单总线输入输出端

3

NC

悬空

4

VDD

4.5~5.5V电压

5

VPP

EPROM编程电压

6

POL

RXD/TXD选择端

7

TXD

发送端

8

RXD

接收端

表1引脚功能说明

 

DS2480B工作原理框图如图10所示。

图10DS2480B工作原理框图

3)DS2480B与RS232的接口技术:

DS2480B与RS232的接口如图11所示。

 

图11DS2480B与RS232的接口图

3.2元件清单

序号

元件

个数

1

PC机串行口UART/RS232

1个

2

转接桥DS2480B

1个

3

数字温度传感器DS18B20

1个

4

电容U07HF

1个

5

稳压管

2个

6

二极管M7

2个

7

电路板XF07

1个

 

表2元件清单

4学习心得

通过该温度监控实验,我们可以发现:

基于DS18B20数字温度传感器构成的实时监控系统确实具有精度高、抗干扰能力强、电路简单等诸多优点,温度传感器得到电缆长度达到几十米都可以正常读取温度数据,并且已经在站长开发的机房安全监控系统中得到了实际考验,那可是要365天从不间断地对机房及相关设备提供实时温度监控的哦。

相比之下,传统的温度检测系统采用热敏电阻等温度敏感元件,热敏电阻成本低,但需要后续信号调理、AD转换处理电路才能将温度信号转换成数字信号,不但电路复杂,而且热敏电阻的可靠性相对较差,测量温度的精度差,很难保证热敏电阻的一致性和线性,在应用中需要很好的解决引线误差补偿问题、共模干扰问题和放大电路零点漂移误差等技术问题。

因此,如果你开发的系统对温度监控精度要求不是非常高,而且测温的范围DS18B20的-55~+125℃之间的话,那么采用DS18B20是一个不错的选择,通过软件的插值运算,其实DS18B20的测温精度还可以进一步提高的,具体的实现方法大家可以参考DALLAS公司相关技术资料。

当然,如果你有条件的话,也可以预先对每一个DS18B20进行一次校验,在标准恒温箱中测量并记录下每个传感器的测温误差,在实际应用中,我们就可以根据每个传感器的实际校准对读出的实时温度进行适当的误差纠正,这样也不失为提高DS18B20测温精度的一个好办法。

可惜的是,并非大家都有这种高精度的恒温箱来校验传感器,如果你的参考温度不准确,那么校准将会适得其反。

通过对这个课程设计的学习,为我们掌握单片机实时温度监控的开发、串口通信程序的开发及计算机串口实时控制开发原理及PC监控软件的开发,以及开发其他功能更加完善的单片机综合应用系统打好基础。

5参考文献

[1]DS18B20ProgrammableResolution1-WireDigitalThermometer

[2]DS2480BSerial1-WireLineDriverwithLoadSensor

[3]左冬红,谢瑞和.实现单总线搜索ROM命令的一种算法

[4]求是科技.单片机典型模块设计实例导航

 

附:

源程序清单

{------------------------------------------------------------------------------------------------------

TEMPDL32:

ThisutilityusesTMEXtoviewareadthetemperaturefrom

aDS18B20.Itrequiresthe32-BitWindowsTMEXdrivers

tobepresent.

Compiler:

BorlandDelphi5.0

}

procedureTForm1.FormCreate(Sender:

Tobject;

Var

ztbuf:

array[0..200]ofChar;

Typebuf:

array[0..200]ofChar;

i,k,RetValue:

smallint;

RetStr:

array[0..200]ofChar;

SetupDone:

Boolean;

PortNum,PortType:

smallint;

begin

dieer:

=false;

SetupDone:

=FALSE;{TMSetupnotdoneyet}

Label4.Caption:

='';

{ReaddefaultPortNumberandPortTypefromregistry}

RetValue:

=TMReadDefaultPort(@PortNum,@PortType);

if(RetValue<1)then

TMReadDefaultPort(@PortNum,@PortType)

begin

ShowMessage('Pleasesetportfirst');

Halt;

end

else

begin

{readthetmexversionandtypeversion}

Get_Version(@ztbuf);

Label1.Caption:

=StrPas(ztbuf);

TMGetTypeVersion(PortType,@Typebuf);

Label2.Caption:

=StrPas(Typebuf);

{attemptogetasession}

Done:

=False;

Repeat

SHandle:

=TMExtendedStartSession(PortNum,PortType,NIL);

If(SHandle>0)Then

begin

if(TMSetup(SHandle)=1)then

{ThedevicethatwillbefoundisTemperatureDeviceDS18B20,

soFamilyTypeissetto$28}

FindFirstFamily($28,SHandle)

else

begin

TMEndSession(SHandle);

ShowMessage('FailtosetupMicroLan!

');

Halt;

end;

end

else

begin

if(SHandle<0)then

Begin

ShowMessage('TheDefaultPortTypedoesnothaveadriver!

');

Halt;

end;

end;

{Releasecontrolbacktowindow}

Application.ProcessMessages;

until(Done);

Done:

=False;

Repeat

SHandle:

=TMExtendedStartSession(PortNum,PortType,NIL);

If(SHandle>0)Then

begin

if(TMSetup(SHandle)=1)then

{ThedevicethatwillbefoundisTemperatureDeviceDS18B20,

soFamilyTypeissetto$28}

FindSecondFamily($28,SHandle)

else

begin

TMEndSession(SHandle);

ShowMessage('FailtosetupMicroLan!

');

Halt;

end;

end

else

begin

if(SHandle<0)then

Begin

ShowMessage('TheDefaultPortTypedoesnothaveadriver!

');

Halt;

end;

end;

{Releasecontrolbacktowindow}

Application.ProcessMessages;

until(Done);

label18.Caption:

=keke1;

label19.caption:

=keke2;

table1.Active:

=true;

iftable1.CanModifythen

begin

table1.Append;

table1.Fields[0].AsDateTime:

=now;

table1.Fields[1].AsString:

=floattostr(diwei1);

table1.Fields[2].AsFloat:

=shangxian1;

table1.Fields[3].AsFloat:

=xiaxian1;

table1.Fields[4].AsString:

=floattostr(diwei2);

table1.Fields[5].AsFloat:

=shangxian2;

table1.Fields[6].AsFloat:

=xiaxian2;

table1.Post;

end;

end;

end;

procedureTForm1.FindFirstFamily(family:

smallint;SHandle:

longint);

var

i,flag:

smallint;

romstr:

string;

rom:

array[0..8]ofsmallint;

begin

{Setuptofindthefirstdevicewiththefamily'family'}

if(TMFamilySearchSetup(SHandle,@stateBuf,family)=1)then

begin

if(TMNext(SHandle,@stateBuf)=1)then

begin

{Readtheromnumberbysettingrom[0]to0forreadingandusingTMRom}

rom[0]:

=0;

TMRom(SHandle,@stateBuf,@rom);

{Checkifcorrecttype}

romstr:

='';

if((familyand$7F)=(rom[0]and$7F))then

begin

fori:

=7downto0do

romstr:

=romstr+IntToHex(ROM[i],2);

Label3.caption:

='SerialROMID1:

'+romstr;

ReadTemperature1(SHandle);

end

else

begin

ShowMessage('ThereisnoTemperatureDeviceontheport');

halt;

end;

end

else

begin

TMEndSession(SHandle);

ShowMessage('ThereisnoTemperatureDeviceontheport');

halt;

end;

end

else

begin

TMEndSession(SHandle);

ShowMessage('ThereisnoTemperatureDeviceontheport');

halt;

end;

end;

procedureTForm1.ReadTemperature1(session_handle:

longint);

var

tsht,i,tmp1:

smallint;

cr,cpc,tmpf,tmp:

Extended;

rbuf:

array[0..9]ofsmallint;

st:

longint;

CRCByte,xiaxianbyte:

Byte;

begin

tmp:

=0.00;

{accessthedevice}

if(TMAccess(session_handle,@StateBuf)=1)then

begin

{SendtherecallE2command(bysetting$B8tooutbyteinTMTouchByte)

makesureScratchiscorrect}

TMTouchByte(session_handle,$B8);

{SendthestartTcommand}

if(TMAccess(session_handle,@StateBuf)=1)then

begin

{PreparethestrongpullupafternextTMTouchByte}

TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRONG_PULL_UP,PRIMED_BYTE);

{Sendtheconversioncommand(bysetting$44tooutbyteinTMTouchByte)}

TMTouchByte(session_handle,$44);

{Sleepforasecond}

st:

=GetTickCount+1000;

While(GetTickCount

TMValidSession(Session_handle);

{Disablethestrongpullup}

TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);

{verifyconversioniscompletebysetting$01tooutbitinTMTouchBitand

checkthereturnvaluewith1}

if(TMTouchBit(session_handle,$01)=$01)then

begin

{Accessdevice}

If(TMAccess(session_handle,@StateBuf)=1)then

begin

{Sendreadscratchcommandbysetting$BEtooutbyteinTMTouchByte}

TMTouchByte(session_handle,$BE);

CRC8:

=0;

{Readscratch(setting$FFtooutbyteinTMTouchByte)andcheckcrcfor

eachbyte}

fori:

=0to7do

begin

rbuf[i]:

=TMTouchByte(session_handle,$FF);

CRCByte:

=Byte(rbuf[i]);{thebytetorunthroughCRC8routine}

CRC8:

=TMCRC(1,@CRCByte,CRC8,0);

end;

{Checkcrc}

CRCByte:

=Byte(TMTouchByte(session_handle,$FF));{thebytetorunthroughCRC8routine}

CRC8:

=TMCRC(1,@CRCByte,CRC8,0);

if(CRC8=0)then

begin

{Calculatethetemperarure

tsht:

=rbuf[0];

if((rbuf[1]and$01)=1)then

tsht:

=tshtor(-256);

tmp1:

=Round((tsht)/2);

tmp:

=tmp1;

cr:

=rbuf[6];

cpc:

=rbuf[7];

if(rbuf[7]<>0)then

tmp:

=tmp-(0.25)+(cpc-cr)/cpc;}

if((rbuf[1]and$F8)=$F8)then

BEGIN

END

ELSE

BEGIN

case(rbuf[4]and$60)of

$00:

begin

fenbianlv1:

=9;

tmp:

=(rbuf[1]and$07)*16+(rbuf[0]and$f8)/16;

diwei1:

=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1