flowunit.c
来自「采用STC89C54RD实现的一个完整的流量计控制系统源代码」· C语言 代码 · 共 1,142 行 · 第 1/5 页
C
1,142 行
ReadBytes(ADDR_LEAK_AREA2, 5, gnSegBuf[1]);
break;
case pnLeakCoef2: // 显示第2段流量系数参数值(2008.06.20)
ReadBytes(ADDR_LEAK_COEF2, 5, gnSegBuf[1]);
break;
case pnLeakArea3: // 显示第3段流量修正的最大流量值(2008.06.20)
ReadBytes(ADDR_LEAK_AREA3, 5, gnSegBuf[1]);
break;
case pnLeakCoef3: // 显示第3段流量系数参数值(2008.06.20)
ReadBytes(ADDR_LEAK_COEF3, 5, gnSegBuf[1]);
break;
case pnLeakArea4: // 显示第4段流量修正的最大流量值(2008.06.20)
ReadBytes(ADDR_LEAK_AREA4, 5, gnSegBuf[1]);
break;
case pnLeakCoef4: // 显示第4段流量系数参数值(2008.06.20)
ReadBytes(ADDR_LEAK_COEF4, 5, gnSegBuf[1]);
break;
}
gbBufUsed = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: Decode
** 功能描述: 将给定的一个32位无符号整型数据转换为5个数字,并存入指定的缓冲区中。
** 输 入: nData>>>>>>>>>>>>>>要转换的32位无符号整型数据。
** 输 出: nBuf[]>>>>>>>>>>>>>代表转换后的数字序列缓冲区。
** 全局变量: 无
** 全局常量:无
** 调用模块: 无
** 其它说明:函数将一个32位无符号整型数据转换为5个数字(0~9),并存入指定的缓冲区中。
**
** 作 者: 罗建
** 日 期: 2007年02月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Decode(INT32U nData, INT8U nBuf[])
{
INT8U i,j;
for (j=4;j>0;j--)
{
for (i=0;i<10;i++)
{
if (nData >= TAB_COEF[j])
nData -= TAB_COEF[j];
else
{
nBuf[j] = i;
break;
}
}
}
nBuf[0] = nData;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: Encode
** 功能描述: 将给定缓冲区中的5个数字转换为一个32位无符号整型数据。
** 输 入: nBuf[]>>>>>>>>>>>>>代表要转换的数字序列缓冲区。
** 输 出: nData>>>>>>>>>>>>>>转换后的32位无符号整型数据,以引用方式输出。
** 全局变量: 无
** 全局常量:无
** 调用模块: 无
** 其它说明:函数将给定缓冲区中的5个数字转换为一个32位无符号整型数据。
**
** 作 者: 罗建
** 日 期: 2007年02月13日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Encode(INT32U *nData, INT8U nBuf[])
{
INT8U i;
*nData = nBuf[0];
for (i=1;i<5;i++)
{
if (nBuf[i] != NONE)
*nData += nBuf[i] * TAB_COEF[i];
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: HideInvalidZero
** 功能描述: 消隐指定缓冲区中的个位以上的各位无效0。
** 输 入: nBufID>>>>>>>>>>>>>代表存放1#或2#LED显示内容的缓冲区数组索引。
** 输 出: 无
** 全局变量: gnPressDot>>>>>>>>>代表压力测量值小数点的位置,0表示无小数点,1表示1位小数点,以此类推;
** gnLeakDot>>>>>>>>>>代表流量测量值小数点的位置,0表示无小数点,1表示1位小数点,以此类推;
** gnSegBuf[][]>>>>>>>代表两组段选缓冲区在SEG_CODE段选码数组中的数字索引。
** 全局常量:无
** 调用模块: 无
** 其它说明:函数搜索指定缓冲区中的无效0,并用消隐代码替换。
**
** 作 者: 罗建
** 日 期: 2007年02月11日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void HideInvalidZero(INT8U nBufID)
{
INT8U i,j;
j = (nBufID == 0)? gnPressDot:gnLeakDot; // 压力至少显示两位数值,流量至少显示三位数值
for (i=4;i>j;i--) // 消隐测量值高位无效0
{
if (gnSegBuf[nBufID][i] == 0)
gnSegBuf[nBufID][i] = NONE;
else
break;
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: GetPressBuf
** 功能描述: 将给定的整型量压力测量值分解为万位、千位、百位、十位和个位数字后存放到压力显示缓冲区中。
** 输 入: 无
** 输 出: 无
** 全局变量: gbWarned>>>>>>>>>>>在待机状态,指示压力测量值是否超出设定区间范围,0~否,1~是;
** gbStarted>>>>>>>>>>指示<启动键>是否按下,0~未按下,1~按下;
** gnMaxPress>>>>>>>>>代表用户设置的压力上限(从EEPROM中读取的);
** gnMinPress>>>>>>>>>代表用户设置的压力下限(从EEPROM中读取的);
** gnPress>>>>>>>>>>>>代表当前测量的压力值,其单位为10kPa;
** gnSegBuf[0][]>>>>>>压力显示缓冲区,保存转换后的万位、千位、百位、十位和个位压力值数字。
** 全局常量:无
** 调用模块: Decode()>>>>>>>>>>>将一个32位无符号整型数据转换为5个数字(0~9),并存入指定的缓冲区中;
** HideInvalidZero()>>消隐指定缓冲区中的个位以上的各位无效0。
** 其它说明:本函数采用关闭INT1外中断来解决显示与储存的冲突。有关更详细的说明请参见INT1_ISR中断服务程序。
**
** 作 者: 罗建
** 日 期: 2007年02月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetPressBuf(void)
{
INT32U nPress;
EX1 = FALSE; // 为防止读数时发生INT1外中断导致冲突,先禁用EX1
nPress = gnPress; // 读取全局变量
EX1 = TRUE; // 恢复响应INT1外中断
if (!gbStarted) // 在待机状态下,检查压力值是否超出了设定的区间范围,超出则点亮WARN灯
{
if (nPress < 150) // 在待机状态下,压力显示值等于实测值减去15kPa(这里扩大了10倍)
nPress = 0;
else
nPress -= 150;
if ((nPress > gnMaxPress) || (nPress < gnMinPress))
gbWarned = TRUE;
else
gbWarned = FALSE;
}
else
{
if (nPress > gnPressZero) // 实测值大于压力零点值,则显示零点值,否则仍显示实测值
nPress = gnPressZero;
}
gbBufUsed = TRUE;
Decode(nPress, gnSegBuf[0]); // 将压力测量值分解为独立的数字表示,以便于显示
HideInvalidZero(0); // 消隐gnSegBuf[0]中的无效0
gbBufUsed = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: GetLeakBuf
** 功能描述: 将给定的双字节流量测量值分解为万位、千位、百位、十位和个位数字后存放到流量显示缓冲区中。
** 输 入: 无
** 输 出: 无
** 全局变量: gbLeakOver>>>>>>>>>指示当前测量值是否大于50.00Ln/min;
** gbStarted>>>>>>>>>>指示<启动键>是否按下,0~未按下,1~按下;
** gbPassed>>>>>>>>>>>在测试期间,指示流量测量值是否超出设定区间范围,0~否,1~是;
** gbFilling>>>>>>>>>>指示当前是否工作于充气状态,0~否,1~是;
** gnMaxLeak>>>>>>>>>>代表用户设置的流量上限(从EEPROM中读取的);
** gnMinLeak>>>>>>>>>>代表用户设置的流量下限(从EEPROM中读取的);
** gnLeak>>>>>>>>>>>>>代表当前测量的流量值,其单位为100Ln/min;
** gnSegBuf[1][]>>>>>>流量显示缓冲区,保存转换后的万位、千位、百位、十位和个位流量值数字。
** 全局常量:FIX_CODE[6][]>>>>>>代表固定显示的字符数组的LED段选码在SEG_CODE数组中的索引。
** 调用模块: Decode()>>>>>>>>>>>将一个32位无符号整型数据转换为5个数字(0~9),并存入指定的缓冲区中;
** HideInvalidZero()>>消隐指定缓冲区中的个位以上的各位无效0。
** 其它说明:本函数采用关闭串口中断来解决显示与储存的冲突。有关更详细的说明请参见SER_ISR中断服务程序。
**
** 作 者: 罗建
** 日 期: 2007年02月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月16日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年05月28日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetLeakBuf(void)
{
INT8U i;
INT32U nLeak;
if (gbLeakOver && gbStarted) // 如果出现流量溢出的现象,则保持直到用户按下STOP键
return;
if (gbTestOver && gbStarted) // 如果检测完成,则保持显示直到用户按下STOP键(2007.03.16)
return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?