串口1初始化配置:
void Uart1Init(void) // 9600bps@12.000MHz
{
SCON = 0x50; // 8位數據,可變波特率
AUXR |= 0x40; // 定時器1時鐘為Fosc,即1T
AUXR &= 0xFE; // 串口1選擇定時器1為波特率發生器
TMOD &= 0x0F; // 設定定時器1為16位自動重裝方式
TL1 = 0xC7; // 設定定時初值
TH1 = 0xFE; // 設定定時初值
ET1 = 0; // 禁止定時器1中斷
TR1 = 1; // 啟動定時器1
ES = 1; // 開串口中斷
EA = 1; // 開總中斷
}
串口2初始化配置:
void Uart2Init(void) // 9600bps@12.000MHz
{
S2CON = 0x50; // 8位數據,可變波特率
AUXR |= 0x04; // 定時器2時鐘為Fosc,即1T
T2L = 0xC7; // 65536-12000000/9600/4 = FEC7H
T2H = 0xFE; // 設定定時初值
AUXR |= 0x10; // 啟動定時器2
IE2 = ES2; // 使能串口中斷
EA = 1; // 開總中斷
}
串口3初始化配置:
void Uart3Init(void) // 9600bps@12.000MHz
{
S3CON = 0x10; // 8位數據,可變波特率
S3CON &= 0xBF; // 串口3選擇定時器2為波特率發生器
AUXR |= 0x04; // 定時器2時鐘為Fosc,即1T
T2L = 0xC7; // 65536-12000000/9600/4=FEC7H
T2H = 0xFE; // 設定定時初值
AUXR |= 0x10; // 啟動定時器2
IE2 = ES3; // 使能串口中斷
EA = 1; // 開總中斷
}
串口4初始化配置:
void Uart4Init(void) // 9600bps@12.000MHz
{
S4CON = 0x10; // 8位數據,可變波特率
S4CON &= 0xBF; // 串口4選擇定時器2為波特率發生器
AUXR |= 0x04; // 定時器2時鐘為Fosc,即1T
T2L = 0xC7; // 65536-12000000/9600/4=FEC7H
T2H = 0xFE; // 設定定時初值
AUXR |= 0x10; // 啟動定時器2
IE2 = ES4; // 使能串口中斷
EA = 1; // 開總中斷
}
主函數:
void main()
{
UartXInit(); // 串口X初始化
busy = 0; // 發送標志位
while (1)
{
if(rptr != wptr) // 將接收到的數據發送出去
{
UartXSend(buffer[rptr++]);
rptr &= 0x0f;
}
}
}
發送函數:
void UartXSend(char dat)
{
while (busy); // 當busy=0時,跳出循環,表示可以發送數據了
busy = 1; // 發送標志置1,為下次發送做準備
SXBUF = dat; // 開始發送字節 (SXBUF = SBUF、S2BUF、S3BUF、S4BUF)
}
中斷函數:
void UART1_Isr() interrupt 4 using 1
{
if (TI) // 發送中斷標志位判斷
{
TI = 0; // 清中斷標志
busy = 0; // 發送標志位置0,表示滿足發送條件
LED0 = !LED0; // 測試端口
}
if (RI) // 接收中斷標志位判斷
{
RI = 0; // 清中斷標志
LED1 = !LED1; // 測試端口
buffer[wptr++] = SBUF;
wptr &= 0x0f;
}
}
void UART2_Isr() interrupt 8 using 1
{
if (S2CON & 0x02) // 發送中斷標志判斷
{
S2CON &= ~0x02; // 清中斷標志
LED0 = !LED0; // 測試端口
busy = 0; // busy=0滿足發送條件
}
if (S2CON & 0x01) // 接收中斷標志判斷
{
S2CON &= ~0x01; // 清中斷標志
LED1 = !LED1; // 測試端口
buffer[wptr++] = S2BUF;
wptr &= 0x0f;
}
}
void UART3_Isr() interrupt 17 using 1
{
if (S3CON & S3TI) // 發送中斷標志位
{
S3CON &= ~S3TI; // 清中斷標志
LED0 = !LED0; // 測試端口
busy = 0;
}
if (S3CON & S3RI) // 接收中斷標志位
{
S3CON &= ~S3RI; // 清中斷標志
LED1 = !LED1; // 測試端口
buffer[wptr++] = S3BUF; // 接收數據
wptr &= 0x0f; // 確保接收數據不超出數組長度
}
}
void UART4_Isr() interrupt 18 using 1
{
if (S4CON & S4TI) // 發送中斷標志判斷
{
S4CON &= ~S4TI; // 清中斷標志
LED0 = !LED0; // 測試端口
busy = 0;
}
if (S4CON & S4RI) // 接收中斷標志判斷
{
S4CON &= ~S4RI; // 清中斷標志
LED1 = !LED1; // 測試端口
buffer[wptr++] = S4BUF; // 接收數據
wptr &= 0x0f; // 確保接收數據不超出數組長度
}
}
|