测试环境
单片机型号: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
}
}