单片机延时子程序,求高手详解?送分

单片机延时子程序,求高手详解?送分,第1张

1,r7赋值200,一个机器周期(春厅搜只执行1次)。2,通过4可知被执行了200次,每次1个机器周扒历期。

3,执行125*200=25000次。每次2个机器周期。4,执行200次,每次2个机器周期。5,最后执行一次返回,花费2个机器周期。如果是12MHZ的晶伏悄振,震荡周期1/12US,机器周期1US。

整个延时程序,花费50603个指令周期,乘以1us,大概延时50Ms左右。怎么会是机器周期*200呢?机器周期应该是振荡周期的12被才对。

push cx先把cx推进栈以保存cx原来简首的中咐改值。然后用mov cx,0ffh赋值,卖判loop循环每执行一次cx自减一,到cx为0为止,此时循环共执行0ffh次即255次。再将栈中cx原来的值d出给cx寄存器。

如果CUP主频为40mHz,则时钟周期为1/40=0.025微秒。

在808X中,一条LOOP指令如果实现跳转的话需要18个时钟周期,退出时需要5个时钟周期。所以这个延时子程序循环部分的延时(0.025*18*255+5)微秒,其他语句的延时基本可以忽略

这个代码其实还是很清楚明了的。

DELY1: PUSH AX ;延时子程序,这里PUSH AX 其实可以不要的,因为AX没有做任何改动

PUSH CX 因为使用了CX来计数,所以先保存橘氏CX进堆栈

MOV CX,30H 循环30H也就是48次

DLY1: CALL DELY2 在次调用一个延时子程序

LOOP DLY1 循环,48次,不到次数则继续循环

POP CX恢复被保护的原来CX的值

POP AX 恢复没野被圆察散保护的原来AX的值

RET过程返回

DELY2: PUSH CX内部调用的过程,也需要把CX当前的值保护进堆栈

MOV CX,8000H 循环8000H也就是32768次

LOOP $$ 表示当前地址,也就是自己的地址,32768次循环不到则原地踏步

POP CX恢复被保护的CX的值

RET 过程返回


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存