單片機(jī)交通燈程序 基于51單片機(jī)的交通燈控制程序
采用51單片機(jī)作為系統(tǒng)的MCU,基本完成控制兩組交通指示燈交替亮
每個(gè)街口有左拐、直行及行人三種指示燈。直行燈每個(gè)燈有紅、黃、綠三種顏色。自行車(chē)與汽車(chē)共用左拐和直行燈。
首先東西向直行綠燈和行人燈亮1分鐘,左轉(zhuǎn)燈亮30秒,黃燈亮5秒(同時(shí)南北向紅燈亮95秒),然后東西向紅燈亮95秒鐘(同時(shí)首先南北向直行綠燈和行人燈亮1分鐘,左轉(zhuǎn)燈亮30秒,黃燈亮5秒),然后東西向的綠燈亮,依次類推。
每次綠燈亮的時(shí)候,對(duì)應(yīng)的行人燈亮。
60S/30S/5S/60S/30S/5S
東西道
綠和行人/左轉(zhuǎn)/黃/紅/紅/紅
南北道
紅/紅/紅/綠和行人/左轉(zhuǎn)/黃
行人燈亮的時(shí)候有聲音提示盲人能通過(guò)。
突發(fā)交通事故的時(shí)候能夠緊急全紅燈。
在有重要人物通過(guò)的時(shí)候能手動(dòng)改為綠燈。
ORG 0000H ;主程序的入口地址
LJMP MAIN ;跳轉(zhuǎn)到主程序的開(kāi)始處
ORG 0003H ;外部中斷0的中斷程序入口地址
ORG 000BH ;定時(shí)器0的中斷程序入口地址
LJMP T0_INT ;跳轉(zhuǎn)到中斷服務(wù)程序處
ORG 0013H ;外部中斷1的中斷程序入口地址
MAIN : MOV SP,#50H
MOV IE,#8EH ;CPU開(kāi)中斷,允許T0中斷,T1中斷和外部中斷1中斷
MOV TMOD,#51H ;設(shè)置T1為計(jì)數(shù)方式,T0為定時(shí)方式,且都工作于模式1
MOV TH1,#00H ;T1計(jì)數(shù)器清零
MOV TL1,#00H
SETB TR1 ;啟動(dòng)T1計(jì)時(shí)器
SETB EX1 ;允許INT1中斷
SETB IT1 ;選擇邊沿觸發(fā)方式
MOV DPTR ,#0003H
MOV A, #80H ;給8255賦初值,8255工作于方式0
MOVX @DPTR, A
AGAIN: JB P3.1,N0 ;判斷是否要設(shè)定東西方向紅綠燈時(shí)間的初值,若P3.1為1 則跳轉(zhuǎn)
MOV A,P1
JB P1.7,RED ;判斷P1.7是否為1,若為1則設(shè)定紅燈時(shí)間,否則設(shè)定綠燈時(shí)間
MOV R0,#00H ;R0清零
MOV R0,A ;存入東西方向綠燈初始時(shí)間
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 ;存入東西方向紅燈初始時(shí)間
MOV R3,A
LCALL DISP1
LCALL DELAY
AJMP AGAIN
;----------------------------------
N0: SETB TR0 ;啟動(dòng)T0計(jì)時(shí)器
MOV 76H,R7 ;紅燈時(shí)間存入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轉(zhuǎn)到當(dāng)前指令處執(zhí)行
;------黃燈閃爍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,$ ;黃燈持續(xù)亮0.5秒
N13: MOV DPTR,#0000H ; 置8255A口,南北方向黃燈滅
MOV A,#0DDH
MOVX @DPTR,A
N14: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續(xù)滅0.5秒
CJNE R3,#00H,N1 ;閃爍時(shí)間達(dá)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,$ ;黃燈持續(xù)亮0.5秒
N32: MOV DPTR,#0000H ; 置8255A口,南北方向黃燈滅
MOV A,#0EBH
MOVX @DPTR,A
N33: MOV R4,#00H
CJNE R4,#7DH,$ ;黃燈持續(xù)滅0.5秒
CJNE R3,#00H,N3 ;閃爍時(shí)間達(dá)5秒則退出
SJMP N00
;------闖紅燈報(bào)警程序------
B0: MOV R2,#03H ;報(bào)警持續(xù)時(shí)間3秒
B01: MOV A,R3
JZ N1 ;若倒計(jì)時(shí)完畢,不再報(bào)警
CLR P3.0 ;報(bào)警
CJNE R2,#00H,B01 ;判斷3秒是否結(jié)束
SJMP N02
;------1秒延時(shí)子程序-------
N7: RETI
T0_INT:MOV TL0,#9AH ;給定時(shí)器T0送定時(shí)10ms的初值
MOV TH0,#0F1H
INC R4
INC R5
CJNE R5,#0FAH,T01 ;判斷延時(shí)是否夠一秒,不夠則調(diào)用顯示子程序
MOV R5,#00H ;R5清零
DEC R3 ;倒計(jì)時(shí)初值減一
DEC R2 ;報(bào)警初值減一
T01: ACALL DISP ;調(diào)用顯示子程序
RETI ;中斷返回
;------顯示子程序------
DISP: JNB P2.4,T02
DISP1: MOV B,#0AH
MOV A,R3 ;R3中值二轉(zhuǎn)十顯示轉(zhuǎn)換
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 ;顯示個(gè)位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
RET
;------東西方向車(chē)流量檢測(cè)程序------
T03: MOV A,R3
SUBB A,#00H ;若綠燈倒計(jì)時(shí)完畢,不再檢測(cè)車(chē)流量
JZ N3
JB P2.0,T03
INC R7
CJNE R7,#64H,E1
MOV R7,#00H ;中斷到100次則清零
E1: SJMP N22
;------東西方向車(chē)流量顯示程序------
T02: MOV B,#0AH
MOV A,R7 ;R7中值二轉(zhuǎn)十顯示轉(zhuǎn)換
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 ;顯示個(gè)位
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0002H
MOVX @DPTR,A
MOV DPTR,#0001H
MOV A,#0FBH
MOVX @DPTR,A
LJMP N7
;------延時(shí)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
評(píng)論