
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
采纳答案,数字,算错了吧?
应该是 500 多毫秒。
51 单片机的指令,执行时间,是一个机器周期或二个机器周期。
只有乘除指令,是四个机器周期。
机器周期,称为T。
正确计算如下:
MOV R2, #10 ;1T
L1: MOV R3, #100 ;1T
L2: MOV R4, #250 ;1T
L3: DJNZ R4, L3 ;2T 2 250 = 500T
DJNZ R3, L2 ;2T (1+500+2) 100 = 50300T
DJNZ R2, L1 ;2T (1+50300+2) 10 = 503030T
RET ;2T (1+503030+2) = 503033T
总共执行时间是:503033T。
当晶振是 12MHz,T 就是 1us。
那么,延时时间就是 503033us,约等于 500 毫秒。
多简单的小程序呀:
TIME1MS:
MOV R6, #2
TIME1:
;延时498uS
MOV R7, #248
DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减
;
DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS
;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1002MS
RET
此程序实现的是1002MS的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间
以上就是关于单片机中,怎么用汇编语言编写程序实现延迟40ms全部的内容,包括:单片机中,怎么用汇编语言编写程序实现延迟40ms、求问这段汇编语言的延时程序怎么计算延时时间、找一个单片机汇编语言编写的延时1ms的子程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)