?? mcuunit.c
字號:
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年09月20日(增加了正負數(shù)符號顯示功能,輸入?yún)?shù)為有符號整數(shù),取消了千位數(shù)顯示功能)
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DataToLCDBuf(INT16 nData, INT8U nBufID)
{
INT16U nTemp1;
INT8U nTemp2;
if (nData >= 0) // 檢查要轉(zhuǎn)換的數(shù)據(jù)是正數(shù)還是負數(shù),負數(shù)需要顯示負號
{
gnLcdBuf[nBufID][0] = ' ';
nTemp1 = nData;
}
else
{
gnLcdBuf[nBufID][0] = '-';
nTemp1 = nData * (-1);
}
nTemp2 = nTemp1/100; // 得到百位數(shù)字
nTemp1 = nTemp1 - nTemp2*100; // 計算余數(shù)
gnLcdBuf[nBufID][1] = nTemp2 + 0x30; // 十進制數(shù)字轉(zhuǎn)換為ASCII碼
nTemp2 = nTemp1/10; // 得到十位數(shù)字
gnLcdBuf[nBufID][3] = nTemp2 + 0x30; // 十進制數(shù)字轉(zhuǎn)換為ASCII碼
nTemp2 = nTemp1 - nTemp2*10; // 得到個位數(shù)字
gnLcdBuf[nBufID][4] = nTemp2 + 0x30; // 十進制數(shù)字轉(zhuǎn)換為ASCII碼
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: SendDataToPC
** 功能描述: 利用RS-232串行口向上位機發(fā)送測量數(shù)據(jù)。本方法分解要發(fā)送的數(shù)據(jù)到發(fā)送緩沖區(qū)中,然后發(fā)送幀頭,后
** 面的數(shù)據(jù)發(fā)送工作在串口中斷服務(wù)程序中完成。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbIsTxHeadOK>>>>>>>指示是否已將幀頭全部發(fā)送至上位機,0~否,1~是;
** gbIsTxDataOK>>>>>>>指示是否已將幀數(shù)據(jù)全部發(fā)送至上位機,0~否,1~是;
** gnDisData[]>>>>>>>>存放前三個測量通道及其平均值的工程量結(jié)果,對應(yīng)于顯示緩沖區(qū);
** gnTxBuf[]>>>>>>>>>>串行接口發(fā)送緩沖區(qū)(不含幀頭及校驗和)。
** 全局常量:無
** 調(diào)用模塊: 無
** 其它說明:無
**
** 作 者: 羅建
** 日 期: 2007年07月03日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月29日(數(shù)據(jù)發(fā)送方式改為了串口中斷發(fā)送方式,效率會更高)
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年09月20日(發(fā)送的數(shù)據(jù)與顯示的數(shù)據(jù)一致,并且包含符號位,同時修改了開關(guān)的狀態(tài))
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SendDataToPC(void)
{
bit bIsNeg;
INT8U i;
TWordType nDisData;
for (i=0;i<4;i++) // 準備要發(fā)送的測量數(shù)據(jù),高位在前,低位在后
{
if (gnDisData[i] >= 0) // 檢查要發(fā)送的數(shù)據(jù)是正數(shù)還是負數(shù)
{
bIsNeg = FALSE;
nDisData.Word = gnDisData[i];
}
else
{
bIsNeg = TRUE;
nDisData.Word = gnDisData[i] * (-1);
}
gnTxBuf[i*2] = nDisData.Byte[0]; // 先高位MSB
gnTxBuf[i*2+1] = nDisData.Byte[1]; // 后低位LSB
if (bIsNeg) // 檢查數(shù)據(jù)是否是負數(shù)
gnTxBuf[i*2] = gnTxBuf[i*2] | 0x80; // 將最高位置為1表示負數(shù)
}
gnTxBuf[8] = 0; // 準備要發(fā)送的開關(guān)(含輸入和輸出)狀態(tài),位6、7備用
if (!SW_TEST) // 位0表示測試按扭是否按下,1為按下
gnTxBuf[8] |= 0x01;
if (!SW_CLR) // 位1表示清除按扭是否按下,1為按下
gnTxBuf[8] |= 0x02;
if (!SW_KEY3) // 位2表示輸入開關(guān)3是否按下,1為按下
gnTxBuf[8] |= 0x04;
if (!SW_KEY4) // 位3表示輸入開關(guān)4是否按下,1為按下
gnTxBuf[8] |= 0x08;
if (!OUT1) // 位4表示輸出開關(guān)1是否有輸出,1為有輸出
gnTxBuf[8] |= 0x10;
if (!OUT2) // 位5表示輸出開關(guān)2是否有輸出,1為有輸出
gnTxBuf[8] |= 0x20;
TI = FALSE; // 準備發(fā)送數(shù)據(jù)到上位機
gbIsTxHeadOK = FALSE;
gbIsTxDataOK = FALSE;
SBUF = 0xFF; // 開始發(fā)送數(shù)據(jù)
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: DoneADC
** 功能描述: 執(zhí)行一次STC12C5408AD的前四個通道的ADC。
** 輸 入: 無
** 輸 出: 無
** 全局變量: 略
** 全局常量:無
** 調(diào)用模塊: 無
** 其它說明:本函數(shù)對STC12C5408AD的前四個通道執(zhí)行FILTER次的AD轉(zhuǎn)換,并對轉(zhuǎn)換結(jié)果進行初步的工程量轉(zhuǎn)換及平均
** 值濾波,結(jié)果最后放在gnADData[i].Word全局變量中。
**
** 作 者: 羅建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneADC(void)
{
INT8U i; // i為循環(huán)變量
INT8U nADChan; // nADChan指向當前AD轉(zhuǎn)換通道
INT8U nFilteCnt; // nFilteCnt為軟件濾波器計數(shù)器
INT16U nADRes[4]; // 存放四個測量通道的AD轉(zhuǎn)換結(jié)果
nFilteCnt = FILTER;
while (nFilteCnt-- > 0) // 檢查濾波是否完成
{
nADChan = 0;
do{
ADC_CONTR &= 0xF8; // 選擇nADChan通道進行AD轉(zhuǎn)換
ADC_CONTR |= nADChan;
ADC_CONTR |= 0x08; // 啟動AD轉(zhuǎn)換
while (!(ADC_CONTR & 0x10)); // 等待AD轉(zhuǎn)換完成
ADC_CONTR &= 0xE7; // 清除AD轉(zhuǎn)換標志
nADRes[nADChan] = 0;
nADRes[nADChan] = nADRes[nADChan] | ADC_DATA; // 讀取AD轉(zhuǎn)換結(jié)果
nADRes[nADChan] = nADRes[nADChan] << 2;
nADRes[nADChan] = nADRes[nADChan] & 0xFFFC;
nADRes[nADChan] = nADRes[nADChan] | (ADC_LOW2 & 0x03);
nADChan++;
}while (nADChan < 4); // 檢查是否所有的通道都測量完畢,是則顯示
gnADData[0].Word += (INT32U)nADRes[0] * VREF / nADRes[3]; // 對通道1的測量值進行工程量轉(zhuǎn)換
gnADData[1].Word += (INT32U)nADRes[1] * VREF / nADRes[3]; // 對通道2的測量值進行工程量轉(zhuǎn)換
gnADData[2].Word += (INT32U)nADRes[2] * VREF / nADRes[3]; // 對通道3的測量值進行工程量轉(zhuǎn)換
}
for (i=0;i<3;i++) // 進行均值濾波處理
{
gnADData[i].Word /= FILTER;
if (nADRes[i] >= 2) // 對測量值進行微量調(diào)整
gnADData[i].Word += 2;
else if (nADRes[i] >= 1)
gnADData[i].Word += 1;
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: SaveBase
** 功能描述: 將三個測量通道的基準值寫入STC5408AD芯片內(nèi)部的EEPROM中。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gnBaseVal[]>>>>>>>>存放前三個測量通道的基準測量值。
** 全局常量:無
** 調(diào)用模塊: WriteBytes()>>>>>>>向STC5408AD芯片內(nèi)部的EEPROM中的指定地址處寫入指定個數(shù)的數(shù)據(jù)。
** 其它說明:每個通道的基準值均為16位無符號整數(shù),讀取時先讀低地址的高位字節(jié),再讀高地址的低位字節(jié),最后組
** 合成為一個16位無符號整數(shù)作為基準值。
**
** 作 者: 羅建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SaveBase(void)
{
WriteBytes(ADDR_BASE_VAL1, 2, gnBaseVal[0].Byte);
WriteBytes(ADDR_BASE_VAL2, 2, gnBaseVal[1].Byte);
WriteBytes(ADDR_BASE_VAL3, 2, gnBaseVal[2].Byte);
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: LoadBase
** 功能描述: 從STC5408AD芯片內(nèi)部的EEPROM中讀取三個測量通道的基準值。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gnBaseVal[]>>>>>>>>存放前三個測量通道的基準測量值。
** 全局常量:無
** 調(diào)用模塊: ReadBytes()>>>>>>>>從STC5408AD芯片內(nèi)部的EEPROM中的指定地址處讀取指定個數(shù)的數(shù)據(jù)至指定的緩沖區(qū)。
** 其它說明:每個通道的基準值均為16位無符號整數(shù),讀取時分成兩個字節(jié),低地址放高位字節(jié),高地址放低位字節(jié)。
**
** 作 者: 羅建
** 日 期: 2007年09月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LoadBase(void)
{
ReadBytes(ADDR_BASE_VAL1, 2, gnBaseVal[0].Byte);
ReadBytes(ADDR_BASE_VAL2, 2, gnBaseVal[1].Byte);
ReadBytes(ADDR_BASE_VAL3, 2, gnBaseVal[2].Byte);
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數(shù)名稱: DisLCD
** 功能描述: 將測試結(jié)果(減去基準值后)顯示在LCD上。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbClring>>>>>>>>>>>指示當前是否正處于清除LCD顯示狀態(tài),0~否,1~是;
** gbDisInfo>>>>>>>>>>指示當前是否正在顯示INFO字符信息,0~否,1~是;
** gnDisData[]>>>>>>>>存放要在LCD上顯示及要發(fā)送給PC的前三個測量通道及其平均值的測量數(shù)據(jù);
** gnLcdBuf[]>>>>>>>>>代表四組LCD顯示緩沖區(qū)內(nèi)容(如:2.35mm);
** gnADData[]>>>>>>>>>存放前三個測量通道的工程量結(jié)果;
** gnBaseVal[]>>>>>>>>存放前三個測量通道的基準測量值。
** 全局常量:無
** 調(diào)用模塊: DataToLCDBuf()>>>>>把一個整型數(shù)據(jù)按個、十、百進行分解,再轉(zhuǎn)換為對應(yīng)數(shù)字的ASCII碼存放到LCD顯
** 示緩沖區(qū)中;
** DisplayListChar()>>在LCD顯示屏的指定位置處顯示一串字符。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -