找回密码
 立即注册
查看: 158|回复: 7

STC89C52RC单片机微秒延时函数

[复制链接]
  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    11

    主题

    68

    回帖

    179

    积分

    注册会员

    积分
    179
    发表于 2024-3-3 22:58:48 | 显示全部楼层 |阅读模式
    STC89C52RC单片机微秒延时函数
    用STC-ISP工具软件延时计算器没法为STC89C52RC计算1微秒延时(@12.000MHz)
    在STC-Y1指令集基础上,用工具软件计算5微秒和6微秒延时函数:
    void Delay5us(void)        //@12.000MHz
    {
            _nop_();
    }


    5微秒函数体内只有一句_nop_();!


    void Delay6us(void)        //@11.0592MHz
    {
            _nop_();
            _nop_();
    }
    6微秒函数体内多一句_nop_();


    看样子_nop_();语句耗时1微秒。函数体耗时4微秒。
    如此,我们在STC89C52RC单片机写ds18b20测温代码时,可以借用_nop_()语句自定义常用微秒级延时函数集myDelay.h进行调用,写延时函数集时要引用头文件​​<intrins.h>​
    void mydelay_5us(void)
    {
      _nop_();  
    }


    void mydelay_10us(void)
    {
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
    }


    void mydelay_15us(void)
    {
      mydelay_10us();
      _nop_();  
    }


    void mydelay_60us(void)
    {
      mydelay_15us();
      mydelay_15us();
      mydelay_15us();
      mydelay_10us();
      _nop_();  
    }


    不知是否正确,请大咖斧正,或者指引更好的方法

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    18 小时前
  • 签到天数: 85 天

    [LV.6]常住居民II

    13

    主题

    325

    回帖

    740

    积分

    荣誉版主

    热心市民

    积分
    740
    发表于 2024-3-3 23:38:55 | 显示全部楼层
    函数调用的跳转和返回也需要指令周期,这个要算进去的
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 08:41
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

    积分
    2459
    发表于 2024-3-3 23:53:32 | 显示全部楼层
    我记得有个大佬算执行时间是要看 汇编 的情况再计算,,,emmm
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 89 天

    [LV.6]常住居民II

    11

    主题

    68

    回帖

    179

    积分

    注册会员

    积分
    179
     楼主| 发表于 2024-3-4 08:59:09 | 显示全部楼层
    我记得有个大佬算执行时间是要看 汇编 的情况再计算,,,emmm
    能否提供大咖教程的链接
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:39
  • 签到天数: 151 天

    [LV.7]常住居民III

    9

    主题

    305

    回帖

    3725

    积分

    荣誉版主

    积分
    3725
    发表于 2024-3-6 16:35:54 | 显示全部楼层


    用STC-ISP工具软件延时计算器没法为STC89C52RC计算1微秒延时(@12.000MHz)
    检查你的STC-ISP版本,6.93版是可以做到的
    Screenshot_20240306_161613.png


    你的分析是合理的。
    STC-Y1是12T单片机,也就是在12MHz时钟频率下一条指令最短(12 clk)需要1us。
    查指令集表可知NOP指令需要12个时钟周期,也就是1us。你推断的_nop_()时间与实际一致。
    你关于函数的推断也没有问题。调用函数时,会执行耗时24个时钟周期的acall或lcall指令,随后执行函数内的指令,结束后再调用ret指令返回调用前的下一条指令。所以刚好进出函数耗时48个时钟周期,也就是4us。
    所以你这几个代码块应该都能正确地延时指定时间。

    当然你也可以使用STC-ISP内置的软件延时计算器生成相应代码。你可以选择生成ASM代码查看汇编代码以更好地理解这一过程。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    9 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    3

    主题

    539

    回帖

    714

    积分

    高级会员

    积分
    714
    发表于 2024-3-7 13:33:57 来自手机 | 显示全部楼层
    这个不是标准的空指令但是也没办法精准到1us晶振有误差
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    4

    主题

    129

    回帖

    279

    积分

    中级会员

    积分
    279
    发表于 2024-4-2 16:12:12 | 显示全部楼层
    可以选择20us,STC-ISP生成的语句中会有i=x,while(--i)这样的语句,

    你可以删掉这个函数调用和nop,这个大概5uS,剩下的就是i=x,while(--i),这个代码就是15uS

    void Delay (void)        //@12.000MHz
    {
            _nop_();
       
    }

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    18 小时前
  • 签到天数: 57 天

    [LV.5]常住居民I

    0

    主题

    182

    回帖

    354

    积分

    中级会员

    积分
    354
    发表于 2024-4-2 18:57:28 | 显示全部楼层
    软件延时不可能非常精确的,而且DS18B20对于延时精度也用不到1us,有个5us,10us误差问题都不大
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-2 18:30 , Processed in 0.064852 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表