📄 main.c
字号:
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 + -