《微型計算機系統》 課程設計 題目名稱:基于單片機的交通燈控制系統設計 專業:電氣工程及其自動化 班級:15級1班 姓名:趙* 學號:201*58 指導教師:辛*平 青島理工大學自動化工程學院 課程設計任務書 課程名稱:微型計算機系統 設計題目:基于單片機的交通燈控制系統設計 系統要求: 可用紅、黃、綠三種顏色發光二極管和兩位LED數碼管模擬交通燈的變化規律: - 首先,東西路口紅燈亮,同時開始60秒倒計時;
- 南北路口“直行”綠燈亮,同時開始40秒倒計時,南北人行道綠燈亮。當南北路口倒計時至4秒時,黃燈開始閃爍,南北人行道紅燈亮;倒計時至0秒時,直行燈變紅,左轉綠燈亮,同時開始20秒倒計時。當20秒倒計時結束時,南北路口紅燈亮,開始60秒倒計時;
- 東西路口直行綠燈亮,開始40秒倒計時,東西人行道綠燈亮;按照上述變化規律依次循環。
硬件設計: - 最小系統設計: 51單片機為本設計的控制器,包括外擴ROM、RAM(其大小由設計者自己設計),系統時鐘電路、復位電路等構成的最小系統;
- 接口電路的設計:設計者擴展一個并行接口〔8155〕;
- 鍵盤設計:由設計者根據需要設計鍵盤的數量
- 顯示設計:采用LED數碼管顯示時間,顯示電路根據顯示的內容設計;采用三種顏色(紅、黃、綠)的發光二極管模擬交通燈;有開機顯示狀態(如顯示888888);
- 在完成基本設計功能的基礎上可以另加其他功能。
軟件設計: 1)主程序設計 2)各功能子程序設計 其他要求: - 每位同學獨立完成本設計。
- 依據題目要求,提出系統設計方案。
- 設計系統電路原理圖。
- 調試系統硬件電路、功能程序。
- 編制課程設計報告書并裝訂成冊,報告書內容(按順序)
(1)報告書封面 (2)課程設計任務書 (3)系統設計方案的提出、分析 (4)系統中典型電路的分析 (5)系統軟件結構框圖 (6)系統電路原理圖 (7)源程序 (8)課設字數不少于3000字 基于單片機的交通燈控制系統設計 摘要: 當你路過一個十字路口時,你是否注意到各個方向車輛和信任有條不紊的通過十字路口。這樣井然有序的情景靠什么來實現呢?靠的是交通燈控制系統。在論文中我使用STC89C51作為主控單元。通過單片機芯片的P1口和P2口分別控制東西方向和南北方向紅黃綠燈的點亮。通過單片機芯片STC89C51的RXD和TXD控制數碼管的顯示時間。采用發光二極管來實現交通燈的點亮,由數碼管實現時間的顯示。該系統不僅僅具有交通等的基本功能還有倒計時,還可以通過按鍵在緊急事件中四個方向都設置為紅燈緊急模式。當然也可以通過按鍵來設置倒計時時間,使系統更加符合實際交通情況。 我設計的交通燈控制系統可以較好的模擬十字路口出現的交通狀況,使行人和車輛能有序的通行。 關鍵詞:交通控制系統 單片機 AT89C51 數碼管 按鍵 LED 內容 1系統方案論證 1.1設計方案 方案一:控制系統主要控制東西方向和南北方向交通狀況,系統以單片機芯片STC89C51為主控單元,通過控制三種顏色LED燈的亮滅來指導個車道通行,上電時復位系統使系統進入運行狀態。總體框圖如下:(見51hei附件)
1.2功能概述 在東西方向和南北方向的十字路口分別設立紅黃綠交通指示燈,用數碼管倒計時顯示。正常情況下兩個主干線上的紅黃綠燈進行交換。紅燈亮表示禁止通行,綠燈亮表示可以通行,每次綠燈變紅燈之前,黃燈亮五秒,方便那些未能及時通過十字路口的車輛能繼續通過。十字路口設立數碼管有倒計時功能,方便人們直關把握通過時間。本設計也考慮緊急情況,當按下緊急模式按鍵后,四個方向紅燈都會常亮。對于夜晚車輛比較少,本設計設計了夜晚模式,按下按鍵后四個方向黃燈會常亮。 2系統硬件設計 2.1交通信號燈控制系統的組成 2.1.1 ATC89C51芯片 選用的ATC89C51與同系列AT89C51在功能上有明顯的提高,最突出的是可以實現在線編程。用于系統的總控制。其主要功能列舉如下: - 為一般控制應用的8位單片機
- 內部具有時鐘振蕩器
- 內部程序存儲器(ROM)位4KB
- 內部數據存儲器(RAM)為128B
- 外部程序存儲器可擴充至64KB
- 外部數據存儲器可擴充至64KB
- 32條雙向輸入線,且每條均可以單獨做I/O的控制
- 5個中斷源
- 2組獨立的16位定時器
- 1個全雙工串行通信端口
- 單片機芯片提供位邏輯運算指令
單片機引腳圖如下: 
2.1.2交通燈控制系統構成 芯片ATC89C51一片,2段共陰極數碼管四個,紅黃綠發光二極管各四個,電阻若干,晶振一個,電容若干,按鍵若干。 交通燈控制系統結構框圖:(見51黑附件) 系統各部分工作原理:采用單片機的I/O口P0口通過上拉電阻和交通燈相連接,P3.0、P3.1口接到數碼管控制位上,控制數碼管的顯示,程序放在ATC89C51單片機的ROM中來設置初始時間,在十字路口的四組紅、黃、綠交通燈中,由單片機的P1.5—P1.7、P1.0—P1.2、P2.5—P2.7、P2.0—P2.2分別控制東西南北方向的三色燈。由于交通燈為發光二極管并且陽極通過限流電阻與電源正極相連,因此I/O口輸出電平時,與之相連的指示燈才會點亮,然后通過數碼管倒計時時間。I/O口輸出高電平時,相應指示燈會滅。由于ATC89C51本身集成了看門狗指令,當系統出現異常時看門狗會發出溢出中斷。通過專用的端口輸出,引起RESET復位信號復位系統。 2.2各單元電路模塊功能 2.2.1時鐘電路模塊 本時鐘電路由一個晶體振蕩器12MHz和兩個30pF的瓷片電容組成。時鐘電路用于產生單片機工作所需的時鐘信號,而是需所研究的是指令執行中各信號之 間的相互關系。單片機本身就是一個復雜的同步時序電路,為了保證同步工作方式的實現,電路應在唯一的時鐘信號控制下嚴格的工作。其電路圖所示: 2.2.2復位電路模塊 電容在上接高電平,電阻在下接低電平,中間為RST。這種復位電路為高電平復位。其工作原理是:通電時,電容兩端相當于是短路,于是RST引腳上為高電平,然后電源通過電容對電阻充電,RST端電壓慢慢下降,降到一定程度,即為低電平,單片機開始正常工作。其電路如下: 2.2.3信號燈輸出控制模塊 路口交通燈指示采用紅、黃、綠發光二極管進行提示。其電路如下: 2.2.4時間顯示電路模塊 本系統使用數碼管完成倒計時顯示功能。以東西方向為例,數碼管顯示的數值從綠燈的設置時間最大值往下減,每秒鐘減1,一直減到零。然后又從紅燈的設置時間最大值往下減,一直減到零。接下來又顯示綠燈時間,如此循環。系統共有4個兩位LED數碼管,分別放在模擬交通燈的上方。路口通行剩余時間采用紅色7段數碼管顯示,采用共陰極數碼管,如用單機IP0口加上拉電阻驅動,P3.0/P3.1口來控制數碼管的位。其顯示電路如下: 2.2.5按鍵輸入模塊 由于該系統具有夜間模式,緊急情況模式和交通燈倒計時時間設定功能,所有需要加上這些功能鍵,如下圖所示:
3系統軟件設計
3.2延時的設定 3.2.1 計數器初值計算 定時器工作時必須給計數器送初值,這個值是送到TH和TL中的。他是以加法記數的,并能從全1到全0自動產生溢出中斷請求。因此,可以把計數器記滿為零所需的計數值設定為C和計數初值設定為TC可得到如下計算公式: TC=M-C 式中,M為計數器模值,該值與計數器工作方式有關。在方式0時M為 2^13;在方式1時M的值為2^16;在方式2和3中為2^8。 算法公式:T=(M-TC)T(計數)或TC=M-T/T(計數) T(計數)是單片機時鐘周期T(clk)的12倍;TC為定時的初值 如果單片機的主脈沖頻率為T(clk)12MHz,經過12分頻 方式0 TMAX=2^13*1微妙=8.192毫秒 方式1 TMAX=2^16*1微妙=65.536毫秒 實現1秒鐘方法: 采用在主程序中設定一個初值為20的軟件計數器和使T1定時50毫秒。 這樣每當T1到50毫秒時CPU就響應他的溢出中斷請求,進入他的中斷服務子程序。在中斷服務子程序中,CPU先使軟件計數器減1,然后判斷他是否為零。為0表示1秒已到可以返回到輸出時間顯示程序。
定時器需定時50毫秒,故T1工作于方式1。 初值計算:TC=M-T/T(計數)=2^16-50ms/1us=15536=3CB0H 延時程序: START:MOV TMOD,#10H ;令TO為定時器方式1 MOV TH0,#3CH ;裝入定時器初值 MOV TL0,#0B0H SETB EA ;打開總中斷 SETB ET1 ;開T1中斷 SETB ER ;啟動T1計數器 CLR FLAG1 CLR FLAG2 CLR FLAG3 MOV R3,#20H ;軟件計數器賦初值 ORG 001BH LJMP DSD ORG 0300H DSD:INC R3 MOV TH0,#3CH ;重裝定時器初值 MOV TL0,#B0H CJNE R3,#20,FH DEC R0 DEC R1 MOV R3,#00H FH: RETI 程序的軟件延時: 單片機的工作頻率為12MHz。機器周期與主頻有關,機器周期是主頻的12倍,所以一個機器周期的時間為12*(1/12M)=1us。可以知道具體每條指令的周期數,這樣就可以通過指令的執行條數來確定1秒的時間。 具體的延時程序分析: DELY: MOV R4,#80H ;延時一秒主程序 DE2: LCALL DELAY1 DJNE R4,DE2 RET DELAY1: MOV R4,#00H ;延時125us子程序 D1: MOV R5,DL2 DJNE R4,D1 RET DELAY1為一個雙重循環,循環次數為256*256=65536次,所以延時時間=65536*2=131072us約為125ms。 DELY R4設置為初值8,主延時程序循環8次,所以125ms*8=1s 用于四個數碼管的倒計時顯示,代碼如下: sbit smg1=P3^0; //定義南北方向數碼管低位 sbit smg2=P3^1; //定義南北方向數碼管高位 sbit smg1=P3^2; //定義東西方向數碼管低位 sbit smg2=P3^3; //定義東西方向數碼管高位 void djsxs() { int b1=0,b2=0; b1=djs/10; //將倒計時時間的高位賦予b1 b2=djs%10; //將倒計時時間的低位賦予b2 P0=table[b1]; smg1=0; delayms(3); smg1=1; //顯示b1 P0=table[b2]; smg2=0; delayms(3); smg2=1; //顯示b2 P0=table[b1]; smg3=0; delayms(3); smg3=1; //顯示b1 P0=table[b2]; smg4=0; delayms(3); smg4=1; //顯示b2
仿真電路圖:
實物: 
總結:
經過我反復思考及驗證,逐漸完善電路以及程序 bug,具體程序及電路圖請詳見附錄。通過此次課程設計的學習,我已掌握老師課堂所述內容,并應用于實踐中,在設計及過程中,發現自己好多知識都掌握不扎實,通過詢問其他同學,以及查閱資料等,已逐步掌握未扎實的內容,為此,我從心底不免升起一份感激之情,感謝老師為了我們著想,老師謝謝您!
單片機源程序如下:
- #include<reg52.h>
- #include<LED.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar time,second,seconde,miao1,miao0;
- sbit smg1=P2^5;//低位
- sbit smg2=P2^6;//東西高位
- sbit smg3=P2^7;//南北高位
- uchar code table1[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
- uchar code table2[]={0x6d,0x66,0x4f,0x5b,0x06,0x3f};
- uchar code table3[]={0x4f,0x5b,0x06,0x3f,0x06,0x3f};
- void display(uchar miao1,miao0);
- void delay(uint z);
- void init();
- void LED();
- void EW_LED();
- void NS_LED();
- void main()
- {
- init();//初始化子程序
- while(1)
- {
- display(miao1,miao0);
- LED();
- }
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(uchar miao1,miao0)
- {
- smg1=0;
- P0=table1[miao0];
- delay(3);
- smg1=1;
- if(seconde<60)
- {
- smg2=0;
- P0=table2[miao1];
- delay(3);
- smg2=1;
- smg3=0;
- P0=table3[miao1];
- delay(3);
- smg3=1;
- }
- else if(seconde>=60)
- {
- smg3=0;
- P0=table2[miao1];
- delay(3);
- smg3=1;
-
- smg2=0;
- P0=table3[miao1];
- delay(3);
- smg2=1;
- }
- }
- void init()
- {
- smg1=0;
- smg2=0;
- smg3=0;
- P0=0xff;
- TMOD=0x01;
- TH0=0x3c;
- TL0=0xb0;
- EA=1;
- ET0=1;
- TCON=0x10;
- second=0;
- seconde=0;
- }
- void timer0() interrupt 1
- {
- TH0=0x3c;
- TL0=0xb0;
- time++;
- if(time==20)
- {
- time=0;
- second++;
- seconde++;
- }
- if(second>=60)
- {
- second=0;
- }
- miao0=second%10;
- miao1=second/10;
- if(seconde>=120)
- seconde=0;
- }
- void LED()
- {
- if(seconde<60)
- {
- P1=0x12;//60s內東西紅燈亮
- NS_LED();
- }
-
- else if(seconde>=60)
- {
- P3=0x12;//60s以上南北紅燈亮
- EW_LED();
- }
- }
- void NS_LED()
- {
- if(seconde<36)
- {
- P3=0x28;//36s南北綠燈亮
- }
- else if(seconde>=36&&seconde<40)
- {
- NSRP=1;
- NSGP=0;//人行道綠燈滅,紅燈亮
- NSG=0;
- NSY=seconde%2;//南北綠燈滅,黃燈閃爍
- }
- else if(seconde>=40&&seconde<60)
- {
- P3=0x11;//南北左轉燈亮;人行紅燈亮
- }
- }
- void EW_LED()
- {
- if(seconde>=60&&seconde<96)
- {
- P1=0x28;//東西綠燈亮
- }
- else if(seconde>=96&&seconde<100)
- {
- EWRP=1;
- EWGP=0;//人行綠燈滅,紅燈亮
- EWG=0;
- EWY=seconde%2;//東西綠燈滅,黃燈閃
- }
- else
- {
- P1=0x11;//東西左轉燈亮,人行紅燈亮;
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (48.39 KB, 下載次數: 42)
下載附件
2018-4-2 01:47 上傳
所有資料51hei提供下載(word格式的設計報告文件):
交通燈設計.rar
(9.99 MB, 下載次數: 112)
2018-3-31 19:40 上傳
點擊文件名下載附件
51交通燈 下載積分: 黑幣 -5
|