本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
东西方向绿灯亮,南北方向红灯亮,定时10S,10S倒计时完以后,东南西北四个方向的黄灯闪5S,5S倒计时完毕;东西方向红灯亮,南北方向绿灯亮,定时15S,15倒计时完毕,又跳回东西方向绿灯亮,南北方向红灯亮定时10S,如此循环。当按下紧急按键KEY1时,东西南北四个方向只亮红灯,定时10S,10S倒计时完毕,时间跳回到按下紧急按键KEY1前的时间,继续倒计时。
改用共阳极的!注释补全! 谢谢各位大哥大姐啦!
;*--------------------------------交通灯控制程序------------------------------------------*
;*--------------------------------MCS-51汇编语言----------------------------------------*
;*--------------------------------用AT89S51单片机,12MHz晶振-------------------*
;*--------------------------------程序名:交通灯.ASM-----------------------------------*
;*--------------------------------交通灯控制系统程序------------------------------------*
ORG 0000H ;主程序的入口地址
AJMP START ;跳转到主程序的开始处
ORG 0003H ;外部中断0的中断程序入口地址
AJMP INT ;跳转到中断服务程序处
ORG 000BH
AJMP DISP
ORG 001BH
AJMP TIME
ORG 0030H
;*--------------------------------初始化--------------------------------------------------*
START:MOV SP,#60H
MOV P1,#0
MOV R3,#0
MOV TMOD,#11H ;定时器T0,T1定时方式且都工作于模式1
MOV TH0,#0D8H ;10ms定时
MOV TL0,#0F0H
MOV TH1,#03CH ;50ms定时
MOV TL1,#0B0H ;初值15536
SETB EA ;总中断开
SETB IT0 ;脉冲触发方式IT=1
SETB EX0 ;开外部中断0
SETB ET0 ;开定时中断0
SETB ET1 ;开定时中断1
SETB TR0 ;开启定时器0
SETB TR1 ;开启定时器1
;*--------------------------------主程序--------------------------------------------------*
MAIN:SETB P1.0 ;开东西绿灯
SETB P1.5 ;开南北红灯
MOV R2,#40 ;东西绿灯亮40s
LOOP:MOV 30H,R2
MOV A,R2
MOV 32H,A
MOV 33H,A
JNB 00H,NEXT ;00H标志位为1说明有救护车到达,需要执行相应的设置
ACALL HELP ;调用10s救护车处理程序
NEXT:CJNE R2,#0,LOOP
MOV 30H,#0
MOV 32H,#5 ;关东西绿灯
MOV 33H,#5
SETB P1.1 ;东西黄灯闪5s
SETB P1.4 ;南北黄灯闪5s
MOV R2,#5
LOOP1:MOV 30H,R2
MOV 32H,R2
JNB 00H,NEXT1
ACALL HELP
NEXT1:ACALL DELAY1 ;延时0.08s
SETB P1.1 ;东西黄灯闪5s
SETB P1.4 ;南北黄灯闪5s
ACALL DELAY1 ;延时0.08s
CLR P1.1 ;关东西黄灯
CLR P1.4 ;关南北黄灯
CJNE R2,#0,LOOP1 ;时间未到零,继续循环
MOV 30H,#0
MOV 32H,#0
CLR P1.0 ;关东西绿灯
CLR P1.1 ;关东西绿灯
CLR P1.4 ;关南北黄灯
CLR P1.5 ;关南北红灯
SETB P1.2 ;开东西红灯
SETB P1.3 ;开南北绿灯
MOV R2,#60 ;东西红灯亮60s
LOOP2:MOV 30H,R2
MOV A,R2
MOV 32H,A
JNB 00H,NEXT2
ACALL HELP
NEXT2:CJNE R2,#5,LOOP2
MOV 32H,#0
SETB P1.1 ;东西黄灯闪5s
SETB P1.4 ;南北黄灯闪5s
LOOP3: MOV 30H,R2
MOV 32H,R2
JNB 00H,NEXT3
ACALL HELP
NEXT3:ACALL DELAY1
SETB P1.1
SETB P1.4
ACALL DELAY1
CLR P1.1
CLR P1.4
CJNE R2,#0,LOOP3
MOV 30H,#0
MOV 32H,#0
CLR P1.1 ;关东西黄灯
CLR P1.2 ;关东西红灯
CLR P1.3 ;关南北绿灯
CLR P1.4 ;关南北黄灯
AJMP MAIN
DELAY1:MOV 55H,#200
YS: MOV 56H,#200
DJNZ 56H,$
DJNZ 55H,YS
RET
;*-------------------------------紧急响应子程序-----------------------------------------*
HELP:MOV 50H,R2 ;保护R2
MOV 51H,P1 ;保护R1
MOV P1,#0
SETB P1.2 ;东西红灯亮
SETB P1.5 ;南北红灯亮
MOV R2,#10 ;东南西北红灯亮10s
D1:MOV 30H,R2
MOV 32H,R2
CJNE R2,#0,D1
MOV 30H,#0
MOV 32H,#0
CLR 00H
MOV R2,50H
MOV P1,51H
RETI
;*-------------------------------外部中断服务程序-----------------------------------------*
INT:CLR EA
PUSH ACC
PUSH PSW
SETB 00H ;清标志位00H
POP PSW
POP ACC
SETB EA
RETI
;*-------------------------------显示中断处理程序-----------------------------------------*
DISP:CLR EA
CLR TR0
PUSH ACC
PUSH PSW
ACALL HEXBCD ;把十六进制数变成十进制数
MOV A,30H
JNZ QING1 ;为零不显示
MOV 40H,#10
MOV 41H,#10
QING1:MOV A,32H
JNZ QING2 ;为零不显示
MOV 44H,#10H
MOV 45H,#10H
QING2:MOV R0,#40H ;R0指向显示缓冲区首地址
MOV R1,#0000001B ;首位位选字送R1
LD0:MOV P2,R1 ;从P2口输出位选码
MOV DPTR,#TAB
MOV A,@R0 ;取要显示的数
MOVC A,@A+DPTR ;查表获得七段码
MOV P0,A ;从P0口输出段选码
ACALL DELAY ;调用延时程序
INC R0 ;指向缓冲区下一单元
MOV A,R1 ;位选码送A
JB ACC.5,EXIT1 ;判六位是否显示完,显示完毕返回
RL A ;未显示完毕,将位选码变成下一个选字
MOV R1,A ;修改后的为选码送R1
AJMP LD0 ;循环选手
EXIT1:MOV TH0,#0D8H ;定时10s
MOV TL0,#0F0H
POP PSW
POP ACC
SETB TR0 ;开定时器0
SETB EA ;开中断中开关
RETI ;中断返回
;*-------------------------------十六进制转十进制子程序-----------------------------------*
HEXBCD:MOV A,30H
MOV B,#10
DIV AB
MOV 40H,B
MOV 41H,A
MOV 42H,#10
MOV 43H,#10
MOV A,32H
MOV B,#10
DIV AB
MOV 44H,B
MOV 45H,A
RET
;*---------------------------------1ms延时子程序------------------------------------------*
DELAY:MOV R5,#10
DEL:MOV R6,#50
DJNZ R6,$
DJNZ R5,DEL
RET
;*---------------------------------定时中断处理程序---------------------------------------*
TIME:CLR EA
CLR TR1
PUSH ACC
PUSH PSW
INC R3
CJNE R3,#20,EXIT0 ;50ms*20=1s定时
MOV R3,#0
DEC R2
EXIT0:MOV TH1,#3CH ;50ms定时
MOV TL1,#0B0H
POP PSW
POP ACC
SETB TR1
SETB EA
RETI
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
END |