储油罐实时监测系统的设计与实现 - 图文

更新时间:2024-05-02 12:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

长 治 学 院

2012届学士学位毕业论文

储油罐实时监测系统的设计与实现

学 号: 08405433 姓 名: 张国雁 指导教师: 张 毅 专 业:电子信息科学与技术 系 别: 电子信息与物理系

完成时间:2012年5月

长治学院学士学位论文

储油罐实时监测系统的设计与实现

专业: 电子信息科学与技术 姓名:张国雁 学号: 08405433

指导教师: 张毅

摘要:我国石油资源丰富,采油炼油企业众多,储油罐是储存油品的重要设备,储油罐液位的精确计量

对生产厂库存管理及经济运行影响很大。但国内许多反应罐、大型储油罐、加油站的液位计量仍采用人工检尺和分析化验的方法,其他参数的测定也没有实行实时动态测量,这样易引发安全事故,无法为生产操作和管理决策提供准确的依据。

本系统针对上述问题,采用相应的传感器采集储油罐内的温度和压力,并通过单片机将储油量、温度值显示出来;同时利用串口将各项数据发送给上位机,从而进行更精确的计算与统计。

关键词 :储油罐、液位监测、QT、ARM、嵌入式

长治学院学士学位论文

目录

1 系统概述 ................................................................................................................................ 1 1.1 题目分析 ............................................................................................................................. 1

1.1.1 选题意义 ................................................................................................................... 1 1.1.2 需求分析 ................................................................................................................... 1 1.2 功能分析 ............................................................................................................................. 1 2 方案论证 .............................................................................................................................. 3 2.1硬件方案 .............................................................................................................................. 3

2.1.1、硬件方案1 .............................................................................................................. 3 2.1.2、硬件方案2 .............................................................................................................. 3 2.1.3、两种硬件方案论证 ................................................................................................. 3 2. 2 软件方案 ............................................................................................................................ 3

2.2.1、软件开发工具论证 ................................................................................................. 4 2.2.2、方案比较 ................................................................................................................. 4 3 系统设计之下位机部分 ........................................................................................................ 6

3.1.液面测量模块: ........................................................................................................... 6 3.2.温度检测模块 ............................................................................................................. 12 3.3 串口数据发送模块 .................................................................................................... 14 3.4 显示模块 .................................................................................................................... 16 4 系统设计之上位机部分 ...................................................................................................... 18

4.1 PC端软件 ................................................................................................................... 18 4.2 ARM嵌入式设备端软件 ........................................................................................... 21 5 系统调试 .............................................................................................................................. 23

5.1 调试计划 .................................................................................................................... 23 5.2 程序运行中的错误 .................................................................................................... 23 5.3 调试结果 .................................................................................................................... 23 6 总结分析 .............................................................................................................................. 28 附录 .......................................................................................................................................... 31

长治学院学士学位论文

1 系统概述

1.1 题目分析

1.1.1 选题意义

随着科技的发展,特别是计算机技术的广泛应用和迅猛发展,由传统的人工测量开始逐步向计算机智能监测方向发展。相比较而言,国外的油罐区安全监测系统性能好,但其价格过高,远远超出了我国广大用户的承受能力。而国内研制的系统大多计算精度低、稳定性和可靠性差。因此,研发出符合我国国情的油罐区安全监测系统,不仅可以保障石油库区的安全生产,而且将加快石油行业的现代化管理进程。

针对油库储油罐地理位置分布广,信号传送距离远的特点,采用“功能分散、负荷分散、危险分散、管理集中”的分布式控制系统设计思想,“硬件模块化、软件组合化、通信网络化”的设计方法。

1.1.2 需求分析

在设计储油罐管理系统时,首先确定系统设计目标和功能要求,从技术和经济角度上进行可行性分析,然后进行方案选择和总体设计,考虑下位机硬件电路的结构是否合理,性价比等问题,探讨上位机的功能框架,采用的数据结构等细节,再进行详细设计和调试,最终完成设计任务。在设计初期,主要考虑了以下因素:

(1)可靠性。系统运行安全可靠,性能稳定,可以在恶劣环境长期连续工作。 (2)通用性。在设计时,应充分考虑其应用对象的共性,使系统具有较强的通用性,可以在油库推广应用。

(3)兼容性。系统应能携挂不同类型的传感器,能够测量多种参数。 (4)经济性。系统的造价经济合理,性能价格比高。

(5)操作维护方便性。在软件方面,要求人机界面友好,操作简便;在硬件方面,要求维护检修方便。

1.2 功能分析

根据对储油罐液位监测及计量管理任务的深入分析,系统应实现以下几大功能:

1

长治学院学士学位论文

1. 系统参数的设定与修改

储油罐区参数设定和修改:储油罐数量、标号设定、通讯参数设置,储油罐分区管理定义等。

储油罐参数设定与修改:储油罐的安全高度、液位的高低报警值等设定和修改。 2. 储油罐实时监测与计量

储油罐状态实时监测:储油罐液位等参数的实时监测。

储油罐实时计量:依据压力值,计算出液位的高度和剩余百分比。 3. 可视信息服务

显示系统总貌及构成、各个油罐的温度,液位,压力数据。

2

长治学院学士学位论文

2 方案论证

2.1硬件方案

2.1.1 硬件方案1

硬件方案1的系统主要由现场仪表和储油罐实时监测与计量的管理主机或服务器等组。系统主机和现场仪表之间通过RS-485总线连接,储油罐实时监测和采集液位的核心是两个压力传感器。

整个系统的工作流程大致如下:压力传感器从储油罐终端采集到数据,经单片机处理(A/D转换)后显示到现场端的数码管上,同时通过串口传输给上位机,实现远端监测,连入计算机,计算机显示并保存上传的液位数据,并可以通过管理软件对数据来进行后续处理。

2.1.2 硬件方案2

硬件方案2是光用单片机设计一个液位监控系统。其硬件的组成是:单片机,A/D转换部分,液位显示部分,将采集到的数据经过单片机处理,显示到数码管上,管理人员可以定时查看各个储油罐的信息。

2.1.3 两种硬件方案论证

结合两种硬件方案,采用的硬件结构有所不同,方案2用单片机作为硬件系统,显然电路复杂,可靠性较低,而且无法向上位机发送数据,实现远端监测。再者系统调试比较困难,无形中延长了开发周期,而且系统的稳定性不高。

本设计最终选择方案1,因为它相对于方案2来说,系统结构较为简单,结构高度模块化,低功耗电路设计,全数字总线接口,通信协议开放,网络扩展能力强,抗干扰能力强,所利用的液位测量技术成熟,可靠性高。

2. 2 软件方案

使用储油罐计量监测管理系统,能够实时采集和处理储油罐中所储油品的各项数据,通过软件显示并打印油品的储量、温度及相关的各项数据,使管理人员了解各个油

3

长治学院学士学位论文

罐的情况。

通过对储油罐实时监测与计量管理设计目标的论证,确定上位机主要实现以下功能:

(1)系统参数的修改 (2)储油罐实时监测与计量

2.2.1 软件开发工具论证 i. 下位机端:

方案一:使用汇编语言为单片机编写程序。特点是执行效率高。

方案二:使用keil软件,用C语言为单片机编写程序。特点是易读性强,可维护性高,开发简单,代码量低。

ii. 上位机端:

方案一: 使用Delphi作为开发工具,Delphi是著名的Borland公司开发的可视化软件开发工具。Delphi的优点是:不能隐式定义、结构严格、方便快捷、运行速度快、使用方便、可读性高等。缺点是结构过于严谨,对编程水平要求颇高。

方案二: 使用Qt设计计量管理系统。

优点是Qt提供了强大的可视化编程能力。编程语言是C++,是面向对象的语言,功能强大。Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件之间的协同工作变得十分简单。

2.2.2 方案比较 i. 下位机端:

显然,用C语言开发下位机程序有可读性强、易于编程、代码量低的优点,而且可以降低开发难度与开发周期。

4

长治学院学士学位论文

ii.上位机端:

Qt是面向对象语言,易于扩展,允许组件编程,对日后软件的维护,功能的扩充提供了极大的方便,而且是一款完全开源免费的软件。所以我们选用Qt作为本系统的上位机开发软件。

5

长治学院学士学位论文

3 系统设计之下位机部分

3.1 液面测量模块

液面测量模块功能是测量液位的高度,并计算出液位高度比。大致的实现方法是由两个压力传感器获取到两个压力模拟量,经A/D转换后以I2C数据形式发送到单片机中,单片机经过一定的算数运算后得到当前液位与满载液位的高度比。其中涉及到的内容有I2C总线驱动,A/D转换,数学建模等内容。具体实现方法在下文中分模块详细介绍。

(1) 数学模型部分

利用压差法计算储油罐液面高度,可以消除密度对计算的影响。如图3.1所示,其中P1,P2是底端和上端的压力值。成品油是一种混合物,各种规格的成品油密度不一致。甚至同厂生产的不同批次的成品油密度差别也很大,所以利用压差法不必事先去测定各种油的密度。这样适应性就更广阔。无论是常压容器还是受压容器,只要被测量的溶液为均匀液体即容器中液体处处密度相等,均可采差压法来测量液位。压差法的计算的思路是:

压差比 = 液面高度比

图3.1 储油罐数学模型

两个传感器之间的相对高度h0是事先设定且固定的,也就是说底端的压力值P1减去上端的压力值P2,就是这段液位的压差。

6

长治学院学士学位论文

同理,底端压力值P1减去顶端的压力值,就是当前液位h(顶端与底端)的压差。由液体压力计算公式P=ρgH 可知,液体在某一位置的压力与深度H有关.液面最顶端的深度是0,故液面最顶端的压力值也是0。由此可以推出当前液位的压力差也就是底端的压力值。

P1?ρgh

(1)

P2?ρg(h-h0) (2)

联立(1),(2)式,可以消除ρ,g.并可以得到当前液位h的计算公式:

h?P1P1-P2h0

(3)

压力不是基准量,而是力和面积的导出量,故测量压力的方法很多,在本系统中我们要测量液体的压力,所以选择液体式压力计。液体式压力计又可以分为U型管压力计、单管压力计、倾斜微压计和自动液柱压力计等,不管采用哪种压力传感器,在测量压力时两个传感器必须要用相同规格的,这样测量的的数据在计算时才有意义。

无论是常压储油罐还是受压储油罐,底部是承压最大的区域,监测储油罐的压力值时,就应该以底部作为监测部位。将底端压力值P1经过物理量化就可以得到这个值。

需要说的一点,P1 和P2是两个模拟压力量,经8位的A/D转化器转换后得到的数字值。8位A/D转换器的数值取值空间是0 ~ 255,也就是说它只能将一个模拟量分割成256份,这个量化数值对于高达几十米的大型储油罐无法做到精确的统计,这就需要提升A/D转换器的精确度,比如用16位的转换器,但原理都是一致的。在本系统中就采用的是8位的转换器。

根据式(3)计算当前液位高度h时,用到的压力值都是比值关系,所以无须计算出确切的物理压力量来。两传感器之间的距离h0我们设置1000mm,这个值的大小可以根据两个传感器的实际距离,在程序中手动更改。这样就可以轻松的计算出当前液位高度h了。再将当前液位高度除以储油罐满载时的高度hmax,就可以得到当前储油量与满载时的百分比。

我们就将两个压力值利用串口发送给上位机,让PC或32位的ARM嵌入式设备去计算,将结果输出到软件界面的相应位置。

但是在下位机端,单片机计算乘除运算比较吃力,而且精确度相当差。所以上述的

7

长治学院学士学位论文

数学模型并不适应于下位机端。在下位机端需要建立另一套数学模型,将底端压力乘某个常量,得到一个大概的液位高度值,显示到下位机的数码管上。

(2).A/D转换部分

本系统要对两个模拟压力量进行监测,如果使用传统的8位并行A/D转换器件,光数据口就会占据16个I/O口,对于一个只有4组8位I/O口的单片机来说,这种硬件上的开销实在比较大。所以我在设计过程中选择了同样能实现两路模拟量检测,且对硬件资源开销极小的PCF8591。

PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。

要用PCF8591监测两个压力模拟量,首先得确定PCF8591在I2C总线上的地址,其次要确定控制字节。

PCF8591采用典型的I2C总线接口寻址方法,即总线地址由器件地址、引脚地址和方向位共同组成。飞利浦公司规定A/D器件地址为1001,引脚A2 A1 A0由用户硬件编程,在本系统中这三个引脚全部接地,也就是个说A2 A1 A0分别为0 0 0。所以在I2C系统中最多可以接23=8个A/D器件。总线地址的最后一位为方向位,当主控器件对A/D器件进行读操作时为1,进行写操作时为0。

总线操作时,由器件地址、引脚地址、方向位组成的从地址为主控器发送的一个字节。这时总线上的I2C设备会根据自己的地址来判断主控器是否在“呼叫”自己。若收到的地址和自己的地址和自己的地址相匹配,就要做好接收数据的准备了。

主控器发送的第二个字节是控制字节,控制字节用于控制器件实现各种功能,如模拟信号由哪几个通道输入等。控制字节存放于控制寄存器中的格式如图3.2所示:

8

长治学院学士学位论文

图3.2 控制寄存器格式

其中:D0 D1两位是A/D通道编号:00通道0, 01通道1, 10通道2,11通道3;在本系统中利用A/D通道0和A/D通道1。

D2 是自动增益位,有效值是1。当这一位置位时,A/D通道0转换完成后,芯片自动会去转换A/D通道1的值,依次循环类推。

D3 是保留位。

D4 D5 是模拟量输入选择:00四路单独输入,01三路差分输入,10为单端与差分配合输入,11为模拟输出允许有效。我们在这里选择单独输入。

D6 是A/D D/A选择位,A/D转换时选择0,D/A转换是选择1 。 D7 也是保留位.

由此可知,当单片机要监测某一个压力值时,它的工作流程如下:

(1)单片机向I2C上发出一个8位的设备地址,这时的D0位(读写位)为0,通知被控器件将要向其执行写操作,并等待应答;

(2)收到应答后,发送控制字节,写入被控器件的控制寄存器,等待应答; (3)收到应答后,再发送一个8位的设备地址,这时的D0(读写位)为1,通知被控器件将要读取它发送的数据,等待应答;

(4)收到应答后,把总线的控制权交给被控器件,读取它发送到总线上的数据。 将这个过程结合到本系统中,PCF8591的器件地址为1001,引脚地址为000,写操作时方向位为0,即0x90,读操作时方向位为1,即0x91。读取通道0时,控制字节为0000 0000,读取通道1时,控制字节为0000 0001。操作的C程序代码:

ISendByte(0x90,0x00); //ISendByte是数据发送函数

p1=IRcvByte(0x91); //AD0 模数转换0,将值赋给p1

这个函数的作用是发送器件地址0x90和控制字0x00(A/D通道0)读取A/D通道0的值 ,具体的实现过程参照附录中的源代码部分。

9

长治学院学士学位论文

到此,我们就顺利的读取到了想要的压力值,但我们不免会有疑问:数据究竟是如何在总线上传输的?这个问题将在下一个小节:I2C总线驱动部分中介绍到。 (3) I2C总线驱动部分

I2C总线设备是飞利浦公司推出的串行总线设备,它与传统的并行总线设备相比较,具有结构简单、可维护性好,易于实现扩展、易于模块化标准设计,可靠性高等优点。但是STC89C516RD+单片机内部没有集成I2C总线设备模块,所以外围的I2C总线设备要实现与单片机的通信时,必须要用软件程序模拟出一个I2C总线设备的时序电路.这无疑增大了系统的开销,也增大了开发难度。可是用I2C总线传输数据只需占用主控器件的两个引脚,就能传输8个外围器件的数据,相当节省硬件资源.所以综合利弊,本系统采用I2C总线设备来传输压力值数据.

它的工作原理如下:

I2C总线设备由一条数据总线SDA和一条时钟总线SCL与中控器件相连,I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,且高电平状态维持一定的时间(一般为5微秒)以后,数据线上的高电平或低电平状态才允许变化(如图3.3)。

如图3.3 时钟与数据变化规律

SCL线为高电平期间,SDA线由高电平向低电平的变化(下降沿)表示起始信号,SCL线为高电平期间,SDA线由低电平向高电平的变化(上升沿)表示终止信号(如图3.4)。

10

长治学院学士学位论文

如图3.4 起始信号与终止信号

在传送数据时,要求每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据,如图3.5。

图3.5 应答与非应答信号

所有I2C总线设备的驱动方法都是一致的,它只是提供传输数据的一种机制,也就是说驱动程序只提供用两条数据线实现通信的一种方法。这种方法的实现步骤在互联网和相关书籍中有大量详细的介绍,在此不做更详细的说明,具体的实现方法也可以参考附录的程序代码部分。

在本系统中我们更为关心的是用I2C总线来传递什么数据,这些数据有什么意义,这就是一种操作I2C总线的策略,它与机制完全不相同,可由用户自己来设定,从而让I2C总线上的不同设备实现不同的功能。在本系统中,这种策略体现在对A/D转换芯片PCF8591 的操作上,详细内容在上文中介绍到了。

11

长治学院学士学位论文

3.2 温度检测模块

对储油罐温度的监测是靠温度传感器DS18B20来完成的,DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线上可以挂很多这样的数字温度计,十分方便。

DS18B20温度差传感器是一个数字传感器,这就省去了A/D转换的麻烦,在硬件电路上只有一根数据线,占用硬件资源很少,硬件上的节约同样需要软件来补偿,这就注定了操作DS18B20的繁琐性。

通常情况下我们采用的是TO-92封装的DS18B20,如图3.6。

图3.6 DS18B20封装

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对51单片机来说,跟I2C总线设备一样,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序,如图3.7-3.9所示。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

图3.7 DS18B20的复位时序

12

长治学院学士学位论文

图3.8 DS18B20的读时序

DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15us之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

图3.9 DS18B20的写时序

DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

在本系统中,DS18B20的2引脚DQ与主控器STC90C516RD+ 的P2^3引脚相连,这条I/O线上只挂载了一个DS18B20,所以在操作时不必去理会DS18B20的ROM编码,在单器件的情况下,为了节省时间则可以选择跳跃ROM指令(#define jump_ROM

13

长治学院学士学位论文

0xCC),即向DS18B20写入指令:0xCC。如过多芯片挂载使用此指令将会出现数据冲突,出现错误。

对DS18B20的整体操作如下: 1.复位;

2.写跳跃ROM指令:0xcc; 3.写温度转换指令:0x44; 4.复位;

5.写跳跃ROM指令:0xcc; 6.写数据读取指令:0xbe; 7.读取温度值的低八位; 8.读取温度值的高八位;

最后将读到的温度数据以十进制的表示方法返回给主调函数。

3.3 串口数据发送模块

串口数据发送模块的主要功能是将温度,压力等数据用串口发送给上位机,实现对储油罐的远端检测功能。在本系统中采用的串口数据通信芯片是MAX485。PC机一般接收的RS232电平,不识别RS485的电平信号,所以在接收端需要将RS485电平转换为RS232电平。

利用MAX485的主要原因是它的有效传输距离能达到1500m,而普通RS-232电平信号的有效距离最多也超不过20m。在一个大型的炼油厂,储油罐与上位机的距离不可能在20m之内,RS232电平无法满足长距离传输数据的功能。

操作单片机发送串口数据时,要利用定时器来设置波特率。主要的操作步骤: 选择好工作方式,设置好串口的相应的寄存器,设置好定时器的寄存器,将要发送的数据放入串口缓存区。

串口发送的数据顺序是:

0x00,0xff,油罐编号,温度,底端压力,上端压力;

其中0x00,和0xff是数据校验标志,当上位机收到一个数组后,先判断第一位是0x00,且第二位是0xff后,就知道从第三位开始就是编号,温度,压力这些有效数据了,因为事先知道数据长度,就不用结束标志位了。

14

长治学院学士学位论文

向上位机发送的数据是源源不断的发送上去,每秒钟能发好几次,上位机再选择性的接收数据并做出相应的处理。在windows下使用串口调试工具,收到的数据如图3.10所示。

图3.10 串口调试工具

用串口调试工具查看串口数据时,这些数据是以十六进制显示的,而且是一连串的数据,不知道它们代表的是什么意思。用一定的方法将这些数据解析完毕后,我们就可以很清楚的理解他们的意思了,在linux平台的终端中,显示解析后的数据如图3.11:

图3.11 linux平台的终端数据

15

长治学院学士学位论文

3.4 显示模块

显示模块的功能是:将各传感器检测到的值经其他相应功能模块处理之后,以数值的形式显示在数码管上。相对而言,显示模块在本系统中是一个比较简单的模块,硬件上由一个八位的八段数码管、一个3-8译码器(74H138)和一个锁存器(74H373)构成,如图3.12所示。

256912151619Q0Q1Q2Q3Q4Q5Q6Q7U274LS373OELE1X1C215141312111097Y0Y1Y2Y3Y4Y5Y6Y7123645E1E2E3ABC1nFD0D1D2D3D4D5D6D7U374HC138347813141718CRYSTALP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A123938373635343332212223242526111R1240k 图3.12 显示电路 锁存器的输入端接单片机的P0口,将P0输出的电平保存起来,防止其跳变。输出端接数码显示管的段选信号。 3-8译码器输入端接单片机P2.1 P2.1 P2.2三端,8个输出端分别接8位数码管上的位选信号。位选的电平逻辑可参考3-8译码器的真值表,在此不再赘述。 特别强调的是,在操作单片机给P2.1 P2.1 P2.2三端赋值时,应只给这三个端口赋值,尽量不要采用“P2 = XXX”的形式。这样虽然可以改变这三个端口的值,达到操作3-8译码器的效果,但同时也改变了P2口其他五个端口的值,这就意味着对显示模块的操作可能会导致其他与P2口相连模块的功能产生错误。

可以这样赋值:

P2^0 = X;

16

长治学院学士学位论文

P2^1= X; P2^2= X;

但这种赋值方式在这三个端口值不断变化的情况下,较为繁琐,所以利用C语言按位与,按位或,左右位移等方法较为简便,例如:

P2 &= 0xf8; /*给P2口赋位选值前,先将p2与(1111 1000)

逻辑与,将P2^0,P2^1,P2^2清零,从而不影 响其他位原来的电平*/

/*将位选信号放进P2口的低三位,只改 变P2口低三位的值,不影响其他位*/

P2 |= weitable[w];

显示模块的程序代码中对外提供一个接口:display(d , w)函数。其中d是段选参数,作用是显示什么数字;w是位选信号,作用是在那一位上显示。调用起来相当方便。

显示的方法是动态扫描显示,即每次只能在数码管的某一位上显示一个数字,显示完当前数字之后立即显示下一位数字,当中间间隔小于20m时,由于人体视觉有一定的滞留时间,所以无法察觉闪烁感,视觉效果与多位同时显示一致。

17

长治学院学士学位论文

4 系统设计之上位机部分

上位机可以是x86平台的计算机,也可以是32位ARM嵌入式设备。一般对几十个储油罐进行监测,系统的资源消耗不会很大,也可以说是轻而易举一件事儿。通的PC功耗一般都超过150W,对储油罐的监测是永不间断的,这种电能的消耗累计起来将是一个很大的量,粗略计算一下每天会消耗电能3千瓦时,一年下来就是一千多千瓦时。但是用嵌入式设备制作一个专门针对储油罐的监测系统,功耗一般不会超过10W,同样能完成PC所能实现的监测功能,但功耗比PC低的多。以下将简单对这两种方式做一简要的说明。

4.1 PC端软件

软件运行平台:Linux 2.6 for x86 32位 软件开发平台:Red Hat Enterprise Linux 5

Qt 4.3 for linux

上位机PC端软件是在linux操作系统下编译开发的,也是要运行在linux 32位平台上。开发软件是Qt4.3,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架,2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言工具,我们熟知的塞班操作系统的图形界面就是用Qt写的。因为Qt是跨平台程序开发软件,所以将源代码做极小量的修改,就可以在Windows平台下运行了。

选择linux操作系统的原因是它很稳定,而且是免费的,绝大多数大型IT公司的服务器都采用的是linux操作系统,甚至就连微软也采用了大量的linux系统的服务器。作为工业监测的设备,稳定性是相当重要的,通常情况下linux操作系统开机一年都不会出现任何问题,完全能满足连续监测的任务。

整个图形化界面的源代码由以下文件组成见图4.1。

18

长治学院学士学位论文

图4.1 文件组织

其中images目录内是软件内的一些图片,posix_qexteserialoprt.ccp;

posix_qexteserialoprt.h;qextserialbase.cpp; extserialbase.cpp这四个文件是第三方为Qt封装的一个串口通讯的类,widget.cpp; widget.h两个文件是我自己写的数据处理和图像化界面文件。

对串口的设置代码如下: myCom = new

Posix_QextSerialPort(\ myCom ->open(QIODevice::ReadWrite); myCom->setBaudRate(BAUD9600); myCom->setDataBits(DATA_8); myCom->setParity(PAR_NONE); myCom->setStopBits(STOP_1); myCom->setFlowControl(FLOW_OFF); myCom->setTimeout(10); readTimer = new QTimer(this); readTimer->start(1000);

connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom())); }

19

长治学院学士学位论文

这种接收方式相当于单片机的串口工作方式2,就实现了上位机与下位机的串口通讯。软件开启界面与软件界面如图4.2和4.3所示:

图4.2 软件开启界面

图4.3 操作界面

20

长治学院学士学位论文

这是一个简单的监测界面,出于实验和整体界面布局美观的考虑,暂时只设计了对四个储油罐监测的位置,若用于工业监测时,在程序中很容易增加几十个监测位置。由于本人能力有限,暂时不能对该软件做出太多的功能。但是Qt是一个很强大的东西,可以建立一个数据库,对储油量,温度,压力进行各种统计,可以绘制曲线图,制作统计报表,也可以建立监测日志等,这些功能都可以实现。

4.2 ARM嵌入式设备端软件

软件运行平台:Linux 2.6 for ARM 32位 软件开发平台:Red Hat Enterprise Linux 5

arm-linux-gcc Qt 4.3 for linux

其实无论是PC上还是嵌入式设备上,源代码都是一致的,只不过编译的软件不一样。在PC上用的是gcc编译软件,在嵌入式设备上是arm-linux-gcc编译软件,生成的是可在ARM平台上运行的二进制可执行文件,其他没有什么太大的区别。

将源代码用arm-linux-gcc编译,生成的可执行文件移植到ARM平台设备上,效果如图4.4:

图4.4操作界面

21

长治学院学士学位论文

将下位机用串口和这块开发板相连,它也能实现对储油罐的监测,上图中的这块开发板的CPU是三星公司的S3C2440, 主频为400MHz,RAM为64M, ROM为256M,屏幕只有3.5寸。除了显示器很勉强外,其他的配置均能满足系统需求,如果要用于工业中,可利用有VGA接口的设备,如miniS3C2440 for VGA,连接上普通显示器后,分辨率可以达到1024*768,与普通PC完全一致。

如果上位机除了监测储油罐外不做其他工作,完全可以用ARM嵌入式设备,无论是从环保,还是从经济的角度考虑都是最佳的选择。

22

长治学院学士学位论文

5 系统调试

5.1 调试计划

1.审查设计方案,检查是否有涉及方向的错误。 2.运行Qt的调试功能,检查是否有语法错误。

3.选择合理的或不合理的输入条件,检查是否有逻辑错误。

5.2 程序运行中的错误

在设计好程序代码后,就要进行错误处理与调试。在QT软件开发中,错误信息的处理十分重要。有些错误在编译时即可发现排出,但还有一些错误是在软件运行时由于用户错误的输入等方面的原因而产生的。这就需要软件开发者在软件设计和开发时注意处理这方面的错误。

常见的错误分为三种:

(1) 语法错误。这种错误在编译时有提示,通常是变量定义错误,或语法结构错

误。

(2) 运行时错误。这部分错误是因为用户违法操作造成的,比如输入油罐编号超

过设计值,将无法在界面内显示。

(3)逻辑错误。这种错误是最复杂的,在编程过程中也最容易犯。

5.3 调试结果

1. 下位机调试 (1)温度测试

提高温度传感器的温度,观察数码管温度显示的变化;

23

长治学院学士学位论文

图5.1 温度调试

用手指接触温度传感器,温度上升

(2)压力传感器测试

旋转电位器(此电位器用来模拟压力传感器),观察压力值和液位值的变化,如图5.2所示:

图5.2 压力调试

24

长治学院学士学位论文

(3)串口数据测试

将本系统的串口连接到计算机,用串口调试工具观察串口数据,调试结果如图5.3:

图5.3 串口调试结果

2.上位机调试 (1)启动测试

查看软件能否正常启动;

通过多次检测,软件在32位linux系统平台下运行正常,没有出现异常情况。 (2)后台数据测试

在linux终端模式下,以文本形查看各项数据是否符合需求,如图5.4所示:

25

长治学院学士学位论文

图5.4 后台数据调试

(3)图形界面测试

在软件图像界面下查看各项数据是否与下位机数据一致,如图5.5所示:

图5.5 软件界面数据调试

26

长治学院学士学位论文

(5)错误处理测试

设置储油罐编号超过软件测试范围(1到4),观察现象,如图5.6。当油罐编号超过4,界面中无数值显示,符合要求。

图5.6 错误数据调试结果

27

长治学院学士学位论文

6 总结分析

经过两个多月的奋斗,毕业设计终于顺利完成了,但是仍有许多不足之处,需要在以后的学习和实践过程中改进,比如说:

(1)由于本人水平有限,加之时间较仓促,多次尝试在系统中添加数据库,添加统计功能,遗憾的是均未能成功,但是面向对象的Qt图形编辑软件完全支持这些功能,在以后的学习过程中可以添加进去。

(2)51单片机的算数计算能力有限,计算较大数值的乘除法会产生较大的误差。需要用其他办法(算法)解决此问题。

(3)本系统中采用的数学模型不适合计算球状等不规则形状的储油罐。

(4)在初期程序设计系统中,没有统一变量名称,给后期调试造成了许多不必要的麻烦,这是一个经验教训。

(5)由于对基础知识的掌握不够牢固,在设计过程中走了不少弯路,做了不少无用功。

总的来说,这次课程设计还是比较成功的,虽然在设计中遇到了很多问题,但是在老师和同学的帮助下,逐步解决了,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,在设计过程中还学到了不少新的知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。

28

长治学院学士学位论文

参考文献

[1] 张毅刚.单片机原理及应用.北京:高等教育出版社,2003.12

[2] 冯博琴、吴宁,微型计算机原理与接口技术,清华大学出版社,2007.8 [3] 杜春雷.ARM体系结构与编程.北京:清华大学出版社,2003.9

[4] 刘笃仁、韩保君.传感器原理及应用技术.北京:机械工业出版社,2003.8 [5] 成洁 .Linux窗口程序设计:Qt4精彩实例分析.北京:清华大学出版社,2008.11 [6] 黄维通 .Visual C++面向对象与可视化程序设计(第3版).北京:清华大学出版社,

2011.8

[7] 刘笃仁、韩保君,传感器原理及应用技术,北京:机械工业出版社,2003.8 [8] 童诗白,模拟电子技术基础,北京:高等教育出版社,2006.5 [9] 周航慈,单片机应用程序设计,北京:北京航空航天大学出版社,2003.8

29

长治学院学士学位论文

The Real-time Monitoring System of Oil Storage Tank

Name:Zhang Guoyan Instructor: Zhang Zhenhong Zhang Yi

Abstract: As China has a rich oil resource, so there are many oil refining enterprises in China, naturally,

the oil storage tank has been important equipment to storage oil. At the same time, the

liquid level of oil storage tank great affect the inventory management and economic operation of factories. However, the liquid level measurement of many responses cans, large oil tank, and gas stations is still using artificial examining and the methods of analysis and assay, and the measurement of other parameters is also has not an execute real-time dynamic measurement. This situation makes accidents happen easily, and can’t provide a accurate basis for the productive operation and management decision of factories.

This system in terms of the problems above uses the monolithic technology and sensor technology to measure the temperature and pressure of oil, and makes it shows the oil capacity and temperature value. It also uses the serial port to sent data to PC, so that there is a more concise calculation and statistics. Thus, the system can provide a technical support for the safety of industrial production.

Key Words: Tanks, liquid level, a monitoring system

30

长治学院学士学位论文

附录

下位机源代码:

1主函数代码 1.1main.c

#include #include \

void main() { uchar p,bai,shi,ge; uchar x; uchar wd,wdshi,wdge; while (1) { p = ADmain(); wd = wendu(); for(x=0;x<=110;x++) { bai = p/100; shi = (p0)/10; ge = p; display (bai,1); display (shi,2); display (ge,3); wdshi = wd/10; wdge = wd; display (wdshi, 7); display (wdge, 8); COM_Out(0x00); COM_Out(0xfe); COM_Out(num); //储油罐编号,在main.h文件里定义赋值 COM_Out(wd); COM_Out(pdow());//向串口发送端底压力值 COM_Out(pup()); //向串口发送上端压力值

31

长治学院学士学位论文

}

}

}

1.2 main.h

#define uint unsigned int #define uchar unsigned char uint ADmain();//储油量函数

void display (uchar ,uchar );//显示函数 void COM_Out(uchar i);//串口发送函数 uchar wendu();//温度读取函数

unsigned char pup(); //上端压力返回函数 unsigned char pdow(); //底端压力返回函数 unsigned char num = 1;//储油罐编号

2显示模块函数代码 2.1 display.c

/*数码管动态扫描显示函数,片选信号接38译码器,段选信号接锁存器,*/ #include #include\

#define uchar unsigned char #define uint unsigned int

sbit duan = P3^7;//P3^7连接74HC573锁存器的锁存信号端 uchar code weitable[9] = {0,0,1,2,3,4,5,6,7}; /* 本应该为: wei [8] = {0,1,2,3,4,5,6,7} 但是这样 的话,wei[1]对应的是第二个元素, wei[0]才对应 的是第一个元素 为了直观方便起见,使wei[1]对应到选通第一个数码管 的代码0x00(也即是数组中的0)就在数组前面加了一个 空元素(可以为任意值),数组大小随之增大一位。 */

uchar code duantable[10] = {0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f}; /* 以上table中的10个元素显示到数码管上 时分别为{0,1,2,3,4,5,6,7,8,9} table[0]对应数组中的第一个元素,显示到数 码管上是:0 以此类推table[9]对应数组中

32

长治学院学士学位论文

的第十个元素,显示到数码管上是:10 */

void display (uchar d,uchar w) {

duan = 0; P0=0xff;

duan = 1; // 打开锁存器的锁存端

P0 = duantable[d]; //将段选信号放进锁存器 duan = 0;// 关闭锁存器的锁存端

P2 &= 0xf8;/*给P2口赋位选值前,先将p2与(1111 1000)逻辑与, // 将P2^0,P2^1,P2^2清零,从而不影响其他位原来的电平*/

P2 |= weitable[w];/*将位选信号放进P2口的低三位, // 只改变P2口低三位的值,不影响其他位*/ delay_display (8); }

void delay_display (uint i) { uchar x,j; for(j=0;j

/*显示一个数字的时候,调用display()即可, 格式:display(段 ,位); */

2.2 display.h

void display (unsigned char ,unsigned char ); void delay_display (unsigned int i);

3串口发送模块代码 3.1 COM.c

/******************************************************************** * 文件名 : 串口发送.c

* 描述 : 该文件实现通过串口把数据从单片机发送到电脑, 。

33

长治学院学士学位论文

***********************************************************************/ #include #include #include\

#define uchar unsigned char #define uint unsigned int

/******************************************************************** * 名称 : Com_Init()

* 功能 : 初始化串口程序,晶振11.0592, 波特率9600 * 输入 : 无 * 输出 : 无

***********************************************************************/ void Com_Init(void) {

TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; }

/******************************************************************** * 名称 :COM_Out() * 功能 : 发送数据

***********************************************************************/ void COM_Out(uchar i) { Com_Init(); //初始化串口 SBUF = i; //把传进来的数据放入SBUF while(!TI) //如果发送完毕,硬件会置位TI { _nop_(); } TI = 0; //TI清零 }

34

长治学院学士学位论文

3.2 COM.h

/******************************************************************** * 文件名 : 串口发送.c

* 描述 : 该文件实现通过串口把数据从单片机发送到电脑,

***********************************************************************/ #include #include #include\

#define uchar unsigned char #define uint unsigned int

/******************************************************************** * 名称 : Com_Init()

***********************************************************************/ void Com_Init(void) {

TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; TL1 = 0xFd; TR1 = 1; }

/******************************************************************** * 名称 :COM_Out()

***********************************************************************/ void COM_Out(uchar i) { Com_Init(); //初始化串口 SBUF = i; //把传进来的数据放入SBUF while(!TI) //如果发送完毕,硬件会置位TI { _nop_(); } TI = 0; //TI清零 }

4.温度测量函数代码

4.1DS18B20.c

/********************************************************************

35

长治学院学士学位论文

* 文件名 : DS18B20.c

* 描述 : 该文件实现了用温度传感器件DS18B20对温度的采集

***********************************************************************/ #include #include\

#define uchar unsigned char #define uint unsigned int

#define jump_ROM 0xCC //总线上只有一个器件,0xcc表示不对ROM编码做出反应 #define start 0x44 //收到只个指令后芯片做一次温度转换 #define read_EEROM 0xBE

sbit DQ = P2^3; //DS18B20数据口

unsigned char TMPH,TMPL;

/******************************************************************** * 名称 : delay() * 功能 : 延时函数

***********************************************************************/ void delay(uint N) { int i; for(i=0; i

/******************************************************************** * 名称 : Reset()

***********************************************************************/ uchar Reset(void) { uchar deceive_ready; DQ = 0; delay(29); DQ = 1; delay(3); deceive_ready = DQ; // 把DQ的值赋给这个变量 delay(25); return(deceive_ready); //返回DQ的电平状态 }

/******************************************************************** * 名称 : read_bit()

***********************************************************************/ uchar read_bit(void) {

36

长治学院学士学位论文

uchar i; DQ = 0; DQ = 1; for(i=0; i<3; i++); return(DQ); }

/******************************************************************** * 名称 : write_bit()

***********************************************************************/ void write_bit(uchar bitval) {

DQ=0;

if(bitval==1) DQ=1; delay(5); DQ=1; }

/******************************************************************** * 名称 : read_byte()

***********************************************************************/ uchar read_byte(void) { uchar i,m,receive_data; m = 1; receive_data = 0; for(i=0; i<8; i++) { if(read_bit()) { receive_data = receive_data + (m << i); } delay(6); } return(receive_data); }

/******************************************************************** * 名称 : write_byte()

*********************************************************/ void write_byte(uchar val) { uchar i,temp; for(i=0; i<8; i++) {

37

本文来源:https://www.bwwdw.com/article/ms1g.html

Top