⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flowunit.c

📁 采用STC89C54RD实现的一个完整的流量计控制系统源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/********************************************************************************************************
**				                               RIDen A50 流量计
**
**                                          版权所有 (c) 2007,罗建
**                                               保留所有权利
**
**                                                  V1.05
**
**
**-------------------------------------------------文件信息----------------------------------------------
**文   件   名: FlowUnit.C
**创   建   人: 罗建
**最后修改日期: 2008年06月20日
**描        述: RIDen A50流量计源程序。
**其        它:MCU采用STC89C54RD+,外部晶振为11.0592MHz,内部2倍频。用户配置数据存储在MCU片内的EEPROM中,
**              用ISP/IAP方式存取。
**
**-----------------------------------------------历史版本信息--------------------------------------------
** 创建人: 罗建
** 版  本: V1.00
** 日 期: 2007年02月08日
** 描 述: 原始版本
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版  本: V1.01
** 日 期: 2007年03月14日
** 描 述: 在前一版本基础上取消了PrEAd、t-Add、t-Sub、rES和StAtE共5个调整参数。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版  本: V1.02
** 日 期: 2007年03月16日
** 描 述: 在上一版本基础上增加和修改了如下几项功能:
**         1)增加了在仪表上电时显示3秒LOGO标志RIDEN A50的功能;
**         2)增加了在检测完成后保持检测前最后一次显示直到用户按下STOP键的功能。
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版  本: V1.03
** 日 期: 2007年03月23日
** 描 述: 在上一版本基础上作了如下修改:
**         1)增加了流量系数参数,允许用户设置不同的流量系数(取值范围为0.00~100.00);
**         2)为了使新增加的流量系数更有意义,取消了默认的最大50Ln/min的流量报警限制;
**         3)由于流量系数的取值范围为0.00~100.00,因此在参数修改时,不再限制流量最大值为50,而是允许用户
**         随意修改。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版  本: V1.04
** 日 期: 2007年03月25日
** 描 述: 在上一版本基础上作了如下修改:
**         LED动态扫描由指令延时改为了定时方式延时,CPU利用率更高了,现在每个LED的扫描时间为2ms,其它间隔
**         时间不变。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版  本: V1.05
** 日 期: 2007年05月28日
** 描 述: 在上一版本基础上作了如下修改:
**         考虑到在充气阶段打开电磁阀可能会造成流量冲击,因而在充气阶段不检测流量超限状态。本次修改仅在函
**         数GetLeakBuf()中增加了对充气阶段的判断,其余未作变化。
**
**-------------------------------------------------------------------------------------------------------
** 修改人: 罗建
** 版  本: V1.06
** 日 期: 2008年06月20日
** 描 述: 在上一版本基础上作了如下修改:
**         为了方便流量计在整个流量测量范围内都能与客户的测量要求相吻合(客户要求使用工厂专用的标准阀进行
**         检测),将原来一个流量系数改为了四个流量系数,每个流量系数及其流量段都可单独设置。
**

**-----------------------------------------------当前版本修订--------------------------------------------
** 修改人: 罗建
** 日 期: 2008年06月20日
** 描 述: 
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <AT89X52.H>
#include <Intrins.h>
#include <String.h>
#include "FlowUnit.h"
#include "STC89C54RD_FlashIAP.h"

/* 定义位变量 */
bit       gbBufUsed;
bit       gbLogo;                                /* 仪表在上电时,该标志为TRUE,指示当前正在显示LOGO标志 */
bit       gbPassed;                              /* 在测试期间,指示流量测量值是否超出设定区间范围,0~否,1~是 */
bit       gbWarned;                              /* 在待机状态,指示压力测量值是否超出设定区间范围,0~否,1~是 */
bit       gbTimeOver;                            /* 指示规定的定时间隔时间时否到,0~未到,1~已到 */
bit       gbLeakOver;                            /* 指示当前测量值是否大于50.00Ln/min */
bit       gbTestOver;                            /* 指示当前是否已完成或退出了检测状态,0~非检测状态或检测过程未结束,1~检测完成(但未退出检测进程) */
bit       gbDispOver;                            /* 指示当前流量测量值是否大于999.99,0~不是,1~是 */
bit       gbSyncOneOK;                           /* 指示串口数据帧的第一个同步字节是否接收完毕,0~未收到,1~收到 */
bit       gbSyncTwoOK;                           /* 指示串口数据帧的第二个同步字节是否接收完毕,0~未收到,1~收到 */
bit       gbParamSel;                            /* 指示当前是否工作在参数选择状态,0~不是,1~是 */
bit       gbParamSet;                            /* 指示当前是否工作在参数修改状态,0~不是,1~是 */
bit       gbStarted;                             /* 指示<启动键>是否按下,0~未按下,1~按下 */
bit       gbFilling;                             /* 指示当前是否工作于充气状态,0~否,1~是 */
bit       gbTesting;                             /* 指示当前是否工作于测试状态,0~否,1~是 */
bit       gbCanFlash;                            /* 指示当前是否要执行闪烁操作(实际是消隐),0~不执行,1~执行 */
bit       gbCanGetKey;                           /* 指示当前是否可以检测按键,0~否,1~是 */

/* 定义字节变量 */
INT8U     data  gnTimeCnt;
INT8U     data  gnLedID;
INT8U     data  gnPressDot;                      /* 为了便于今后小数点扩展,保留了当前这个变量,0表示没有小数点,1表示有一位小数点,以此类推 */
INT8U     data  gnLeakDot;                       /* 为了便于今后小数点扩展,保留了当前这个变量,0表示没有小数点,1表示有一位小数点,以此类推 */
INT8U     data  gnKeyID;                         /* 存放用户按键的键值,取值范围:0~8,0表示无按键 */
INT8U     data  gnRxdID;                         /* 串口接收缓冲区数组索引 */
INT8U     data  gnParamID;                       /* 代表当前用户选择的参数在参数组中的序号,取值0~PARAMS_NUMS-1 */
INT8U     data  gnCursorID;                      /* 代表当前光标位置,由左移键和右移键进行控制,取值0~4 */
INT8U     data  gnFlashCnt;                      /* 代表当前光标闪烁的频率,实际频率=1/(gnFlashCnt*0.01*2)Hz */
INT8U     data  gnT0OverCnt;                     /* 代表T0中断溢出的次数 */
INT8U     data  gnGetKeyCnt;                     /* 用于按键检测间隔期间的倒计数,其值为0时允许再一次检测按键,以防止连续快速按键 */
INT8U     data  gnRxdBuf[2];                     /* 代表串口接收缓冲区数组,高字节在前 */
INT8U     idata  gnSegBuf[2][5];                  /* 代表两组段选缓冲区在SEG_CODE段选码数组中的数字索引 */
INT8U     idata  gnDisBuf[2][5];

/* 定义字变量 */
INT16U    idata  gnLogoCnt;                       /* 代表LOGO信息显示时间对应的系统定时间隔次数,默认为200,代表2秒 */

/* 定义32位字变量 */
INT32U    data  gnFillTime;                      /* 代表用户设置的充气时间(从EEPROM中读取的) */
INT32U    data  gnTestTime;                      /* 代表用户设置的测试时间(从EEPROM中读取的) */
INT32U    data  gnCurrTime;                      /* 代表当前测试流程中正在使用的时间(充气或测试时间) */
INT32U    data  gnMaxPress;                      /* 代表用户设置的压力上限(从EEPROM中读取的) */
INT32U    data  gnMinPress;                      /* 代表用户设置的压力下限(从EEPROM中读取的) */
INT32U    data  gnPress;                         /* 代表当前测量的压力值,其单位为10kPa */
INT32U    data  gnPressZero;                     /* 代表测试前压力零点偏移值,用于压力零点值修正 */
INT32U    data  gnMaxLeak;                       /* 代表用户设置的流量上限(从EEPROM中读取的) */
INT32U    data  gnMinLeak;                       /* 代表用户设置的流量下限(从EEPROM中读取的) */
INT32U    data  gnLeak;                          /* 代表当前测量的流量值,其单位为100Ln/min */
INT32U    data  gnLeakZero;                      /* 代表测试前流量零点偏移值,用于流量零点值修正 */
INT32U    idata gnLeakArea[4];                   /* 代表要进行流量分段线性修正的各段流量最大值(V1.06) */
INT32U    idata gnLeakCoef[4];                   /* 代表流量显示值与实测值的比例系数(V1.06) */
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 关于LED编码的说明
**
** U1(STC89C54RD+)的Q1..Q6经驱动放大后分别对应于LED1..LED6,高电平有效。
** U8和U9(74HC595)的QA..QH分别对应于LED的a..h,低电平有效。
**  	 _a_
**     f|   |b
**	    |_g_|
**     e|   |c
**	    |_ _| .h
**        d
----------------------------------------------------------------------------------
** 字形	    段(共阳)						编码					ID		HEX_ID
**  		h	g	f	e	d	c	b	a	无小数点	有小数点
** 0		1	1	0	0	0	0	0	0	0xC0		0x40		0		0x00
** 1		1	1	1	1	1	0	0	1	0xF9		0x79		1		0x01
** 2		1	0	1	0	0	1	0	0	0xA4		0x24		2		0x02
** 3		1	0	1	1	0	0	0	0	0xB0		0x30		3		0x03
** 4		1	0	0	1	1	0	0	1	0x99		0x19		4		0x04
** 5		1	0	0	1	0	0	1	0	0x92		0x12		5		0x05
** 6		1	0	0	0	0	0	1	0	0x82		0x02		6		0x06
** 7		1	1	1	1	1	0	0	0	0xF8		0x78		7		0x07
** 8		1	0	0	0	0	0	0	0	0x80		0x00		8		0x08
** 9		1	0	0	1	0	0	0	0	0x90		0x10		9		0x09
** A		1	0	0	0	1	0	0	0	0x88		0x08		10		0x0A
** b		1	0	0	0	0	0	1	1	0x83		0x03		11		0x0B
** C		1	1	0	0	0	1	1	0	0xC6		0x46		12		0x0C
** d		1	0	1	0	0	0	0	1	0xA1		0x21		13		0x0D
** E		1	0	0	0	0	1	1	0	0x86		0x06		14		0x0E
** F		1	0	0	0	1	1	1	0	0x8E		0x0E		15		0x0F
** 无		1	1	1	1	1	1	1	1	0xFF		0x7F		16		0x10
** H		1	0	0	0	1	0	0	1	0x89		0x09		17		0x11
** h		1	0	0	0	1	0	1	1	0x8B		0x0B		18		0x12
** I        1   1   0   0   1   1   1   1   0xCF        0x4F        19		0x13
** L		1	1	0	0	0	1	1	1	0xC7		0x47		20		0x14
** n		1	0	1	0	1	0	1	1	0xAB		0x2B		21		0x15
** o		1	0	1	0	0	0	1	1	0xA3		0x23		22		0x16
** P		1	0	0	0	1	1	0	0	0x8C		0x0C		23		0x17
** q		1	0	0	1	1	0	0	0	0x98		0x18		24		0x18
** r		1	0	1	0	1	1	1	1	0xAF		0x2F		25		0x19
** S		1	0	0	1	0	0	1	0	0x92		0x12		26		0x1A
** t		1	0	0	0	0	1	1	1	0x87		0x07		27		0x1B
** u		1	1	1	0	0	0	1	1	0xE3		0x63		28		0x1C
** y		1	0	0	1	0	0	0	1	0x91		0x11		29		0x1D
** -		1	0	1	1	1	1	1	1	0xBF		0x3F		30		0x1E
** a亮      1   1   1   1   1   1   1   0	0xFE		0x7E		31		0x1F
** b亮      1   1   1   1   1   1   0   1	0xFD		0x7D		32		0x20
** c亮      1   1   1   1   1   0   1   1	0xFB		0x7B		33		0x21
** ab亮     1   1   1   1   1   1   0   0	0xFC		0x7C		34		0x22
** ac亮     1   1   1   1   1   0   1   0	0xFA		0x7A		35		0x23
** bc亮     1   1   1   1   1   0   0   1	0xF9		0x79		36		0x24
** abc亮    1   1   1   1   1   0   0   0	0xF8        0x78        37      0x25
**
*********************************************************************************************************
** 关于面板的布局
** 面板的布局情况如下:
**  -----------------------------------------------------------------
** | FLOW tester     RIDEN A50									     |
** | --------------------------------                                |
** |                                                                 |
** |      TEST Pressure(1#-LED)            Leak Quantity(2#-LED)	 |
** |  ____  ____  ____  ____  ____     ____  ____  ____  ____  ____  |
** | |    ||    ||    ||    ||    |   |    ||    ||    ||    ||    | |
** | |____||____||____||____||____|   |____||____||____||____||____| |
** | |    ||    ||    ||    ||    |   |    ||    ||    ||    ||    | |
** | |____||____||____||____||____|   |____||____||____||____||____| |
** |                                                         ______  |
** |                ____    ________        ____            |      | |
** | PASS(3#-LED)  |■■|  |Function|      |_Up_|           |START | |
** |               ˉˉˉ   ˉˉˉˉ                        |______| |
** |				____	  		______         _____             |
** | FAIL(4#-LED)  |■■|          | Left |       |Right|    		 |
** |               ˉˉˉ          ˉˉˉˉ        ˉˉˉ    ______  |
** |                ____    _______        ____             |      | |
** | WARN(5#-LED)  |■■|  |  SET  |      |Down|            | STOP | |
** |               ˉˉˉ  ˉˉˉˉ       ˉˉˉ            |______| |
** |                                                                 |
**  -----------------------------------------------------------------
**
** 工作状态如下:
** (1)待机状态:仪表上电复位后的自然状态,或从其它状态返回的系统默认状态,此时,1#LED显示压力测量值,2#
**                LED显示流量测量值,5#LED指示压力测量值是否越限。
** (2)参数选择:用户按下Function键后的状态,此时,1#LED显示参数的符号名称,2#LED显示参数的值。
** (3)参数修改:用户按下Function键和SET键后的状态,此时,1#LED显示参数的符号名称,2#LED显示参数的值,且
**                修改位闪烁。
** (4)充气状态:用户按下START键后的状态,此时,1#LED显示压力测量值,2#LED显示流量测量值,系统记下当前流
**                量测量值作为零点修正值,同时打开电磁阀。
** (5)测试状态:充气时间结束后所进入的状态,此时,1#LED显示压力测量值,2#LED显示流量测量值,3#和4#LED指
**                示流量测量值是否越限。
** (6)检测状态:由于测试状态是系统自动进入的状态,为了注释方便,有时也将充气状态和测试状态合称检测状态。
**
** 按键功能如下:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -