完整word版基于单总线的温度实时监控系统YST.docx
《完整word版基于单总线的温度实时监控系统YST.docx》由会员分享,可在线阅读,更多相关《完整word版基于单总线的温度实时监控系统YST.docx(17页珍藏版)》请在冰点文库上搜索。
完整word版基于单总线的温度实时监控系统YST
基于单总线的实时温度监控系统
1引言
基于数字温度传感器构成的实时监控系统确实具有精度高、抗干扰能力强、电路简单等诸多优点,温度传感器得到电缆长度达到几十米都可以正常读取温度数据,并且已经在站长开发的机房安全监控系统中得到了实际考验,那可是要365天从不间断地对机房及相关设备提供实时温度监控。
1.1流程图
本系统软件部分采用Delphi来实现初始化、数据采集处理、温度报表管理,其主程序的流程图见图1。
图1主程序流程图
本系统软件部分共分为3个部分,分别是:
1)初始化程序。
a.设置串行通信波特率;
b.串行通讯方式的初始化;
c.对TO,T1两个计数器的初始化;
d.中断控制程序的初始化。
此外,还负责从E2PROM中调出以前的采样参数,使器件能够以它采样温度数据。
2)当监控到ONTIME1和NTIME2标记时作相应温度的存储、转换、发送处理。
ONTIME1和NTIME2的标记主要有定时电路决定,当到达采样间隔时,做出相应的处理。
3)采用动态显示方式即时显示温度,以节省电路规模,使得整个系统的体积变小。
2硬件电路设计
在硬件电路设计时,应着重考虑电子器件的供电方式,以及对器件的限压和限流保护。
因为本次设计要求利用单总线技术,所以可以考虑使用寄生供电方式。
设计的电路图如下。
图2基于单总线的温度实时监控系统硬件电路总图
2.1软件设计
2.1.1设计窗体
本次设计要求软件的可视化窗体中包含实时温度显示、数据记录、存储管理和ROM数据,并且能将测得的数据保存到指定的数据库中。
窗体界面如下。
(a)温度计
(b)存储管理
(c)数据记录
(d)存储管理
(e)ROM数据
图3窗体界面
实时温度显示中可以看到当前室温,并且可以显示摄氏温度和华氏温度。
数据记录包含温度曲线和温度日志,可以显示一天内的温度变化曲线。
存储管理和ROM数据用来对数据库中已经保存的温度数据进行管理,如删除、转移等操作。
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所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端,在寄生电源接线方式时接地,见图5。
图4DS18B20的内部结构
图5DS18B20的管脚排列
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操作指令→存储器操作指令→数据传输。
其工作时序包括初始化时序、写时序和读时序,如图6(a)(b)(c)所示。
(a)初始化时序
(b)写时序
(c)读时序
图6DS18B20的工作时序图
3)DS18B20与微处理器的连接
DS18B20与微处理器的连接如下图7所示。
(a)寄生电源工作方式
(b)外接电源工作方式
图7DS18B20与微处理器的典型连接图
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)管脚图及引脚说明
图8DS2480B的封装和引脚
DS2480B为8脚贴片式封装,如图8所示。
引脚功能如表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工作原理框图如图9所示。
图9DS2480B工作原理框图
3)DS2480B与RS232的接口技术:
DS2480B与RS232的接口如图10所示。
图10DS2480B与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学习心得
实训结束了,说长也不长,说短也不短,但是的确难熬。
因为每天对着一台电脑,机械着制作、调试。
测试成功激动万分,可万一出现一些小问题,那这是像热锅上的蚂蚁,到处乱窜,找老师找同学来帮忙解决,虽然实训过程有些苦,中午都是在机房度过,也没好好吃过一顿好午餐,但是收获还是颇丰。
每一门专业的学习都需要理论结合实践,只是有时候学校的教学条件受到限制。
但是没关系,对于每一次的实训我们都很珍惜,因为每一次我们都有很多的感受,因为这不仅仅是一次实训,也是对于我们各方面能力的培养,也能证明我们自己的实力。
这次实训给我的最大的启发就是学习需要灵活应变,学以致用,更要动脑子去思考问题。
因为,对于我个人而言,有些程序的代码我还是看得懂的,但是我没有联系到实际。
如果我在实训当中能认真的去思考一些问题,并把操作好好调试几遍,我想问题也就会减少很多。
也就是说,知识需活学活用,勤学善思,当然,在以后的生活中、学习中也是如此。
5参考文献
[1]DS18B20ProgrammableResolution1-WireDigitalThermometer
[2]DS2480BSerial1-WireLineDriverwithLoadSensor
[3]左冬红,谢瑞和.实现单总线搜索ROM命令的一种算法
[4]求是科技.单片机典型模块设计实例导航
附:
源程序清单
{------------------------------------------------------------------------------------------------------
procedureTForm1.ReadTemperature2(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(GetTickCountTMValidSession(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
tmp:
=(rbuf[1]and$07)*16+(rbuf[0]and$f8)/16;//9位分辨率
fenbianlv2:
=9;
diwei2:
=(rbuf[0]and$f8)/16;
end;
$20:
begin
fenbianlv2:
=10;
tmp:
=(rbuf[1]and$07)*16+(rbuf[0]and$fc)/16;//10位分辨率
diwei2:
=(rbuf[0]and$fc)/16;
end;
$40:
begin
fenbianlv2:
=11;
tmp:
=(rbuf[1]and$07)*16+(rbuf[0]and$fe)/16;//11位分辨率
diwei2:
=(rbuf[0]and$fe)/16;
end;
$60:
begin
fenbianlv2:
=12;
tmp:
=(rbuf[1]and$07)*16+rbuf[0]/16;//12位分辨率
diwei2:
=rbuf[0]/16;
end;
end;
END;
tmpf:
=(tmp*9)/5+32;
label11.caption:
='当前实时温度2:
'+FormatFloat('0.0000',tmp)+
'Cor'+FormatFloat('0.0000',tmpf)+'F';
keke2:
=FormatFloat('0.0000',tmp);
yuanshi2:
=rbuf[4];
shangxian2:
=rbuf[2]and$7f;
xiaxianbyte:
=rbuf[3]and$80;
ifxiaxianbyte=1then
xiaxian2:
=(rbuf[3]and$7f)*(-1)
else
xiaxian2:
=rbuf[3]and$7f;
MessageBeep(0);
TMEndSession(session_handle);
Done:
=True;
end;
end;
end;
end;
end;
end;