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
编译器编译的这个位处理函数中的参数也是不一样的。
- 相关内容可以参考《【STC单片机】在不同编译环境下波特率位时间计算差异》
波特率计算公式
/**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不同系列单片机的软串口位时间函数差异的主要内容,如果未能解决你的问题,请参考以下文章