設(shè)計一個十字路口的交通燈控制電路,要求南北方向和東西方向兩個交叉路口的車輛交替運行。 2) 每次綠燈變紅燈時,要求黃燈先亮5S,才能變換運行車輛. 3) 東西方向、南北方向車道除了有紅、黃、綠燈指示外,每一種燈亮的時間都用數(shù)碼管顯示器進(jìn)行顯示(采用LED倒計時的方法)
附件有仿真電路,程序,框圖,參考文檔等等
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (93.87 KB, 下載次數(shù): 42)
下載附件
2022-4-27 21:04 上傳
制作出來的實物圖如下:
IMG_20150307_231758.jpg (2.37 MB, 下載次數(shù): 39)
下載附件
2022-4-26 23:27 上傳
整個系統(tǒng)的構(gòu)成以STC89C52RC單片機(jī)為核心,由I/O口擴(kuò)展,LED數(shù)碼管顯示,還有復(fù)位電路、時鐘電路等組成。單片機(jī)作為整個硬件系統(tǒng)的核心,它既是協(xié)調(diào)整機(jī)工作的控制器,又是數(shù)據(jù)處理器。它由單片機(jī)、晶振電路、復(fù)位電路等組成。
行車方向指示采用LED發(fā)光二極管,可有紅、綠兩種顏色指示放行與禁止,黃燈作為紅綠轉(zhuǎn)換的提示,形象直觀。系統(tǒng)采用雙數(shù)碼管倒計時計數(shù)功能,最大顯示數(shù)字99。 3 系統(tǒng)硬件設(shè)計
3.1交通燈通行模式及行車方向指示按交通燈控制規(guī)則,每個道口有紅、黃、綠三種指示燈,交道口模型如圖2.1所示: 
圖3.1 交道口模型圖


2組LED數(shù)碼管按照設(shè)置的通行時間(各路口默認(rèn)的通行時間均為30s)進(jìn)行倒計時,倒計時到5S時,綠燈變成黃燈,并各自進(jìn)行紅、黃、綠燈顯示,共有兩種通行方式分別為:
圖3.2 通行方式一示意圖 圖3.3 通行方式二示意圖
通行方式一:倒計時時間為30s(通行時間),紅綠燈狀態(tài)為:東西通行:綠,南北禁行:紅;如圖3.2所示。 通行方式二:倒計時時間為30s(通行時間),紅綠燈狀態(tài)為:南北通行:綠;東西禁行:紅;如圖3.3所示。 通行默認(rèn)時間為30s,系統(tǒng)設(shè)置了任意更改功能,可以根據(jù)實際情況進(jìn)行調(diào)整,以提高車輛通過率,緩減交通壓力。在通行結(jié)束前5秒鐘,黃燈亮直至結(jié)束。本設(shè)計選用LED發(fā)光二極管的紅綠燈狀態(tài)用來指示交通指示信息。綠色表示通行,紅色則表示禁止通行,黃燈等待。你所有指示信息一目了然。
3.2各單元電路模塊功能3.2.1時鐘電路模塊時鐘電路由一個晶體振蕩器12MHZ和兩個30pF的瓷片電容組成。時鐘電路用于產(chǎn)生單片機(jī)工作所需的時鐘信號,而時序所研究的是指令執(zhí)行中各信號之間的相互關(guān)系。單片機(jī)本身就是一個復(fù)雜的同步時序電路,為了保證同步工作方式的實現(xiàn),電路應(yīng)在唯一的時鐘信號控制下嚴(yán)格地工作。其電路如圖3.4所示:
圖3.4 時鐘電路模塊
3.2.2復(fù)位電路模塊 電容在上接高電平,電阻在下接地,中間為RST。這種復(fù)位電路為高電平復(fù)位。其工作原理是:通電時,電容兩端相當(dāng)于是短路,于是RST引腳上為高電平,然后電源通過電阻對電容充電,RST端電壓慢慢下降,降到一定程度,即為低電平,單片機(jī)開始正常工作。其電路如圖3.5所示:
圖3.5 復(fù)位電路模塊
3.2.3主控制系統(tǒng)模塊主控制器采用STC89C52RC,STC89C52RC 單片機(jī)是宏晶科技推出的新一代高速/低功耗/超強(qiáng)抗干擾的單 片機(jī),指令代碼完全兼容傳統(tǒng) 8051 單片機(jī),12 時鐘/機(jī)器周期和 6 時鐘/機(jī)器周 期可以任意選擇。 其特點如下: 1. 增強(qiáng)型 8051 單片機(jī),6 時鐘/機(jī)器周期和 12 時鐘/機(jī)器周期可以任 意選擇,指令代碼完全兼容傳統(tǒng) 8051. 2. 工作電壓:5.5V~3.3V(5V 單片機(jī))/3.8V~2.0V(3V 單片機(jī)) 3. 工作頻率范圍:0~40MHz,相當(dāng)于普通 8051 的 0~80MHz,實際工 作頻率可達(dá) 48MHz 4. 用戶應(yīng)用程序空間為 8K 字節(jié) 5. 片上集成 512 字節(jié) RAM 6. 通用 I/O 口 (32 個) 復(fù)位后為: , P1/P2/P3/P4 是準(zhǔn)雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴(kuò)展用時,不用加上拉電阻,作為 I/O 口用時,需加上拉電阻。 7. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程) ,無需專用編程器,無 需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數(shù)秒即可完成一片 8. 具有 EEPROM 功能 9. 具有看門狗功能 10. 共 3 個 16 位定時器/計數(shù)器。即定時器 T0、T1、T2 11. 外部中斷 4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒 12. 通用異步串行口(UART) ,還可用定時器軟件實現(xiàn)多個 UART 13. 工作溫度范圍:-40~+85℃(工業(yè)級)/0~75℃(商業(yè)級) 14. DIP 封裝
圖3.6主控置系統(tǒng)模塊電路
3.2.4交通燈輸出控制模塊 道口交通燈指示采用紅、黃、綠發(fā)光二極管進(jìn)行提示。其圖如圖3.7所示:
圖3.7LED顯示模塊電路
當(dāng)R=1000歐時,按公式A=(5-1.8)/R計算,電路中的電流大小應(yīng)為A=3.2mA。由于每個路口的通行雙向指示處理相同,因此每個端口應(yīng)具有6.4mA的吸收電流能力。
3.2.5時間顯示電路模塊考慮設(shè)計需要,我們在各個方向分別用二位數(shù)碼管用來顯示倒計時時間,構(gòu)成交通提示信息,形象逼真。本系統(tǒng)使用數(shù)碼管完成倒計時顯示功能。以方向東西為為例,數(shù)碼管顯示的數(shù)值從綠燈的設(shè)置時間最大值往下減,每秒鐘減1,一直減到0。然后又從紅燈的設(shè)置時間最大值往下減,一直減到0。接下來又顯示綠燈時間,如此循環(huán)。 系統(tǒng)共有1個二位的LED 數(shù)碼管,分別放置在模擬交通燈控制板上四組交通燈中間。四個方向上都應(yīng)該顯示同樣的內(nèi)容,所以我們可以把它們同樣對待,只用了一組數(shù)碼管來模擬。也就是說各個方向的數(shù)碼管個位(把數(shù)碼管第二位定義為個位,第一位定義為十位)用一根信號線控制,十位用另一根信號線控制。 道口通行剩余時間采用紅色7段數(shù)碼管顯示,采用共陰數(shù)碼管,如用單片機(jī)P0口加上拉電阻驅(qū)動,P3.0/P3.1來控制數(shù)碼管的位。其顯示電路如圖3.8所示:
圖3.8數(shù)碼管顯示模塊電路
3.2.6系統(tǒng)電源模塊電路 由于該系統(tǒng)中 51 單片機(jī)及三極管工作電壓均為 5V 電壓,所以要保證系統(tǒng)穩(wěn)定可靠的工作,需要設(shè)計一個可以穩(wěn)定提供 5V 電壓的供電系統(tǒng)。本設(shè)計采用外置5V穩(wěn)壓開關(guān)電源作為系統(tǒng)的供電電源,系統(tǒng)電源輸入接口要加濾波電容以確保工作電壓穩(wěn)定。電源輸出接口加上LED 電源指示燈,用來判定電源是否正常工作。該系統(tǒng)電源電路設(shè)計如圖3.9所示: 圖3.9系統(tǒng)電源電路
4 系統(tǒng)軟件設(shè)計根據(jù)實際交通燈的變化情況和規(guī)律。假設(shè)一個十字路口為東南西北走向。初始狀態(tài)1東西綠燈通車,南北紅燈亮。過30s,轉(zhuǎn)狀態(tài)2,東西綠燈滅黃燈亮,南北紅燈滅黃燈亮,過5s,再轉(zhuǎn)狀態(tài)3,南北綠燈通車,東西紅燈亮。過30s,轉(zhuǎn)狀態(tài)4,南北綠燈滅黃燈亮,東西紅燈滅黃燈亮,過5s,又循環(huán)至狀態(tài)1。對于交通信號燈來說東西南北共四組燈,由于同一道上的兩組的信號燈的顯示情況是相同的,因此,采用單片機(jī)內(nèi)部的I/O口來控制12個信號燈。通過編寫程序,實現(xiàn)對發(fā)光二極管的控制,來模擬交通信號燈的管理。 4.1 軟件總體流程圖軟件總體設(shè)計及流程圖見圖3-1,主要完成各部分的軟件控制和協(xié)調(diào)。本系統(tǒng)主程序模塊主要完成的工作是對系統(tǒng)的初始化,發(fā)送顯示數(shù)據(jù),同時對按鍵進(jìn)行掃描,等待外部中斷,以及根據(jù)所需要的功能進(jìn)行相應(yīng)的操作。其流程圖如圖4.1 
圖4.1正常情況下交通燈控制流程
5 系統(tǒng)調(diào)試分析及結(jié)果
因本設(shè)計本身要求有穩(wěn)定性高、免維護(hù)、抗干擾能力強(qiáng)等功能,系統(tǒng)調(diào)試除了驗證數(shù)據(jù)處理的精度,確保判斷的準(zhǔn)確性外,同時必須確認(rèn)各項功能的正常運行。
5.1 電路板實物的制作
5.1.1印制電路板PCB圖的繪制
由于本電路硬件設(shè)計中,用單片機(jī)的一個IO口控制各路交通燈的循環(huán)點亮。用同一芯片單片機(jī)的P0口來控制數(shù)碼管的顯示點亮。因此,在同一芯片中,所要接的線路比較多。在硬件的布局中,各位LED燈和數(shù)碼管的布局比較固定化,集中分布在所控制的兩個路口。因此,若采用雙面PCB板的話,這個電路的布線比較容易實現(xiàn)。但是,現(xiàn)實水平中做雙面板會出現(xiàn)一些焊點接觸不良而導(dǎo)致電路調(diào)試過程不易實現(xiàn)。因此,決定使用單面板布線。單片面板的布線需要犧牲本設(shè)計電路板一部分實際電路的美觀。印制電路板的設(shè)計是以電路原理圖為根據(jù),實現(xiàn)電路設(shè)計者所需要的功能。印刷電路板的設(shè)計主要指版圖設(shè)計,需要考慮外部連接的布局、內(nèi)部電子元件的優(yōu)化布局、金屬連線和通孔的優(yōu)化布局、電磁保護(hù)、熱耗散等各種因素。優(yōu)秀的版圖設(shè)計可以節(jié)約生產(chǎn)成本,達(dá)到良好的電路性能和散熱性能。
5.1.2實物的制做
準(zhǔn)備工作:采購萬能板若干張,實物電路所需的各種元器件;
還有其他的基本電子器件和制板工具。
①總制板工藝程序
1)先將所有元器件擺放到萬能板上,確實各個原件的最有位置,原則是,既美觀,又容易焊接。
2)把擺好位置的元器件焊到板子上,最好用焊臺來完成。
3)根據(jù)原理圖,把所有的連線連接起來,連接的導(dǎo)線,盡量用細(xì)一點的。
②制板心得:我們在制板過程中,
1)首先是PROTEL設(shè)計的時候出現(xiàn)的錯誤導(dǎo)致印制電路板制作錯誤。
2)其次是由于設(shè)計的理論和實際有誤差導(dǎo)致無法實現(xiàn)目標(biāo)。
3)焊接過程中出現(xiàn)了一些問題,比如焊跳線的時候,由于接線太多,而且是手工焊接,并且焊接設(shè)備不好,烙鐵頭高溫下容易老化氧化和溫度不可控制。因此導(dǎo)致焊盤脫落,原件燙傷等原因?qū)е聢髲U了好幾塊板子。此外,有些焊盤太小并且有損壞跡象,所以焊接很不方便。但為了不出現(xiàn)虛焊,卻花了很長時間去焊,有些焊點并不是很美觀。
4)焊接過程中,有時候焊錫會不小心將相鄰的兩根引線短路。所以,此次做板積累了一些經(jīng)驗,主要是,再次做板的時候一定要注意PCB的引線之間的距離不能設(shè)置太近。因為是手工制作,精度和密度都必須有一個自由度和能力所及的范圍,并且考慮到手工制板的局限性和線路過細(xì)密導(dǎo)致的氧化和短路故障。擁有了這些寶貴的經(jīng)驗,相信今后制板,一定會完美保證電路的實現(xiàn)!
5.2 系統(tǒng)硬件調(diào)試
在設(shè)計過程中,實物交通燈控制系統(tǒng)的PCB電路板焊接工作量非常大,電路安裝完成后,首先進(jìn)行檢查,即確認(rèn)電路無虛焊,無短路,無斷路,集成元件安裝是否正確,之后進(jìn)行電路功能模塊的分級調(diào)試,根據(jù)電路功能逐級進(jìn)行:通行方式功能調(diào)試:包括對兩種通行方式控制調(diào)試,指示燈亮度和驅(qū)動電路調(diào)試;倒計時功能調(diào)試:數(shù)碼管亮度調(diào)試;復(fù)位功能調(diào)試。
5.3 系統(tǒng)軟件調(diào)試
本系統(tǒng)的軟件系統(tǒng)很大,選用一般的單片機(jī)通信C語言程序進(jìn)行編寫和調(diào)試。除了語法差錯外,當(dāng)確認(rèn)程序沒問題時,通過直接下載到單片機(jī)來調(diào)試。采取的是自下到上的調(diào)試方法,即單獨調(diào)試好每一個模塊,然后再連接成一個完整的系統(tǒng),最后完成一個完整的系統(tǒng)調(diào)試。
5.4 系統(tǒng)總體調(diào)試
系統(tǒng)做好后,進(jìn)行系統(tǒng)的完整調(diào)試。主要任務(wù)是檢驗實現(xiàn)的功能及其效果并校正誤差。
測試一開始,我們就發(fā)現(xiàn)了系統(tǒng)出現(xiàn)了兩個問題:一是有一部分交通燈亮度不夠,所發(fā)出來的光非常的微弱以致于幾乎感覺不到它的亮度;二是數(shù)碼管不工作,沒有時間顯示。這與設(shè)計的要求完全不符。為了找出這個問題和解決方法,查找了電路的輸出各部分的輸出電平。發(fā)現(xiàn)了一個現(xiàn)象,我們采用的數(shù)碼管是共陰極數(shù)碼管。而控制數(shù)碼段顯示的P3.0和P3.1口輸出的是高電平。
經(jīng)多方查閱資料,解決第二個問題可以有兩個解決方法。其一,將硬件電路作修改,將數(shù)碼管換成共陽極的數(shù)碼管。這樣數(shù)碼管就可以正常進(jìn)行時間顯示了。其二,修改程序,讓控制數(shù)碼管段碼的P0輸出的是低電平。若采用修改硬件電路的方法的話,硬件電路就得作變動。已經(jīng)布好的線也必須有相應(yīng)的變動,操作起來比較麻煩。所以,我們采用了第二種方法。修改了程序電路中的段碼代碼。再次調(diào)試,按照設(shè)計要求的指標(biāo),系統(tǒng)數(shù)碼管電路部分基本能按照預(yù)先設(shè)定的要求來進(jìn)行倒計時的顯示。亮度要求也基本符合預(yù)先設(shè)想。
接下來還有一個問題有待解決,交通燈亮度不足,以致于部分交通燈只能勉強(qiáng)看得出來它在亮而已。這明顯不能滿足設(shè)計要求。經(jīng)多方檢測,我們認(rèn)為這是由于LED燈驅(qū)動能力不足引起的亮度弱問題。若要修正這個問題,那就得為LED燈增加驅(qū)動電路以提高電路的驅(qū)動能力。要實現(xiàn)這一步驟必須對硬件電路進(jìn)行一定的改動。LED燈的驅(qū)動電路可以用集成電路電路芯片來進(jìn)行驅(qū)動。在初步方案中考慮要用集成電路來完成。但是由于客觀方面的原因,沒有制作實物的環(huán)境條件。因此,這部分改進(jìn)只作了一個設(shè)想,并沒有時間去付諸實施。但基本問題和解決問題的原理還是有一定的了解。
51hei.png (7.29 KB, 下載次數(shù): 38)
下載附件
2022-4-27 21:17 上傳
附錄B:總體電路原理圖、PCB、仿真圖及實物圖
單片機(jī)源程序如下: - #include<reg51.h>
- #include<intrins.h> //包含庫文件
- sbit smg1=P3^0; //定義南北方向數(shù)碼管低位
- sbit smg2=P3^1; //定義南北方向數(shù)碼管高位
- sbit N_green=P2^0; //定義北向綠燈端口
- sbit N_red=P2^1; //定義北向紅燈端口
- sbit N_yellow=P2^2; //定義北向黃燈端口
- sbit S_green=P2^7; //定義南向綠燈端口
- sbit S_red=P2^6; //定義南向紅燈端口
- sbit S_yellow=P2^5; //定義南向黃燈端口
- sbit W_green=P1^0; //定義西向綠燈端口
- sbit W_red=P1^1; //定義西向紅燈端口
- sbit W_yellow=P1^2; //定義西向黃燈端口
- sbit E_green=P1^7; //定義東向綠燈端口
- sbit E_red=P1^6; //定義東向紅燈端口
- sbit E_yellow=P1^5; //定義東向黃燈端口
- int js=0,djs=30; //初始倒計時時間
- int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40}; //共陰極數(shù)碼管段值
- /************以下為函數(shù)聲明*************/
- void jtd();
- void jtda();
- void jtdb();
- void djsxs();
- void yj();
- void jj();
- void jtday();
- void jtdby();
- /*****************************************************/
- /* 函數(shù)名:delayms */
- /* 功能:產(chǎn)生毫秒級延時 */
- /*****************************************************/
- void delayms(int x)
- {
- char i;
- while(x--)
- {
- for(i=150;i>0;i--);
- }
- }
- /*****************************************************/
- /* 函數(shù)名:Timer0_init() */
- /* 功能:定時器0初始化 */
- /*****************************************************/
- void Timer0_init()
- {
- js=0;
- TMOD=0x01; //定義定時器0工作模式
- TH0=0x4c; //賦初值高位
- TL0=0x00; //賦初值低位
- TR0=1; //啟動定時器
- ET0=1; //開中斷
- EA=1; //開全局中斷
- }
- /*****************************************************/
- /* 函數(shù)名:timer0() interrupt 1 using 1 */
- /* 功能:定時器0中斷服務(wù)函數(shù) */
- /*****************************************************/
- void timer0() interrupt 1 using 1
- {
- TF0=0;
- TH0=0x4c;
- TL0=0x00; //重新賦高地位初值
- js++;
- if(js==22)
- { js=0;
- djs--;
- }
- }
- /*****************************************************/
- /* 函數(shù)名:djsxs11() */
- /* 功能:數(shù)碼管動態(tài)顯示 */
- /*****************************************************/
- void djsxs11() //此函數(shù)注視同djsxs22()
- { int b1,b2;
- 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
- }
- /*****************************************************/
- /* 函數(shù)名:qm() */
- /* 功能:使所有的交通信號燈全部熄滅 */
- /*****************************************************/
- void qm()
- {
- N_green=1;
- N_red=1;
- N_yellow=1;
- S_green=1;
- S_red=1;
- S_yellow=1;
- W_green=1;
- W_red=1;
- W_yellow=1;
- E_green=1;
- E_red=1;
- E_yellow=1;
- }
- /*****************************************************/
- /* 函數(shù)名:jtdb() */
- /* 功能:交通燈東西方向綠燈亮,紅燈滅 */
- /* 交通燈南北方向紅燈亮,綠燈滅 */
- /*****************************************************/
- void jtdb()
- {
- qm(); //所有信號燈滅
- W_green=0; //西向綠燈亮
- E_green=0; //東向綠燈亮
- N_red=0; //北向紅燈亮
- S_red=0; //南向紅燈亮
- while(1)
- {
- if(djs>5) //當(dāng)?shù)褂嫊r時間大于5秒時,執(zhí)行
- {
- djsxs11(); //數(shù)碼管時間顯示
- }
- if(djs<=5) //當(dāng)?shù)褂嫊r時間小于5秒時,執(zhí)行
- {
- jtdby(); //調(diào)用函數(shù)
- }
- }
- }
- /*****************************************************/
- /* 函數(shù)名:jtdby() */
- /* 功能:交通燈東西方向黃燈亮,紅燈滅 */
- /* 交通燈南北方向紅燈亮,綠燈滅 */
- /*****************************************************/
- void jtdby()
- {
- qm(); //所有信號燈全滅
- W_green=1; //西向綠燈滅
- E_green=1; //東向綠燈滅
- W_yellow=0; //西向黃燈亮
- E_yellow=0; //東向黃燈亮
- N_red=0; //北向紅燈滅
- S_red=0; //南向紅燈滅
- while(1)
- {
- djsxs11(); //數(shù)碼管時間顯示
- if(djs<0) //當(dāng)?shù)褂嫊r時間小于0秒時,執(zhí)行
- {
- djs=30;
- jtda(); //調(diào)用jtda()函數(shù)
- }
- }
- }
- /*****************************************************/
- /* 函數(shù)名:jtda() */
- /* 功能:交通燈南北方向綠燈亮,紅燈滅 */
- /* 交通燈東西方向紅燈亮,綠燈滅 */
- /*****************************************************/
- void jtda()
- {
- qm(); //所有信號燈滅
- N_green=0; //北向綠燈亮
- S_green=0; //南向綠燈亮
- W_red=0; //西向紅燈亮
- E_red=0; //東向紅燈亮
- while(1)
- {
- if(djs>5) //當(dāng)?shù)褂嫊r時間大于5秒時,執(zhí)行
- {
- djsxs11(); //數(shù)碼管時間顯示
- }
- if(djs<=5) //當(dāng)?shù)褂嫊r時間小于5秒時,執(zhí)行
- {
- jtday(); //調(diào)用函數(shù)
- }
- }
- }
- /*****************************************************/
- /* 函數(shù)名:jtday() */
- /* 功能:交通燈南北方向黃燈亮,紅燈滅 */
- /* 交通燈東西方向紅燈亮,綠燈滅 */
- /*****************************************************/
- void jtday()
- {
- qm(); //所有信號燈全滅
- N_green=1; //北向綠燈滅
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼 仿真程序文檔下載: |