?? src.c
字號:
#define OSC_FREQ 22118400L
//*note: when using the 8051RD2 (in 6 clk instructiion cycle,
// use a crystal that is half the value state in OSC_FREQ.
// Example: for OSC_FREQ=22118400, use 11059000 crystal.
#define BAUD_CNT 7
#define BAUD_115200 256 - (OSC_FREQ/192L)/115200L // 255
#define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254
#define BAUD_38400 256 - (OSC_FREQ/192L)/38400L // 253
#define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 252
#define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 250
#define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 248
#define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 244
#ifdef __SRC
uchar code BaudRateTable[BAUD_CNT] = {
BAUD_115200,
BAUD_57600,
BAUD_38400,
BAUD_28800,
BAUD_19200,
BAUD_14400,
BAUD_9600
};
#else
extern uchar code BaudRateTable[BAUD_CNT];
#endif
#ifdef __SRC
uint code CmpTable[BAUD_CNT + 1] = {
0x078,
0x095,
0x129,
0x1BD,
0x252,
0x37A,
0x4A3,
0x6F4
};
#else
extern uint code CmpTable[BAUD_CNT + 1];
#endif
void auto_baud (void)
{
if (autoBaud && !RXD) // if autobaud is enable and RXD pin is low
{
TR0 = TRUE; // Start timer0
do
{
if (RXD) // When RXD pin is high
{
Capt_L = TL0;
Capt_H = TH0;
do
{
if (!RXD)
{
break;
}
} while (!TF0);
}
} while (!TF0);
TR0 = FALSE;
TF0 = FALSE;
Capt = ((uint)Capt_H << 5) | ((uint)Capt_L & 0x001F);
for (BaudRate = BAUD_CNT; BaudRate >= 0; BaudRate--)
{
if (Capt >= CmpTable[BaudRate])
{
break;
}
}
if (BaudRate < 0 || BaudRate == BAUD_CNT) // Error baud count
{
TH0 = 0;
TL0 = 0;
Capt_L = 0;
Capt_H = 0;
return;
}
TMOD = 0x21; // Timer 0, mode 1, 16-bit counter
TH1 = BaudRateTable[BaudRate];
TL1 = TH1;
TR1 = TRUE;
TH0 = 0xE0;
TL0 = 0;
TR0 = TRUE;
while (!TF0); // Wait 4.4 ms
TR0 = FALSE;
TF0 = FALSE;
ET0 = TRUE;
autoBaud = FALSE; // Baudrate had been choose, disable autobaud
SBUF = NAK;
while (!TI);
TI = FALSE;
RI = FALSE;
ES = TRUE;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -