您的位置:首页 > 编程语言

51 汇编编程:中断的现场保护与恢复

2016-01-25 12:02 281 查看
;
;有个交通灯的题目,链接在:
;
;http://zhidao.baidu.com/question/556903116
;
;问题主要是中断时,强制变换为红灯后,退出前应该怎样恢复原来的灯。
;
;一般来说,保护现场、恢复现场,都是用 PUSH、POP 来完成。
;
;这种方法,仅仅适用于片内单元的保护,对于接口,以及显示器的内容,就不适用了。
;
;外设的状态如何恢复呢?
;
;做而论道编写了一个小程序,来说明恢复的方法。
;
;仿真运行如下图:
;



;
;图片链接:http://xiangce.baidu.com/picture/detail/623f4ad8d63d7a2a7d61bd87006a113f5a07041a
;
;全部程序如下。
;
;交通灯
;-------------------------------------------
    ORG   0000H
    JMP   MAIN
    ORG   0003H         ;外部中断0的入口地址
    JMP   X0_INT
    ORG   000BH         ;T0中断的入口地址
    JMP   T0_INT
;***************************************
MAIN:
    MOV   TMOD, #01H
    MOV   TH0, #3CH
    MOV   TL0, #0B0H
    MOV   R1, #20       ;定时1s
    SETB  TR0
    SETB  ET0
    SETB  PT0
    SETB  EX0
    SETB  IT0
    SETB  EA
    MOV   SP, #60H
M_LOOP:
;***************************************
N_B:
    MOV   30H, #11H     ;南北
    MOV   P1, 30H
    MOV   R5, #30       ;
    CALL  DISPLAY
    MOV   R2, #27
LOOP1:
    CALL  WAIT_1S
    DJNZ  R2, LOOP1     ;判断是否过了27s
;--------------------------
    MOV   30H, #21H
    MOV   P1, 30H
    MOV   R2, #3
LOOP11:
    CALL  WAIT_1S
    DJNZ  R2, LOOP11    ;判断是否过了3秒
;***************************************
D_X:
    MOV   30H, #0AH     ;东西
    MOV   P1, 30H
    MOV   R5, #30
    CALL  DISPLAY
    MOV   R2, #27
LOOP2:
    CALL  WAIT_1S
    DJNZ  R2, LOOP2     ;判断是否过了27s
;--------------------------
    MOV   30H, #0CH
    MOV   P1, 30H
    MOV   R2, #3
LOOP22:
    CALL  WAIT_1S
    DJNZ  R2, LOOP22    ;判断是否过了3秒
    JMP   M_LOOP
;***************************************
WAIT_1S:                ;等待新秒出现
    JNB   20H.0, $
    CLR   20H.0
    DEC   R5
    CALL  DISPLAY
    RET
;-----------------------------
DISPLAY:
    MOV   A, R5
    MOV   B, #10
    DIV   AB
    MOV   DPTR, #TAB1
    MOVC  A, @A + DPTR
CPL  A
    MOV   P0, A
    MOV   A, B
    MOV   DPTR, #TAB1
    MOVC  A, @A + DPTR
CPL  A
    MOV   P2, A
    RET
TAB1:
    DB    3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH   
;***************************************
X0_INT:
    MOV   P1, #09H      ;全部红灯
    PUSH  ACC
    PUSH  B
    PUSH  PSW
    SETB  RS0           ;换工作区
    MOV   R5, #10       ;倒计时显示
    CALL  DISPLAY
    MOV   R1, #20       ;定时1s
;----------------
    MOV   R2, #10       ;倒计时
LOOP3:
    CALL  WAIT_1S
    DJNZ  R2, LOOP3     ;判断是否到了10s
;----------------
    POP   PSW           ;恢复原区
    CALL  DISPLAY       ;显示原值
    MOV   P1, 30H       ;显示原灯
    POP   B
    POP   ACC
    RETI
;-----------------------------
T0_INT:                 ;T0中断,高优先级
    MOV   TL0, #0B0H
    MOV   TH0, #3CH     ;50ms中断一次
    DJNZ  R1, EXIT_T0
    MOV   R1, #20       ;定时1s
    SETB  20H.0         ;每到一秒就置一
EXIT_T0:
    RETI
;***************************************

END
;-------------------------------------------
;
;本程序对中断现场的保护、恢复效果如何?
;
;感兴趣的网友,可以试试看。
;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: