|
用51單片機(jī)實(shí)現(xiàn)一個(gè)交通燈的控制
交通燈的變化模式為:初始化狀態(tài)為東西紅燈都亮→延遲 3s 變?yōu)闁|西方向綠燈,南北方向紅燈→過 20S 后,東西方向變黃燈,南北方向依然是紅燈→過 3S,東西方向變紅燈,南北方向變綠燈→過 30S 后,東西方向依然為紅燈,南北方向變黃燈→過 3S 后變?yōu)闁|西綠燈, 南北紅燈,依次循環(huán)。
交通燈模塊電路板如圖
其中, J0 和 J0’是電源插座, POWER 為電源開關(guān), P0 為 P0.0~P0.7 插座,對就數(shù)碼管段碼(a~f), P1 為 P1.0~P1.7 插。
P1.0 連接?xùn)|西紅燈, P1.1 連接南北紅燈, P1.2 連接?xùn)|西綠燈, P1.3 連接南北綠燈, P1.4連接?xùn)|西黃燈, P1.5 連接南北黃燈, P1.6 連接?xùn)|西車 , P1.7 連接南北車; P2.0 為 LED1和 LED3 的位選, P2.1 為 LED2 和 LED4 的位選, P2.2 為 LED5 和 LED7 的位選, P2.3 為LED6 和 LED8 的位選; P3.2 東西緊急按鈕, P3.3 南北緊急按鈕
當(dāng)按下緊急按鈕,對應(yīng)的通路會(huì)變?yōu)槌>G,同時(shí)本方向表示車的LED亮起,用以表示有救護(hù)車通過等緊急情況
通過匯編語言基于KEILC51實(shí)現(xiàn)
通過實(shí)際觀察發(fā)現(xiàn) 由于按鍵是中斷實(shí)現(xiàn),故沒有添加去抖,導(dǎo)致按下緊急按鈕后可能沒有進(jìn)入中斷狀態(tài),這個(gè)可以通過數(shù)碼管的顯示來判斷,當(dāng)數(shù)碼管顯示暫停,說明進(jìn)入緊急中斷;當(dāng)再次按下時(shí),數(shù)碼管繼續(xù)跑數(shù)字,則退出了中斷。還有一點(diǎn)做的不太好,沒有做好現(xiàn)場保存,當(dāng)退出緊急中斷的時(shí)候,紅綠燈無法立刻恢復(fù)到原狀態(tài),當(dāng)此狀態(tài)時(shí)間跑過,LED會(huì)直接顯示下一個(gè)狀態(tài)。
初學(xué)單片機(jī)的新手歡迎各位大佬指正
代碼放入了附件部分 備有詳細(xì)的注釋
Snipaste_2021-04-12_20-55-02.jpg (68.82 KB, 下載次數(shù): 84)
下載附件
2021-4-12 20:55 上傳
單片機(jī)源程序如下:
- ORG 0000H;程序起始地址
- LJMP START;初始化標(biāo)號(hào)
- ORG 0003H;外部中斷地址--東西緊急按鈕觸發(fā)
- LJMP DXJJ;東西緊急標(biāo)號(hào)
- ORG 0013H;外部中斷地址--南北緊急按鈕觸發(fā)
- LJMP NBJJ;南北緊急標(biāo)號(hào)
- ORG 000BH;定時(shí)器T0中斷地址
- LJMP OT ;定時(shí)器T0標(biāo)號(hào)
- ORG 0100H;程序起始位置
- START: SETB EA ;中斷允許
- SETB ET0 ;允許定時(shí)器T0中斷
- CLR IT0 ;設(shè)置外部中斷為電平觸發(fā)
- CLR IT1 ;同上
- SETB EX0 ;允許外部中斷
- SETB EX1 ;同上
- SETB PX0 ;設(shè)置外部中斷優(yōu)先級(jí)高于定時(shí)器中斷
- SETB PX1 ;
- CLR PT0 ;
- MOV TMOD,#01H;設(shè)置定時(shí)器模式1
- MOV TH0,#3CH ;
- MOV TL0,#0B0H;設(shè)置定時(shí)器初值--50ms
- SETB TR0 ;開啟定時(shí)器
- MAIN: MOV R0,#20;設(shè)置R0 記錄20個(gè)50ms 產(chǎn)生1s
- MOV R1,#56;設(shè)置主時(shí)間判斷時(shí)間軸 表示循環(huán)周期
- MOV R2,#3 ;
- MOV R3,#3 ;東西南北初始紅燈時(shí)間為3S
- MOV R4,#0FCH;初始全紅 1111 1100
- MOV 70H,#0;判斷是否按下了緊急按鈕的標(biāo)志位 0 第一次按(進(jìn)入緊急狀態(tài)) 1 第二次按(退出緊急狀態(tài))
- MOV R7,#00H ;判斷是要執(zhí)行緊急程序還是正常交通燈顯示 00H正常交通燈 01H 東西緊急 02H南北緊急
- XS: LCALL DISPLAY;調(diào)用顯示程序
- LJMP XS ;循環(huán)進(jìn)行顯示
- SJMP [ DISCUZ_CODE_3 ]nbsp; ;死循環(huán) 保護(hù)程序執(zhí)行? 可能沒用
- OT: CJNE R7,#00H,PD ;R7不等于0跳轉(zhuǎn)判斷是哪個(gè)緊急,R7=0 說明未中斷正常跑程序
- ZCP: DJNZ R0,OVER2; ;R0 不為零說明沒有記夠20個(gè)50ms即沒有產(chǎn)生1s,跳出中斷等待下一次50ms產(chǎn)生中斷信號(hào)
- MOV TH0,#3CH ;
- MOV TL0,#0B0H;記完一次50ms 重新裝載定時(shí)器初值
- DEC R1 ;進(jìn)入此部分說明已經(jīng)經(jīng)過了1s 那么總時(shí)間-1
- DEC R2 ;顯示時(shí)間-1
- DEC R3 ;顯示時(shí)間-1
- KK1: CJNE R1,#53,KK2 ;判斷是否經(jīng)過了3s 到達(dá)了第一個(gè)狀態(tài)(初始狀態(tài)全紅為第狀態(tài))
- MOV R2,#20 ;
- MOV R3,#23 ;賦值顯示
- MOV R4,#0F9H;DX綠,NB紅 1111 1001
- LJMP OVER2
- KK2: CJNE R1,#33,KK3 ;判斷是否又經(jīng)過了20s 到達(dá)了第二個(gè)狀態(tài)
- MOV R2,#3 ;賦值顯示
- MOV R4,#0EDH;DX黃,NB紅 1110 1101
- LJMP OVER2
- KK3: CJNE R1,#30,KK4 ;判斷是否又經(jīng)過了3s 到達(dá)了第三個(gè)狀態(tài)
- MOV R2,#33 ;
- MOV R3,#30 ;賦值顯示
- MOV R4,#0F6H;DX紅,NB綠 1111 0110
- LJMP OVER2
- KK4: CJNE R1,#0,OVER1 ;判斷是否又經(jīng)過了30s 到達(dá)了第四個(gè)狀態(tài) 此時(shí)為了跳出中斷 還不能重新賦值記錄50ms的個(gè)數(shù) 采用了OVER1和OVER2
- MOV R3,#3 ;賦值顯示
- MOV R4,#0DEH;DX紅,NB黃 1101 1110
- MOV R1,#56 ;重新賦值總時(shí)間
- OVER1: MOV R0,#20 ;重新賦值20 以產(chǎn)生1s
- OVER2: RETI ;跳出中斷 如果用ERT是跳出子程序調(diào)用 兩者有區(qū)別!
- PD: CJNE R7,#01H,NB;判斷是哪種緊急 01H 是DX緊急 02H是NB緊急
- DX: MOV R4,#0B9H;DXJJ將東西車和綠燈打開,將南北燈變紅 1011 1001
- MOV P2,#0FFH;關(guān)掉數(shù)碼管選通 達(dá)到暫停數(shù)碼管效果
- RETI
- NB: MOV R4,#76H;NBJJ將南北車和南北綠燈打開,將東西燈變紅 0111 0110
- MOV P2,#0FFH;關(guān)掉數(shù)碼管選通 達(dá)到暫停數(shù)碼管效果
- RETI
- DXJJ: JB 70H,OFF1;判斷是否第一次按下緊急按鈕
- ON1: CPL 70H ;按下一次后就翻轉(zhuǎn) 下次就能檢測出是第二次
- MOV R7,#01H;第一次按下說明開啟中斷 那么進(jìn)入緊急狀態(tài) 緊急狀態(tài)標(biāo)志變?yōu)?01H表示產(chǎn)生東西中斷
- LJMP OUT1
- OFF1: CPL 70H ;如果要關(guān)掉中斷那么也要對標(biāo)志位取反 下次就能檢測出是要開啟
- MOV R7,#00H;第二次按下說明是關(guān)閉中斷 緊急標(biāo)志變?yōu)?00H進(jìn)入正常交通燈顯示
- OUT1: RETI
- NBJJ: JB 70H,OFF2;道理同上
- ON2: CPL 70H
- MOV R7,#02H
- LJMP OUT2
- OFF2: CPL 70H
- MOV R7,#00H
- OUT2: RETI
- DISPLAY:MOV DPTR,#TAB;東西的數(shù)碼管十位顯示
- MOV A,R2;
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR;
- MOV P2,#11111101B;
- MOV P0,A
- LCALL YS
- MOV DPTR,#TAB;東西的數(shù)碼管個(gè)位顯示
- MOV A,B;
- MOVC A,@A+DPTR;
- MOV P2,#11111110B
- MOV P0,A;
- LCALL YS
- MOV DPTR,#TAB;南北的數(shù)碼管十位顯示
- MOV A,R3;
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR;
- MOV P2,#11110111B;
- MOV P0,A
- LCALL YS
- MOV DPTR,#TAB;南北的數(shù)碼管個(gè)位顯示
- MOV A,B;
- MOVC A,@A+DPTR;
- MOV P2,#11111011B
- MOV P0,A;
- LCALL YS
-
- MOV P1,R4;紅綠燈的顯示
- LCALL YS
- RET
- YS: MOV R5,#150 ;延時(shí)函數(shù)
- JY: DJNZ R5,JY ;減一操作
- RET
- TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;數(shù)碼管共陰極
- END
復(fù)制代碼
hex下載:
TraficLight.zip
(14.31 KB, 下載次數(shù): 21)
2021-4-12 20:52 上傳
點(diǎn)擊文件名下載附件
工程文件帶有詳細(xì)注釋 下載積分: 黑幣 -5
|
|