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