; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; Subroutine 延时指定的时钟嘀嗒数
; 入口:
; Didas=时钟嘀嗒数(1秒钟约嘀嗒182次,10秒钟嘀嗒182次。若延时不是秒的10数次倍,误差稍微大点)
Delay1S Proc Near
push dx
push cx
xor ax,ax
int 1ah
mov Times,dx
mov Times[2],cx
Read_Time: xor ax,ax
int 1ah
sub dx,Times
sbb cx,Times[2]
cmp dx,Didas
jb Read_Time
pop cx
pop dx
ret
Times dw 0,0
Delay1S EndP
; -----------------------------------------
Didas equ 18
Start: call Delay1S
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束
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
要求编写延时子程序,就不要使用定时器;
也不要用C语言,因为C语言的执行时间,并不确定。
用汇编语言,是最简单、准确的。
51单片机的程序如下:
DL1000:
MOV R7,#248
DJNZ R7,$
MOV R7,#250
DJNZ R7,$
RET
正好1000个机器周期。
R7,是8位寄存器,其最大数值是255,不能直接存入500。
以上就是关于用汇编语言编写一个延时1S的子程序全部的内容,包括:用汇编语言编写一个延时1S的子程序、单片机中,怎么用汇编语言编写程序实现延迟40ms、汇编语言编写一段延时1000个指令周期的子程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)