自己设计的交通灯汇编程序,运行不成功,请各位帮忙看看
[复制链接]
;-------------------------------------------
;十字路口交通灯控制器
;MADE BY Leo
;-------------------------------------------
;分别用单片的P1.0-P1.5口控制南北和东西方向的直行/左转/右转红绿灯
;P1.6-P1.7为人行横道指示灯
;P0.0-P0.6控制LED显示
;P2.4-P2.5为南北东西直行设置,用来处理突法事件
;直行持续30秒,左转持续20秒,右转始终为绿灯
;-------------------------------------------
GO1 EQU P1.0
RIGHT1 EQU P1.1
LEFT1 EQU P1.2
GO2 EQU P1.3
RIGHT2 EQU P1.4
LEFT2 EQU P1.5
GO_NS EQU P2.4
GO_RL EQU P2.5
WALK_NS EQU P1.6
WALK_EW EQU P1.7
SECOND_COUNT DATA 32H
ORG 0000H ;主程序入口地址
LJMP MAIN
ORG 0003H ;外中断0入口地址
LJMP PINT0
ORG 000BH
RETI
ORG 0013H ;外中断1入口地址
LJMP PINT1
MAIN:
MOV SP,#60H ;堆栈指针赋初值
LCALL P_INIT ;调用定时器中断初始化子程序
;------------------------------------
;南北方向直行灯为绿灯,南北东西方向右转为绿灯.其余所有灯为红灯
;人行道南北通行
;持续时间30秒,然后转到状态2
;------------------------------------
STATUS1:
MOV SECOND_COUNT,#60 ;30秒后转到状态2,状态2持续20秒
SETB GO1
SETB RIGHT1
SETB RIGHT2
CLR LEFT1
CLR GO2
CLR LEFT2
SETB WALK_NS
CLR WALK_EW
LOP_S1:
DJNZ SECOND_COUNT,M1
LJMP STATUS2
M1:
LCALL WORK
LCALL DISPLAY
AJMP LOP_S1
;-----------------------------------
;南北方向左转灯为绿灯,南北东西方向右转为绿灯.其余所有灯为红灯
;人行道南北通行
;持续时间20秒,然后转到状态3
;-----------------------------------
STATUS2:
MOV SECOND_COUNT,#40 ;20秒后转到状态3,状态3持续30秒
CLR GO1
SETB LEFT1
CLR WALK_NS
CLR WALK_EW
LOP_S2:
DJNZ SECOND_COUNT,M4
LJMP STATUS3
M2:
LCALL WORK
LCALL DISPLAY
AJMP LOP_S2
;-----------------------------------
;东西方向直行灯为绿灯,南北东西方向右转为绿灯.其余所有灯为红灯
;人行道东西通行
;持续时间30秒,然后转到状态4
;------------------------------------
STATUS3:
MOV SECOND_COUNT,#60 ;30秒后转为状态4,状态4持续20秒
CLR LEFT1
SETB GO2
SETB WALK_EW
CLR WALK_NS
LOP_S3:
DJNZ SECOND_COUNT,M3
LJMP STATUS4
M3:
LCALL WORK
LCALL DISPLAY
AJMP LOP_S3
;-----------------------------------
;东西方向左转灯为绿灯,南北东西方向右转为绿灯其余所有灯为红灯
;人行道东西通行
;持续时间20秒,然后转到状态1
;-----------------------------------
STATUS4:
MOV SECOND_COUNT,#40 ;20秒后转为状态1,状态1持续30秒
CLR GO2
SETB LEFT2
CLR WALK_EW
CLR WALK_NS
LOP_S4:
DJNZ SECOND_COUNT,M4
LJMP STATUS1
M4:
LCALL WORK
LCALL DISPLAY
AJMP LOP_S4
;*********************************
;外中断初始化子程序
;*********************************
P_INIT:
MOV TCON,#0AH ;外中断INT0和INT1使能
SETB EA ;中断允许总控制使能
SETB EX0 ;外中断0使能
SETB EX1 ;外中断1使能
RET
;******************************
;INT0中断服务程序
;******************************
;遇到紧急情况1,南北方向直行灯为绿灯,南北东西方向右转为绿灯.
;其余所有灯为红灯.人行道南北通行
PINT0:
SETB GO1
SETB RIGHT1
CLR LEFT1
CLR GO2
SETB RIGHT2
CLR LEFT2
CLR WALK_NS
CLR WALK_EW
MOV R3,#50
DJNZ R3,PINT0_EXIT
PINT0_EXIT:
RETI
;******************************
;INT1中断服务程序
;******************************
;遇到紧急情况1,东西方向直行灯为绿灯,南北东西方向右转为绿灯.
;其余所有灯为红灯.人行道南北通行
PINT1:
CLR GO1
SETB RIGHT1
CLR LEFT1
SETB GO2
SETB RIGHT2
CLR LEFT2
CLR WALK_EW
CLR WALK_NS
MOV R3,#50
DJNZ R3,PINT1_EXIT
PINT1_EXIT:
RETI
;****************************************************
;* 显示程序 *
;****************************************************
; 40H为最高位,41H为最低位,先扫描高位
DISPLAY:MOV R1,#40H
MOV R5,#7fH
PLAY: MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.6,ENDOUT
RR A
MOV R5,A
AJMP PLAY
ENDOUT: MOV P2,#0FFH
MOV P0,#0FFH
RET
;****************************************************
;* 延时程序 *
;****************************************************
DL1MS:
PUSH 06H
PUSH 07H
MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
POP 07H
POP 06H
RET
;***********************************************
;辅助显示,将要显示时间的十位赋给40H,个位赋给41H
;***********************************************
WORK:
PUSH ACC
MOV A,SECOND_COUNT
MOV B,#10
DIV AB
MOV 40H,A
MOV 41H,B
POP ACC
RET
;------字符表(共阳)------
TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H, 0FFH
;共阳段码表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"
END