单片机中,怎么用汇编语言编写程序实现延迟40ms

单片机中,怎么用汇编语言编写程序实现延迟40ms,第1张

1.循环延时的方法

DELAY: 误差 0us

MOV R7,#25H

DL1:

MOV R6,#9AH

DL0:

MOV R5,#02H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

RET

不过这不实用。40MS时间单片机都 在这里循环,不作能它事。

1.可以用定时中断的方法:

ORG 0000H

LJMP START

ORG 000BH

LJMP Timer0Interrupt

START:

MOV SP,#60H

LCALL InitTimer0

LOOP:

add your code here!

LJMP LOOP

InitTimer0:

MOV TMOD,#01H

MOV TH0,#63H

MOV TL0,#0C0H

SETB EA

SETB ET0

SETB TR0

RET

Timer0Interrupt:

PUSH DPH

PUSH DPL

PUSH ACC

MOV TH0,#63H

MOV TL0,#0C0H

========================

add your code here!

========================

POP ACC

POP DPL

POP DPH

RETI

END

如果是用汇编语言的话,是可以做到精准延时的。当然首先要有一个精准的时钟,也即是晶振要准确,比如使用精准的12M晶振12T模式的51单片机延时1毫秒,程序如下:

DELAY1MS:

    MOV R3,#249    1

    DJNZ R3,$      2*249

    MOV R3,#249    1

    DJNZ R3,$      2*249

    RET            2

延时时间为:1+2*249+1+2*249+2=1000T,这里使用12M晶振,T=1微秒,所以总共延时1000微秒也即是1毫秒。如果要延时更多时间,可以采用循环方式来实现。当然在计算延时时间时要考虑到使用的单片机类型和型号,比如STC89C51是6T,DS80320是4T,STC12C5A60S2是12T,这些因数一定要考虑进去才行。

首先明确机器执行一条指令耗时大概是1us那么延时10ms的程序如下:MOV AX,50L1:MOV BX,100L2:DEC BX     JNZ L2DEC AXJNZ L1执行完之后时间大约为10ms多一点

根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。

具体步骤如下:/导致这种情况的原因主要是……


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

原文地址: http://outofmemory.cn/yw/11078780.html

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

发表评论

登录后才能评论

评论列表(0条)

保存