垂柳工作室 发表于 2024-3-3 22:58:48

STC89C52RC单片机微秒延时函数

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_();
}


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

晓飛飛 发表于 2024-3-3 23:38:55

函数调用的跳转和返回也需要指令周期,这个要算进去的

_奶咖君_ 发表于 2024-3-3 23:53:32

我记得有个大佬算执行时间是要看 汇编 的情况再计算,,,emmm

垂柳工作室 发表于 2024-3-4 08:59:09

我记得有个大佬算执行时间是要看 汇编 的情况再计算,,,emmm能否提供大咖教程的链接

kksk 发表于 2024-3-6 16:35:54



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



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

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

soma 发表于 2024-3-7 13:33:57

这个不是标准的空指令但是也没办法精准到1us晶振有误差

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

xxxevery 发表于 2024-4-2 18:57:28

软件延时不可能非常精确的,而且DS18B20对于延时精度也用不到1us,有个5us,10us误差问题都不大
页: [1]
查看完整版本: STC89C52RC单片机微秒延时函数