?? 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 + -