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

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


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

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

串口1工作模式

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

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

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

  • 定时器 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
    STC单片机波特率初值计算以及通用串口配置程序_第3张图片
  • 针对STC12
    STC单片机波特率初值计算以及通用串口配置程序_第4张图片
  • 由于用其他工作方式设置波特率计算方法较复杂,一般应用较少。
  • 针对STC12C5A60S2没有定时器2,但有独立的波特率发生器做串行通讯的波特率发生器,STC12尽量使用外部晶振源。
    STC单片机波特率初值计算以及通用串口配置程序_第5张图片
    STC单片机波特率初值计算以及通用串口配置程序_第6张图片

定时器1 模式2:8bit自动重装载,通用串口程序

  • 可以适用于STC12/STC15/STC8

    • ⚡需要注意一点的是,对于STC15W408AS没有定时器1,不在此适用范围内。
  • ✨以下是配置的是定时器1,12T速度,使用内部11.0592MHz,波特率:9600

/************************************************
 * 文件描述     : Printf程序
 * 芯    片     : STC12、STC15、STC8
 * 时    钟       :11.0592MHz
 ************************************************/

#include //用于printf打印
#include 

//#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 //用于printf打印
#include 

//#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 //用于printf打印
#include 

//#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);
}


你可能感兴趣的:(#,STC12系列,#,STC15系列,波特率配置)