串口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; // 确保接收数据不超出数组长度
}
}
|