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

📄 main.c

📁 一个采用C8051F020芯片实现的流量计控制系统源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
  for (i=0;i<GROUPS_OF_COEFS;i++)
  {
    ReadParams(PARAM_ADDR[i][piLeakArea], 4, nReadBuf);    // 从EEPROM中载入流量分段值
    Encode(&gnLeakArea[i], nReadBuf);
    ReadParams(PARAM_ADDR[i][piLeakCoef], 4, nReadBuf);    // 从EEPROM中载入流量系数值
    Encode(&gnLeakCoef[i], nReadBuf);
  }
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: SetRxd0OK和SetRxd1OK
** 功能描述: UART0或UART1数据接收完毕,重新初始化同步字节检测标志及接收缓冲区索引。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetRxd0OK (void)
{
  gbSyncOneOK0 = FALSE;
  gbSyncTwoOK0 = FALSE;
  gnRxdID0 = 0;
}

void SetRxd1OK (void)
{
  gbSyncOneOK1 = FALSE;
  gbSyncTwoOK1 = FALSE;
  gnRxdID1 = 0;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: CheckPress
** 功能描述: 检查压力是否超出设定的最大与最小值,是则警告。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:略
** 调用模块: 略
** 其它说明:
** 设 计 者:罗建                                                                日  期:2008年02月16日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CheckPress (void)
{
  if ((gnPressGet > gnPressMax) || (gnPressGet < gnPressMin))
  {
    if (!gbReadyWarn)                            // 当首次检测到压力超出设定值时,开始计时
    {
      gbReadyWarn = TRUE;
      gnCntWarn = 0;
    }
    else if (gnCntWarn++ == WARN_WAIT)           // 当压力超出设定值的时间持续10秒后,输出报警指示
    {
      gbReadyWarn = FALSE;
      DRV_WARN = OPEN;                           // 输出报警指示信号
      LED_WARN = OPEN;
      gbPressOver = TRUE;
    }
  }
  else                                           // 压力在设定值区间内,不用报警
  {
    gbReadyWarn = FALSE;
    gnCntWarn = 0;
    DRV_WARN = CLOSE;                            // 关闭报警指示信号
    LED_WARN = CLOSE;
    gbPressOver = FALSE;
  }
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: AdjustPress
** 功能描述: 判断当前测试压力值是否超过设定范围,是则调节。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void AdjustPress (void)
{
  INT16 nErr;

  // 仅当进入测试画面后才进行压力调节
  if (gnCntAdjust++ != ADJUST_WAIT)
    return;
  gnCntAdjust = 0;
  // 调节比例阀的输出,使其等于用户设定值
  nErr = gnPressSet - gnPressGet;                // 计算设定值与实测值之间的差值
  if ((nErr > (-1)*PRESS_OFFSET) && (nErr < PRESS_OFFSET))               // 误差在正负PRESS_OFFSET(kPa)之间时为稳定状态,不再调节压力
  {
    gbPressStabled = TRUE;
    return;
  }
  gbPressStabled = FALSE;
  gnPressOut = gnPressOut + nErr;
  DAC0L = gnPressOut % 256;                      // 最后将输出值通过DAC0输出给压力调节阀
  DAC0H = gnPressOut / 256;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: GetKey
** 功能描述: 读取当前用户按键键值(包括远程按键)。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2008年02月01日
** 版    本:V1.00,原始版本
** 修 改 者:罗建                                                                日  期:2008年03月03日
** 版    本:V1.01,当功能键在持续按下的过程中弹起来了,则将其复位至默认状态(实现Press Up功能)。
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetKey (void)
{
  if (!gbCanGetKey)                              // 实现按键检测延时
  {
    if (gnCntGetKey++ == KEY_WAIT)
      gbCanGetKey = TRUE;
  }
  else                                           // 检测是否有键按下
  {
    KEY1 = LEVEL_HIGH;                           // 准备检测薄膜面板上的按键(KEY1或KEY2为低电平表示有键按下)
    KEY2 = LEVEL_HIGH;
    if (!KEY_START)                              // 远程启动键按下(优先级最高)
      gnKeyID = ktStartKey;
    else if (!KEY_STOP)                          // 远程停止键按下(优先级较高)
      gnKeyID = ktStopKey;
    else                                         // 检查薄膜面板上是否有键按下
    {
      if (!KEY1)
        gnKeyID = ((5-gnScanID)<<1) + 1;
      else if (!KEY2)
        gnKeyID = ((5-gnScanID) + 1)<<1;
    }
    if (gnKeyID != 0)                            // 如果检测到有键按下,则准备进行按键检测延时
    {
      gnCntGetKey = 0;                           // 准备进行按键检测延时
      gbCanGetKey = FALSE;                       // 暂停下一次键检测
    }
    if (gnKeyID != ktFuncKey)                    // 该语句用于复位功能键5秒持续按下延时(V1.01)
    {
      gbFuncContinue = FALSE;                    // 说明功能键没有持续按下(V1.01)
      gnFuncCnt = 0;                             // 功能键持续按下计数器清零(V1.01)
    }
  }
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneRxd0
** 功能描述: UART0串口接收数据处理子程序。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:略
** 调用模块:略
** 其它说明:
** 设 计 者:罗建                                                                日  期:2008年02月03日
** 版    本:V1.00,原始版本
** 修 改 者:罗建                                                                日  期:2008年03月03日
** 版    本:V1.01,修改了流量修正分段数,且因将流量显示2位小数点改为了1位小数点,所以作了适应性处理。
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneRxd0 (void)
{
  UINT8  i;
  UINT32 nRes;

  if (!gbRxdOK0)                                 // UART0还没有接收到数据,不进行任何处理
    return;
  nRes = gnRxdBuf0[0];                           // 先计算测量值
  nRes = nRes*256 + gnRxdBuf0[1];
  if (gnRxdBuf0[0] & 0x80)                       // 如果测量值为负,则认为是0
    nRes = 0;
  else
    nRes = nRes * 10 / 128;                      // 将从串口接收到的数字量转换为物理量用于显示(单位:0.1L/min)
  for (i=0;i<GROUPS_OF_COEFS;i++)                // 对流量值采取分段线性修正,如果流量值不在设定的流量范围,
  {                                              // 则保持上一次采集计算的值不变,这样可防止强脉冲干扰(V1.01)
    if (nRes < gnLeakArea[i])
    {
      nRes *= gnLeakCoef[i];                     // 乘以系数(为提高精度而扩大100倍)
      nRes /= 100;                               // 抵消前面计算时乘以的10,以及由于修正系数比实际值扩大了100倍,为了获得0.1L/min的单位,需再除10(V1.01)
      gnLeakGet = nRes;                          // 返回流量值
      break;
    }
  }
  if ((gnWorkState != wsParamSet) && (gnWorkState != wsCoefSet))  // 如果不是在参数修改和修正系数修改状态,则分解并显示流量值(V1.01)
    Decode(gnLeakGet, gnSegBuf[1]);              // 分解流量值
  gbRxdOK0 = FALSE;                              // 数据处理完毕,可以接收下一帧数据
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneRxd1
** 功能描述: UART1串口接收数据处理子程序。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:略
** 调用模块:略
** 其它说明:
** 设 计 者:罗建                                                                日  期:2008年02月03日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneRxd1 (void)
{
  U

⌨️ 快捷键说明

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