Bootstrap

51单片机STC8G串口Uart配置

测试环境

单片机型号:STC8G1K08-38I-TSSOP20,其他型号请自行测试;
IDE:KEIL C51;

寄存器配置及主要代码

STC8G系列单片机具有4个全双工异步串行通信接口;本文以串口1为例,串口1有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用;
串口相关寄存器如下表所示,其中红框中的是串口1需要配置的寄存器;
在这里插入图片描述其中,SCON寄存器详细介绍如下,因为我们需要可随意配置的波特率,所以SM0及SM1位需要按照红框中的配置,配置为模式1;其他位为与中断相关,可根据需要配置;
在这里插入图片描述
寄存器PCON和AXUR介绍如下,我们选择定时器2位波特率发生器,波特率不加倍;
在这里插入图片描述
串口1模式1的波特率计算公式如下表,选择定时器2,1T模式,确定好波特率后,可根据红框中的公式计算出定时器的重载值;
例如,时钟频率为22.1184MHz,波特率位19200,则定时器重载值=65536-22118400/(4*19200)=65248,即0xFEE0,将值赋给定时器2的T2H、T2L;
在这里插入图片描述
另外,需要注意的是,定时器的1T或12T模式,通过AUXR寄存器设置;定时器配置可参考51单片机定时器中断配置
综上,可写出串口1初始化配置的程序如下:

#define FOSC     							22118400L//时钟频率
#define UART1_BAUD_RATE						19200//波特率

/*******************************************************************************
  * 函数名:Uart1_Init
  * 功  能:Uart1初始化
  * 参  数:无
  * 返回值:无
  * 说  明:定时器2为波特率发生器
*******************************************************************************/
void Uart1_Init(void)
{
	uint16_t u16Reload = 0;//重装值
	SCON |= 0x50;//模式1,可变波特率8位数据,允许接收
	PCON &= 0x7F;//串口1波特率不加倍,SMOD=0
	AUXR |= 0x01;//定时器2为波特率发生器
	AUXR |= 0x14;//定时器2开始运行,1T模式
		
	//定时器2初值,自动重载
	u16Reload = (uint16_t)((uint32_t)65536 - (uint32_t)FOSC / ( 4 * (uint32_t)UART1_BAUD_RATE));
	T2H = (uint8_t)(u16Reload >> 8);
	T2L = (uint8_t)(u16Reload >> 0);
		
	//串口1中断优先级2,较高级
	IP &= 0xEF;//PS=0
	IPH |= 0x10;//PSH=1	
	
	TI = 0;//串口1发送中断请求标志
}

另外,如果需要在串口中断里接收处或发送数据,需要用到串口中断服务函数,先查询芯片手册中中断列表,Uart1的中断序号为4:
在这里插入图片描述可在接收中断RI时,读取数据寄存器SBUF即可得到串口接收的数据,在发送中断TI时,对SBUF进行写操作即可,代码如下:

/*******************************************************************************
  * 函数名:UART1_Isr() interrupt 4
  * 功  能:Uart1中断服务子函数
  * 参  数:无
  * 返回值:无
  * 说  明:无
*******************************************************************************/
void UART1_Isr(void) interrupt 4
{
    if (TI)
    {
        TI = 0;//清中断标志
        //SUBF = data;//将要发送的数据放入SBUF中
        //do something
    }
    if (RI)
    {
        RI = 0;//清中断标志
        //data = SBUF;//读取SBUF中的数据
        //do something
    }
}
;