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

STC89C52RC单片机微秒延时函数

[复制链接]
  • TA的每日心情
    难过
    昨天 00:10
  • 签到天数: 102 天

    [LV.6]常住居民II

    11

    主题

    69

    回帖

    235

    积分

    中级会员

    积分
    235
    发表于 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的每日心情
    开心
    1 小时前
  • 签到天数: 100 天

    [LV.6]常住居民II

    14

    主题

    389

    回帖

    942

    积分

    荣誉版主

    热心市民

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

    使用道具 举报

  • TA的每日心情
    慵懒
    6 小时前
  • 签到天数: 142 天

    [LV.7]常住居民III

    20

    主题

    1084

    回帖

    2581

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    难过
    昨天 00:10
  • 签到天数: 102 天

    [LV.6]常住居民II

    11

    主题

    69

    回帖

    235

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:20
  • 签到天数: 161 天

    [LV.7]常住居民III

    9

    主题

    309

    回帖

    3775

    积分

    荣誉版主

    积分
    3775
    发表于 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 小时前
  • 签到天数: 73 天

    [LV.6]常住居民II

    3

    主题

    627

    回帖

    950

    积分

    高级会员

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

    使用道具 举报

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

    [LV.6]常住居民II

    6

    主题

    141

    回帖

    369

    积分

    中级会员

    积分
    369
    发表于 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的每日心情
    奋斗
    3 小时前
  • 签到天数: 72 天

    [LV.6]常住居民II

    0

    主题

    209

    回帖

    468

    积分

    中级会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-17 14:55 , Processed in 0.070339 second(s), 59 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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