• 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

    在这里插入图片描述

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

  • 相关阅读:
    web课程设计【网页设计】期末大作业html+css(个人网站)
    【节前福利】国庆搞定Java面试!
    [Java Framework] [Spring] Spring Event / 事件的使用 一: ApplicationEvent
    11. 查询人数及其所占的百分比
    2023/9/12 -- C++/QT
    Leetcode 239 滑动窗口最大值
    rocketmq Listener 消费消息的优雅方式(基于SPEL)
    Jmeter接口自动化测试操作流程
    测试岗面试,一份好的简历总可以让人眼前一亮
    SLAM从入门到精通(用python实现机器人运动控制)
  • 原文地址:https://blog.csdn.net/weixin_42880082/article/details/126202416