[灌水]FLAG EQU 00H ;从第一次进入中断后它就始终为‘1’
ORG 0000H
SJMP MAIN
ORG 000BH
SJMP TIMER0 ;我用定时器0中断模拟你的外部掉电中断
ORG 0030H ;我的30H~38H因该在你的片外非易失性存储器中
MAIN: MOV 20H,38H
JB FLAG,INIT1
MOV 33H,#02H
MOV 34H,#0A4H
MOV 35H,#0A4H
MOV 36H,#82H
MOV 37H,#10H
;原始初始化
INIT1: ACALL INIT ;把中间变量还原
JNB FLAG,INIT2 ;如果进过中断,PC还原
MOV DPH,30H
MOV DPL,31H
CLR A
JMP @A+DPTR ;PC还原
INIT2: NOP ;你的其它程序
NOP ;你的其它程序
NOP ;你的其它程序
NOP ;你的其它程序
SJMP $+3 ;中断在这儿产生,你的是外部产生
NOP
SJMP $-3 ;中断在这儿产生,你的是外部产生
RET
TIMER0: POP 00H
MOV 30H,R0 ;保存PC高字节
POP 00H
MOV 31H,R0 ;保存PC低字节
MOV 32H,PSW
MOV 33H,TMOD
MOV 34H,TL0
MOV 35H,TH0
MOV 36H,IE
MOV 37H,TCON
SETB FLAG
MOV 38H,20H
;保存中间变量
SJMP $
RETI
INIT: MOV TMOD,33H
MOV TH0,34H
MOV TL0,35H
MOV IE,36H
MOV TCON,37H
MOV PSW,32H
RET
END
程序已经完全正常。
点击浏览该文件