
你写的这个延时程序的反汇编代码如下:(使用keil
3反汇编),使用12MHZ晶振,每个机器周期占用1us,那么只循环一次总共用时为18us
C:0x0800
EF
MOV
A,R7
C:0x0801
4E
ORL
A,R6
C:0x0802
6009
JZ
C:080D
C:0x0804
00
NOP
C:0x0805
00
NOP
C:0x0806
EF
MOV
A,R7
C:0x0807
1F
DEC
R7
C:0x0808
70F6
JNZ
delay(C:0800)
C:0x080A
1E
DEC
R6
C:0x080B
80F3
SJMP
delay(C:0800)
C:0x080D
22
RET
在单片机C语言中加入NOP指令是因为标准的C语言中没有空语句。
但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。
这在汇编语言中很容易实现,写几个nop就行了。
在AVR-GCC中,如下方法嵌入汇编指令:
asm ("nop; nop; nop; nop;" ::);
在keil C51中,直接调用库函数:
#include// 声明了void _nop_(void);
_nop_();// 产生一条NOP指令
扩展资料
执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。实例:MOVLW 0xOF ;送OFH到W MOVWF PORT_B ;W内容写入B口 NOP ;空 *** 作 MOVF PORT_B,W 。
读 *** 作说明:该三条指令是一种对I/O口的B口连续 *** 作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入了空 *** 作指令NOP。
作用:对于延时很短的,要求在us级的,采用“_nop_ ”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。
对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
在选择C51中循环语句时,要注意以下几个问题:
第一、定义的C51中循环变量,尽量采用无符号字符型变量。
第二、在FOR循环语句中,尽量采用变量减减来做循环。
第三、在do,, while, while 语句中,循环体内变量也采用减减方法。
这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。
以上就是关于C51程序中有关NOP的延时小程序全部的内容,包括:C51程序中有关NOP的延时小程序、单片机汇编中为什么要用NOP、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)