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

STC89C52RC单片机微秒延时函数

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2025-05-01 08:48:18

24

主题

108

回帖

448

积分

中级会员

积分
448
发表于 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_();  
}


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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2025-05-01 08:48:18

24

主题

108

回帖

448

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-03-09 19:40:01

9

主题

328

回帖

4501

积分

荣誉版主

积分
4501
发表于 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代码查看汇编代码以更好地理解这一过程。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:337
  • 最近打卡:2025-04-28 12:55:00

23

主题

296

回帖

1160

积分

金牌会员

积分
1160
发表于 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_();
   
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-04-30 00:26:42

0

主题

336

回帖

1490

积分

金牌会员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:16 , Processed in 0.160271 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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