?? main.#1
字號:
{
SCON1 &= ~0x01; // 清除接收中斷標(biāo)志,允許下次接收數(shù)據(jù)
if (gbSyncTwoOK1) // 檢查同步字節(jié)是否接收完畢
{
if (SBUF1 == 0x7F) // 同步字節(jié)已接收完畢,但仍接收到了0x7F,說明出現(xiàn)了最糟糕
return; // 的情況,即有3個(gè)0x7F,因此需將該字節(jié)舍棄。
gnRxdBuf1[gnRxdID1++] = SBUF1;
if (gnRxdID1 == 2) // 檢查字節(jié)是否接收完畢,接收完則為下次接收做好準(zhǔn)備
{
SetRxd1OK(); // 重新初始化同步字節(jié)檢測標(biāo)志和串口接收緩沖區(qū)索引
if (gbStarted && gbTestOver) // 當(dāng)測試進(jìn)程結(jié)束,且用戶尚未按下停止鍵時(shí),不更新流量顯示值
return;
nRes = gnRxdBuf1[0]; // 先計(jì)算測量值
nRes = nRes*256 + gnRxdBuf1[1];
if (gnRxdBuf1[0] & 0x80) // 如果測量值為負(fù),則乘以-1轉(zhuǎn)換為正數(shù)
nRes = 0;
gnLeakRes += nRes; // 對流量值濾波(平均值濾波)
nLeakCnt--;
if (nLeakCnt == 0)
{
nLeakCnt = LEAK_SAMPLE_NUMS; // 重新準(zhǔn)備計(jì)數(shù)初值
if (gbStarted) // 僅當(dāng)充氣和測試時(shí)才顯示流量值,停止時(shí)顯示為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; // 數(shù)字量轉(zhuǎn)換為工程量
#else
gnLeakRes /= 128;
#endif
break;
}
}
if (i == 4) // 如果測量值超出了最大流量修正值,則系數(shù)默認(rèn)為1
{
gnLeakRes *= 100; // 乘以系數(shù)1
#ifdef RIDEN_A10
gnLeakRes /= 896; // 數(shù)字量轉(zhuǎn)換為工程量(A50=128,A10=128*7=896)
#else
gnLeakRes /= 128;
#endif
}
}
else
gnLeakRes = 0;
EA=0;
gnLeakGet = gnLeakRes;
EA =1;
}
}
}
else // 同步字節(jié)還未接收完畢,繼續(xù)檢測
{
if (SBUF1 == 0x7F) // 如果是同步字節(jié),則設(shè)置相應(yīng)的同步字節(jié)接收到標(biāo)志
{
if (gbSyncOneOK1)
gbSyncTwoOK1 = TRUE;
else
gbSyncOneOK1 = TRUE;
}
else // 接收到的字節(jié)既非同步字節(jié)又非正常的測量數(shù)據(jù),舍棄重來。
SetRxd1OK(); // 重新初始化同步字節(jié)檢測標(biāo)志和串口接收緩沖區(qū)索引
}
}
else
SCON1 &= ~0x02; // 清除發(fā)送中斷標(biāo)志,允許下次接收數(shù)據(jù)
}
/********************************************************************************************************
** 函數(shù)名稱: TIMER2_ISR
** 功能描述: TIMER2定時(shí)中斷服務(wù)程序。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:無
** 調(diào)用模塊: 無
** 設(shè) 計(jì) 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TIMER2_ISR(void) interrupt INT_TIMER2
{
TF2 = FALSE;
gnCnt10ms++;
if (gnCnt10ms >= 10) // 定時(shí)100ms
{
gbTimeOver = TRUE;
gnCnt10ms = 0;
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: SetRxd0OK和SetRxd1OK
** 功能描述: UART0或UART1數(shù)據(jù)接收完畢,重新初始化同步字節(jié)檢測標(biāo)志及接收緩沖區(qū)索引。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:無
** 調(diào)用模塊: 無
** 設(shè) 計(jì) 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetRxd0OK(void)
{
gbSyncOneOK0 = FALSE;
gbSyncTwoOK0 = FALSE;
gnRxdID0 = 0;
}
void SetRxd1OK(void)
{
gbSyncOneOK1 = FALSE;
gbSyncTwoOK1 = FALSE;
gnRxdID1 = 0;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: AdjustPress
** 功能描述: 判斷當(dāng)前測試壓力值是否超過設(shè)定范圍,是則調(diào)節(jié)。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:無
** 調(diào)用模塊: 無
** 設(shè) 計(jì) 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void AdjustPress(void)
{
INT16 nErr;
// 僅當(dāng)進(jìn)入測試畫面后才進(jìn)行壓力調(diào)節(jié)
if (gnCntAdjust-- != 0)
return;
gnCntAdjust = ADJUST_WAIT;
// 調(diào)節(jié)比例閥的輸出,使其等于用戶設(shè)定值
nErr = gnPressSet - gnPressGet; // 計(jì)算設(shè)定值與實(shí)測值之間的差值
if ((nErr <= -20) || (nErr >= 20)) // 壓力值誤差大于正負(fù)2.0KPa,則粗調(diào)
gnPressOut = gnPressOut + nErr;
else if ((nErr <= -5) || (nErr >= 5)) // 壓力值誤差大于正負(fù)0.5KPa且小于正負(fù)2.0KPa,則細(xì)調(diào)
gnPressOut = gnPressOut + nErr/5; // 按照誤差的1/5進(jìn)行微調(diào)
if (gnPressOut > 0x0FFF) // 當(dāng)壓力輸出gnPressOut超出了DAC0的最大輸出值時(shí),讓其輸出為0
gnPressOut = 0;
DAC0L = gnPressOut % 256; // 最后將輸出值通過DAC0輸出給壓力調(diào)節(jié)閥
DAC0H = gnPressOut / 256;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: DoneKey
** 功能描述: 檢測哪個(gè)鍵有按下,如有鍵按下則進(jìn)行相應(yīng)的處理。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:無
** 調(diào)用模塊: 無
** 設(shè) 計(jì) 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneKey(void)
{
if (!gbCanGetKey) // 檢測用戶按鍵情況
{
if (gnCntGetKey-- == 0) // 實(shí)現(xiàn)按鍵檢測延時(shí)
gbCanGetKey = TRUE;
}
else // 可以檢測按鍵
{
if (!KEY_START) // 啟動鍵按下
{
if (!gbStarted) // 僅在啟動按鍵尚未按下時(shí)才響應(yīng)啟動鍵操作
{
gnCurrTime= gnFillTime; // 準(zhǔn)備充氣時(shí)間
DRV_PASS = CLOSE; // 先將PASS和FAIL指示燈關(guān)閉
DRV_FAIL = CLOSE;
DRV_VALVE = OPEN; // 打開控制閥
gbTestOver= FALSE; // 假定測試狀態(tài)未結(jié)束
gbStarted = TRUE; // 進(jìn)入啟動測試狀態(tài)
gbFilling = TRUE; // 進(jìn)入充氣時(shí)間倒計(jì)數(shù)狀態(tài)
}
}
else if (!KEY_STOP) // 停止鍵按下
{
DRV_VALVE = CLOSE; // 關(guān)閉電磁閥
gbFilling = FALSE; // 退出充氣時(shí)間倒計(jì)數(shù)狀態(tài)
gbTesting = FALSE; // 退出測試時(shí)間倒計(jì)數(shù)狀態(tài)
gbStarted = FALSE; // 退出啟動測試狀態(tài)
gbTestOver= FALSE; // 已經(jīng)退出測試狀態(tài)
DRV_PASS = CLOSE; // 關(guān)閉PASS和FAIL指示燈
DRV_FAIL = CLOSE;
}
gnCntGetKey = KEY_WAIT; // 準(zhǔn)備進(jìn)行按鍵檢測延時(shí)
gbCanGetKey = FALSE; // 暫停下一次鍵檢測
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: DoneTest
** 功能描述: 執(zhí)行充氣和測試操作。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:無
** 調(diào)用模塊: 無
** 設(shè) 計(jì) 者:羅建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneTest(void)
{
if (gbFilling) // 如果正在執(zhí)行充氣操作,則對充氣時(shí)間進(jìn)行遞減
{
if (gnCurrTime == 0) // 如果充氣時(shí)間減為全0,則進(jìn)入測試狀態(tài)
{
gbFilling = FALSE;
gbTesting = TRUE;
gnCurrTime = gnTestTime; // 準(zhǔn)備測試時(shí)間
}
else
gnCurrTime--;
else if (gbTesting) // 如果正在執(zhí)行測試操作,則對測試時(shí)間進(jìn)行遞減
{
if (gnCurrTime == 0) // 如果測試時(shí)間減為全0,則測試結(jié)束,關(guān)閉電磁閥并保持當(dāng)前顯示狀態(tài)不變
{
if (gnLeakGet > gnLeakMax)
{ // 測試結(jié)束后,如果氣體流量超過了設(shè)定的流量范圍,則FAIL燈亮,否則PASS燈亮
DRV_FAIL = OPEN;
DRV_PASS = CLOSE;
}
else
{
gbTesting = FALSE;
gbTestOver= TRUE; // 指示檢測已完成
DRV_PASS = OPEN;
DRV_FAIL = CLOSE;
DRV_VALVE = CLOSE; // 關(guān)閉電磁閥
}
}
else
gnCurrTime--;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -