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

📄 main.#2

📁 一个采用C8051F020+CH372实现的带USB功能的流量测控系统
💻 #2
📖 第 1 页 / 共 3 页
字号:
  {
    SCON1 &= ~0x01;                              // 清除接收中断标志,允许下次接收数据
	if (gbSyncTwoOK1)                            // 检查同步字节是否接收完毕
	{
      if (SBUF1 == 0x7F)                         // 同步字节已接收完毕,但仍接收到了0x7F,说明出现了最糟糕
	    return;                                  // 的情况,即有3个0x7F,因此需将该字节舍弃。
      gnRxdBuf1[gnRxdID1++] = SBUF1;
	  if (gnRxdID1 == 2)                         // 检查字节是否接收完毕,接收完则为下次接收做好准备
	  {        
        SetRxd1OK();                             // 重新初始化同步字节检测标志和串口接收缓冲区索引
		if (gbStarted && gbTestOver)             // 当测试进程结束,且用户尚未按下停止键时,不更新流量显示值
		  return;
        nRes = gnRxdBuf1[0];                     // 先计算测量值
		nRes = nRes*256 + gnRxdBuf1[1];
        if (gnRxdBuf1[0] & 0x80)                 // 如果测量值为负,则乘以-1转换为正数
          nRes = 0;
        gnLeakRes += nRes;                       // 对流量值滤波(平均值滤波)
		nLeakCnt--;
		if (nLeakCnt == 0)
		{
		  nLeakCnt = LEAK_SAMPLE_NUMS;           // 重新准备计数初值
		  if (gbStarted)                         // 仅当充气和测试时才显示流量值,停止时显示为0
		  {
  		    gnLeakRes = gnLeakRes/(LEAK_SAMPLE_NUMS+1);
			#ifdef  RIDEN_A10
            nRes = gnLeakRes*100/896;
			#else
			nRes = gnLeakRes*100/128;
			#endif
			for (i=0;i<4;i++)
			{
			  if (nRes < gnLeakAreaMax[i])
			  {
			    gnLeakRes *= gnLeakAreaCoef[i];
				#ifdef  RIDEN_A10
				gnLeakRes /= 896;                // 数字量转换为工程量
				#else
				gnLeakRes /= 128;
				#endif
				break;
			  }
			}
			if (i == 4)                          // 如果测量值超出了最大流量修正值,则系数默认为1
			{
			  gnLeakRes *= 100;                  // 乘以系数1
			  #ifdef  RIDEN_A10
              gnLeakRes /= 896;                  // 数字量转换为工程量(A50=128,A10=128*7=896)
			  #else
			  gnLeakRes /= 128;
			  #endif
            }
          }
		  else
		    gnLeakRes = 0;
          EA=0;
          gnLeakGet = gnLeakRes;
          EA =1;
        }
	  }
	}
	else                                         // 同步字节还未接收完毕,继续检测
	{
      if (SBUF1 == 0x7F)                         // 如果是同步字节,则设置相应的同步字节接收到标志
      {
	    if (gbSyncOneOK1)
		  gbSyncTwoOK1 = TRUE;
		else
		  gbSyncOneOK1 = TRUE;
	  }
	  else                                       // 接收到的字节既非同步字节又非正常的测量数据,舍弃重来。
		SetRxd1OK();                             // 重新初始化同步字节检测标志和串口接收缓冲区索引
	}
  }
  else
    SCON1 &= ~0x02;                              // 清除发送中断标志,允许下次接收数据    
}

/********************************************************************************************************
** 函数名称: TIMER2_ISR
** 功能描述: TIMER2定时中断服务程序。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TIMER2_ISR(void) interrupt INT_TIMER2
{
  TF2 = FALSE;
  gnCnt10ms++;
  if (gnCnt10ms >= 10)                 // 定时100ms
  {
    gbTimeOver = TRUE;
	gnCnt10ms = 0;
  }
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: 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;
}

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

  // 仅当进入测试画面后才进行压力调节
  if (gnCntAdjust-- != 0)
    return;
  gnCntAdjust = ADJUST_WAIT;

  // 调节比例阀的输出,使其等于用户设定值
  nErr = gnPressSet - gnPressGet;           // 计算设定值与实测值之间的差值
  if ((nErr <= -20) || (nErr >= 20))        // 压力值误差大于正负2.0KPa,则粗调
    gnPressOut = gnPressOut + nErr;
  else if ((nErr <= -5) || (nErr >= 5))     // 压力值误差大于正负0.5KPa且小于正负2.0KPa,则细调
    gnPressOut = gnPressOut + nErr/5;       // 按照误差的1/5进行微调
  if (gnPressOut > 0x0FFF)                  // 当压力输出gnPressOut超出了DAC0的最大输出值时,让其输出为0
    gnPressOut = 0;
  DAC0L = gnPressOut % 256;                 // 最后将输出值通过DAC0输出给压力调节阀
  DAC0H = gnPressOut / 256;
}


// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneKey
** 功能描述: 检测哪个键有按下,如有键按下则进行相应的处理。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneKey(void)
{
  if (!gbCanGetKey)                         // 检测用户按键情况
  {
    if (gnCntGetKey-- == 0)                 // 实现按键检测延时
      gbCanGetKey = TRUE;
  }
  else                                      // 可以检测按键
  {
    if (!KEY_START)                         // 启动键按下
	{
	  if (!gbStarted)                       // 仅在启动按键尚未按下时才响应启动键操作
      {
        gnCurrTime= gnFillTime;             // 准备充气时间
        DRV_PASS  = CLOSE;                  // 先将PASS和FAIL指示灯关闭
        DRV_FAIL  = CLOSE;
        DRV_VALVE = OPEN;                   // 打开控制阀
        gbTestOver= FALSE;                  // 假定测试状态未结束
        gbStarted = TRUE;                   // 进入启动测试状态
        gbFilling = TRUE;                   // 进入充气时间倒计数状态
      }
	}
    else if (!KEY_STOP)                     // 停止键按下
	{
      DRV_VALVE = CLOSE;                    // 关闭电磁阀
      gbFilling = FALSE;                    // 退出充气时间倒计数状态
      gbTesting = FALSE;                    // 退出测试时间倒计数状态
      gbStarted = FALSE;                    // 退出启动测试状态
      gbTestOver= FALSE;                    // 已经退出测试状态
	  DRV_PASS  = CLOSE;                    // 关闭PASS和FAIL指示灯
      DRV_FAIL  = CLOSE;
	}
    gnCntGetKey = KEY_WAIT;                 // 准备进行按键检测延时
    gbCanGetKey = FALSE;                    // 暂停下一次键检测
  }
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneTest
** 功能描述: 执行充气和测试操作。
** 输  入: 无
** 输  出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建                                                                日  期:2007年12月09日
** 版    本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneTest(void)
{
  if (gbFilling)                          // 如果正在执行充气操作,则对充气时间进行递减
  {
    if (gnCurrTime == 0)                  // 如果充气时间减为全0,则进入测试状态
    {
      gbFilling = FALSE;
      gbTesting = TRUE;
      gnCurrTime = gnTestTime;            // 准备测试时间
    }
	else
	  gnCurrTime--;
  }
  else if (gbTesting)                     // 如果正在执行测试操作,则对测试时间进行递减
  {
    if (gnCurrTime == 0)                  // 如果测试时间减为全0,则测试结束,关闭电磁阀并保持当前显示状态不变
    {
	  if (gnLeakGet > gnLeakMax)
	  {                                   // 测试结束后,如果气体流量超过了设定的流量范围,则FAIL灯亮,否则PASS灯亮
	    DRV_FAIL = OPEN;
	    DRV_PASS = CLOSE;
      }
	  else
	  {
        gbTesting = FALSE;
        gbTestOver= TRUE;                 // 指示检测已完成
        DRV_PASS = OPEN;
        DRV_FAIL = CLOSE;
        DRV_VALVE = CLOSE;                // 关闭电磁阀
	  }
    }
	else
	  gnCurrTime--;
  }
}

⌨️ 快捷键说明

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