单片机汇编语言流水灯程序延时0.5秒 一共四个灯循环

单片机汇编语言流水灯程序延时0.5秒 一共四个灯循环,第1张

4只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

;用最直接的方式实现流水灯

ORG 0000H

START:MOV P1,#01111111B ;最下面的LED点亮

LCALL DELAY ;延时60秒

LCALL DELAY ;延时60秒

MOV P1,#10111111B ;最下面第二个的LED点亮

LCALL DELAY ;延时60秒

LCALL DELAY ;延时60秒

MOV P1,#11011111B ;最下面第三个的LED点亮 (以下省略)

LCALL DELAY

LCALL DELAY ;延时60秒

MOV P1,#11101111B

LCALL DELAY

LCALL DELAY ;延时60秒

MOV P1,#11110111B

LCALL DELAY

LCALL DELAY ;延时60秒

MOV P1,#11111011B

LCALL DELAY ;延时60秒

LCALL DELAY ;延时60秒

LCALL DELAY ;延时60秒

LCALL DELAY ;延时60秒

LCALL DELAY ;完成第一次循环点亮,延时约025秒

AJMP START ;反复循环

;延时子程序,12M晶振延时约250毫秒

DELAY: ;大约值:2us2562562=260ms,也可以认为为250ms

PUSH PSW ;现场保护指令(有时可以不加)

MOV R4,#240

L3: MOV R2 ,#00H

L1: MOV R3 ,#00H

L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2)

DJNZ R2 ,L1 ; 中层循环:256次

DJNZ R4 ,L3 ;外层循环:240次

POP PSW

RET

END

DJNZ指令是先减一再判断结果是不是为0,所以36H赋值0是可以的,标识要循环256次

延时计算:

12M的晶振换算指令周期为1uS

MDLY1S: MOV 35H, #255 ;2uS

MOV 36H, #0 ;2uS

MOV 37H,#4 ;2uS

DLYB: NOP ;1us

DJNZ 35H, DLYB ;2us,第一次循环为255(1+2)=765,以

;后为256(1+2)=768

DJNZ 36H, DLYB ;2us 765+(255768)+(2256)=197119

DJNZ 37H,DLYB ;2us 197119+(1971223)+(24)=788493

RET ;2us

所以,从进入函数开始到返回调用地址总的延时时间为: 2+2+2+788493+2 = 788501us

DEL: MOV R7,#210

DEL1: MOV R6,#117

DEL2: DJNZ R6,DEL2

NOP

DJNZ R7,DEL1

NOP ;此处17个NOP

NOP

NOP

RET

1μs+(1+234+1+2)μs210+2μs+17=50000μs

其实考虑到LCALL调用这个函数的时间,末尾应该再减少2个NOP。

另外,实际使用中需要精确延时的话应该使用定时器中断,一方面是精确,另一方面延时函数执行时,如果有中断发生,那么延时就不正确了。

多简单的小程序呀:

TIME1MS:

MOV R6, #2

TIME1:

;延时498uS

MOV R7, #248

DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减

;

DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS

;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1002MS

RET

此程序实现的是1002MS的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间

以上就是关于单片机汇编语言流水灯程序延时0.5秒 一共四个灯循环全部的内容,包括:单片机汇编语言流水灯程序延时0.5秒 一共四个灯循环、51单片机延迟程序(汇编语言)解析、怎样用单片机的汇编语言编写一个50ms的延时程序。(晶振频率为12MHz)ps51单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9284477.html

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

发表评论

登录后才能评论

评论列表(0条)

保存