首先给出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
RE
ti 理论上当对应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
-
没办法,课程设计,我们老师强调得汇编语言,整了好久,好不容易有个大致程序雏形了,结果居然会在中断这步出问题。
一周热门 更多>