J6---P0
;J7---P2
;J5---P1
;BUZZ----P3.0
;STOP----INT0;定义各引脚
DISP_LEQU 52H
DISP_HEQU 51H
TIME EQU 50H
DIODE_BUSEQU 53H
DIODE_WEIEQU 54H
BIAOZHI EQU 55H
NB_DIODE_YANGEQU 56H
NB_DIODE_YIN EQU 57H
DX_DIODE_YANGEQU 58H
DX_DIODE_YIN EQU 59H
TEM_TIME EQU 5AH
TEM_BIAOZHI EQU 5BH
TEM_NB_DIODE_YANGEQU 5CH
TEM_NB_DIODE_YIN EQU 5DH
TEM_DX_DIODE_YANGEQU 5EH
TEM_DX_DIODE_YIN EQU 5FH
ORG0
AJMPMAIN
ORG0003H
LJMPSTOP
ORG000BH;中断向量地址
AJMPT0_50;跳转到标号
ORG 001BH
LJMP T1_KK
ORG 0030H;程序开始单元
MAIN: MOV R0,#7FH
K_CLR: MOV @R0,#0
DJNZ R0,K_CLR;
MOV TMOD,#11H;选择定时器T0工作方式,方式1;T1工作方式,方式1
SETB IT0;允许T0中断
MOV TH0,#3CH;定时器T0初始化
MOV TL0,#0B0H
MOV TH1,#0FFH;定时器T1的初始化
MOV TL1,#0CH
MOV R4,#20;设置循环次数
MOV IE,#8BH;开中断
MOV TIME,#10,定时10s
MOV NB_DIODE_YANG,#09H
MOV NB_DIODE_YIN,#33H
MOV DX_DIODE_YANG,#09H
MOV DX_DIODE_YIN,#0CCH
MOV BIAOZHI,#00H
CLR F0;表示绿灯闪烁是否的标志
SETB TR0;开定时器0
CLR TR1;关中断
LOOP: ACALL DISPLAY;调用延时子程序
ACALL DIODE;调用延时子程序
SJMP LOOP
T0_50: MOV TL0,#0B0H;重置T0初值
MOV TH0,#3CH
DJNZ R4,EXITMM,R4的内容减1,不等于0则转移
MOV R4,#20; 20*50=1000ms=1s
DEC TIME ; 40-1-1-...-1=?1
;MOV A,TIME; 将时间送到寄存器R7之中
;CJNE A,#00H,EXIT;A与00H比较,不相等则转移至EXIT
MOV A,BIAOZHI;将标志送到寄存器R7中
CJNE A,#00H,NEXT1;A与00H比较,不相等则转移至NEXT1
MOV A,TIME; 将时间送到寄存器R7之中
CJNE A,#00H,EXITMM;A与00H比较,不相等则转移至EXUTMM
MOV BIAOZHI,#01H
MOV TIME,#15定时15S
MOV NB_DIODE_YANG,#24H
MOV NB_DIODE_YIN,#33H
MOV DX_DIODE_YANG,#09H
MOV DX_DIODE_YIN,#0CCH
SJMP EXITMM
NEXT1: MOV A,BIAOZHI;将标志送到寄存器R7中
CJNE A,#01H,NEXT2;A与01H比较,不相等则转移至NEXT2
MOV A,TIME; 将时间送到寄存器R7之中
CJNE A,#00H,SS;A与00H比较,不相等则转移至SS
CLR TR1
MOV BIAOZHI,#02H
MOV TIME,#13
MOV NB_DIODE_YANG,#24H
MOV NB_DIODE_YIN,#0CCH
MOV DX_DIODE_YANG,#09H
MOV DX_DIODE_YIN,#33H
SJMP EXITMM
SS: MOV A,TIME
CJNE A,#10,NEXT1_10_1;A与10比较,不相等则转移至NEXT1_10_1SS
NEXT1_10_1:JNC EXITMM
MOV A,TIME
CJNE A,#5,NEXT1_4;A与5比较,不相等则转移至NEXT1_4
NEXT1_4:JNCNEXT1_SHANSHUO
SJMP NEXT1_YELLOW
NEXT1_SHANSHUO:
SETB TR1
CPL F0
JB F0,MIE_NEXT1
MOV NB_DIODE_YANG,#24H
EXITMM: LJMP EXIT
MIE_NEXT1:MOVNB_DIODE_YANG,#00H
SJMP EXIT
NEXT1_YELLOW:SETBTR1;允许T1开始计数
MOV NB_DIODE_YANG,#12H
SJMP EXIT
NEXT2: MOV A,BIAOZHI
CJNE A,#02H,NEXT3;A与02H比较,不相等则转移至NEXT3
MOV A,TIME
CJNE A,#00H,SSSS;A与00H比较,不相等则转移至SSSS
MOV BIAOZHI,#01H
MOV TIME,#15
CLR TR1
MOV NB_DIODE_YANG,#24H
MOV NB_DIODE_YIN,#33H
MOV DX_DIODE_YANG,#09H
MOV DX_DIODE_YIN,#0CCH
SJMP EXIT
SSSS: MOV A,TIME
CJNE A,#10,NEXT2_10_2;A与10比较,不相等则转移至NEXT2_10_2SS
NEXT2_10_2:JNC EXIT
MOV A,TIME
CJNE A,#5,NEXT2_4;A与5比较,不相等则转移至NEXT2_4SS
NEXT2_4:JNCNEXT2_SHANSHUO
SJMP NEXT2_YELLOW
NEXT2_SHANSHUO:
SETB TR1
CPL F0;
JB F0,MIE_NEXT2;位操作,F0直接地址为1则转移,不为1则顺行
MOV NB_DIODE_YANG,#24H
SJMP EXIT
MIE_NEXT2:MOV NB_DIODE_YANG,#00H
SJMP EXIT
NEXT2_YELLOW:
SETB TR1;允许T1开始计时
MOV NB_DIODE_YANG,#12H
SJMP EXIT
NEXT3: MOV A,BIAOZHI
CJNE A,#03H,EXIT;A与03H比较,不相等则转移至EXIT
CLR TR1;停止计时
MOV A,TIME
CJNE A,#01H,NEXT4_N;A与01H比较,不相等则转移至NEXT4_N
MOV TIME,TEM_TIME
MOV BIAOZHI,TEM_BIAOZHI
MOV NB_DIODE_YANG,TEM_NB_DIODE_YANG
MOV NB_DIODE_YIN,TEM_NB_DIODE_YIN
MOV DX_DIODE_YANG,TEM_DX_DIODE_YANG
MOV DX_DIODE_YIN,TEM_DX_DIODE_YIN
SJMP EXIT
NEXT4_N:MOV NB_DIODE_YANG,#09H
MOV DX_DIODE_YANG,#09H
EXIT: RETI
T1_KK:MOV TL1,#00H
MOV TH1,#0FFH
CPL P3.0;开蜂鸣器
RETI
STOP: CLR EA;
JB P3.2,STOP_H
ACALL DELAY;调用延时子程序
ACALL DELAY;调用延时子程序
ACALL DELAY;调用延时子程序
ACALL DELAY;调用延时子程序
ACALL DELAY;调用延时子程序
ACALL DELAY;调用延时子程序
JB P3.2,STOP_H;位操作,P3.2口直接地址为1则转移,不为1则顺行
MOV TEM_TIME,TIME
MOV TEM_BIAOZHI,BIAOZHI
MOV TEM_NB_DIODE_YANG,NB_DIODE_YANG
MOV TEM_NB_DIODE_YIN,NB_DIODE_YIN
MOV TEM_DX_DIODE_YANG,DX_DIODE_YANG
MOV TEM_DX_DIODE_YIN,DX_DIODE_YIN
MOV TIME,#15;定时15s
MOV BIAOZHI,#03H
MOV NB_DIODE_YANG,#09H
MOV DX_DIODE_YANG,#09H
STOP_H:SETBEA
RETI
DISP_PRO:MOV A,TIME
MOV B,#10
DIV AB;A除以B,商的整数送A,余数送B
MOV DISP_H,A
MOV DISP_L,B;LED数字显示,十位与个位分离
RET
DISPLAY:ACALL DISP_PRO;调用DISP_PRO子程序
MOV P2,#00H ;关发光二极管
MOV DPTR,#DISP_TAB
MOV A,DISP_H ;十位
CJNE A,#00H,N_DISPLAY;A与00H比较,不相等则转移至SS
SJMP M_DISPLAY;跳转
N_DISPLAY:MOVCA,@A+DPTR
MOV P1,A;将累加器A中的数送到P1口
MOV P0,#0AAH;将0AAH送到P0口
ACALL DELAY;调用延时子程序
M_DISPLAY:MOVA,DISP_L ;个位
MOVC A,@A+DPTR
MOV P1,A;将累加器A中的数送到P1口
MOV P0,#55H,将55H送到P0口
ACALL DELAY调用延时子程序
RET
DIODE: MOV P0,#00H ;关LED
MOV P1,NB_DIODE_YANG; 将NB_DIODE_YANG里的内容送到P1口
MOV P2,NB_DIODE_YIN; 将NB_DIODE_YIN里的内容送到P2口
ACALL DELAY;调用延时子程序
RETDIODE: MOV P0,#00H ;关LED
MOV P1,NB_DIODE_YANG; 将NB_DIODE_YANG里的内容送到P1口
MOV P2,NB_DIODE_YIN; 将NB_DIODE_YIN里的内容送到P2口
ACALL DELA;Y调用延时子程序
MOV P1,DX_DIODE_YANG; 将DX_DIODE_YANG里的内容送到P1口
MOV P2,DX_DIODE_YIN;将DX_DIODE_YIN里的内容送到P2口
ACALL DELAY调用延时子程序
RET
MOV P1,DX_DIODE_YANG; 将DX_DIODE_YANG里的内容送到P1口
MOV P2,DX_DIODE_YIN;将DX_DIODE_YIN里的内容送到P2口
ACALL DELAY;调用延时子程序
RET
DELAY: MOV R7,#2
DEL: MOV R6,#0FAH
DJNZ R6,$;延时T=2*250*4=2ms
DJNZ R7,DEL
RET
DISP_TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;LED查表
END
|