?? mcuunit.c
字號:
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SER_ISR(void) interrupt 4
{
if (RI)
RI = FALSE; // 允許下次接收數據
else if (TI)
{
TI = FALSE;
if (!gbIsTxHeadOK)
{
gbIsTxHeadOK = TRUE; // 幀頭已發送完畢
gnTxCnt = 0; // 準備發送數據
gnCrc = 0; // 準備計算校驗和
SBUF = 0xFF; // 發送第二個幀頭
}
else if (!gbIsTxDataOK)
{
if (gnTxCnt > 8) // 檢查數據是否發送完
{
gbIsTxDataOK = TRUE;
SBUF = gnCrc; // 發送校驗和
}
else
{
gnCrc = gnCrc^gnTxBuf[gnTxCnt]; // 計算校驗和
SBUF = gnTxBuf[gnTxCnt]; // 發送緩沖區中的數據
}
gnTxCnt++; // 準備發送下一個數據
}
else
gbIsTxBusyOK = FALSE; // 串口發送緩沖區處于空閑狀態
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: SysInit
** 功能描述: 儀器上電時,對系統全局變量、特殊功能寄存器、定時器、串行口及中斷進行初始化。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gnKeyCnt>>>>>>>>>>>按鍵檢測間隔計數器;
** gnADData[]>>>>>>>>>存放前三個測量通道及其平均值的工程量結果;
** gnLcdBuf[]>>>>>>>>>LCD顯示緩沖區。
** 全局常量:無
** 調用模塊: 無
** 其它說明:無
**
** 作 者: 羅建
** 日 期: 2007年06月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月03日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月05日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年09月20日(P3.2=OUT1、P3.3=OUT2默認設為高電平)
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SysInit(void)
{
INT8U i;
P3 = 0x0F; // TXD和RXD必須先設為高電平才能正常通訊
gnKeyCnt = KEY_WAIT;
/* LCD顯示緩沖區初始化 */
for (i=0;i<4;i++)
{
gnLcdBuf[i][0] = ' '; // 空格
gnLcdBuf[i][2] = '.'; // 小數點
gnLcdBuf[i][5] = 'm'; // 單位:mm
gnLcdBuf[i][6] = 'm'; // 單位:mm
gnLcdBuf[i][7] = ' '; // 空格
gnADData[i].Word = 0; // 清零
}
/* 配置ADC模塊 */
P1M0 = 0x0F; // P1.0~P1.3作為ADC輸入(開漏),P1.4~P1.7作為通用IO(準雙向口)
P1M1 = 0x0F;
ADC_CONTR = 0x80; // 打開ADC電源,每通道轉換速度約為12KHz(約80us)
/* 配置串行通訊口 */
/***************************************************************
PCON地址為 ,復位值為
SMOD --- --- --- GF1 GF0 PD IDL 16進制值
0 0 0 0 0 0 0 0 0x00
****************************************************************
SCON地址為 ,復位值為
SM0 SM1 SM2 REN TB8 RB8 TI RI 16進制值
0 1 0 0 0 0 0 0 0x40
***************************************************************/
PCON = 0x00; // SMOD=1,如果SMOD=0,則波特率將減半
SCON = 0x40; // 串行口工作于方式1,10位異步收發,允許接收
/* 配置T0和T1 */
/***************************************************************
TMOD地址為89H,設定值為
GATE1 C/T1 M1 M0 GATE0 C/T0 M1 M0 16進制值
0 0 1 0 0 0 0 1 0x21
****************************************************************
AUXR地址為8EH,設定值為
T0x12 T1x12 UART_M0x6 EADCI ESPI ELVDI - - 16進制值
0 0 0 0 0 0 0 0 0x00
****************************************************************
TCON地址為88H,設定值為
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 16進制值
0 1 0 1 0 0 0 0 0x50
****************************************************************
波特率計算
12T模式:Reload = 256 - INT(Fosc/Baud0/32/12 + 0.5);
1T模式: Reload = 256 - INT(Fosc/Baud0/32 + 0.5).
式中,INT()表示取整操作,即取消小數點,加0.5用于四舍五入;
Fosc為晶振頻率;
Baud0為標準波特率。
***************************************************************/
TH0 = T0_CONST / 256; // 設置T0定時初值(10ms)
TL0 = T0_CONST % 256;
TH1 = T1_CONST; // 設置T1定時初值(19200bps)
TL1 = T1_CONST;
AUXR = 0x00; // T0和T1采用12T模式
TMOD = 0x21; // 配置T0定時,T1自動重裝載為UART提供波特率
TCON = 0x50; // 啟動T0、T1定時
/* 配置中斷允許控制寄存器 */
/***************************************************************
IE地址為 ,復位值為
EA --- ET2 ES ET1 EX1 ET0 EX0 16進制值
1 0 0 1 0 0 1 0 0x92
***************************************************************/
IE = 0x92; // 開放相關中斷
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: main
** 功能描述: 主程序,負責檢測按鍵,并根據按鍵情況進行數據處理,同時將數據發送至PC。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbTimeOver>>>>>>>>>指示規定的定時間隔時間時否到,0~未到,1~已到;
** gbIsTxBusyOK>>>>>>>指示是否串口發送緩沖區處于忙狀態,0~否,1~是。
** 全局常量:LOGO[]>>>>>>>>>>>>>開機顯示在LCD屏上的兩行字符串。
** 調用模塊: SysInit()>>>>>>>>>>儀器上電初始化;
** LCDInit()>>>>>>>>>>LCD上電初始化;
** LoadBase()>>>>>>>>>從STC5408AD芯片內部的EEPROM中讀取三個測量通道的基準值;
** WriteCmdToLCD()>>>>向LCD顯示屏中寫入命令;
** DisplayListChar()>>在LCD顯示屏的指定位置處顯示一串字符;
** SendDataToPC()>>>>>通過RS-232串口發送測量數據到上位機;
** DoneKey()>>>>>>>>>>檢測用戶按鍵并處理。
** 其它說明:
**
** 作 者: 羅建
** 日 期: 2007年06月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月03日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月05日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年07月29日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年09月20日(將ADC過程集中到DoneKey子程序中進行處理,數據發送也是自發進行的,該版改變很大)
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void main(void)
{
bit bLogo; // 儀表在上電時,該標志為TRUE,指示當前正在顯示LOGO標志
INT16U nTimeCnt; // 代表LOGO信息顯示時間對應的系統定時間隔次數,默認為200,代表2秒
/* 初始化操作 */
SysInit(); // 初始化系統定時器等片內外設
LCDInit(); // 初始化LCD
LoadBase(); // 從EEPROM中載入基準測量值
/* LOGO顯示 */
DisplayListChar(0, 0, 16, LOGO[0]); // 顯示LOGO信息并保持3秒
DisplayListChar(0, 1, 16, LOGO[1]);
bLogo = TRUE;
nTimeCnt = LOGO_WAIT;
while (bLogo) // 檢查是否還處于LOGO信息顯示狀態
{
if (gbTimeOver) // T0每10ms定時一次
{
gbTimeOver = FALSE;
nTimeCnt--;
if (nTimeCnt == 0)
bLogo = FALSE;
}
}
/* 顯示清零 */
WriteCmdToLCD(0x01, TRUE); // 顯示清屏(2007.07.05,增加)
ClrLCD(); // 顯示0.00mm
/* 主程序循環 */
while (TRUE)
{
if (gbTimeOver) // 每隔10ms響應一次
{
gbTimeOver = FALSE;
DoneKey(); // 處理用戶按鍵操作
if (!gbIsTxBusyOK && !TI) // 待發送緩沖區空時,向PC發送一次數據
{
gbIsTxBusyOK = TRUE;
SendDataToPC();
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -