STC89C52RC单片机额外篇 05 - 把NOP指令封装成微秒级延时函数_i--相当于nop多少次

本文介绍了如何使用NOP指令在STC89C52RC单片机中创建不同微秒级别的延时函数。通过不同数量的NOP指令,实现了5us, 10us, 20us, 和50us的延时。作者还分享了个人的嵌入式开发经验,包括在大厂的工作经历,并提供了一份全面的《2024年嵌入式&物联网开发全套学习资料》来帮助开发者提升技能。" 103202754,8166133,MyBatis Plus的ActiveRecord模式实践,"['ORM框架', 'MyBatis框架', '数据库操作', 'Java开发']
摘要由CSDN通过智能技术生成
	i--;
}

if (i == 0) {
	return;
} else {
	i--;
}
...

}


给`delay`函数传递的`i`有多大,像这样的语句就有多少条:



if (i == 0) {
	return;
} else {
	i--;
}

所以注释中说`i=1`,大约延时`10us`完全是有可能的,那我们想实现精确性稍微好点的微秒级延时函数怎么办?


其实这块有很多大神已经帮我们封装好了,我们直接使用即可:


* 延时5us



void delay_5us(void)
{
#pragma ASM
NOP
#pragma ENDASM
}


这就是一个延时5us的函数,只需要在需要延时5us时调用此函数即可。从前面博文《[STC89C52RC单片机额外篇 | 04 - 认识头文件<intrins.h>与\_nop\_函数]( )》可知,`_nop_`函数的执行需要消耗一个机器周期,对于12MHz晶振,就是1us,`_nop_`函数与`NOP`指令是一样的。那为啥函数`delay_5us()`只有一条`NOP`指令就需要5us?


答案是:在调用此函数时,需要一个调用指令,此指令消耗2个周期(即2us);函数执行完毕时要返回主调函数,需要一个返回指令,此指令消耗2个周期(2us)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值