主機功能:主機,用於在特殊狀況下操縱從機,和對從機的時間統一。數組
從機功能:從機,每隔10s紅燈亮、每隔10s綠燈亮,綠燈到紅燈時黃燈閃爍3秒。函數
2. C51單片機連圖:設計
3. 丁字路口模擬圖:3d
4. 緊急狀況處理按鈕:指針
代碼註釋較爲詳細,自行觀看code
程序中斷圖:blog
主機代碼:get
// 程序說明 ; 主機,用於在特殊狀況下操縱從機,和對從機的時間統一。 ; 採用串口通訊方式二,波特率固定fosc/64 ; SCON = 1000 0000B = 80H, PCON = 00H 波特率不加倍 ; 定時器T0,方式1,50ms中斷一次,20次爲1s。 ; 初值:X = 2^16 - (50 * 10^-3) / (1 * 10^-6) = 15536D = 3CB0H // 變量定義 START EQU 30H STOP EQU 31H // 程序起點 ORG 0000H ; 復位入口 LJMP MAIN ; 轉到主程序 ORG 000BH ; T0中斷入口 LJMP COUNTTIME ; 轉到T0中斷服務程序 ORG 0023H ; 串行中斷入口 LJMP CONNECT ; 轉到串行中斷服務程序 ORG 0100H ; 主程序入口 // 主函數 MAIN: ; 1.啓動檢查 ; 2.初始化定時器0,開中斷 MOV TMOD, #01H ; 設置T0工做方式 MOV TCON, #05H ; 中斷觸發方式 MOV SCON, #80H ; 設置串行口工做方式 MOV PCON, #00H ; 設置波特率不加倍 MOV TH0, #3CH ; 裝入T0初值 MOV TL0, #0B0H SETB TR0 ; 啓動T0 SETB EA ; 開中斷 SETB ES SETB ET0 ; 容許T0中斷 ; 3.定義變量初值 MOV SP, #60H ; 設置堆棧指針 MOV START, #00H ; 傳入從機的數據,控制開始運行中斷信號 MOV STOP, #01H ; 傳入從機的數據,控制終止運行中斷信號 AGAIN: JNB P1.0, SET_NM1 ; 啓動鍵按下? JNB P1.1, SET_NM2 ; 中止鍵按下? SJMP AGAIN SET_NM1: LCALL DELAY500 ; 延時消抖 LCALL DELAY500 MOV R0, START ; 數據起始地址 CPL P2.1 LCALL TRS ; 數據發送 MOV R5, #0 ; 從新計時 SJMP AGAIN SET_NM2: LCALL DELAY500 ; 延時消抖 MOV R0, STOP LCALL TRS ; 數據發送 SJMP AGAIN TRS: MOV C, P MOV TB8, C MOV A, @R0 MOV SBUF, A WAIT: JNB TI, WAIT ; 一幀輸出完,TI=1時發送中斷 CLR TI RET DELAY500: MOV R6, #2000 ;DELAY500MS子程序(2000*125*1*10^-3=500ms) H2: MOV R0, #125 H1: DJNZ R0, H1 DJNZ R6, H2 RET // -----定時器0中斷用於定時----- ORG 0300H COUNTTIME: MOV TH0, #3CH ; 重裝T0初值 MOV TL0, #0B0H CPL P1.4 INC R5 ; 中斷次數加一 // -----串行中斷用於主機發送信號----- CONNECT: CLR TI ; TI=0發送中斷結束 CPL P2.2 RETI END
從機代碼:class
; 從機南北方向與東西方向基本一致 // 程序說明 ; 東西方向交通訊號燈。 ; 每隔10s綠燈亮、每隔10s紅燈亮、綠燈到紅燈時黃燈閃爍3秒。 ; CPU晶振頻率12MHz狀態週期,1個機器週期爲12個時鐘振盪週期,即1μs。 ; 定時器T0,方式1,50ms中斷一次,20次爲1s。 ; 初值:X = 2^16 - (50 * 10^-3) / (1 * 10^-6) = 15536D = 3CB0H // 變量定義 REDTIME EQU 30H YELLOWTIME EQU 31H GREENTIME EQU 32H MASTERDATA EQU 50H // 程序起點 ORG 0000H ; 復位入口 LJMP MAIN ; 轉到主程序 ORG 0003H ; INT0中斷入口地址 LJMP SEVER0 ; 轉到INT0中斷服務程序 ORG 000BH ; T0中斷入口 LJMP COUNTTIME ; 轉到T0中斷服務程序 ORG 0013H ; INT1中斷入口地址 LJMP SEVER1 ; 轉到INT1中斷服務程序 ORG 0023H ; 串行中斷入口 LJMP CONNECT ; 轉到串行中斷服務程序 ORG 0100H ; 主程序入口 // 主函數 MAIN: ; 1.啓動檢查 ; 2.初始化定時器0 MOV IE, #9FH ; 開中斷 MOV IP, #91H ; 中斷優先級,0>1,使0中斷觸發,保證恢復正常工做 MOV TMOD, #01H ; 設置T0工做方式 MOV TCON, #05H ; 中斷觸發方式 MOV SCON, #90H ; 設置串行口工做方式 MOV PCON, #00H ; 設置波特率不加倍 MOV TH0, #3CH ; 裝入T0初值 MOV TL0, #0B0H SETB TR0 ; 啓動T0 ; 3.定義變量初值 MOV SP, #60H ; 設置堆棧指針 MOV REDTIME, #10 ; 記錄紅燈總時長10s MOV YELLOWTIME, #3 ; 記錄黃燈總時長3s MOV GREENTIME, #10 ; 記錄綠燈總時長10s MOV P0, #00H ; 共陰極數碼管每段都不亮 MOV P1, #00H ; 每一個發光二級管都不亮 MOV P2, #00H ; 數碼管每一個都不顯示 // 方式寄存器R0-R5的初始化 MOV R0, #10 ; 用於存儲數碼管顯示數據,初始時從REDTIME開始 MOV R1, REDTIME ; 記錄紅燈實時的時間變化 MOV R2, YELLOWTIME ; 記錄黃燈實時的時間變化 MOV R3, GREENTIME ; 記錄綠燈實時的時間變化 MOV R4, #0 ; 記錄數碼管位選信號 MOV R5, #0 ; 記錄定時器中斷次數 MOV R6, #0 ; 記錄外部中斷類型 MOV R7, #0 ; 記錄通訊數據傳輸 // 燈光狀態初始化 SETB P1.0 ; 初始紅燈亮 CLR P1.1 ; 初始黃燈暗 CLR P1.2 ; 初始綠燈暗 ; 4.LED開始工做和SEG開始倒計時工做 WORK: CJNE R5, #10, WORK ; 中斷次數檢驗,當R5=10則爲0.5s進行倒計時時間的變化 CJNE R1, #1, RED ; 未到10s,紅燈 CJNE R3, #0, GREEN ; 黃燈結束,跳轉到綠燈,未到10s,綠燈 CJNE R2, #0, YELLOW ; 綠燈結束,跳轉到黃燈,未到3s,黃燈 // -----燈光周期結束後的從新賦值----- REFRESH: CJNE R5, #20, REFRESH; 中斷次數檢驗,當R5=20則爲1s進行倒計時時間的變化 MOV R5, #0 ; 重置中斷次數 MOV R1, REDTIME ; 時間寄存器從新賦值 MOV R2, YELLOWTIME MOV R3, GREENTIM MOV R0, #10 ; 初始化時間 SETB P1.0 ; 初始紅燈亮 CLR P1.1 ; 初始黃燈暗 CLR P1.2 ; 初始綠燈暗 JMP WORK ; 從新開始工做 // -----紅黃綠燈的燈光操做----- ; 1.紅燈亮REDTIME秒數 RED: CJNE R5, #20, RED ; 中斷次數檢驗,當R5=20則爲1s進行倒計時時間的變化 MOV R5, #0 ; 重置中斷次數 DEC R1 ; 秒數減一 MOV A, R1 ; R0做爲顯示時間 MOV R0, A SETB P1.0 ; 紅燈亮 CLR P1.1 ; 黃燈暗 CLR P1.2 ; 綠燈暗 JMP WORK ; 2.黃燈閃爍YRLLOWTIME秒數 YELLOW: CJNE R2, #3, DARK ; 第一次進入黃燈延遲0.5s,以避免時間誤差 CJNE R5, #20, YELLOW MOV R5, #0 ; 重置中斷次數 DEC R2 ; 秒數減一 MOV A, R2 ; R0做爲顯示時間 INC A ; 從YELLOWTIME開始倒計時 MOV R0, A CLR P1.0 ; 紅燈暗 SETB P1.1 ; 黃燈亮0.5s CLR P1.2 ; 綠燈暗 JMP WORK DARK: CJNE R5, #10, DARK ; 每秒閃爍 CLR P1.0 ; 紅燈暗 CLR P1.1 ; 黃燈暗0.5s CLR P1.2 ; 綠燈暗 LIGHT: CJNE R5, #20, LIGHT ; 中斷次數檢驗,當R5=20則爲1s進行倒計時時間的變化 MOV R5, #0 ; 重置中斷次數 DEC R2 ; 秒數減一 MOV A, R2 ; R0做爲顯示時間 INC A ; 從YELLOWTIME開始倒計時 MOV R0, A CLR P1.0 ; 紅燈暗 SETB P1.1 ; 黃燈亮0.5s CLR P1.2 ; 綠燈暗 WAIT: CJNE R2, #0, WORK CJNE R5, #10, WAIT CLR P1.0 ; 紅燈暗 CLR P1.1 ; 黃燈暗0.5s CLR P1.2 ; 綠燈暗 JMP WORK ; 3.綠燈亮GREENTIME秒數 GREEN: CJNE R5, #20, GREEN ; 中斷次數檢驗,當R5=20則爲1s進行倒計時時間的變化 MOV R5, #0 ; 重置中斷次數 DEC R3 ; 秒數減一 MOV A, R3 ; R0做爲顯示時間 INC A ; 從GREENTIME開始倒計時 MOV R0, A CLR P1.0 ; 紅燈暗 CLR P1.1 ; 黃燈暗 SETB P1.2 ; 綠燈亮 JMP WORK // -----外部中斷0用於恢復正常工做----- ORG 0200H SEVER0: MOV R6, #1 ; 結束中斷1的標誌,退出中止狀態,繼續正常工做 RETI // -----外部中斷1用於緊急狀況處理----- ORG 0220H SEVER1: MOV R5, #0 ; 時間初始化 MOV R6, #0 ; 狀態初始化 MOV P0, #6FH ; 數碼管顯示99秒 MOV P2, #00H SETB P1.0 ; 紅燈亮 CLR P1.1 ; 黃燈暗 CLR P1.2 ; 綠燈暗 T1WAIT: CJNE R6, #1, T1WAIT ; 原地等待,維持中止狀態 RETI // -----定時器0中斷用於定時----- ORG 0300H COUNTTIME: MOV TH0, #3CH ; 重裝T0初值 MOV TL0, #0B0H CPL P1.4 INC R5 ; 中斷次數加一 STEPRO: INC R4 ;R4爲片選信號 CJNE R4, #2,TODISP MOV R4, #0 TODISP: LCALL DISPSEG ;根據數碼管的片選信號進行顯示 DONTIME: RETI ; 中斷返回 DISPSEG: MOV A, R4 MOV DPTR, #SEGCON MOVC A, @A+DPTR MOV P2, A CJNE R4, #0, SEG1 ;判斷是哪一位數碼管亮 MOV A, R0 ;若是是第一個數碼管亮 MOV B, #10 DIV AB MOV DPTR, #NUM MOVC A, @A+DPTR MOV P0, A ;顯示秒數的十位 SEG1: CJNE R4, #1, FINDISP MOV A, R0 MOV B, #10 DIV AB MOV A, B MOV DPTR, #NUM MOVC A, @A+DPTR MOV P0, A ;顯示秒數的個位 FINDISP: RET ;結束顯示,程序返回 // -----串行中斷用於接收主機信號----- ; 0 恢復正常處理 ; 1 緊急狀況處理 ; 2 時間減五秒操做 ; 3 時間加五秒操做 CONNECT: JBC RI, READ SJMP CONNECT READ: MOV A, SBUF ; 數據接收 MOV C, P ; 奇偶校驗 JNC LP0 ; 奇偶校驗位位0? JNB RB8, ERR ; RB8=0禁止接收 SJMP LP1 ; 將數據放入指定位置 LP0: JB RB8,ERR LP1: CLR RI ; 接收中斷清零 JZ TT0 ; 恢復正常處理 DEC A JZ TT1 ; 緊急狀況處理 DEC A JZ TT2 ; 時間減五秒操做 JMP LP1 DEC A JZ TT3 ; 時間加五秒操做 TT0: CLR RI ; 接受中斷結束標誌 CLR P3.2 ; 觸發T0中斷 SETB P3.2 ; 恢復T0中斷 CPL P1.6 RETI TT1: ;CLR P3.3 ; 觸發T1中斷 ;SETB P3.3 ; 恢復T1中斷 SETB P1.5 RETI TT2: RETI TT3: RETI ERR: SETB P1.3 RETI ;數組:NUM控制數碼管顯示數字,SEGCON控制數碼管使能信號(數碼管低電平亮) NUM: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH SEGCON: DB 02H, 01H END
開機運行:變量
緊急狀況處理按鈕按下:
包含項目概述、項目圖紙、項目代碼、項目報告及項目PPT須要自取
提取碼: vijn
本人初學C51如上功能暫不完善,歡迎指正!