📄 main.#2
字号:
{
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 + -