找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6894|回復(fù): 2
收起左側(cè)

基于FPGA的交通燈設(shè)計(jì)-含源碼

[復(fù)制鏈接]
ID:727047 發(fā)表于 2020-4-11 17:13 | 顯示全部樓層 |閱讀模式
主要利用FPGA作為主控。

以FPGA為核心,設(shè)計(jì)一個(gè)交通燈控制器,每個(gè)路口都有紅、黃、綠三盞燈。該交通信號(hào)燈控制器由一條車道A和一條車道B匯合成十字路口,在每個(gè)入口處設(shè)置紅、綠、黃三色信號(hào)燈,紅燈亮禁止通行,綠燈亮允許通行,黃燈亮則給行駛中的車輛有時(shí)間停在禁行線外。用紅、綠、黃發(fā)光二極管作信號(hào)燈。


1.2要求

(1)東西、南北兩個(gè)方向的信號(hào)燈必須交替工作且兩個(gè)方向通行時(shí)間不同;

(2)顯示采用LED光柱或數(shù)碼管倒計(jì)時(shí)的方式。

(3)遇有緊急情況可人為將兩個(gè)方向都置為紅燈。

(4)每個(gè)路口用2個(gè)七段數(shù)碼管倒計(jì)時(shí)顯示。


2. FPGA模塊方案論證及選擇

各模塊端口及信號(hào)連接如下圖所示:

由上圖可知,F(xiàn)PGA部分包括四個(gè)模塊,頂層模塊(top_traffic)、交通燈控制模塊(traffic_light)、數(shù)碼管顯示模塊(seg_led)、led燈控制模塊(led)。在頂層模塊中完 成對(duì)其它三個(gè)模塊的例化,并實(shí)現(xiàn)各模塊之間的數(shù)據(jù)傳遞。

頂層模塊(top_traffic):頂層模塊完成了對(duì)其它三個(gè)子模塊的例化、實(shí)現(xiàn)了子模塊間 的信號(hào)連接、并將led燈和數(shù)碼管的驅(qū)動(dòng)信號(hào)輸出給外接設(shè)備(交通信號(hào)燈外設(shè))。

交通燈控制模塊(traffic_light):交通燈控制模塊是本次實(shí)驗(yàn)的核心代碼,這個(gè)模塊 控制信號(hào)燈的狀態(tài)轉(zhuǎn)換,將實(shí)時(shí)的狀態(tài)信號(hào)state[1:0]輸出給led燈控制模塊(led),同時(shí)將 東西和南北方向的實(shí)時(shí)時(shí)間數(shù)據(jù)ew_time[5:0]和sn_time[5:0]輸出給數(shù)碼管顯示模塊 (seg_led)。

數(shù)碼管顯示模塊(seg_led):接收交通燈控制模塊傳遞過(guò)來(lái)的東西和南北方向的實(shí)時(shí)時(shí)間數(shù)據(jù)ew_time[5:0]和sn_time[5:0],并以此驅(qū)動(dòng)對(duì)應(yīng)的數(shù)碼管,將數(shù)據(jù)顯示出來(lái)。

led燈控制模塊(led):根據(jù)接收到的實(shí)時(shí)狀態(tài)信號(hào)state[1:0],驅(qū)動(dòng)?xùn)|西和南北方向的led發(fā)光。


3. 原理設(shè)計(jì)
3.1
基本原理
點(diǎn)FPGA開(kāi)發(fā)板上左邊的P6擴(kuò)展口可以用來(lái)外接交通信號(hào)燈擴(kuò)展模塊,交通信號(hào)
燈擴(kuò)展模塊的原理圖如圖 38.3.1所示。
圖 38.3.1 交通信號(hào)燈原理圖

由上圖可知,交通信號(hào)燈擴(kuò)展模塊四個(gè)方向共12個(gè)LED燈,而我們使用6個(gè)LED控制信號(hào)來(lái) 驅(qū)動(dòng)12個(gè)LED燈,這是因?yàn)闁|西方向或者南北方向LED燈的亮滅狀態(tài)總是一致的,所以我們將東西方向或者南北方向顏色相同的LED燈并聯(lián)在一起,這樣設(shè)計(jì)的好處是減少了交通信號(hào)燈擴(kuò)展模塊LED控制信號(hào)的引腳。

上圖中四個(gè)共陽(yáng)型數(shù)碼管分別對(duì)應(yīng)四個(gè)路口,每個(gè)路口用兩位數(shù)碼管顯示當(dāng)前狀態(tài)的剩余 時(shí)間。我們知道,在十字路口中,東西方向或者南北方向數(shù)碼管顯示的時(shí)間總是一樣的。以東西方向?yàn)槔,正因(yàn)檫@兩個(gè)方向顯示的時(shí)間一致,所以這兩個(gè)方向的數(shù)碼管,它們的十位可以用同一個(gè)位選信號(hào)來(lái)控制,個(gè)位用另一個(gè)位選信號(hào)來(lái)控制,這樣的話,就可以實(shí)現(xiàn)兩個(gè)位選信號(hào)控制東西方向共4位數(shù)碼管的亮滅,南北方向的數(shù)碼管同理。這樣設(shè)計(jì)的好處是減少了交通信號(hào)燈擴(kuò)展模塊位選信號(hào)的引腳。

數(shù)碼管由PNP型三極管驅(qū)動(dòng),當(dāng)三極管的基極為低電平時(shí),數(shù)碼管相應(yīng)的位被選通,所以交通信號(hào)燈擴(kuò)展模塊的位選信號(hào)是低電平有效的。

3.2系統(tǒng)組成框圖

交通燈控制模塊將需要顯示的時(shí)間數(shù)據(jù)連接到數(shù)碼管顯示模塊,同時(shí)將狀態(tài)信號(hào)連接到led燈控制模塊,然后數(shù)碼管顯示模塊和led燈控制模塊驅(qū)動(dòng)交通信號(hào)燈外設(shè)工作。系統(tǒng)總體框架圖如圖 38.4.1所示,

      

3.3單元電路設(shè)計(jì)

3.3.1 FPGA最小系統(tǒng)

  FPGA最小系統(tǒng)包括:FPGA芯片、下載電路、外部時(shí)鐘、復(fù)位電路和電源。

如果使用NIOS II軟嵌入式處理器還要包括SDRAM和Flash。



     圖3-3 FPGA最小系統(tǒng)

3.3.2 數(shù)碼管顯示電路

采用簡(jiǎn)單的4組2位共陽(yáng)極數(shù)碼管數(shù)碼管由PNP型三極管驅(qū)動(dòng),當(dāng)三極管的基極為低電平時(shí),數(shù)碼管相應(yīng)的位被選通,所以交通信號(hào)燈擴(kuò)展模塊的位選信號(hào)是低電平有效的。


圖3-4數(shù)碼管顯示電路

3.4總體電路圖

交通燈控制模塊將需要顯示的時(shí)間數(shù)據(jù)連接到數(shù)碼管顯示模塊,同時(shí)將狀態(tài)信號(hào)連接到led燈控制模塊,然后數(shù)碼管顯示模塊和 led燈控制模塊驅(qū)動(dòng)交通信號(hào)燈外設(shè)工作。

總體電路圖如下圖所示:



          圖3-6整體電路
3.5 程序設(shè)計(jì)
                  
3-7 系統(tǒng)軟件流程圖
3.6元件列表
發(fā)光二極管(紅綠黃)
12個(gè)
2.54單排針1*40
2排
三極管8550
4個(gè)
排母
2排
數(shù)碼管2位共陽(yáng)
4組
FPGA模塊
1塊

4.方案實(shí)現(xiàn)與測(cè)試(或調(diào)試)
實(shí)現(xiàn)題上已給要求,在程序調(diào)試花費(fèi)時(shí)間較多。
交通燈成品及實(shí)驗(yàn)現(xiàn)象


課題二:電梯
1、設(shè)計(jì)的目的與要求
1.1目的

設(shè)計(jì)以8952單片機(jī)、AVR或ARM和步進(jìn)電機(jī)為核心,設(shè)計(jì)電梯控制器。假設(shè)電梯安裝一個(gè)樓層為4樓的樓上。其人機(jī)接口包括顯示器、鍵盤、喇叭、指示燈。

1.2要求
    每層樓電梯口都有上樓、下樓兩個(gè)按鈕,一個(gè)7段數(shù)碼顯示器作為電梯當(dāng)前層指示燈。兩個(gè)發(fā)光二極管作為電梯運(yùn)行方向的指示燈;進(jìn)入電梯里面,按數(shù)字鍵選擇要去的樓層,一個(gè)7段數(shù)碼管顯示當(dāng)前層顯示,兩個(gè)發(fā)光二極管作為電梯上行和下行指示燈。步進(jìn)電機(jī)正轉(zhuǎn),上行,反轉(zhuǎn),表示下行。啟動(dòng)按鈕按下去表示電梯控制系統(tǒng)可以運(yùn)行。緊急停止按鈕按下,電機(jī)停止運(yùn)動(dòng)。報(bào)警按鈕按下,啟動(dòng)蜂鳴器和閃爍紅色報(bào)警燈。
1.3 分工
馬浩寧:電路設(shè)計(jì)、程序調(diào)試
    張曉涵:刻板、焊電路
    王春燕:寫(xiě)論文、查找資料
2、方案論證及選擇
2.1 總體設(shè)計(jì)方案
設(shè)計(jì)的基本思想是采用STM32F103C8T6單片機(jī)作為核心采用8位LED靜態(tài)顯示來(lái)實(shí)時(shí)顯示電梯所在樓層。采用行列式鍵盤矩陣作為外呼內(nèi)選電路,由于是4層樓,故選用4×4矩陣鍵盤,鍵盤矩陣共16個(gè)按鍵,其中6個(gè)按鍵是各層樓外呼按鍵,2個(gè)表示電梯啟動(dòng)和停止的控制按鍵,電梯狀態(tài)是通過(guò)3個(gè)發(fā)光二極管顯示的,綠燈亮表示電梯在向上運(yùn)行,黃燈亮表示電梯在向下運(yùn)行,紅燈亮表示電梯故障急停狀態(tài)總體方框圖如圖2-1所示:
總體方框下圖所示:


2.2  主控芯片選擇   
方案一:多片單片機(jī)控制方案。這種方案是使用多片單片機(jī),其中一片是作為主控制器,另外設(shè)置了轎廂控制系統(tǒng),每層的控制系統(tǒng)分別由一個(gè)單片機(jī)控制,然后通過(guò)主控制器和副控制器之間的通訊,實(shí)現(xiàn)電梯系統(tǒng)的控制。這種方案的控制系統(tǒng)的結(jié)構(gòu)簡(jiǎn)單明了,各個(gè)系統(tǒng)之間相互獨(dú)立便于維護(hù)和修檢。所以根據(jù)功能要求需要選用1片STM32單片機(jī)就能可以實(shí)現(xiàn)該電梯的功能。不過(guò)單片機(jī)之間的通訊較多,在目前通訊是個(gè)難點(diǎn),可能導(dǎo)致電梯運(yùn)行過(guò)程不穩(wěn)定。
方案二:一片單片機(jī)為主控制器的方案。MCU采用一個(gè)單片機(jī)控制所有的按鍵、屏幕顯示、電動(dòng)機(jī)的轉(zhuǎn)動(dòng)等,并對(duì)以上所有信號(hào)進(jìn)行處理。這種方案的控制系統(tǒng)相對(duì)復(fù)雜,只適用于較簡(jiǎn)單的電梯控制系統(tǒng),因?yàn)檫@次的設(shè)計(jì)是四層電梯控制系統(tǒng),所以選用這種方案。單片機(jī)技術(shù)目前較為成熟,自身資源豐富,硬件設(shè)計(jì)簡(jiǎn)單,成本低,可靠性高,結(jié)合軟件完全可以實(shí)現(xiàn)電梯運(yùn)行狀況的簡(jiǎn)單模擬。
    權(quán)衡以上二種方案方案分析,采用方案二。
2.3  樓層顯示選擇
方案一:采用點(diǎn)陣式的液晶顯示器(LCD)來(lái)顯示各種相關(guān)的數(shù)據(jù)以及相關(guān)的信息。點(diǎn)陣式的液晶顯示器雖然屬于低功耗的器件,但其價(jià)格比較貴。
方案二:采用傳統(tǒng)的八段數(shù)碼管(LED)顯示電梯實(shí)時(shí)所到的樓層。雖功耗大,但其軟件驅(qū)動(dòng)相對(duì)比較簡(jiǎn)單,硬件電路調(diào)試也比較方便,價(jià)格便宜,亮度大,能滿足本設(shè)計(jì)的要求。
    以上兩種方案中,選擇方案一。
2.4  電動(dòng)機(jī)驅(qū)動(dòng)模塊選擇
方案一:步進(jìn)電機(jī)作為設(shè)計(jì)的執(zhí)行部件,在定位性能的步進(jìn)電機(jī)是非常優(yōu)越的。步進(jìn)電機(jī)和普通電機(jī)的區(qū)別主要在于其脈沖驅(qū)動(dòng)形式,步進(jìn)電機(jī)不需要A/D 轉(zhuǎn)換,能夠直接將數(shù)字脈沖信號(hào)轉(zhuǎn)化為角位移。常用的步進(jìn)電機(jī)每轉(zhuǎn)一步,角度轉(zhuǎn)1.8°,在應(yīng)用中,步進(jìn)電機(jī)可以同時(shí)來(lái)完成兩個(gè)工作,一個(gè)是傳遞轉(zhuǎn)矩,第二個(gè)是傳遞信息,在本設(shè)計(jì)中作為傳遞信息用。
方案二:直流電機(jī)作為執(zhí)行元件的設(shè)計(jì),直流電機(jī)的功能是讓線圈總是交替地處于穩(wěn)定狀態(tài)和不穩(wěn)定的平衡狀態(tài),通過(guò)兩個(gè)半圓環(huán)形電樞將穩(wěn)定平衡線圈消除。這樣一個(gè)載流線圈總是降低磁場(chǎng)。直流電機(jī)中常用的系統(tǒng),高轉(zhuǎn)矩,高扭矩,低慣量。
    以上兩種方案采用方案一。
    利用DXP畫(huà)圖軟件構(gòu)建原理圖如下圖所示:
   

3、 原理設(shè)計(jì)
3.1 STM32F103C8T6功能簡(jiǎn)介
STM32F103C8T6是一款基于ARM Cortex-M 內(nèi)核STM32系列的32位的微控制器,程序存儲(chǔ)器容量是64KB,需要電壓2V~3.6V,具有高達(dá)1MB的Flash、電機(jī)控制、USB和CAN,該系列利用一流的外設(shè)和低功耗、低壓操作實(shí)現(xiàn)了高性能,同時(shí)還以可接受的價(jià)格、利用簡(jiǎn)單的架構(gòu)和簡(jiǎn)便易用的工具實(shí)現(xiàn)了高集成度。從以上3種方案,很容易看出,采用方案3,電路設(shè)計(jì)比較簡(jiǎn)潔,軟件設(shè)計(jì)也比較簡(jiǎn)單,故采用方案3。STM32F103C8T6實(shí)物圖以及引腳結(jié)構(gòu)圖如圖:


                          圖3-1  STM32原理圖


   
圖 3-1 STM32F103C8T6實(shí)物圖


3.2 單片機(jī)最小系統(tǒng)
最小系統(tǒng)包括復(fù)位電路和時(shí)鐘電路兩部分,其中復(fù)位電路采用上電自動(dòng)復(fù)位,如圖3-2所示:
                            圖3-2 單片機(jī)最小系統(tǒng)



3.3  按鍵電路
本電路采用了13個(gè)按鍵。分別利用了P2和P3 端口,單片機(jī)采用行和列掃描法來(lái)判別這些按鍵中哪個(gè)鍵按下, S1-S13為微動(dòng)按鍵,分別控制電梯的啟動(dòng)、停止、急停及電梯樓層呼叫開(kāi)關(guān),然后可根據(jù)每個(gè)按鍵的功能來(lái)通過(guò)單片機(jī)控制電梯的運(yùn)行。                                 

         
圖 3-3  矩陣按鍵原理圖

圖3-4  矩陣按鍵

各按鈕開(kāi)關(guān)說(shuō)明:
電梯內(nèi):K4:緊急停止     K5:終止停止                 K14:關(guān)門
K9:選擇一樓    K10:選擇二樓                   K11:選擇三樓     K12:選擇四樓
電梯外:K1:一樓電梯上行 K2:二樓電梯上行 K3:三樓電梯上行
K6:二樓電梯下行 K7:三樓電梯下行 K8:四樓電梯下行
K15:啟動(dòng)         K16:停止
3.4報(bào)警電路設(shè)計(jì)

報(bào)警電路接單片機(jī)P35口,當(dāng)端口變成低電平時(shí), VCC電壓加載到蜂鳴器使其發(fā)聲、報(bào)警發(fā)光二極管亮,如圖3-5。

圖3-5   報(bào)警電路
3.5顯示電路設(shè)計(jì)

采用點(diǎn)陣式的液晶顯示器(LCD12864)來(lái)顯示各種相關(guān)的數(shù)據(jù)以及相關(guān)的信息。點(diǎn)陣式的液晶顯示器屬于低功耗的器件,顯示清晰便利

如圖3.7,采用LCD12864顯示電路,VCC接3.3V,RS接單片機(jī)A5,RW接單片機(jī)A6, EN接單片機(jī)A7口,當(dāng)有輸出時(shí),直接在lcd 屏幕上進(jìn)行顯示。



圖3-6  顯示電路設(shè)計(jì)




4、方案實(shí)現(xiàn)與調(diào)試
4.1  軟件設(shè)計(jì)思想
設(shè)計(jì)采用微動(dòng)按鍵來(lái)代替外呼按鈕,而電梯的運(yùn)行方向和電梯啟動(dòng)和停止是根據(jù)這些呼叫按鍵和選擇按鍵來(lái)決定的,所以單片機(jī)通過(guò)掃描鍵盤來(lái)獲取各層呼叫狀態(tài),從而控制電梯的運(yùn)行。故按鍵掃描是本系統(tǒng)軟件設(shè)計(jì)中的重要一部分,另外要把鍵盤掃描到的各層的按鍵信息存儲(chǔ)起來(lái),然后和電梯的運(yùn)行狀態(tài)比較,判斷是否響應(yīng)各層呼叫,當(dāng)電梯到達(dá)目的樓層時(shí)電機(jī)停止,可隨意選擇去哪一層,然后電梯選擇判斷去哪一層,繼續(xù)運(yùn)行。
由于本設(shè)計(jì)采用單片機(jī)實(shí)現(xiàn)自動(dòng)控制,主要完成了整個(gè)系統(tǒng)系統(tǒng)如數(shù)碼管的顯示,按鍵的響應(yīng),轉(zhuǎn)動(dòng)電機(jī)的控制,延時(shí)等均由相應(yīng)的子程序來(lái)完成。
軟件設(shè)計(jì)思想:使用模塊化的C語(yǔ)言編程,軟件系統(tǒng)的功能層次化設(shè)計(jì)方法,包括多個(gè)單一功能的子程序的。通過(guò)調(diào)用不同的子程序,實(shí)現(xiàn)復(fù)雜的控制功能。這是方便調(diào)試,修改。軟件編程是一種多功能,智能化,操作簡(jiǎn)便。在本設(shè)計(jì)中,可以把程序的各部分相互結(jié)合起來(lái),達(dá)到完成各項(xiàng)設(shè)計(jì)的功能。
4.2  電梯主程序
根據(jù)任務(wù)要求,電梯的程序應(yīng)滿足以下要求:
(1)初始化程序使LCD顯示“1”表示電梯處在一樓,等待人進(jìn)入電梯;
(2)主程序主要包括:
①判斷電梯選擇去哪一層,根據(jù)判斷情況來(lái)控制電梯運(yùn)行,相應(yīng)的指示燈顯示運(yùn)行方向,到達(dá)目標(biāo)樓層后相應(yīng)的數(shù)碼管顯示電梯所在樓層;
②電梯在運(yùn)行過(guò)程中要不斷的掃描鍵盤,從而來(lái)判斷各樓層是否有其他呼叫請(qǐng)求;
③設(shè)置電梯啟動(dòng)、停止及緊急功能按鍵;
④實(shí)時(shí)顯示電梯所在位置及運(yùn)行狀態(tài)(上行/下行);
⑤緊急按鈕是用于電梯出現(xiàn)意外時(shí),用來(lái)報(bào)警求救;
圖4-1  主程序流程圖
電梯的整個(gè)軟件設(shè)計(jì)包括一下幾部分:電梯邏輯控制模塊、電梯運(yùn)行模塊、鍵盤模塊、樓層顯示模塊。

電梯的整個(gè)軟件設(shè)計(jì)包括一下幾部分:電梯邏輯控制模塊、電梯運(yùn)行模塊、鍵盤模塊、樓層顯示模塊。
4.3  按鍵方式
鍵盤是獨(dú)立按鍵,采用的是查詢方式,即外接獨(dú)立按鍵的時(shí)候,是按鍵的一端接地,另一端與I/O引腳相連,當(dāng)按鍵按下的時(shí)候,引腳輸入的是低電平,而按鍵未按下的時(shí)候,引腳輸入的是高電平[6]。利用C語(yǔ)言編程時(shí)只要用檢測(cè)高低電平來(lái)判斷是否有按鍵按下就可以了。其程序源代碼見(jiàn)附錄1。
4.4  顯示系統(tǒng)
    顯示屏12864顯示全部
4.5  電機(jī)演示系統(tǒng)
采用步進(jìn)電機(jī)作為本設(shè)計(jì)的執(zhí)行元件,步進(jìn)電機(jī)在定位性能方面十分優(yōu)越。步進(jìn)電機(jī)和普通電機(jī)的區(qū)別主要就在于其脈沖驅(qū)動(dòng)的形式,步進(jìn)電機(jī)不需要A/D 轉(zhuǎn)換,能夠直接將數(shù)字脈沖信號(hào)轉(zhuǎn)化為角位移。常用的步進(jìn)電機(jī)每轉(zhuǎn)一步,角度轉(zhuǎn)1.8°,在應(yīng)用中,步進(jìn)電機(jī)可以同時(shí)完成兩個(gè)工作,其一是傳遞轉(zhuǎn)矩,其二是傳遞信息,在本設(shè)計(jì)中作為傳遞信息用,步進(jìn)電機(jī)使用的是28BYJ-5V。電梯運(yùn)行前按啟動(dòng)按鈕,步進(jìn)電機(jī)8個(gè)節(jié)拍循環(huán)旋轉(zhuǎn),電梯每上升或下降一層電機(jī)順時(shí)針或者逆時(shí)針轉(zhuǎn)動(dòng)40度。
4.6軟件編譯調(diào)試
在軟件調(diào)試中,采用keil仿真軟件進(jìn)行程序調(diào)試。首先分別調(diào)試各個(gè)功能程序,再對(duì)整個(gè)程序進(jìn)行調(diào)試,以便修改錯(cuò)誤碼。具體的調(diào)試方法如下:
首先在keil軟件中選擇AT89C52作為CPU,因?yàn)樵撥浖袥](méi)有STC89C52RC,但是基本功能和之差不多,將晶振頻率設(shè)置為11.0592MHZ,然后新建一個(gè)文件,將各個(gè)功能程序錄入,先檢查程序有無(wú)明顯錯(cuò)誤,保存過(guò)后編譯程序,如果有錯(cuò)誤時(shí)就根據(jù)提示加以修改,當(dāng)各個(gè)功能程序編譯完成后,再對(duì)整個(gè)程序全速執(zhí)行,查看程序有哪些地方出現(xiàn)錯(cuò)誤,對(duì)應(yīng)錯(cuò)誤的提示來(lái)調(diào)整程序,糾正錯(cuò)誤直到程序正確無(wú)誤,調(diào)試結(jié)束后軟件調(diào)試界面如下圖5-1所示:
        圖5-1  軟件調(diào)試界面
4.7  實(shí)物制作及系統(tǒng)測(cè)試
   在原理圖及原材料確定好的基礎(chǔ)上直接進(jìn)行實(shí)物制作,進(jìn)行各部件在電路板上的組配和焊接。

                            

圖3-9  矩陣按鍵實(shí)物圖

            

圖4-1  報(bào)警電路實(shí)物圖

         

圖4-2   電機(jī)驅(qū)動(dòng)電路實(shí)物圖


對(duì)系統(tǒng)進(jìn)行測(cè)試,首先啟動(dòng)電機(jī)運(yùn)行,電梯位于一樓,按下二樓按鍵,上行燈點(diǎn)亮,步進(jìn)電機(jī)轉(zhuǎn)動(dòng),到達(dá)目標(biāo)樓層停下,此時(shí)數(shù)碼管顯示當(dāng)前樓層。然后再一次按下三、四樓的按鍵,電梯先后在三樓、四樓停下。最后再按下二樓按鈕,電機(jī)逆時(shí)針旋轉(zhuǎn)停在二樓,最后在一樓停下。而且各指示燈和數(shù)碼管顯示都正常。
通過(guò)上電測(cè)試,電梯在上升或者下降過(guò)程中先響應(yīng)上升或者下降樓層的信號(hào),并對(duì)最近樓層呼叫有優(yōu)先級(jí)的響應(yīng)。系統(tǒng)具有方向優(yōu)先、距離優(yōu)先的功能,基本模擬了實(shí)際電梯運(yùn)行,完成題目設(shè)計(jì)要求。
4.8 元器件清單

序號(hào)

名稱

型號(hào)及規(guī)格

數(shù)量

1

單片機(jī)

STM32

1

2

步進(jìn)電機(jī)驅(qū)動(dòng)模塊

SBT0811

1

3

發(fā)光二極管

LED

1

4

按鍵

微動(dòng)

14

5

屏幕顯示

12864

1

8

電阻

470

3

10

步進(jìn)電機(jī)

28BYJ-48-5V

1

11

電解電容

105℃-50V-10uF±20%

1

12

蜂鳴器

電磁式

1




5、總結(jié)
經(jīng)過(guò)這一段時(shí)間選擇和設(shè)計(jì),完成了一個(gè)具有基本功能的電梯控制系統(tǒng)。系統(tǒng)是一個(gè)四層樓電梯控制系統(tǒng)。它能實(shí)現(xiàn)一個(gè)電梯具有的基本功能,包括:電梯上下運(yùn)行功能,電梯選層功能,樓層顯示功能,電梯的啟動(dòng)和停止及緊急報(bào)警功能,智能初始化功能。并且加入了自我設(shè)計(jì)的電機(jī)模塊,不僅基本達(dá)到了設(shè)計(jì)要求和目的,同時(shí)也不乏自我的創(chuàng)新設(shè)計(jì)。
通過(guò)這次設(shè)計(jì),雖然遇到的困難重重,但是受益匪淺,對(duì)單片機(jī)在實(shí)物中應(yīng)用的能力有一個(gè)很好的了解,這種開(kāi)放式的設(shè)計(jì),我從中學(xué)到的不僅僅是所設(shè)計(jì)方面的知識(shí),更重要的是學(xué)習(xí)方法以及資料查找的技巧,學(xué)會(huì)了利用身邊現(xiàn)有的資源和人緣,作為我去更好學(xué)習(xí)的一個(gè)階梯,雖然這次設(shè)計(jì)時(shí)間并不長(zhǎng),但是我發(fā)現(xiàn)我們對(duì)自主學(xué)習(xí)能力有所提高。學(xué)無(wú)止境,在今后的學(xué)習(xí)生活中,我將把學(xué)到的知識(shí)靈活的運(yùn)用到學(xué)習(xí)、工作和生活當(dāng)中。而且在設(shè)計(jì)過(guò)程中,不僅是在學(xué)習(xí)新知識(shí)這一塊上有了很大的提高,同時(shí)我的意志力也得到了很好的鍛煉。只有你堅(jiān)持,努力了,才能讓自己學(xué)到和收獲更多,才能更好的適應(yīng)這個(gè)社會(huì)。


  1. module top_traffic(
  2.     input                  sys_clk   ,    //系統(tǒng)時(shí)鐘信號(hào)
  3.     input                  sys_rst_n ,    //系統(tǒng)復(fù)位信號(hào)

  4.     output       [3:0]     sel       ,    //數(shù)碼管位選信號(hào)
  5.     output       [7:0]     seg_led   ,    //數(shù)碼管段選信號(hào)
  6.     output                   [5:0]                 led            //LED使能信號(hào)
  7. );

  8. //wire define   
  9. wire   [5:0]  ew_time;                    //東西方向狀態(tài)剩余時(shí)間數(shù)據(jù)
  10. wire   [5:0]  sn_time;                    //南北方向狀態(tài)剩余時(shí)間數(shù)據(jù)
  11. wire   [1:0]  state  ;                    //交通燈的狀態(tài),用于控制LED燈的點(diǎn)亮

  12. //*****************************************************
  13. //**                    main code                     
  14. //*****************************************************
  15. //交通燈控制模塊   
  16. traffic_light u0_traffic_light(
  17.     .sys_clk                (sys_clk),  
  18.     .sys_rst_n              (sys_rst_n),     
  19.     .ew_time                (ew_time),
  20.     .sn_time                (sn_time),
  21.     .state                  (state)
  22. );

  23. //數(shù)碼管顯示模塊            
  24. seg_led    u1_seg_led(
  25.     .sys_clk                (sys_clk)  ,
  26.     .sys_rst_n              (sys_rst_n),
  27.     .ew_time                (ew_time),
  28.     .sn_time                (sn_time),
  29.     .en                     (1'b1),  
  30.     .sel                    (sel),
  31.     .seg_led                (seg_led)
  32. );

  33. //led燈控制模塊
  34. led   u2_led(
  35.     .sys_clk                (sys_clk  ),
  36.     .sys_rst_n              (sys_rst_n),
  37.     .state                  (state    ),
  38.     .led                    (led      )
  39. );

  40. endmodule
  41. module  traffic_light(
  42.     //input
  43.     input               sys_clk   ,        //系統(tǒng)時(shí)鐘
  44.     input               sys_rst_n ,        //系統(tǒng)復(fù)位

  45.     output  reg  [1:0]  state     ,        //交通燈的狀態(tài),用于控制LED燈的點(diǎn)亮
  46.     output  reg  [5:0]  ew_time   ,        //交通燈東西向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
  47.     output  reg  [5:0]  sn_time            //交通燈南北向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
  48.     );

  49. //parameter define
  50. parameter  TIME_LED_Y    = 5'd3;              //黃燈發(fā)光的時(shí)間
  51. parameter  TIME_LED_R    = 5'd30;             //紅燈發(fā)光的時(shí)間
  52. parameter  TIME_LED_G    = 5'd27;             //綠燈發(fā)光的時(shí)間
  53. parameter  WIDTH         = 25_000_000;     //產(chǎn)生頻率為1hz的時(shí)鐘

  54. //reg define
  55. reg    [4:0]     time_cnt;                 //產(chǎn)生數(shù)碼管顯示時(shí)間的計(jì)數(shù)器   
  56. reg    [24:0]    clk_cnt;                  //用于產(chǎn)生clk_1hz的計(jì)數(shù)器
  57. reg              clk_1hz;                  //1hz時(shí)鐘

  58. //*****************************************************
  59. //**                    main code                     
  60. //*****************************************************
  61. //計(jì)數(shù)周期為0.5s的計(jì)數(shù)器
  62. always @ (posedge sys_clk or negedge sys_rst_n)begin
  63.     if(!sys_rst_n)
  64.         clk_cnt <= 25'b0;
  65.     else if (clk_cnt < WIDTH - 1'b1)
  66.         clk_cnt <= clk_cnt + 1'b1;
  67.     else
  68.         clk_cnt <= 25'b0;
  69. end

  70. //產(chǎn)生頻率為1hz的時(shí)鐘
  71. always @(posedge sys_clk or negedge sys_rst_n)begin
  72.     if(!sys_rst_n)
  73.         clk_1hz <= 1'b0;
  74.     else  if(clk_cnt == WIDTH - 1'b1)
  75.         clk_1hz <= ~ clk_1hz;
  76.     else
  77.         clk_1hz <=  clk_1hz;
  78. end

  79. //切換交通信號(hào)燈工作的4個(gè)狀態(tài),并產(chǎn)生數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
  80. always @(posedge clk_1hz or negedge sys_rst_n)begin
  81.     if(!sys_rst_n)begin      
  82.         state <= 2'd0;
  83.         time_cnt <= TIME_LED_G ;            //狀態(tài)1持續(xù)的時(shí)間
  84.     end
  85.     else begin
  86.         case (state)
  87.             2'b0:  begin                    //狀態(tài)1
  88.                 ew_time <= time_cnt + TIME_LED_Y - 1'b1;//東西方向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
  89.                sn_time <= time_cnt - 1'b1;             //南北方向數(shù)碼管要顯示的時(shí)間數(shù)據(jù)
  90.                 if (time_cnt > 1)begin      //time_cnt等于1的時(shí)候切換狀態(tài)
  91.                     time_cnt <= time_cnt - 1'b1;
  92.                     state <= state;
  93.                 end
  94.                 else begin
  95.                     time_cnt <= TIME_LED_Y; //狀態(tài)2持續(xù)的時(shí)間
  96.                     state <= 2'b01;         //切換到狀態(tài)2
  97.                 end
  98.             end
  99.             2'b01:  begin                   //狀態(tài)2
  100.                 ew_time <= time_cnt  - 1'b1;
  101.                 sn_time <= time_cnt  - 1'b1;
  102.                 if (time_cnt > 1)begin
  103.                     time_cnt <= time_cnt - 1'b1;
  104.                     state <= state;
  105.                 end
  106.                 else begin
  107.                     time_cnt <= TIME_LED_G; //狀態(tài)3持續(xù)的時(shí)間
  108.                     state <= 2'b10;         //切換到狀態(tài)3
  109.                 end
  110.             end
  111.             2'b10:  begin                   //狀態(tài)3
  112.                 ew_time <= time_cnt  - 1'b1;
  113.                 sn_time <= time_cnt + TIME_LED_Y - 1'b1;
  114.                 if (time_cnt > 1)begin
  115.                     time_cnt <= time_cnt - 1'b1;
  116.                     state <= state;
  117.                 end
  118.                 else begin
  119.                     time_cnt <= TIME_LED_Y; //狀態(tài)4持續(xù)的時(shí)間
  120.                     state <= 2'b11;         //切換到轉(zhuǎn)態(tài)4
  121.                 end
  122.             end
  123.             2'b11:  begin                   //狀態(tài)4
  124.                 ew_time <= time_cnt  - 1'b1;
  125.                 sn_time <= time_cnt  - 1'b1;
  126.                 if (time_cnt > 1)begin
  127.                     time_cnt <= time_cnt - 1'b1;
  128.                     state <= state;
  129.                 end
  130.                 else begin
  131.                     time_cnt <= TIME_LED_G;
  132.                     state <= 2'b0;          //切換到狀態(tài)1
  133.                 end
  134.             end        
  135.             default: begin
  136.                 state <= 2'b0;
  137.                 time_cnt <= TIME_LED_G;
  138.             end
  139.         endcase
  140.     end
  141. end               

  142. endmodule
  143.             
  144. module seg_led(
  145.     input                  sys_clk     ,     //系統(tǒng)時(shí)鐘
  146.     input                  sys_rst_n   ,     //系統(tǒng)復(fù)位
  147.     input        [5:0]     ew_time     ,     //東西方向數(shù)碼管要顯示的數(shù)值
  148.     input        [5:0]     sn_time     ,     //南北方向數(shù)碼管要顯示數(shù)值
  149.     input                  en          ,     //數(shù)碼管使能信號(hào)                                                            
  150.     output  reg  [3:0]     sel         ,     //數(shù)碼管位選信號(hào)
  151.     output  reg  [7:0]     seg_led           //數(shù)碼管段選信號(hào),包含小數(shù)點(diǎn)
  152. );

  153. //parameter define
  154. parameter  WIDTH = 50_000;                   //計(jì)數(shù)1ms的計(jì)數(shù)深度

  155. //reg define
  156. reg    [15:0]             cnt_1ms;           //計(jì)數(shù)1ms的計(jì)數(shù)器
  157. reg    [1:0]              cnt_state;         //用于切換要點(diǎn)亮數(shù)碼管
  158. reg    [5:0]              num;               //數(shù)碼管要顯示的數(shù)據(jù)

  159. //wire define
  160. wire   [5:0]              data_ew_0;         //東西方向數(shù)碼管的十位
  161. wire   [5:0]              data_ew_1;         //東西方向數(shù)碼管的各位
  162. wire   [5:0]              data_sn_0;         //南北方向數(shù)碼管的十位
  163. wire   [5:0]              data_sn_1;         //南北方向數(shù)碼管的各位

  164. //*****************************************************
  165. //**                    main code                     
  166. //*****************************************************
  167. assign  data_ew_0   = ew_time / 4'd10;          //取出東西向時(shí)間數(shù)據(jù)的十位
  168. assign  data_ew_1   = ew_time % 4'd10;          //取出東西向時(shí)間數(shù)據(jù)的個(gè)位
  169. assign  data_sn_0   = sn_time / 4'd10;          //取出南北向時(shí)間數(shù)據(jù)的十位
  170. assign  data_sn_1   = sn_time % 4'd10;          //取出南北向時(shí)間數(shù)據(jù)的個(gè)位

  171. //計(jì)數(shù)1ms
  172. always @ (posedge sys_clk or negedge sys_rst_n) begin
  173.     if (!sys_rst_n)
  174.         cnt_1ms <= 15'b0;
  175.     else if (cnt_1ms < WIDTH - 1'b1)
  176.         cnt_1ms <= cnt_1ms + 1'b1;
  177.     else
  178.         cnt_1ms <= 15'b0;
  179. end

  180. //計(jì)數(shù)器,用來(lái)切換數(shù)碼管點(diǎn)亮的4個(gè)狀態(tài)
  181. always @ (posedge sys_clk or negedge sys_rst_n) begin
  182.     if (!sys_rst_n)
  183.         cnt_state <= 2'd0;
  184.     else  if (cnt_1ms == WIDTH - 1'b1)
  185.         cnt_state <= cnt_state + 1'b1;
  186.     else
  187.         cnt_state <= cnt_state;
  188. end

  189. //先顯示東西方向數(shù)碼管的十位,然后是個(gè)位。再顯示南北方向數(shù)碼管的十位,然后個(gè)位
  190. always @ (posedge sys_clk or negedge sys_rst_n) begin
  191.     if(!sys_rst_n) begin
  192.         sel  <= 4'b1111;
  193.         num  <= 4'b0;
  194.     end
  195.     else if(en) begin      
  196.         case (cnt_state)
  197.             3'd0 : begin   
  198.                 sel <= 4'b1110;              //驅(qū)動(dòng)?xùn)|西方向數(shù)碼管的十位
  199.                 num <= data_ew_0;
  200.             end      
  201.             3'd1 : begin   
  202.                 sel <= 4'b1101;              //驅(qū)動(dòng)?xùn)|西方向數(shù)碼管的個(gè)位
  203.                 num <= data_ew_1;
  204.             end
  205.             3'd2 : begin
  206.                 sel <= 4'b1011;              //驅(qū)動(dòng)南北方向數(shù)碼管的十位
  207.                 num  <= data_sn_0;
  208.             end
  209.             3'd3 : begin
  210.                 sel <= 4'b0111;              //驅(qū)動(dòng)南北方向數(shù)碼管的個(gè)位
  211.                 num  <= data_sn_1 ;   
  212.             end
  213.             default : begin   
  214.                 sel <= 4'b1111;                    
  215.                 num <= 4'b0;
  216.             end
  217.         endcase
  218.     end
  219.     else  begin
  220.           sel <= 4'b1111;
  221.           num <= 4'b0;   
  222.     end
  223. end

  224. //數(shù)碼管要顯示的數(shù)值所對(duì)應(yīng)的段選信號(hào)     
  225. always @ (posedge sys_clk or negedge sys_rst_n) begin
  226.     if (!sys_rst_n)
  227.         seg_led <= 8'b0;
  228.     else begin
  229.         case (num)            
  230.             4'd0 :     seg_led <= 8'b1100_0000;                                                      
  231.             4'd1 :     seg_led <= 8'b1111_1001;                           
  232.             4'd2 :     seg_led <= 8'b1010_0100;                           
  233.             4'd3 :     seg_led <= 8'b1011_0000;                           
  234.             4'd4 :     seg_led <= 8'b1001_1001;                           
  235.             4'd5 :     seg_led <= 8'b1001_0010;                           
  236.             4'd6 :     seg_led <= 8'b1000_0010;                           
  237.             4'd7 :     seg_led <= 8'b1111_1000;     
  238.             4'd8 :     seg_led <= 8'b1000_0000;     
  239.             4'd9 :     seg_led <= 8'b1001_0000;   
  240.             default :  seg_led <= 8'b1100_0000;
  241.         endcase
  242.     end
  243. end

  244. Endmodule

  245. module led (
  246.     input              sys_clk   ,       //系統(tǒng)時(shí)鐘
  247.     input              sys_rst_n ,       //系統(tǒng)復(fù)位
  248.     input       [1:0]  state     ,       //交通燈的狀態(tài)
  249.     output reg  [5:0]  led               //紅黃綠LED燈發(fā)光使能
  250. );

  251. //parameter define
  252. parameter  TWINKLE_CNT = 25_000_000;     //讓黃燈閃爍的計(jì)數(shù)次數(shù)

  253. //reg define
  254. reg    [24:0]     cnt;                   //讓黃燈產(chǎn)生閃爍效果的計(jì)數(shù)器

  255. //計(jì)數(shù)時(shí)間為0.2s的計(jì)數(shù)器,用于讓黃燈閃爍                                                            
  256. always @(posedge sys_clk or negedge sys_rst_n)begin                                 
  257.     if(!sys_rst_n)                                                                  
  258.         cnt <= 25'b0;                                                               
  259.     else if (cnt < TWINKLE_CNT - 1'b1)                                                                                                      
  260.         cnt <= cnt + 1'b1;                                                                                                                                                                                                                                                            
  261.     else                                                                           
  262.         cnt <= 25'b0;                                                               
  263. end                                                                                 

  264. //在交通燈的四個(gè)狀態(tài)里,使相應(yīng)的led燈發(fā)光                                                            
  265. always @(posedge sys_clk or negedge sys_rst_n)begin                                 
  266.     if(!sys_rst_n)                                                                  
  267.         led <= 6'b100100;                                                           
  268.     else begin                                                                     
  269.         case(state)                                                                  
  270.             2'b00:led<=6'b100010;        //led寄存器從高到低分別驅(qū)動(dòng):東西向                       
  271.                                          //紅綠黃燈,南北向紅綠黃燈                                          
  272.             2'b01: begin                                                            
  273.                 led[5:1]<=5'b10000;                                                
  274.                 if(cnt == TWINKLE_CNT - 1'b1)  //計(jì)數(shù)滿0.2秒讓黃燈的亮滅狀況切換一次
  275.                                                //產(chǎn)生閃爍的效果                                
  276.                     led[0] <= ~led[0];                                             
  277.                 else                                                               
  278.                     led[0] <= led[0];                                               
  279.             end                                                                     
  280.             2'b10:led<=6'b010100;                                                   
  281.             2'b11: begin                                                            
  282.                 led[5:4]<=2'b00;                                                   
  283.                 led[2:0]<=3'b100;                                                   
  284.                 if(cnt == TWINKLE_CNT - 1'b1)                                          
  285.                     led[3] <= ~led[3];                                             
  286.                 else                                                               
  287.                     led[3] <= led[3];                                             
  288.             end                                                                     
  289.             default:led<=6'b100100;                                                
  290.         endcase                                                                     
  291.     end                                                                             
  292. end

  293. endmodule  
復(fù)制代碼
51hei.png
完整的Word格式文檔51黑下載地址:
基于FPGA的交通燈設(shè)計(jì).7z (6.47 MB, 下載次數(shù): 81)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:703622 發(fā)表于 2020-4-25 20:58 | 顯示全部樓層
好資料謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:306846 發(fā)表于 2020-11-11 12:41 | 顯示全部樓層
請(qǐng)問(wèn)這程序是用啥軟件打開(kāi)的啊,下載了打不開(kāi)啊,需要仿真測(cè)試
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表