> 文章列表 > STC单片机波特率初值计算以及通用串口配置程序

STC单片机波特率初值计算以及通用串口配置程序

STC单片机波特率初值计算以及通用串口配置程序

STC单片机波特率初值计算以及通用串口配置程序


  • 🔖这里以STC15手册上的数据展开。
  • 🔰串口模式一:可变波特率8位数据方式。以为最为常用的配置模式。
  • 🌿定时器1模式0:16位定时器计数器
  • 🌿定时器1模式2:8位定时器计数器

✨当然如果不需要深入了解计算,可以使用STC-ISP工具一键自动生成相对于的相关代码。但是看不到具体的参数时怎么计算得来的。

串口1工作模式

STC单片机波特率初值计算以及通用串口配置程序

🛠串口 1 模式 1,模式 1 波特率计算公式:

STC单片机波特率初值计算以及通用串口配置程序

  • 🔧定时器 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 vauleTH1 =(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 vauleTH1 =(unsigned int)((65536 - (MAIN_Fosc/4/BAUD))>>8);///STC15 1T Set 16bit auto-reload vaule

,🔖STC12单片机定时器1模式0为13位定时器/计数器.

  • 🌿以下只适用于STC15、STC8
    STC单片机波特率初值计算以及通用串口配置程序
  • 🔰针对STC12
    STC单片机波特率初值计算以及通用串口配置程序
  • 由于用其他工作方式设置波特率计算方法较复杂,一般应用较少。
  • 🔖针对STC12C5A60S2没有定时器2,但有独立的波特率发生器做串行通讯的波特率发生器,STC12尽量使用外部晶振源。
    STC单片机波特率初值计算以及通用串口配置程序
    STC单片机波特率初值计算以及通用串口配置程序

📝定时器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 vauleTR1 = 1;                //Timer1 start runET1 = 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 flagbusy = 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_6Ti = MAIN_Fosc / 14000;  //STC12
//  i=MAIN_Fosc/13000;     //STC15
//  i=MAIN_Fosc/10000;     //STC8
//  i=MAIN_Fosc/6030;     //STC32while (--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 vauleTH1 = TL1 =256 -(MAIN_Fosc /  32 / BAUD); //STC12/STC15 1T Set auto-reload vauleTR1 = 1;                //Timer1 start runET1 = 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 flagbusy = 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_6Ti = MAIN_Fosc / 14000;  //STC12
//  i=MAIN_Fosc/13000;     //STC15
//  i=MAIN_Fosc/10000;     //STC8
//  i=MAIN_Fosc/6030;     //STC32while (--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 vauleTL1 =(unsigned int)(65536 -(MAIN_Fosc / 4 / BAUD)); ///STC15 1T Set 16bit auto-reload vauleTH1 =(unsigned int)((65536 - (MAIN_Fosc/4/BAUD))>>8);///STC15 1T Set 16bit auto-reload vauleTR1 = 1;                //Timer1 start runET1 = 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 flagbusy = 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_6Ti = MAIN_Fosc / 14000;  //STC12
//  i=MAIN_Fosc/13000;     //STC15
//  i=MAIN_Fosc/10000;     //STC8
//  i=MAIN_Fosc/6030;     //STC32while (--i);}while (--ms);
}