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单片机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)