ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
SETB P2.0 ;将P2.0口对应的LED点亮
ACALL DELAY ;调用延时子程序
CLR P2.0 ;关闭P2.0口的输出,即灭灯
ACALL DELAY ;调用延时子程序
SJMP MAIN ;短转移指令,跳转到main,死循环
ORG 0150H
DELAY:
MOV R7, #28H ;28H=40D ,单周期指令 1.085US 晶振频率=11.0592M,则单周期指令的执行时长为1.085us
D1:
MOV R6, #0F9H ;F9H=249D ,单周期指令 1.085US
D2:
MOV R5, #0AH ;AH=10D ,单周期指令 1.085US
DJNZ R5,$ ;双周期指令 2.17US ,$为本行的地址,即将R5的内容减1,若不等于0则跳转到本行
DJNZ R6,D2 ;双周期指令 2.17US ,将R6的内容减1,若不等于0则跳转到D2
DJNZ R7,D1 ;双周期指令 2.17US ,将R7的内容减1,若不等于0则跳转到D1
RET ;2US
END
;%%%%%%%%以下为matlab计算的DELAY延时程序各阶段所耗时间%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;R7=40;
;R6=249;
;R5=10;
;T1=1.085; %单周期指令所耗时间 1.085us
;T2=2*T1; %双周期指令所耗时间 2.17us
;%%%%%%%%%%第一阶段: DELAY子程序的14到18行 所耗时间
;t0=3*T1;
;%%%%%%%%%%第二阶段: DJNZ R5,$ 所耗时间
;t1=R5*T2;
;%%%%%%%%%%第三阶段: DJNZ R6,D2 所耗时间
;t2=R6*(T2+T1+t1);
;%%%%%%%%%%第三阶段: DJNZ R7,D1 所耗时间
;t3=R7*(T2+T1+T1+t1+t2);
;%%%%%%%%%%DELAY 子程序总耗时t
;t=t0+t1+t2+t3 = 2.5583e+5us=0.25583s
;两次亮灯之间的时间间隔为2*t=0.51166s,实验测了100次亮灯,总用时50.16s,基本于理论相符合
51单片机 汇编语言 点亮第一个LED
于 2022-06-02 22:41:04 首次发布