关于STC8单片机串口1、串口2、串口3、串口4的配置

串口1初始化配置:

void Uart1Init(void)	// [email protected]
{
	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)	// [email protected]
{
	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)	// [email protected]
{
	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)	// [email protected]
{
	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;           // 确保接收数据不超出数组长度
    }
}

你可能感兴趣的:(备忘录)