东莞微联建站,淘宝网页模板免费下载,咸宁网站建设解决方案,广告招牌设计效果图测试环境
单片机型号#xff1a;STC8G1K08-38I-TSSOP20#xff0c;其他型号请自行测试#xff1b; IDE#xff1a;KEIL C51#xff1b;
寄存器配置及主要代码
STC8G系列单片机具有4个全双工异步串行通信接口#xff1b;本文以串口1为例#xff0c;串口1有4种工作方式…测试环境
单片机型号STC8G1K08-38I-TSSOP20其他型号请自行测试 IDEKEIL C51
寄存器配置及主要代码
STC8G系列单片机具有4个全双工异步串行通信接口本文以串口1为例串口1有4种工作方式其中两种方式的波特率是可变的另两种是固定的以供不同应用场合选用 串口相关寄存器如下表所示其中红框中的是串口1需要配置的寄存器 其中SCON寄存器详细介绍如下因为我们需要可随意配置的波特率所以SM0及SM1位需要按照红框中的配置配置为模式1其他位为与中断相关可根据需要配置 寄存器PCON和AXUR介绍如下我们选择定时器2位波特率发生器波特率不加倍 串口1模式1的波特率计算公式如下表选择定时器21T模式确定好波特率后可根据红框中的公式计算出定时器的重载值 例如时钟频率为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波特率不加倍,SMOD0AUXR | 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;//PS0IPH | 0x10;//PSH1 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}
}