单片机交通灯程序
5.5.2 程序源代码
ORG 0000H ; 主程序的入口地址 LJMP MAIN ; 跳转到主程序的开始处 ORG 0003H ; 外部中断0的中断程序入口地址
ORG 000BH ; 定时器0的中断程序入口地址
LJMP T0_INT ; 跳转到中断服务程序处 ORG 0013H ; 外部中断1的中断程序入口地址 MAIN : MOV SP,#50H
MOV IE,#8EH ;CPU 开中断,允许T0中断,T1中断和外部中断1中断
MOV TMOD,#51H ; 设置T1为计数方式,T0为定时方式,且都工作于模式1
MOV TH1,#00H ;T1计数器清零 MOV TL1,#00H
SETB TR1 ; 启动T1计时器 SETB EX1 ; 允许INT1中断 SETB IT1 ; 选择边沿触发方式 MOV DPTR ,#0003H
MOV A, #80H ; 给8255赋初值,8255工作于方式0
MOVX @DPTR, A
AGAIN: JB P3.1,N0 ; 判断是否要设定东西方向红绿灯时间的初值,若P3.1为1 则跳转 MOV A,P1
JB P1.7,RED ; 判断P1.7是否为1,若为1则设定红灯时间,否则设定绿灯时间 MOV R0,#00H ;R0清零
MOV R0,A ; 存入东西方向绿灯初始时间 MOV R3,A LCALL DISP1 LCALL DELAY
AJMP AGAIN RED: MOV A,P1
ANL A,#7FH ;P1.7置0
MOV R7,#00H ;R7清零
MOV R7,A ; 存入东西方向红灯初始时间
MOV R3,A LCALL DISP1 LCALL DELAY AJMP AGAIN
;-------------------------------------------
N0: SETB TR0 ; 启动T0计时器 MOV 76H,R7 ; 红灯时间存入76H N00: MOV A,76H ; 东西方向禁止,南北方向通行
MOV R3,A
MOV DPTR,#0000H ; 置8255A 口,东西方向红灯亮,南北方向绿灯亮 MOV A,#0DDH MOVX @DPTR, A N01: JB P2.0,B0 N02: SETB P3.0
CJNE R3,#00H,N01 ; 比较R3中的值是否为0,不为0转到当前指令处执行 ;------黄灯闪烁5秒程序------ N1: SETB P3.0 MOV R3,#05H
MOV DPTR,#0000H ; 置8255A 口,东西,南北方向黄灯亮 MOV A,#0D4H MOVX @DPTR,A N11: MOV R4,#00H
N12: CJNE R4,#7DH,$ ; 黄灯持续亮0.5秒 N13: MOV DPTR,#0000H ; 置8255A 口,南北方向黄灯灭
MOV A,#0DDH MOVX @DPTR,A N14: MOV R4,#00H
CJNE R4,#7DH,$ ; 黄灯持续灭0.5秒 CJNE R3,#00H,N1 ; 闪烁时间达5秒则退出
;------------------------------------------------------------ N2: MOV R7,#00H
MOV A,R0 ; 东西通行,南北禁止 MOV R3,A
MOV DPTR,#0000H ; 置8255A 口,东西方向绿灯亮,南北方向红灯亮 MOV A,#0EBH MOVX @DPTR,A N21: JB P2.0,T03
N22: CJNE R3,#00H,N21 ;------黄灯闪烁5秒程序------ N3: MOV R3,#05H
MOV DPTR,#0000H ; 置8255A 口,东西,南北方向黄灯亮 MOV A,#0E2H MOVX @DPTR,A N31: MOV R4,#00H
CJNE R4,#7DH,$ ; 黄灯持续亮0.5秒 N32: MOV DPTR,#0000H ; 置8255A 口,南北方向黄灯灭
MOV A,#0EBH MOVX @DPTR,A N33: MOV R4,#00H
CJNE R4,#7DH,$ ; 黄灯持续灭0.5秒 CJNE R3,#00H,N3 ; 闪烁时间达5秒则退出
SJMP N00 ;------闯红灯报警程序------
B0: MOV R2,#03H ; 报警持续时间3秒 B01: MOV A,R3
JZ N1 ; 若倒计时完毕,不再报警
CLR P3.0 ; 报警
CJNE R2,#00H,B01 ; 判断3秒是否结束 SJMP N02 ;------1秒延时子程序------- N7: RETI
T0_INT:MOV TL0,#9AH ; 给定时器T0送定时10ms 的初值
MOV TH0,#0F1H INC R4 INC R5
CJNE R5,#0FAH,T01 ; 判断延时是否够一秒,不够则调用显示子程序
MOV R5,#00H ;R5清零 DEC R3 ; 倒计时初值减一 DEC R2 ; 报警初值减一 T01: ACALL DISP ; 调用显示子程序 RETI ; 中断返回 ;------显示子程序------ DISP: JNB P2.4,T02 DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二转十显示转换 DIV AB MOV 79H,A MOV 7AH,B
DIS: MOV A,79H ; 显示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0F7H MOVX @DPTR,A LCALL DELAY
DS2: MOV A,7AH ; 显示个位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0FBH MOVX @DPTR,A RET
;------东西方向车流量检测程序------ T03: MOV A,R3
SUBB A,#00H ; 若绿灯倒计时完毕,不再检测车流量
JZ N3 JB P2.0,T03
INC R7 CJNE R7,#64H,E1
MOV R7,#00H ; 中断到100次则清零
E1: SJMP N22
;------东西方向车流量显示程序------ T02: MOV B,#0AH
MOV A,R7 ;R7中值二转十显示转换 DIV AB MOV 79H,A MOV 7AH,B
DIS3: MOV A,79H ; 显示十位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0F7H MOVX @DPTR,A LCALL DELAY
DS4: MOV A,7AH ; 显示个位 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#0002H MOVX @DPTR,A MOV DPTR,#0001H MOV A,#0FBH MOVX @DPTR,A LJMP N7
;------延时4MS 子程序---------- DELAY: MOV R1,#0AH
LOOP: MOV R6,#64H NOP
LOOP1: DJNZ R6,LOOP1 DJNZ R1,LOOP RET ;------字符表------ TAB: DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END