STC不同系列单片机的软串口位时间函数差异

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC不同系列单片机的软串口位时间函数差异相关的知识,希望对你有一定的参考价值。

STC不同系列单片机的软串口位时间函数差异


不同型号的单片机的运行速度是不一样的,所以在库函数当中,的位处理时间也是存在差异的。

  • STC8系列库函数官方下载地址:http://www.stcmcudata.com/STC8F-DATASHEET/STC8G-STC8H-LIB-DEMO-CODE-20220509.zip
    -STC15系列库函数V1.0: http://www.stcmcudata.com/STC-LIB/STC15-SOFTWARE-LIB-V1.0.rar

STC8系列给出的库函数

//========================================================================
// 函数: void	BitTime(void)
// 描述: 位时间函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 波特率:9600
//========================================================================
void	BitTime(void)

	u16 i;
	i = ((MAIN_Fosc / 100) * 138) / 130000L - 1;		//根据主时钟来计算位时间
	while(--i);

  • STC15系列库函数与例程测试版V2.0
//========================================================================
// 函数: void	BitTime(void)
// 描述: 位时间函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 波特率9600
//========================================================================
void	BitTime(void)

	u16 i;
	i = ((MAIN_Fosc / 100) * 104) / 130000L - 1;		//根据主时钟来计算位时间
	while(--i);

在没有使用定时器定时的情况下,这种方式是比较粗陋不准确的,如果在没有乱码输出的情况下,一旦确定相关参数想修改波特率是一件很麻烦的事情。这样的好处是可以节省一个定时器。

根据官方给的默认资料和示例,使用默认的波特率是没有什么问题的,包括是以9600的1/2被或2倍的倍率都没有问题,但是使用115200或其他倍率与i = ((MAIN_Fosc / 100) * 104) / 130000L - 1; 不整除的时候就会出现乱码问题。

另外一点要说明的是,如果你更换了编译器,那么这个参数又不一样了,Keil环境下编译的以及基于VSCode Plateform IO SDCC编译器编译的这个位处理函数中的参数也是不一样的。

波特率计算公式

/**1 个起始位,8 个数据位,无校验位,1 个停止位,
 * :8,N,1;8 个数据位,一个停止位,无校验位。
 * 波特率:9600,位宽度:8,停止位:1
 * 传输一个字节(8 位)的数据,在总线上产生 10 个电平变换,也就是串行总线上,需要 10 位,才能发送 1 个字节数据
 * 1 秒可以发送 9600 位,那么用 9600/10 ,就是1秒可以发送 960 个字节数据,
 * 则每发送一个字节需要的时间就是:1/960 ~= 0.00104166…s ~= 1.0416667 ms。
*/

  • 推导115200波特率的话位时间:1/11520 ~= 0.086805556ms。

实际调试中软串口,115200波特率的位处理时间函数

这里 i的值,经过修正后是4,而且还需要在while之后增加3个nop空指令,才能保证串口输出的内容不会出现乱码。

//========================================================================
// 函数: void	BitTime(void)
// 描述: 位时间函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0  11059200
// 日期: 2022-8-5
// 备注: 波特率 11520000
//========================================================================
void	BitTime2(void)

	u16 i;
	i = ((MAIN_Fosc / 100) * 9) / 130000L - 3;		//根据主时钟来计算位时间
// i = 4;
	while(--i);
	NOP3();

这个源码就不放了,在官方提供的库函数当中都有相关案例提供,只是在使用其他波特率时需要注意。

以上是关于STC不同系列单片机的软串口位时间函数差异的主要内容,如果未能解决你的问题,请参考以下文章

STC15单片机软串口的使用

STC15W408AS单片机通过ADC端口采集模拟量并从串口打印数值

STC单片机不同数据类型串口打印输出示例程序

STC15不同配置模式下的串口输出方式总结

STC15不同配置模式下的串口输出方式总结

STC15系列单片机通过串口多字节数据读写EEPROM操作