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

您所在的位置:网站首页 计算初值 STC单片机波特率初值计算以及通用串口配置程序

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

2023-04-19 03:18| 来源: 网络整理| 查看: 265

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 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 在这里插入图片描述🔰针对STC12 在这里插入图片描述 由于用其他工作方式设置波特率计算方法较复杂,一般应用较少。🔖针对STC12C5A60S2没有定时器2,但有独立的波特率发生器做串行通讯的波特率发生器,STC12尽量使用外部晶振源。 在这里插入图片描述 在这里插入图片描述 📝定时器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 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 //用于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 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 //用于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 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); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3