C51程序中有关NOP的延时小程序

C51程序中有关NOP的延时小程序,第1张

你写的这个延时程序的反汇编代码如下:(使用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、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9479632.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存