STC单片机波特率初值计算以及通用串口配置程序
- 🔖这里以STC15手册上的数据展开。
- 🔰串口模式一:可变波特率8位数据方式。以为最为常用的配置模式。
- 🌿定时器1模式0:16位定时器计数器
- 🌿定时器1模式2:8位定时器计数器
✨当然如果不需要深入了解计算,可以使用STC-ISP工具一键自动生成相对于的相关代码。但是看不到具体的参数时怎么计算得来的。
串口1工作模式
🛠串口 1 模式 1,模式 1 波特率计算公式:
- 🔧定时器 12T 模式2:8bit自动重装载的初值配置
TH1 = TL1 = 256 - (MAIN_Fosc / 12 / 32 / BAUD); //STC12/STC15/STC8 Set auto-reload vaule
- 🔧定时器 1T 模式2:8bit自动重装载的初值配置
TH1 = TL1 =256 -(MAIN_Fosc / 32 / BAUD); //STC12/STC15 1T Set auto-reload vaule
✨定时器运行速度选择1T还是12T绝对上面在计算波特率时,否则再除以12.
- 🔧定时器 12T 模式0:16bit自动重装载的初值配置
TL1 =(unsigned int)(65536 -(MAIN_Fosc /12/ 4 / BAUD)); ///STC15 1T Set 16bit auto-reload vaule
TH1 =(unsigned int)((65536 - (MAIN_Fosc/12/4/BAUD))>>8);///STC15 1T Set 16bit auto-reload vaule
- 🔧定时器 1T 模式0:16bit自动重装载的初值配置(STC12不在此计算范围内)
TL1 =(unsigned int)(65536 -(MAIN_Fosc / 4 / BAUD)); ///STC15 1T Set 16bit auto-reload vaule
TH1 =(unsigned int)((65536 - (MAIN_Fosc/4/BAUD))>>8);///STC15 1T Set 16bit auto-reload vaule
,🔖STC12单片机定时器1模式0为13位定时器/计数器.
- 🌿以下只适用于STC15、STC8
- 🔰针对STC12
- 由于用其他工作方式设置波特率计算方法较复杂,一般应用较少。
- 🔖针对STC12C5A60S2没有定时器2,但有独立的波特率发生器做串行通讯的波特率发生器,STC12尽量使用外部晶振源。
📝定时器1 模式2:8bit自动重装载,通用串口程序
-
🌿可以适用于STC12/STC15/STC8
-
- ⚡需要注意一点的是,对于STC15W408AS没有定时器1,不在此适用范围内。
-
✨以下是配置的是定时器1,12T速度,使用内部11.0592MHz,波特率:9600
/************************************************
* 文件描述 : Printf程序
* 芯 片 : STC12、STC15、STC8
* 时 钟 :11.0592MHz
************************************************/
#include <stdio.h>//用于printf打印
#include <STC12C5A60S2.H>
//#define MAIN_Fosc 48000000L //定义主时钟
//#define MAIN_Fosc 44236800L //定义主时钟
//#define MAIN_Fosc 40000000L //定义主时钟
//#define MAIN_Fosc 36864000L //定义主时钟
//#define MAIN_Fosc 35000000L //定义主时钟
//#define MAIN_Fosc 33177600L //定义主时钟
//#define MAIN_Fosc 30000000L //定义主时钟
//#define MAIN_Fosc 27000000L //定义主时钟
//#define MAIN_Fosc 24000000L //定义主时钟
//#define MAIN_Fosc 22118400L //定义主时钟
//#define MAIN_Fosc 20000000L //定义主时钟
//#define MAIN_Fosc 18432000L //定义主时钟
//#define MAIN_Fosc 12000000L //定义主时钟
#define MAIN_Fosc 11059200L //定义主时钟
//#define MAIN_Fosc 6000000L //定义主时钟
//#define MAIN_Fosc 5529600L //定义主时钟
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
#define BAUD 9600 //UART baudrate
bit busy;
//函数声明
void Uart1_Init(void);
void Uart1_SendChar(unsigned char dat);
void Delay_ms(unsigned int ms);
void main(void)
{
Uart1_Init();
Delay_ms(500);
while (1)
{
Delay_ms(1000);
printf("Hello World! \r\n");
}
}
/***********************************************
函数名称:Uart1_Init
功 能:串口1初始化函数
入口参数:无
返 回 值:无
************************************************/
void Uart1_Init(void)
{
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
// AUXR |= 0x40; //定时器时钟1T模式
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器1模式8bit自动重装载
TH1 = TL1 = 256 - (MAIN_Fosc / 12 / 32 / BAUD); //STC12/STC15/STC8 12T Set auto-reload vaule
// TH1 = TL1 =256 -(MAIN_Fosc / 32 / BAUD); //STC12/STC15 1T Set auto-reload vaule
TR1 = 1; //Timer1 start run
ET1 = 0; //禁止定时器中断
// ES = 1; //Enable UART interrupt
// EA = 1; //Open master interrupt switch
}
/***********************************************
*函数名称:Uart1_SendChar
*功 能:串口1发送单个字符函数
*入口参数:Udat:欲发送的数据
*返 回 值:无
*备 注:无
************************************************/
void Uart1_SendChar(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待前一个数据发送完成
TI = 0;//清除发送标志
}
/***********************************************
函数名称:printf重映射
功 能:串口1初始化函数
入口参数:无
返 回 值:无
************************************************/
char putchar(char dat)
{
Uart1_SendChar(dat);
return dat;
}
/*----------------------------
UART interrupt service routine
----------------------------*/
/*
void Uart_Isr() interrupt 4
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
busy = 0; //Clear transmit busy flag
}
}
*/
/***********************************************
函数名称:Delay_ms
功 能:STC 1T单片机1ms延时程序
入口参数:ms:延时的毫秒数
************************************************/
void Delay_ms(unsigned int ms) //注:ms_max=65536
{
unsigned int i;
do
{
// i=MAIN_Fosc/96000L; //STC89_12T
// i=MAIN_Fosc/48000L; //STC89_6T
i = MAIN_Fosc / 14000; //STC12
// i=MAIN_Fosc/13000; //STC15
// i=MAIN_Fosc/10000; //STC8
// i=MAIN_Fosc/6030; //STC32
while (--i);
}
while (--ms);
}
-
- ✨以下是配置的是定时器1,1T速度,使用内部11.0592MHz,波特率:9600
/************************************************
* 文件描述 : Printf程序
* 芯 片 : STC12C5A60S2
* 时 钟 :11.0592MHz
************************************************/
#include <stdio.h>//用于printf打印
#include <STC12C5A60S2.H>
//#define MAIN_Fosc 48000000L //定义主时钟
//#define MAIN_Fosc 44236800L //定义主时钟
//#define MAIN_Fosc 40000000L //定义主时钟
//#define MAIN_Fosc 36864000L //定义主时钟
//#define MAIN_Fosc 35000000L //定义主时钟
//#define MAIN_Fosc 33177600L //定义主时钟
//#define MAIN_Fosc 30000000L //定义主时钟
//#define MAIN_Fosc 27000000L //定义主时钟
//#define MAIN_Fosc 24000000L //定义主时钟
//#define MAIN_Fosc 22118400L //定义主时钟
//#define MAIN_Fosc 20000000L //定义主时钟
//#define MAIN_Fosc 18432000L //定义主时钟
//#define MAIN_Fosc 12000000L //定义主时钟
#define MAIN_Fosc 11059200L //定义主时钟
//#define MAIN_Fosc 6000000L //定义主时钟
//#define MAIN_Fosc 5529600L //定义主时钟
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
#define BAUD 9600 //UART baudrate
bit busy;
//函数声明
void Uart1_Init(void);
void Uart1_SendChar(unsigned char dat);
void Delay_ms(unsigned int ms);
void main(void)
{
Uart1_Init();
Delay_ms(500); //等待上电稳定
// printf("AT24C02 Read success! \r\n");
// Uart1_SendChar();
while (1)
{
Delay_ms(1000);
printf("Hello World! \r\n");
}
}
/***********************************************
函数名称:Uart1_Init
功 能:串口1初始化函数
入口参数:无
返 回 值:无
************************************************/
void Uart1_Init(void)
{
SCON = 0x50; //8位数据,可变波特率
// AUXR &= 0xBF; //定时器时钟12T模式
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器1模式8bit自动重装载
// TH1 = TL1 = 256 - (MAIN_Fosc / 12 / 32 / BAUD); //STC12/STC15/STC8 12T Set auto-reload vaule
TH1 = TL1 =256 -(MAIN_Fosc / 32 / BAUD); //STC12/STC15 1T Set auto-reload vaule
TR1 = 1; //Timer1 start run
ET1 = 0; //禁止定时器中断
// ES = 1; //Enable UART interrupt
// EA = 1; //Open master interrupt switch
}
/***********************************************
*函数名称:Uart1_SendChar
*功 能:串口1发送单个字符函数
*入口参数:Udat:欲发送的数据
*返 回 值:无
*备 注:无
************************************************/
void Uart1_SendChar(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待前一个数据发送完成
TI = 0;//清除发送标志
}
/***********************************************
函数名称:printf重映射
功 能:串口1初始化函数
入口参数:无
返 回 值:无
************************************************/
char putchar(char dat)
{
Uart1_SendChar(dat);
return dat;
}
/*----------------------------
UART interrupt service routine
----------------------------*/
/*
void Uart_Isr() interrupt 4
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
busy = 0; //Clear transmit busy flag
}
}
*/
/***********************************************
函数名称:Delay_ms
功 能:STC 1T单片机1ms延时程序
入口参数:ms:延时的毫秒数
************************************************/
void Delay_ms(unsigned int ms) //注:ms_max=65536
{
unsigned int i;
do
{
// i=MAIN_Fosc/96000L; //STC89_12T
// i=MAIN_Fosc/48000L; //STC89_6T
i = MAIN_Fosc / 14000; //STC12
// i=MAIN_Fosc/13000; //STC15
// i=MAIN_Fosc/10000; //STC8
// i=MAIN_Fosc/6030; //STC32
while (--i);
}
while (--ms);
}
定时器1 模式0 1T STC15、STC8通用串口程序(不适用于STC12)
/************************************************
* 文件描述 : Printf程序
* 芯 片 : STC12C5A60S2
* 时 钟 :11.0592MHz
************************************************/
#include <stdio.h>//用于printf打印
#include <STC12C5A60S2.H>
//#define MAIN_Fosc 48000000L //定义主时钟
//#define MAIN_Fosc 44236800L //定义主时钟
//#define MAIN_Fosc 40000000L //定义主时钟
//#define MAIN_Fosc 36864000L //定义主时钟
//#define MAIN_Fosc 35000000L //定义主时钟
//#define MAIN_Fosc 33177600L //定义主时钟
//#define MAIN_Fosc 30000000L //定义主时钟
//#define MAIN_Fosc 27000000L //定义主时钟
//#define MAIN_Fosc 24000000L //定义主时钟
//#define MAIN_Fosc 22118400L //定义主时钟
//#define MAIN_Fosc 20000000L //定义主时钟
//#define MAIN_Fosc 18432000L //定义主时钟
//#define MAIN_Fosc 12000000L //定义主时钟
#define MAIN_Fosc 11059200L //定义主时钟
//#define MAIN_Fosc 6000000L //定义主时钟
//#define MAIN_Fosc 5529600L //定义主时钟
sfr T2H = 0xD6; //0000,0000 T2高字节
sfr T2L = 0xD7; //0000,0000 T2低字节
#define BAUD 115200 //UART baudrate
//函数声明
void Uart1_Init(void);
void Uart1_SendChar(unsigned char dat);
void Delay_ms(unsigned int ms);
void main(void)
{
Uart1_Init();
Delay_ms(500); //等待上电稳定
while (1)
{
Delay_ms(1000);
printf("Hello World! \r\n");
}
}
/***********************************************
函数名称:Uart1_Init
功 能:串口1初始化函数
入口参数:无
返 回 值:无
************************************************/
void Uart1_Init(void)
{
SCON = 0x50; //8位数据,可变波特率
// AUXR &= 0xBF; //定时器时钟12T模式
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
// TMOD &= 0x0F; //设置定时器模式
// TMOD |= 0x20; //设置定时器1模式2:8bit自动重装载
TMOD &= 0x0F; //设置定时器模式0:16位自动重载模式
// TH1 = TL1 = 256 - (MAIN_Fosc / 12 / 32 / BAUD); //STC12/STC15/STC8 12T Set 8bit auto-reload vaule
// TH1 = TL1 =256 -(MAIN_Fosc / 32 / BAUD); //STC12/STC15 1T Set 8bit auto-reload vaule
TL1 =(unsigned int)(65536 -(MAIN_Fosc / 4 / BAUD)); ///STC15 1T Set 16bit auto-reload vaule
TH1 =(unsigned int)((65536 - (MAIN_Fosc/4/BAUD))>>8);///STC15 1T Set 16bit auto-reload vaule
TR1 = 1; //Timer1 start run
ET1 = 0; //禁止定时器中断
// ES = 1; //Enable UART interrupt
// EA = 1; //Open master interrupt switch
}
/***********************************************
*函数名称:Uart1_SendChar
*功 能:串口1发送单个字符函数
*入口参数:Udat:欲发送的数据
*返 回 值:无
*备 注:无
************************************************/
void Uart1_SendChar(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待前一个数据发送完成
TI = 0;//清除发送标志
}
/***********************************************
函数名称:printf重映射
功 能:串口1初始化函数
入口参数:无
返 回 值:无
************************************************/
char putchar(char dat)
{
Uart1_SendChar(dat);
return dat;
}
/*----------------------------
UART interrupt service routine
----------------------------*/
/*
void Uart_Isr() interrupt 4
{
if (RI)
{
RI = 0; //Clear receive interrupt flag
}
if (TI)
{
TI = 0; //Clear transmit interrupt flag
busy = 0; //Clear transmit busy flag
}
}
*/
/***********************************************
函数名称:Delay_ms
功 能:STC 1T单片机1ms延时程序
入口参数:ms:延时的毫秒数
************************************************/
void Delay_ms(unsigned int ms) //注:ms_max=65536
{
unsigned int i;
do
{
// i=MAIN_Fosc/96000L; //STC89_12T
// i=MAIN_Fosc/48000L; //STC89_6T
i = MAIN_Fosc / 14000; //STC12
// i=MAIN_Fosc/13000; //STC15
// i=MAIN_Fosc/10000; //STC8
// i=MAIN_Fosc/6030; //STC32
while (--i);
}
while (--ms);
}