基於C51單片機的丁字路口交通燈控制系統

基於C51單片機的丁字路口交通燈控制系統


項目要求:用單片機設計一套丁字路口的交通燈顯示系統,如圖所示,有三組相同的道路顯示系統

undefined

項目概述:採用多機通信實現對多個紅綠燈的控制

  1. 主機功能:主機,用於在特殊狀況下操縱從機,和對從機的時間統一。數組

  2. 從機功能:從機,每隔10s紅燈亮、每隔10s綠燈亮,綠燈到紅燈時黃燈閃爍3秒。函數

項目圖紙:

  1. 概覽圖:

undefined

2. C51單片機連圖:設計

undefined

3. 丁字路口模擬圖:3d

undefined

4. 緊急狀況處理按鈕:指針

undefined

項目代碼

代碼註釋較爲詳細,自行觀看code

  1. 程序中斷圖:blog

    undefined

  2. 主機代碼: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
  3. 從機代碼: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須要自取

本人初學C51如上功能暫不完善,歡迎指正!

相關文章
相關標籤/搜索