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 + -
显示快捷键?