?? main.c
字號:
{
RI0 = FALSE; // 清除數據接收中斷標志
if (gbSyncTwoOK0) // 檢查同步字節是否接收完畢
{
if (SBUF0 == 0x7F) // 同步字節已接收完畢,但仍接收到了0x7F,說明出現了最糟糕
return; // 的情況,即有3個0x7F,因此需將該字節舍棄。
gnRxdBuf0[gnRxdID0++] = SBUF0;
if (gnRxdID0 == 2) // 檢查字節是否接收完畢,接收完則為下次接收做好準備
{
SetRxd0OK(); // 重新初始化同步字節檢測標志和串口接收緩沖區索引
if (gbStarted && gbTestOver) // 當測試進程結束,且用戶尚未按下停止鍵時,不更新流量顯示值
return;
nRes = gnRxdBuf0[0]; // 先計算測量值
nRes = nRes*256 + gnRxdBuf0[1];
if (gnRxdBuf0[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 (SBUF0 == 0x7F) // 如果是同步字節,則設置相應的同步字節接收到標志
{
if (gbSyncOneOK0)
gbSyncTwoOK0 = TRUE;
else
gbSyncOneOK0 = TRUE;
}
else // 接收到的字節既非同步字節又非正常的測量數據,舍棄重來。
SetRxd0OK(); // 重新初始化同步字節檢測標志和串口接收緩沖區索引
}
}
else
TI0 = FALSE; // 清除數據發送中斷標志
}
/********************************************************************************************************
** 函數名稱: 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 + -