汇编延时程序

汇编延时程序

 

;用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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值