設(shè)計要求: 用單片機(jī)控制LED模擬交通燈。東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s。
本項目為典型的LED顯示和中斷定時電路。利用定時器T0產(chǎn)生每10ms一次的中斷,每100次中斷為1s。對兩個方向分別顯示紅、綠、黃燈,并顯示相應(yīng)的剩余時間。
本設(shè)計基于AT89C52單片機(jī),可用單片機(jī)控制信號燈的狀態(tài)變化,基本可以指揮交通的基本通行。用單片機(jī)控制紅、黃、綠LED燈模擬指示,模擬東西方向的十字路口交通信號控制情況。東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s,并將時間倒計時輸出,方便行人的觀看。 本設(shè)計主要設(shè)計指標(biāo): - 紅綠燈狀態(tài)提示模塊。
- T0定時器模塊,實現(xiàn)三種時間的定時。
- 驅(qū)動顯示模塊,利用MAX7219驅(qū)動數(shù)碼管的顯示倒計時。
1.3 系統(tǒng)結(jié)構(gòu)圖
圖1 系統(tǒng)結(jié)構(gòu)圖 系統(tǒng)正常運行后,5V的穩(wěn)壓源給MAX7219芯片、LED信號燈和單片機(jī)供電,通過單片機(jī)內(nèi)部的定時器T0產(chǎn)生每10ms一次的中斷,每100次中斷為1s。所計的時間以秒為單位,通過MAX7219驅(qū)動七段顯示器倒計時輸出,計滿時間后產(chǎn)生中斷,中斷產(chǎn)生后信號燈發(fā)生相應(yīng)的變化,以達(dá)到自動控制的目的。
2 理論分析與計算 定時器初值的計算,并掌握十進(jìn)制到十六進(jìn)制的轉(zhuǎn)化。在進(jìn)行通行時間上的控制時應(yīng)注意生活中的常識。 2.1 定時器初值的計算
通過單片機(jī)內(nèi)部的定時器T0產(chǎn)生每10ms一次的中斷,每100次中斷為1s。在本設(shè)計中所用的晶振為12MHZ,定時器 T0為工作方式一。其中初值為X,定時間為m us。
 (1) 計算可得,定時m=10ms=10000us時,X=55536,轉(zhuǎn)化為十六進(jìn)制,X=D8F0H。即寫入定時器的初值TH0=0xD8,TL0=0xF0。 2.2 通行時間的計算 A方向紅燈時間=B方向綠燈時間+黃燈緩沖時間 (2) 3 硬件設(shè)計 根據(jù)系統(tǒng)結(jié)構(gòu)圖,系統(tǒng)由MAX7219驅(qū)動電路、顯示電路、晶振電路、復(fù)位電路、單片機(jī)供電電路、單片機(jī)電路組成。 3.1顯示電路通過該電路, 行人可以清楚的看見各路口狀態(tài)燈的亮滅情況,判斷是否通行。同時,數(shù)碼管顯示剩下通行的時間,提示行人。 數(shù)碼管顯示方面,東西南北各個方向分別用兩位7段數(shù)碼管,南北方向接DIG0、DIG1,東西方向接DIG2、DIG3,進(jìn)行位選控制,如圖2。 圖2 顯示電路1 紅綠燈采用三個共陽二極管作為指示燈,南北、東西方向各個一組,分別對應(yīng)數(shù)碼管的倒計時。東西方向接單片機(jī)的P1^0 , P1^1 , P1^2口,南北方向接單片機(jī)的P0^0 , P0^1 , P0^2口,如圖3。 圖3 顯示電路2
首先東西方向通行時間為80s,東西綠燈亮,南北紅燈亮。時間到后,東西南北黃燈亮3s。然后南北方向通行時間為60s,南北綠燈亮,東西紅燈亮。時間到后3s,東西南北黃燈亮3s。 3.2MAX7219驅(qū)動電路 采用專用數(shù)碼管顯示控制芯片MAX7219。MAX7219是美國MAXI生產(chǎn)的串行輸入/輸出共陰極顯示驅(qū)動器,該芯片最多可驅(qū)動8位7段數(shù)字LED顯示器或多個LED和條形圖顯示器。  圖4 MAX7219驅(qū)動電路
4 軟件設(shè)計 在硬件的基礎(chǔ)上對軟件進(jìn)行設(shè)計,本程序由主程序,定時中斷子程序和顯示驅(qū)動子程序組成。主程序主要負(fù)責(zé)系統(tǒng)初始化和等待中斷,以及紅黃綠燈各種狀態(tài)判斷。定時中斷子程序主要負(fù)責(zé)各個狀態(tài)的定時要求,以及狀態(tài)的跳轉(zhuǎn)。顯示驅(qū)動子程序負(fù)責(zé)倒計時時間的顯示。 根據(jù)系統(tǒng)軟件設(shè)計要求將軟件劃分為:延時模塊,狀態(tài)判斷模塊,中斷服務(wù)模塊,驅(qū)動顯示模塊。 4.1 主程序主程序完成MAX7219的初始化,定時器的初始化,狀態(tài)燈的初始化并進(jìn)行狀態(tài)的判斷。
圖 5 程序流程圖 進(jìn)入主程序后,先初始化并開啟定時器1和MAX7219芯片,再裝入初始狀態(tài)和初始值,然后等待中斷響應(yīng)。根據(jù)收到的中斷響應(yīng),主程序依次判斷。首先南北綠燈亮,東西紅燈亮,倒計時60S;定時結(jié)束后,由中斷跳轉(zhuǎn)到下一個狀態(tài),再東西南北黃燈亮,倒計時3S;定時結(jié)束后,由中斷跳轉(zhuǎn)到下一個狀態(tài),東西綠燈亮,南北紅燈亮,倒計時80S;定時結(jié)束后,再由中斷跳轉(zhuǎn)到下一個狀態(tài),東西南北黃燈亮,倒計時3S。依次循環(huán)執(zhí)行。
主要(關(guān)鍵)代碼: - void main()
- {
- T0_init();
- MAX7219_init();
- EA=1;
- NS=60; //初始南北通行60秒
- EW=63;
- R2=0,G1=0; //南北綠燈亮,東西紅燈亮
- while (1)
- {
- uint k;
- display();
- switch(i)
- {
- case 1: R2=1,G1=1; //關(guān)閉南北綠燈,東西紅燈
- Y1=0,Y2=0; //黃燈閃爍
- for(k=0;k<3;k++)
- {
- Y1=~Y1;
- Y2=~Y2;
- delay(10000);
- }
- break;
- case 2: G2=0,R1=0; //東西綠燈亮,南北紅燈亮
- break;
- case 3: G2=1,R1=1;
- Y1=0,Y2=0; //黃燈閃爍
- for(k=0;k<3;k++) //循環(huán)三次進(jìn)行延時閃爍
- {
- Y1=~Y1;
- Y2=~Y2;
- delay(10000);
- }
- break;
- case 4: R2=0,G1=0; //東西紅燈亮,南北綠燈亮
- break;
- }
- }
- }
復(fù)制代碼
此段程序是對狀態(tài)的判斷,利用switch()....case語句對狀態(tài)進(jìn)行判斷。 4.2 定時中斷子程序定時器子程序是進(jìn)行時間的設(shè)定,并實現(xiàn)狀態(tài)的自動跳轉(zhuǎn)。跳轉(zhuǎn)過后產(chǎn)生的中斷送入主程序進(jìn)行判斷并輸出。
圖 6 定時中斷子程序流程圖 設(shè)置通行時間,并利用定時器進(jìn)行倒計時,其中狀態(tài)一60S,其中狀態(tài)二3S,其中狀態(tài)三80S,其中狀態(tài)四3S。 關(guān)鍵代碼介紹: void T0_(void)interrupt 1 { temp++; TH0=0XD8; TL0=0XF0; if(temp==100) { temp=0; NS--; EW--; if((NS==0)&&(EW==3)) { NS=3; EW=3; i=1; } if((NS==0)&&(EW==0)&&(i==1)) { NS=83; EW=80; i=2; } if((NS==3)&&(EW==0)) { NS=3; EW=3; i=3; } if((NS==0)&&(EW==0)&&(i==3)) { NS=60; EW=63; i=4; } } display(); } 利用if語句對計時是否完畢進(jìn)行判斷,如計時完畢,執(zhí)行if中的內(nèi)容。 4.2 MAX7219驅(qū)動程序 MAX7219采用串行尋址方式,在傳送的串行數(shù)據(jù)中包含內(nèi)部RAM的地址。加在DIN腳上的串行數(shù)據(jù),必須在LOAD信號為高電平的前提下,以每個字節(jié)為一個數(shù)據(jù)包,在CLK信號上升沿移入16位的移位寄存器。然后在LOAD信號的上升沿鎖存進(jìn)數(shù)字或控制寄存器中。LOAD信號必須在第16個CLK信號上升沿的同時,或在下一個CLK信號上升沿之前升高,否則,數(shù)據(jù)會丟失。DIN腳上的串行數(shù)據(jù)在16.5個CLK信號后出現(xiàn)在DOUT腳上,以便級聯(lián)應(yīng)用時傳到下一個MAX7219上。 圖 7 數(shù)據(jù)串行傳送時序圖
關(guān)鍵代碼介紹: - void MAX_write(uchar ch) //以8位一個字節(jié)進(jìn)行寫值
- {
- uchar j,ads;
- for(j=0;j<8;j++) //8位
- {
- ads=ch&0x80; //取最高位
- CLK = 0; //時鐘線置低
- if(ads) DIN = 1;
- else DIN = 0;
- ch=ch<<1; //左移一位
- CLK=1; //上升沿,DIN的數(shù)據(jù)寫入到7219
- }
- }
- void MAX7219(uchar addr, uchar num) //寫地址,寫數(shù)據(jù)
- {
- LOAD = 0;
- _nop_();
- MAX_write(addr);
- _nop_();
- MAX_write(num);
- _nop_();
- LOAD = 1; //鎖存
- }
復(fù)制代碼
系統(tǒng)測試
5.1 倒計時狀態(tài)測試由Proteus仿真軟件進(jìn)行系統(tǒng)測試。
圖8 60S、80S計時 結(jié)論:單片機(jī)內(nèi)部定時器能夠進(jìn)行定時。 5.2 紅綠燈狀態(tài)測試由Proteus仿真軟件進(jìn)行系統(tǒng)測試。 表1 紅綠燈狀態(tài)測試
結(jié)論:每個狀態(tài)能夠正常的跳轉(zhuǎn)。 5.3 系統(tǒng)聯(lián)機(jī)測試1、接硬件圖接線,為了確保東西南北紅黃綠燈能夠?qū)?yīng)顯示,實驗時,對P1口的接線做了調(diào)整。即,P1.0接G2綠燈,P1.1接Y2黃燈,P1.2接R2紅燈,P0.1接G1綠燈,P0.2接Y1黃燈,P0.3接R1紅燈。 2、從第一個狀態(tài)開始連續(xù)運行,觀察六個LED燈是否與交通顯示情況對應(yīng),如果有偏差,則單步運行或斷點運行,進(jìn)行調(diào)試,直至滿足設(shè)計要求。 3、調(diào)試完燈的顯示后,從第一個狀態(tài)開始連續(xù)運行,觀察數(shù)碼管顯示的是否正常,如果不正常,則運用單步運行或斷點運行進(jìn)行分析和調(diào)試,直至滿足要求。 4、整體運行,觀察燈顯示和時間顯示是否都符合要求,如果不符合,則再調(diào)試。直至滿足要求
6 總結(jié)以及展望 本設(shè)計實現(xiàn)設(shè)計要求。 本設(shè)計在實現(xiàn)相應(yīng)功能的時候主要是考慮到現(xiàn)有的條件,采用成熟度高的STC89C52作為CPU的解決方案,同時用LED燈和雙位數(shù)碼管作為顯示模塊,軟件則使用了移植性好的C語言。從功能需求上來看,已經(jīng)能夠滿足簡單的應(yīng)用需要。 在設(shè)計過程中,從開始設(shè)計該系統(tǒng)的功能,到方案的論證,再到最后的調(diào)試,每一步都顯得是那么的重要,在這個過程中學(xué)習(xí)到了比這次設(shè)計本身更多的知識,除此之外,在這次設(shè)計中也奠定了我對一個工業(yè)產(chǎn)品設(shè)計的思維,收獲頗豐。 展望,由于時間有限,本設(shè)計還需要做很多的改進(jìn)才能作為產(chǎn)品進(jìn)入市場,如:在對單片機(jī)供電方案中可以改為更簡單的電容降壓電路;在狀態(tài)的多樣性方面還很單一,可以增加一些更加符合實際情況的狀態(tài),如彎道時的狀態(tài)、擁堵時的狀態(tài)、應(yīng)急狀態(tài);在PCB元器件布局還可以更科學(xué)使線的寬度做的更寬等元器件選擇方面的問題,使其能夠通過一些標(biāo)準(zhǔn)。
圖9 系統(tǒng)原理圖
本系統(tǒng)的PCB版圖為雙重布線。 圖10 系統(tǒng)PCB圖
全部資料51hei下載地址:
通信交通燈.7z
(981.18 KB, 下載次數(shù): 121)
2020-4-28 15:35 上傳
點擊文件名下載附件
|