关于倒计时交通灯控制程序中断子程序失效(注:汇编语言)

2019-07-15 12:17发布

首先给出protues仿真图,其中 LED数码管为共阴数码管
P0口为数码管段码口,段码口驱动为74HC573
P2口为数码管位码口,位码口驱动为74HC573
P1口控制发光二极管,驱动器74HC245
我自己鼓捣的程序完成了倒计时功能,并且可以自己设定初值,但是当我想要通过中断实现交通灯的特殊功能时,发现中断功能无效,比如说
如图 五个按键 连接p3.0到p3.4,     JNB P3.0,STOP
                                                STOP: CLR P1
                                                         SETB P1.2
                                                         SETB P1.6
                                                     REti         理论上当对应P3.0的按键按下时,跳转到STOP实施中断,然后四个路口的红灯全部都亮






然而我加进去后按了没有反应
程序清单如下,望解惑,谢谢。
ORG        0000H
AJMP        MAIN
ORG        000BH        //T0中断向量入口地址
LJMP        INT_T0
ORG        0030H
MAIN:        MOV        P0,#0FFH        //I/0口,寄存器初始化
MOV        P2,#0FFH
MOV        P1,#0FFH
MOV        P1,#00H


MOV        P2,#00H
MOV        R7,#20        //定时计数器T0定时50ms,循环20次获得一秒定时




/*************T0初始化**************/       
MOV        TMOD,#01H        //定时计数器T0,模式1,16位
MOV        TH0,#3CH        //50MS定时初值
MOV        TL0,#0B0H
SETB        EA        //开总中断
SETB        ET0        //开T0中断
SETB        TR0        //T0启动
SETB ES
SETB EX0
SETB EX1




/**********************************
状态1:
东西红灯亮,倒计时初值20S
南北绿灯亮,倒计时初值17S
**********************************/
MOV 50H,#16
MOV 51H,#12
STATE1:        MOV        R6,50H        //东西方向倒计时初值20


MOV        R3,51H        //南北方向倒计时初值17
MOV        P1,#00H
SETB        P1.6        //东西红灯20s
SETB        P1.0        //南北绿灯17s


/**********************************
状态2:
南北绿灯17S倒计时完成,绿灯熄灭
黄灯点亮,倒计时初值3S
**********************************/
STATE2:        LCALL        DISPLAY        //调用显示子程序
CJNE        R3,#00H,STATE2 //若倒计时未到0则继续调
CLR A
MOV A,50H
SUBB A,51H
MOV        R3,A        //黄灯倒计时初值3
CLR        P1.0        //绿灯熄灭
SETB        P1.1        //黄灯点亮


/**********************************
状态3:
南北黄灯灭,红灯倒计时初值20s
东西红灯灭,绿灯亮,倒计时初值17s
**********************************/       
STATE3:        LCALL        DISPLAY
CJNE        R3,#00H,STATE3
;ADDC A,#3       
MOV        R3,50H        //南北黄灯灭,红灯倒计时初值20s
;SUBB A,#3
CLR        P1.1
SETB        P1.2
MOV        R6,51H        //东西红灯灭,绿灯亮,倒计时初值17s
CLR        P1.6       
SETB P1.4       


/**********************************
状态4:
南北持续红灯
东西绿灯灭,黄灯倒计时初值3s
**********************************/       
STATE4:        LCALL        DISPLAY       
CJNE        R6,#00H,STATE4       
CLR A
MOV A,50H
SUBB A,51H
MOV        R6,A        //东西绿灯灭,黄灯倒计时初值3s
CLR        P1.4
SETB        P1.5
CLR        P1.0       


/**********************************
状态5:
黄灯倒计3s完成后所有状态完成,
返回状态1,循环
**********************************/       
STATE5: LCALL        DISPLAY
CJNE        R6,#00H,STATE5




LCALL DISPLAY
JNB P3.0,STOP
SJMP        STATE1        //返回状态1

STOP:
CLR P1
SETB P1.2
SETB P1.6
RETI

;显示子程序
DISPLAY:
MOV DPTR,#TABLE
MOV A,R6
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P2,#11111111B
MOV P0,A
MOV P2,#11111110B
LCALL        DELAY_1MS
MOV A,B
MOVC A,@A+DPTR
MOV P2,#11111111B
MOV P0,A
MOV P2,#11111101B
LCALL        DELAY_1MS
MOV A,R3
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P2,#11111111B
MOV P0,A
MOV P2,#11111011B
LCALL        DELAY_1MS
MOV A,B
MOVC A,@A+DPTR
MOV P2,#11111111B
MOV P0,A
MOV P2,#11110111B
LCALL        DELAY_1MS
RET


;T0中断子程序
INT_T0:        DJNZ        R7,NT0        //计数寄存器不为0则跳转,T0重新赋初值
MOV        R7,#20        //计数寄存器赋值20
DEC        R6        //东西方向倒计时数值减1
DEC        R3        //东西方向倒计时数值减1
NT0:        MOV        TH0,#3CH        //T0赋50MS初值
MOV        TL0,#0B0H
SETB        TR0        //启动T0
RETI       


TABLE:
DB 3fh,06h,5bh,4fh
DB 66h,6dh,7dh,07h
DB 7fh,6fh

DELAY_1MS:        //1MS软件延时子程序
MOV        R5,#5
DELAY1:        MOV        R4,#200
DELAY2:        DJNZ        R4,DELAY2
DJNZ        R5,        DELAY1
RET
DL10:
MOV R7,#0AH
DL: MOV R6,#0FFH
DL6: DJNZ R6,DL6
DJNZ R7,DL
RET
END       


捕获.PNG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。