交通灯,加入急救车信号,急救车信号用外部中断0实现

2019-07-15 20:15发布

ORG 0000H
LJMP MAIN
ORG 0003H        //外部中断0,作为急救车信号,当p3.2按钮按下,即有急救车信号
LJMP INTO
ORG 000BH
LJMP INTR0
ORG 1000H
MAIN:
         MOV P3,#0FFH
         MOV TMOD,#01H
         MOV TH0,#3CH
         MOV TL0,#0B0H
         MOV IE,#83H
         SETB TR0
BEGIN:
         MOV P1,#11101110B          //东西红灯亮
     MOV P0,#11101110B          //南北红灯亮
         
HERE:SJMP HERE                          //等待中断
INTR0:
         MOV R0,30H
         MOV R1,31H
         PUSH ACC
         PUSH PSW
         MOV TH0,#3CH
         MOV TL0,#0B0H
         INC R0
         MOV 30H,R0
         CJNE R0,#20,RETURN
         MOV R0,#00
         MOV 30H,R0
         INC R1
         MOV 31H,R1
LOOP:
         
         CJNE R1,#3,L1
         MOV P1,#10111011B          //东西绿灯亮
         MOV P0,#11101110B          //南北红灯亮
                       
L1:        CJNE R1,#13,L2
        MOV P1,#11011101B          //东西黄灯亮

L2:        CJNE R1,#14,L3
        MOV P1,#11111111B          //东西黄灯灭
L3:        CJNE R1,#15,L4
        MOV P1,#11011101B          //东西黄灯亮

L4:        CJNE R1,#16,L5
        MOV P1,#11111111B          //东西黄灯灭
L5:        CJNE R1,#17,L6
        MOV P1,#11011101B          //东西黄灯亮

L6:        CJNE R1,#18,L7
        MOV P1,#11111111B          //东西黄灯灭

        MOV P1,#11101110B           //东西红灯亮
        MOV P0,#10111011B           //南北绿灯亮

L7:        CJNE R1,#29,L8
        MOV P0,#11011101B          //南北黄灯亮

L8:        CJNE R1,#30,L9
        MOV P0,#11111111B          //南北黄灯灭
L9:        CJNE R1,#31,L10
        MOV P0,#11011101B          //南北黄灯亮

L10:CJNE R1,#32,L11
        MOV P0,#11111111B          //南北黄灯灭
L11:CJNE R1,#33,L12
        MOV P0,#11011101B          //南北黄灯亮

L12:CJNE R1,#34,RETURN
        MOV P0,#11111111B          //南北黄灯灭
        MOV R1,#3
        MOV 31H,R1
        LJMP LOOP       
return:
        POP ACC
        POP PSW
        REti
INTO:
        CLR TR0
        PUSH PSW
        PUSH ACC
        MOV P1,#11101110B          //东西红灯亮
    MOV P0,#11101110B          //南北红灯亮
        ACALL DELAY
        POP PSW
        POP ACC
        SETB TR0
        RETI
DELAY:MOV R7,#04
D2:   MOV R6,#250
D3:   MOV R5,#250
      DJNZ R5,$
          DJNZ R6,D3
          DJNZ R7,D2
          RET
END
现在出现的问题是:按下按钮进入中断,定时器0关闭,红灯亮起,然后开启定时器,返回,但是返回不到原来的状态,比如原来是绿灯亮,但是返回直接到红灯亮

交通灯.zip 下载积分: 积分 -1 分
78.45 KB, 下载次数: 14, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
依然落叶飘零
1楼-- · 2019-07-16 01:06
这就是典型的错误,你进入中断后不但PSW和ACC要入栈,你用到的寄存器都要入栈,你中断里面用的P0,P1,还有调用的delay子程序用到的R5,R6,R7。都要入栈。这样跳出中断才能回到以前的状态。
1522495332
2楼-- · 2019-07-16 02:20
 精彩回答 2  元偷偷看……
ch020904
3楼-- · 2019-07-16 04:01
哦哦,谢谢你们
ch020904
4楼-- · 2019-07-16 07:13
1522495332 发表于 2014-4-16 11:57
很简单,因为你按键中断并没有保存原来的灯的状态,你让它退出中断后怎么恢复成原来的状态。至少你在INTO里 ...

嗯嗯,非常感谢

一周热门 更多>