汇编子程序如何算延时时间

汇编子程序如何算延时时间,第1张

DELAY: MOV R2,#3H ;1个机器周期,执行1次

DJNZ R2,$ ;2个机器周期,执行3次

RET ;2个机器周期,执行1次

以上程序段共延时11+23+21=9个机器周期

同理,以下程序段也延时9个机器周期

DEL: MOV R3,#03H

DJNZ R3,$

RET

所以无论你调用DEL还是DELAY都是延时9个机器周期

如果机器周期不明白请查阅相关资料或直接补充

1、比较死板的方法是自己写一个delay函数,里面用for,while等做一些循环,下面是1ms的延时函数

void delay1ms(void)

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++);

}

具体算法是//(3j+2)i=(3×33+2)×10=1010(us),但精确度不高,如果想准确点可以调节相应的参数用示波器来实

现,上面的函数适用于程序简单,对时间性要求不高,如:点led灯,单个按键 *** 作等等。

2,就是用定时器中断里面设定标志位来产生延时的方法,比如你可以把定时器设定为每1ms进一次中断,在中断里面

把一个标志位(如flag)置一

当你需要1ms延时的时候你可以先初始化定时器,然后查询标志位是否置一,置一则执行if后面的语句,即if(fla{};

当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++;外面查询用if(10==flag){};

以此类推,上面的方法精确度高适用地方。

;用汇编代码设计程序,完成8个LED灯的循环闪烁:

;LED1亮,其余灭->LED2亮,其余灭……,如此循环5次后,

;进行全灭->全亮闪烁,时间间隔为500ms用p0口控制

下列程序已经测试通过

;----------------------

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0_INT

MAIN:

SETB TR0 ;T0定时方式0

MOV SP, #60H

MOV IE, #82H

MOV B, #61 ;定时500ms,500 000 / 8192 = 61

;-----------------------

MOV A, #127

MOV R1, #40

LP0:MOV P0, A

JBC F0, $ + 5

SJMP $ - 3

RR A

DJNZ R1, LP0

;-----------------------

CLR A

LP1:MOV P0, A

JBC F0, $ + 5

SJMP $ - 3

CPL A

LJMP LP1

;-----------------------

T0_INT: ;自动重新装入0

DJNZ B, T0_END

MOV B, #61

SETB F0

T0_END:

RETI

;-----------------------

END

delay子程序就是让单片机不做什么事情,在等待子程序完成条件

void delay(n) //延时子程序

{

while(n--) //这里把传入的参数当作次数来用

{

for(i=120;i>0;i--); // 等待i减完

}

}

以上就是关于汇编子程序如何算延时时间全部的内容,包括:汇编子程序如何算延时时间、编写软件延时函数子程序, 子程序名为delay,返回类型为void、关于AT89c51单片机定时器实现延时子程序的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存