汇编延时程序

 

;用6MHz晶振,51单片机,一个机器周期为2us。延时10s子程序如下
DLY10S :       MOV R5,100
DLY10S1:       MOV R6,200
DLY10S2:       MOV R7,248
DLY10S3:
DJNZ R7,DLY10S3      ;248*2+4
DJNZ R6,DLY10S2      ;(248*2+4)*200+4
DJNZ R5,DLY10S1   ;[(248*2+4)*200+4]*100+4
RET
;改用11.0592MHz晶振,一个机器周期应该为1.085us ,延时400ms子程序
DLY_400MS:
MOV R5,#02H
DLY_400MS1:
MOV R6,#00H
DLY_400MS2:
MOV R7,#00H
DLY_400MS3:
NOP
DJNZ R7,DLY_400MS3
DJNZ R6,DLY_400MS2
DJNZ R5,DLY_400MS1
RET
2:用中断:
MAIN:         CLR P3.2       ;P3.2设置低电平
JB P3.2,LIGHT  ;P3.2是高电平则跳转LIGHT处执行常亮
SETB P0.0      ;闪烁
LCALL DELAY
CLR P0.0
LCALL DELAY
LJMP MAIN
LIGHT:        CLR P0.0
LJMP MAIN
DELAY:        MOV R7,#255  ;延时
D1:           MOV R6,#255
D2:           DJNZ R6,D2
DJNZ R7,D1
RET
END
3:以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:
mov     r0, #09h
loop:         djnz    r0, loop
51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,
4:延时子程序,12M晶振延时约250毫秒
DELAY:
MOV R4,#2
L3:        MOV R2 ,#250
L1:        MOV R3 ,#250
L2:        DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R4 ,L3
RET
END
如何精确计算延时子程序的执行时间?
汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要!
;延时子程序,12M晶振延时约253毫秒
DELAY:
MOV R4,#2-----执行1个机器周期,耗时1微秒
L3: MOV R2 ,#250--执行1个机器周期,耗时1微秒
L1: MOV R3 ,#250--执行1个机器周期,耗时1微秒
L2: DJNZ R3 ,L2---执行2个机器周期,反复执行250次(2x250)=500微秒)
DJNZ R2 ,L1---执行2个机器周期,反复执行250次(1+500+2)*250=125750微秒)
DJNZ R4 ,L3--执行2个机器周期,反复执行2次 (1+125750+2)*2=251506微秒)
RET
delay 加上第一条总共延时1+251506=251507微秒
5:
DELAY:             ;延时1s子程序(汇编)
MOV R1,#08H
D1: MOV R2,#0F4H
D2: MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,D2
DJNZ R1,D1
RET
你的晶振是多少的如果是6M的应该是这样的
Y100:MOV R6,#63H
L100:LCALL YS10
NOP
DJNZ R6,L100
NOP
NOP
RET
YS10:MOV  R7,#FAH
L1:    DJNZ  R7,L1
RET
void delay2()      ;延时1s子程序(c语言)
{int x,y;
for(x=50;x>0;x--)
for(y=500;y>0;y--)
;}
我自己平时用的!
没问题的 !!1
6: ORG 0000H
MAIN:MOV  R0,#01H
S:   DJNZ R0,S
MOV  SP,#40H
MOV  TMOD,#01H
MOV  TH0,#0DBH
MOV  TL0,#0FFH
CLR  TF0
SETB TR0
OK:  JNB  TF0,OK
CLR  TF0
MOV  TH0,#0DBH
MOV  TL0,#0FFH
MOV  A,#0
INC  A
CJNE A,#100,OK
CPL  P3.2
SJMP OK
END
7:
MOV TH0。#3CH
MOV TL0。#B0H
MOV TMOD,#01H
MOV IE,#82H
SETB TR0
MOV R3,#00
下面是中断服务程序
TIMER0:
MOV TH0,#3CH
MOV TL0,#B0H
INC R3
CJNE R3,#20,LOOP
MOV R3,#00
LOOP:RET
8:
ORG 0000H
START:MOV P1,
LCALL DELAY
MOV P1,
LCALL DELAY
MOV P1,#11011111B
LCALL DELAY
MOV P1,#11101111B
LCALL DELAY
MOV P1,#11110111B
LCALL DELAY
MOV P1,#11111011B
LCALL DELAY
MOV P1,#11111101B
LCALL DELAY
MOV P1,#11111110B
LCALL DELAY
MOV P1,#11111111B;完成第一次LED跳灯循环
AJMP START;反复循环
DELAY:MOV R4,#02H;延时子程序,12M晶振延时约1秒
L3: MOV R2 ,#0FAH
L1: MOV R3 ,#0FAH
L2: DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R4 ,L3
RET
4.  程序设计内容
(1).    延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒
机器周期       微秒
MOV R6,#20                2个         2
D1:         MOV R7,#248                     2个         2       2+2×248=498 20×               DJNZ R7,$                   2个         2×248             (498
DJNZ R6,D1                2个   2×20=40           10002
因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY:          MOV R5,#20
D1:             MOV R6,#20
D2:             MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET