?? mcuunit.c
字號:
** 其它說明:要顯示的數據及其符號(正或負)存放在gnDisData結構的數組中。
**
** 作 者: 羅建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年10月29日
** 變 化:將原第四個顯示值由通道平均值改為了通道最大值。
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DisLCD(void)
{
INT8U i;
// 轉換測試數據及其平均值到LCD顯示緩沖區中
for (i=0;i<3;i++)
{
gnDisData[i] = gnADData[i].Word - gnBaseVal[i].Word;
DataToLCDBuf(gnDisData[i], i);
}
// 2007.10.29,將原通道平均值改為了通道最大值
gnDisData[3] = gnDisData[0];
if (gnDisData[3] < gnDisData[1])
gnDisData[3] = gnDisData[1];
if (gnDisData[3] < gnDisData[2])
gnDisData[3] = gnDisData[2];
// gnDisData[3] = (gnDisData[0] + gnDisData[1] + gnDisData[2]) / 3;
/////////////
DataToLCDBuf(gnDisData[3], 3);
DisplayListChar(0x00, 0, 8, gnLcdBuf[0]);// 顯示通道1的測試數據
DisplayListChar(0x08, 0, 8, gnLcdBuf[1]);// 顯示通道2的測試數據
DisplayListChar(0x00, 1, 8, gnLcdBuf[2]);// 顯示通道3的測試數據
DisplayListChar(0x08, 1, 8, gnLcdBuf[3]);// 顯示通道平均值
gbClring = FALSE;
gbDisInfo = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: ClrLCD
** 功能描述: 清除LCD顯示內容(顯示0.00mm)。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbClring>>>>>>>>>>>指示當前是否正處于清除LCD顯示狀態,0~否,1~是;
** gbDisInfo>>>>>>>>>>指示當前是否正在顯示INFO字符信息,0~否,1~是;
** gnDisData[]>>>>>>>>存放要在LCD上顯示及要發送給PC的前三個測量通道及其平均值的測量數據;
** gnLcdBuf[]>>>>>>>>>代表四組LCD顯示緩沖區內容(如:2.35mm)。
** 全局常量:無
** 調用模塊: DataToLCDBuf()>>>>>把一個整型數據按個、十、百進行分解,再轉換為對應數字的ASCII碼存放到LCD顯
** 示緩沖區中;
** DisplayListChar()>>在LCD顯示屏的指定位置處顯示一串字符。
** 其它說明:無
**
** 作 者: 羅建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void ClrLCD(void)
{
INT8U i;
for (i=0;i<4;i++)
{
gnDisData[i] = 0;
DataToLCDBuf(gnDisData[i], i);
}
DisplayListChar(0x00, 0, 8, gnLcdBuf[0]);// 顯示通道1的測試數據
DisplayListChar(0x08, 0, 8, gnLcdBuf[1]);// 顯示通道2的測試數據
DisplayListChar(0x00, 1, 8, gnLcdBuf[2]);// 顯示通道3的測試數據
DisplayListChar(0x08, 1, 8, gnLcdBuf[3]);// 顯示通道平均值
gbClring = TRUE;
gbDisInfo = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: DoneKey
** 功能描述: 檢查是否有按鍵,如有則進行處理。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbTimeOver>>>>>>>>>指示規定的定時間隔時間時否到,0~未到,1~已到;
** gbDoKeep>>>>>>>>>>>指示是否保持當前顯示值不變,0~否,1~是;
** gbDoTest>>>>>>>>>>>指示是否開始測試,0~否,1~是;
** gnKeyCnt>>>>>>>>>>>按鍵檢測間隔計數器。
** 全局常量:無
** 調用模塊: 無
** 其它說明:按鍵檢測間隔為250ms,有抖動消除功能。
**
** 作 者: 羅建
** 日 期: 2007年07月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年09月20日(增加對功能鍵的處理代碼,包括測量、清零和校準)
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneKey(void)
{
INT8U i;
gnKeyCnt--;
if (gnKeyCnt == 2) // 消除抖動(20ms延時)
P1 |= 0xC0;
else if (gnKeyCnt == 0) // 開始檢測按鍵
{
gnKeyCnt = KEY_WAIT; // 準備下一次鍵檢測延時
if ((SW_CLR == 0) && (SW_TEST == 0)) // 檢查用戶是否需要進行校準
{
if (gbDisInfo)
return;
if (!gbBaseWait) // 如果同時按下清零鍵和測試鍵,則準備采集數據
{
gbBaseWait = TRUE; // 開始計時
gnBaseCnt = BASE_WAIT; // 計時2秒鐘
DisplayListChar(0x00, 0, 16, INFO[0]); // 顯示"Ready to adjust,"
DisplayListChar(0x00, 1, 16, INFO[1]); // 顯示" Waiting... "
}
else // 如果同時按下清零鍵和測試鍵并保持2秒,則采集一次數據,
{ // 并作為基準數據存儲在EEPROM中。
gnBaseCnt--; // 計數
if (gnBaseCnt == 0) // 2秒計時到則保存數據
{
gbBaseWait = FALSE;
DoneADC(); // 采集一次數據
for (i=0;i<3;i++) // 保存基準數據至內存和EEPROM中
gnBaseVal[i].Word = gnADData[i].Word;
SaveBase();
DisplayListChar(0x00, 0, 16, INFO[2]); // 顯示" Adjust OK! "
DisplayListChar(0x00, 1, 16, INFO[3]); // 顯示"Press CLEAR key."
gbDisInfo = TRUE;
gbClring = FALSE;
DelayXMS(1000);
}
}
}
else // 只有一個鍵按下
{
if (gbBaseWait || (SW_CLR == 0)) // 清零鍵按下或取消了校準
{
gbBaseWait = FALSE; // 取消校準
ClrLCD(); // LCD顯示為零
}
else if (SW_TEST == 0)
{
if (gbClring) // 檢查數據是否已清除,是則采集一次數據并顯示
{
DoneADC();
DisLCD();
}
}
}
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: T0_ISR
** 功能描述: T0定時器中斷服務程序(默認為10ms)。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbTimeOver>>指示規定的定時間隔時間時否到,0~未到,1~已到。
** 全局常量:無
** 調用模塊: 無
** 其它說明:本模塊實現了T0定時精度的兩重補償。
** 1)第一重補償是將上一次因中斷響應延時造成多計的一部分脈沖數(存于T0中)加在下一次T0定時初值中
** ,使定時器少計數T0個脈沖。
** 2)第二重補償是考慮到晶振的振蕩精度不足,于是加了一個補償值T0_COMP(可正可負),具體值需實驗
** 確定,且不同的晶振和單片機都有可能不同。如果對精度要求不高,可以將T0_COMP設置為0,即不補償。
** 如果單片機計時變慢,則T0_COMP取值為正,否則為負。T0_COMP的簡單確定方法如下:
** 每T0_TIMER定時間隔內補償(T0_COMP*12*TSYS)秒,假設單片機設置的充氣時間為t1,用計數器計下實際的
** 充氣時間t2,為了對Δt=t2-t1進行補償,有Δt=t1*1000/T0_TIMER * (T0_COMP*12*TSYS),則補償量為
** T0_COMP = Δt * T0_TIMER / t1 / 12000 / TSYS
** = Δt * T0_TIMER * FSYS / t1 / 12000
** = (t2 - t1) * T0_TIMER * FSYS / t1 / 12000
** 比如:設t1=10s, 測得t2=11.321s, 則
** T0_COMP = (11.321 - 10) * 10 * 22118400 / 10 / 12000
** = 2435
** 又比如:設t1=20s,測得t2=19.992s,則
** T0_COMP = (19.992 - 20) * 10 * 22118400 / 20 / 12000
** = -7
**
** 作 者: 羅建
** 日 期: 2006年09月22日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void T0_ISR(void) interrupt 1
{
TWordType T0Word;
TR0 = EA = FALSE;
T0Word.Word = T0_CONST + T0_COMP + TL0;
T0Word.Byte[0] = T0Word.Byte[0] + TH0;
TH0 = T0Word.Byte[0];
TL0 = T0Word.Byte[1];
EA = TR0 = TRUE;
gbTimeOver = TRUE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: SER_ISR
** 功能描述: 串行接口中斷服務程序(主要針對數據發送)。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbIsTxHeadOK>>>>>>>指示是否已將幀頭全部發送至上位機,0~否,1~是;
** gbIsTxDataOK>>>>>>>指示是否已將幀數據全部發送至上位機,0~否,1~是;
** gnTxBuf>>>>>>>>>>>>串行接口發送緩沖區(不含幀頭及校驗和)。
** 全局常量:無
** 調用模塊: 無
** 其它說明:
**
** 作 者: 羅建
** 日 期: 2007年07月29日
**-------------------------------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -