51單片機匯編數顯大型交通燈控制仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (110.4 KB, 下載次數: 26)
下載附件
2022-4-23 15:29 上傳
屏幕截圖 2022-04-23 100514.png (204.21 KB, 下載次數: 26)
下載附件
仿真
2022-4-23 10:05 上傳
屏幕截圖 2022-04-23 100855.png (516.74 KB, 下載次數: 31)
下載附件
部分代碼
2022-4-23 10:09 上傳
單片機源程序如下:
- ;------------------------------------
- ;程序實現功能
- ;西南北路口直行與轉彎交替通行,數碼管顯示直行通行倒計時,紅綠黃燈顯示包括人行道在內的道路交通狀態。
- ;某一方向道路擁擠時,可以人工控制調節東西南北方向通行時間。
- ;緊急情況時,各路口交通燈顯示紅燈,數碼管保持數據不變。
- ;工作寄存器及存儲單元分配
- ;1.工作寄存器
- ;R2設置為定時器定時中斷次數,R6、R7用于延時程序中的寄存器
- ;2.片內存儲單元
- ;30H、31H作為兩組數碼管顯示數據存儲單元;32H、33H作為交通燈初始狀態存儲單元;40H、41H作為交通燈顯示數據存儲單元
- ;3.標志位
- ;00H:南北通行標志位 ; 01H:東西通行標志位;02H:緊急事件標志位
- ;-----------------------------------
- SNF EQU 00H ;;;南北通行標志位
- EWF EQU 01H ;;;東西通行標志位
- URF EQU 02H ;;;緊急事件標志位
- ORG 0000H
- LJMP MAIN ;;;上電轉主程序
- ORG 000BH ;;;定時中斷入口
- LJMP DSZD
- ORG 0003H ;;;緊急中斷入口
- LJMP URZD
- ORG 0030H
- MAIN: LCALL INIT ;;;調用初始化子程序
- LOOP: LCALL DIS ;;;循環執行顯示子程序
- AJMP LOOP
- ;///////////初始化程序
- INIT: SETB SNF
- SETB EWF
- SETB URF
- MOV R2,#20 ;;;定時器中斷20次為1s
- MOV TMOD,#01H ;;;初始化定時器
- MOV TL0,#0B0H
- MOV TH0,#3CH
- SETB EA ;;;開定時中斷與緊急中斷
- SETB ET0
- SETB TR0
- SETB EX0
- SETB IT0 ;;;設置中斷程控方式
- MOV DPTR,#TAB ;;;數值首地址放入DPTR中
- MOV 40H,#40 ;;;東南西北通行時間設置
- MOV 41H,#40
- MOV 30H,#40 ;;;通行時間初始化
- MOV 31H,#60
- MOV P0,#4CH ;;;初始化時南北通行并把交通燈狀態分別放在32H和33H中
- MOV 32H,#4CH
- MOV P2,#15H
- MOV 33H,#15H
- RET
- ;////////////顯示子程序
- DIS: MOV P3,#0DFH ;;;選中南北方向的十位數碼管
- MOV A,30H ;;;把顯示數據送人數碼管顯示
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV P1,A ;;;
- LCALL D1MS
- MOV P3,#0EFH ;;;選中南北方向的個位數碼管
- MOV A,B ;;;送入數碼管顯示
- MOVC A,@A+DPTR
- MOV P1,A
- LCALL D1MS
- MOV P3,#7FH ;;;選中第東西方向的十位數碼管
- MOV A,31H ;;;送入數碼管顯示
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV P1,A
- LCALL D1MS
- MOV P3,#0BFH ;;;選中第東西方向的個位數碼管
- MOV A,B
- MOVC A,@A+DPTR
- MOV P1,A
- LCALL D1MS
- SETB P3.0
- SETB P3.1
- JNB P3.0,DIS_S ;;;查詢是否第一個按鍵按下
- JNB P3.1,DIS_E ;;;查詢是否第二個按鍵按下
- AJMP DIS_R ;;;沒有鍵按下則返回
- DIS_S:LCALL D5MS ;;;按鍵去抖
- JNB P3.0,DIS_SN
- AJMP DIS_R
- DIS_SN:MOV 40H,#50 ;;;對通行時間從新分配,南北通行時間加長
- MOV 41H,#30
- AJMP DIS_R
- DIS_E:LCALL D5MS ;;;按鍵去抖
- JNB P3.1,DIS_EW
- AJMP DIS_R
- DIS_EW:MOV 40H,#30 ;;;東西通行時間加長
- MOV 41H,#50
- DIS_R:RET
- ;///////定時中斷處理程序
- DS_C: LJMP DS_R ;;;接力跳轉
- DSZD: PUSH ACC ;;;保護現場
- PUSH PSW
- CLR TR0 ;;;關定時器及中斷標志位并重新賦值
- CLR TF0
- MOV TL0,#0B0H
- MOV TH0,#3CH
- DJNZ R2,DS_C ;;;判斷1m時間是否到達
- MOV R2,#20 ;;;到達重新賦值
- DEC 30H ;;;南北方向通行時間減一
- MOV A,30H ;;;把減一后的時間送入顯示存儲單元
- ;;;;;;;南北通行到達最后4秒時黃燈閃爍
- DS_10:CJNE A,#4,DS_11 ;;;如果通行時間剩余4秒
- JNB SNF,DS_11 ;;;判斷是否是南北通行
- MOV P0,#8AH
- MOV 32H, #8AH ;;;把交通燈狀態存入存儲單元(后面類似)
- DS_11:CJNE A,#3,DS_12 ;;;不是剩余3秒,返回
- JNB SNF,DS_12 ;;;不是南北通行時間,返回
- MOV P0,#88H
- MOV 32H, #88H
- DS_12:CJNE A,#2,DS_13
- JNB SNF,DS_13
- MOV P0,#8AH
- MOV 32H, #8AH
- DS_13:CJNE A,#1,DS_14
- JNB SNF,DS_14
- MOV P0,#88H
- MOV 32H, #88H
- ;------------------------
- DS_14:JNZ DS_NE ;;;通行時間沒有結束轉向改變東西方向的數碼管
- CPL SNF ;;;如果通行時間結束則對標志位取反
- JNB SNF,DS_1 ;;;判斷是否南北通行
- MOV 30H,40H ;;;是,點亮相應的交通燈
- MOV P0,#4CH
- MOV 32H,#4CH ;;;存儲交通燈狀態
- MOV P2,#15H
- MOV 33H, #15H ;;;存儲交通燈狀態
- DS_NE:DEC 31H ;;;東西方向通行時間減一
- MOV A,31H ;;;把通行剩余時間送入顯示存儲單元
- ;;;;;;;;東西方向通行時間剩余4秒鐘黃燈閃爍(程序注釋與南北方向類似 略)
- DS_20:CJNE A,#4,DS_21
- JB EWF,DS_21
- MOV P0,#51H
- MOV 32H, #51H
- DS_21:CJNE A,#3,DS_22
- JB EWF,DS_22
- MOV P0,#41H
- MOV 32H, #41H
- DS_22:CJNE A,#2,DS_23
- JB EWF,DS_23
- MOV P0,#51H
- MOV 32H, #51H
- DS_23:CJNE A,#1,DS_24
- JB EWF,DS_24
- MOV P0,#41H
- MOV 32H, #41H
- ;-----------------------------
- DS_24:JNZ DS_R ;;;東西方向時間沒有結束,返回
- CPL EWF ;;;對通行狀態取反
- JNB EWF,DS_2 ;;;東西方向通行時間到來,跳轉
- MOV 31H,#80 ;;;東西方向通行結束,重新顯示時間
- MOV P0,#89H ;;;點亮相應的交通燈
- MOV 32H, #89H
- MOV P2,#29H
- MOV 33H, #29H
- AJMP DS_R
- DS_1: MOV 30H,#80 ;;;南北通行時間結束,重新對顯示存儲單元賦值
- MOV P0,#89H ;;;執行轉彎狀態1
- MOV 32H, #89H
- MOV P2,#26H
- MOV 33H, #26H
- AJMP DS_NE
- DS_2: MOV 31H,41H ;;;東西方向開始通行,賦值予顯示存儲單元
- MOV P0,#61H ;;;點亮相應的交通燈
- MOV 32H, #61H
- MOV P2,#15H
- MOV 33H, #15H
- DS_R: SETB TR0
- POP PSW ;;;恢復現場
- POP ACC
- RETI
- ;/////////////緊急中斷處理程序
- URZD: PUSH ACC ;;;保護現場
- PUSH PSW
- CLR IE0 ;;;清除中斷標志位
- CLR TR0 ;;;關定時器
- CPL URF ;;;緊急事件標志位
- JB URF,UR_CON ;;;緊急結束;跳轉
- MOV P0,#49H ;;;各路口燈全顯示紅燈亮
- MOV P2,#15H
- AJMP UR_R
- UR_CON:SETB TR0 ;;;恢復正常交通
- MOV A,32H
- MOV P0,A
- MOV A,33H
- MOV P2,A
- UR_R: POP PSW ;;;恢復現場
- POP ACC
- RETI
- ;////////////查表指令0,1,2,3,4,5,6,7,8,9
- TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
- DB 7DH, 07H, 7FH, 6FH
- ;//////////延時5ms與1ms
- D5MS: MOV R7,#5
- D1MS: MOV R7,#10
- MOV R6,#50
- L1: DJNZ R6,$
- DJNZ R7,L1
- RET
- END
復制代碼
51hei.png (14.01 KB, 下載次數: 30)
下載附件
2022-4-23 15:29 上傳
Keil代碼與Proteus仿真下載:
匯編數顯大型交通燈控制.zip
(71.57 KB, 下載次數: 29)
2022-4-23 10:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|