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_();
}
不知是否正确,请大咖斧正,或者指引更好的方法
函数调用的跳转和返回也需要指令周期,这个要算进去的 我记得有个大佬算执行时间是要看 汇编 的情况再计算,,,emmm 我记得有个大佬算执行时间是要看 汇编 的情况再计算,,,emmm能否提供大咖教程的链接
用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代码查看汇编代码以更好地理解这一过程。
这个不是标准的空指令但是也没办法精准到1us晶振有误差 可以选择20us,STC-ISP生成的语句中会有i=x,while(--i)这样的语句,
你可以删掉这个函数调用和nop,这个大概5uS,剩下的就是i=x,while(--i),这个代码就是15uS
void Delay (void) //@12.000MHz
{
_nop_();
}
软件延时不可能非常精确的,而且DS18B20对于延时精度也用不到1us,有个5us,10us误差问题都不大
页:
[1]