• 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    根据官方给的默认资料和示例,使用默认的波特率是没有什么问题的,包括是以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。
    */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 推导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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

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

  • 相关阅读:
    《软件方法》第1章2023版连载(07)UML的历史和现状
    Spring(SpringBoot)--解决拦截器中注入Bean失败的问题
    软件设计师 软考 真题练习 (三)
    什么是高阶成分(HOC)?解释 React 中 render() 的目的?
    WRKY转录因子通过促进GhMKK2介导的类黄酮生物合成调节棉花对尖孢镰刀菌的抗性
    从-1开始实现一个中间件
    西工大 ASLP 实验室在 WeNet 中开源基于 CPPN 的神经网络热词增强语音识别方案
    正点原子嵌入式linux驱动开发——Linux蜂鸣器
    Pytorch C++ 前端第二部分:输入、权重和偏差
    从国产低代码龙头企业零赛云看零(低)代码在软件开发行业和工业企业的应用趋势
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/126202416