📄 flowunit.c
字号:
/********************************************************************************************************
** 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 + -