一、設計內容
本設計以單片機為核心,以LED數(shù)碼管作為倒計時指示,根據(jù)設計的要求我們考慮了各功能模塊的幾種設計方案,以求最佳方案,實現(xiàn)實時顯示系統(tǒng)各種狀態(tài),系統(tǒng)還增設了根據(jù)交通擁擠情況可分別設置主干道和次干道的通行時間,以提高效率,緩減交通擁擠。系統(tǒng)總體設計框圖如圖所示。
交通燈控制的框圖如下圖所示,主要有控制電路、按鍵電路、晶振電路、復位電路、顯示電路、電源電路等電路組成。
二、設計方案1. 總體方案
本設計以單片機為核心,以LED數(shù)碼管作為倒計時指示,根據(jù)設計的要求我們考慮了各功能模塊的幾種設計方案,以求最佳方案,實現(xiàn)實時顯示系統(tǒng)各種狀態(tài),系統(tǒng)還增設了根據(jù)交通擁擠情況可分別設置主干道和次干道的通行時間,以提高效率,緩減交通擁擠。系統(tǒng)總體設計框圖如圖所示。
交通燈控制的框圖如下圖所示,主要有控制電路、按鍵電路、晶振電路、復位電路、顯示電路、電源電路等電路組成。
電源提供方案
為使模塊穩(wěn)定工作,須有可靠電源。本次設計考慮了兩種電源方案:
方案一:采用獨立的穩(wěn)壓電源。此方案的優(yōu)點是穩(wěn)定可靠,且有各種成熟電路可供選用;缺點是各模塊都采用獨立電源,會使系統(tǒng)復雜,且可能影響電路電平。
方案二:采用單片機控制模塊提供電源。該方案的優(yōu)點是系統(tǒng)簡明扼要,節(jié)約成本;缺點是輸出功率不高。
綜上所述,選擇第二種方案。
顯示界面方案
該系統(tǒng)要求完成倒計時功能。基于上述原因,本次設計考慮了兩種方案:
方案一:完全采用點陣式LED顯示。這種方案功能強大,可方便的顯示各種英文字符,漢字,圖形等,但實現(xiàn)復雜,且須完成大量的軟件工作。
方案二:完全采用數(shù)碼管顯示。這種方案優(yōu)點是實現(xiàn)簡單,可以完成倒計時功能。缺點是功能較少,只能顯示有限的符號和數(shù)碼字符。根據(jù)本設計的要求,方案二已經滿足了要求,所以本次設計采用方案二以實現(xiàn)系統(tǒng)的顯示功能。
輸入方案
這里同樣討論了兩種方案:
方案一:采用8155擴展I/O口、鍵盤及顯示等。該方案的優(yōu)點是使用靈活可編程,并且有RAM及計數(shù)器。若用該方案,可提供較多I/O口,但操作起來稍顯復雜。
方案二:直接在I/O口線上接上按鍵開關。因為設計時精簡和優(yōu)化了電路,所以剩余的端口資源還比較多。
由于該系統(tǒng)是對交通燈及數(shù)碼管的控制,只需用單片機本身的I/O口就可實現(xiàn),且本身的計數(shù)器及RAM已經夠用,故選擇方案二。
2. 硬件電路設計
硬件設計是整個系統(tǒng)的基礎,要考慮的方方面面很多,除了實現(xiàn)交通燈基本功能以外,主要還要考慮如下幾個因素:①系統(tǒng)穩(wěn)定度;②器件的通用性或易選購性;③軟件編程的易實現(xiàn)性;④系統(tǒng)其它功能及性能指標;因此硬件設計至關重要。現(xiàn)從各功能模塊的實現(xiàn)逐個進行分析探討。
總體設計
本設計以單片機為控制核心,采用模塊化設計,共分以下幾個功能模塊:單片機控制系統(tǒng)、鍵盤及狀態(tài)顯示、倒計時模塊等。
單片機作為整個硬件系統(tǒng)的核心,它既是協(xié)調整機工作的控制器,又是數(shù)據(jù)處理器。它由單片機振蕩電路、復位電路等組成。
系統(tǒng)采用雙數(shù)碼管倒計時計數(shù)功能,最大顯示數(shù)字99。
友好的人機界面、靈活的控制方式、優(yōu)化的物理結構是本設計的亮點。
單片機的選擇
單片機微型計算機是微型計算機的一個重要分支,也是頗具生命力的機種。單片機微型計算機簡稱單片機,特別適用于控制領域,故又稱為微控制器。
通常,單片機由單塊集成電路芯片構成,內部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當?shù)能浖巴獠吭O備相結合,便可成為一個單片機控制系統(tǒng)。
單片機經過1、2、3、3代的發(fā)展,正朝著多功能、高性能、低電壓、低功耗、低價格、大存儲容量、強I/O功能及較好的結構兼容性方向發(fā)展。其發(fā)展趨勢不外乎以下幾個方面:
1、多功能 單片機中盡可能地把所需要的存儲器和I/O口都集成在一塊芯片上,使得單片機可以實現(xiàn)更多的功能。比如A/D、PWM、PCA(可編程計數(shù)器陣列)、WDT(監(jiān)視定時器---看家狗)、高速I/O口及計數(shù)器的捕獲/比較邏輯等。 有的單片機針對某一個應用領域,集成了相關的控制設備,以減少應用系統(tǒng)的芯片數(shù)量。例如,有的芯片以51內核為核心,集成了USB控制器、SMART CARD接口、MP3解碼器、CAN或者I*I*C總線控制器等,LED、LCD或VFD顯示驅動器也開始集成在8位單片機中。2、高效率和高性能為了提高執(zhí)行速度和執(zhí)行效率,單片機開始使用RISC、流水線和DSP的設計技術,使單片機的性能有了明顯的提高,表現(xiàn)為:單片機的時鐘頻率得到提高;同樣頻率的單片機運行效率也有了很大的提升;由于集成度的提高,單片機的尋址能力、片內ROM(FLASH)和RAM的容量都突破了以往的數(shù)量和限制。 由于系統(tǒng)資源和系統(tǒng)復雜程度的增加,開始使用高級語言(如C語言)來開發(fā)單片機的程序。使用高級語言可以降低開發(fā) 難度,縮短開發(fā)周期,增強軟件的可讀性和可移植性,便于改進和擴充功能。3、低電壓和低功耗 單片機的嵌入式應用決定了低電壓和低功耗的特性十分重要。由于CMOS等工藝的大量采用,很多單片機可以在更低的電壓下工作(1.2V或0.9V),功耗已經降低到uA級。這些特性使得單片機系統(tǒng)可以在更小電源的支持下工作更長的時間。4、低價格 單片機應用面廣,使用數(shù)量大,帶來的直接好處就是成本的降低。目前世界各大公司為了提高競爭力,在提高單片機性能的同時,十分注意降低其產品的價格。下面大致介紹一下單片機的主要應用領域和特點。(1)家用電器領域 用單片機控制系統(tǒng)取代傳統(tǒng)的模擬和數(shù)字控制電路,使家用電器(如洗衣機、空調、冰箱、微波爐、和電視機等)功能更完善,更加智能化和易于使用。(2)辦公自動化領域 單片機作為嵌入式系統(tǒng)廣泛應用于現(xiàn)代辦公設備,如計算機的鍵盤、磁盤驅動、打印機、復印機、電話機和傳真機等。(3)商業(yè)應用領域 商業(yè)應用系統(tǒng)部分與家用和辦公應用系統(tǒng)相似,但更加注重設備的穩(wěn)定性、可靠性和安全性。商用系統(tǒng)中廣泛使用的電子計量儀器、收款機、條形碼閱讀器、安全監(jiān)測系統(tǒng)、空氣調節(jié)系統(tǒng)和冷凍保鮮系統(tǒng)等,都采用了單片機構成的專用系統(tǒng)。與通用計算機相比,這些系統(tǒng)由于比較封閉,可以更有效地防止病毒和電磁干擾等,可靠性更高。(4)工業(yè)自動化 在工業(yè)控制和機電一體化控制系統(tǒng)中,除了采用工控計算機外,很多都是以單片機為核心的單片機和多機系統(tǒng)。(5)智能儀表與集成智能傳感器 目前在各種電氣測量儀表中普遍采用了單片機應用系統(tǒng)來代替?zhèn)鹘y(tǒng)的測量系統(tǒng),使得測量系統(tǒng)具有存儲、數(shù)據(jù)處理、查詢及聯(lián)網等智能功能。將單片機和傳感器相結合,可以構成新一代的智能傳感器。它將傳感器變換后的物理量作進一步的變化和處理,使其成為數(shù)字信號,可以遠距離傳輸并與計算機接口。(6)現(xiàn)代交通與航空航天領域 通常應用于電子綜合顯示系統(tǒng)、動力監(jiān)控系統(tǒng)、自動駕駛系統(tǒng)、通信系統(tǒng)以及運行監(jiān)視系統(tǒng)等。這些領域對體積、功耗、穩(wěn)定性和實時性的要求往往比商用系統(tǒng)還要高,因此采用單片機系統(tǒng)更加重要。單片機的基本結構
AT89S52單片機是一款低功耗、低電壓、高性能CMOS8位單片機,片內含8KB(可經受1000次擦寫周期)的FLASH可編程可反復擦寫的只讀程序存儲器(EPROM),器件采用CMOS工藝和ATMEL公司的高密度,非易失性存儲器(NURAM)技術制造,其輸出引腳和指令系統(tǒng)都與MCS-51兼容,片內的FLASH存儲器允許在系統(tǒng)內可改編程序或用常規(guī)的非易失性存儲編程器來編程。因此,AT89C52是一種功能強,靈活性高且價格合理的單片機,可方便的應用在各個控制領域[1]。
AT89S52具有以下主要性能:
1.8KB可改編程序FLASH存儲器;
2.全表態(tài)工作 :0~24HZ;
3.256X8字節(jié)內部RAM;
4.32個外部雙向輸入,輸出(I、O)口;
引腳說明如圖2-2。
引腳功能說明如下[2]:
VCC:電源電壓。
GND:地。
P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數(shù)據(jù)線復用口。作為輸出口時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端。
在訪問外部數(shù)據(jù)儲存器或程序儲存器時,這組口線分時轉換地址(低8位)和數(shù)據(jù)總線復用,在訪問期間激活內部上拉電阻。FLASH編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。
P1口:P1是一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作為輸入口。作為輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。FLASH編程和程序校驗期間,P1接收低8位地址。
P2口:P2是一個帶內部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作為輸入口。作為輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。在訪問外部程序儲存器或16位地址的外部數(shù)據(jù)儲存器(例如執(zhí)行MOVX@DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)儲存器(例如執(zhí)行MOVX@RI指令)時,P2口線上的內容(也即特殊功能寄存器(SFR)區(qū)中R2寄存器的內容),在整個訪問期間不改變。P3口:P3是一個帶內部上拉電阻的8位雙向I/O口,P3的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作為輸入口。作為輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。
P3除了作為一般的I/O口線外,更重要的用途是它的第二功能,具體功能說明如表2-1。
P3口還接收一些用于FLASH閃速存儲器編程和程序校的控制信號。
RST:復位輸入。當振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復位
ALE/PROG:當訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。
表2-1 P3口的第二功能表
端口引腳
第二功能
P3.0
RXD(穿行輸出口)
P3.1
TXD(穿行輸入口)
P3.2
INT0(外部中斷0)
P3.3
INT1(外部中斷1)
P3.4
T0(定時/計數(shù)器0)
P3.5
T1(定時/計數(shù)器0)
P3.6
WR(外部數(shù)據(jù)寫選通)
P3.7
RD(外部數(shù)據(jù)讀選通)
不訪問外部存儲器,ALE仍以是時鐘振蕩頻率的1/6輸出固定的正脈沖信號,因此他可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。對FLASH存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。
如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令ALE才會被激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應設置ALE無效。
PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT80C51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數(shù)據(jù)存儲器,這兩次有效的PSEN信號不出現(xiàn)。
EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序儲存器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需要注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態(tài)。如EA端為高電平(Vcc端),CPU則執(zhí)行內部程序儲存器中的指令。
FLASH儲存器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12v編程電壓。
XTAL1:振蕩器反相放大器的及內部時鐘發(fā)生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端
單片機外圍電路設計復位電路設計
MCS-51的復位輸入引腳RST為MCS-51提供了初始化的手段,可以使程序從指定處開始執(zhí)行,在MCS-51的時鐘電路工作后,只要RST引腳上出現(xiàn)超過兩個機器周期以上的高電平時,即可產生復位的操作,只要RST保持高電平,則MCS-51循環(huán)復位,只有單RET由高電平變成低電平以后,MCS-51才從0000H地址開始執(zhí)行程序,本系統(tǒng)采用按鍵復位方式的復位電路。
外部晶振時鐘電路設計
MCS-51的時鐘可以由兩種方式產生,一種是內部方式,利用芯片內部的振蕩電路;另外一種為外部方式,本論文根據(jù)實際需要和簡便,采用內部振蕩方式,MCS-51內部有一個用于構成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端,這個放大器與作為反饋元件的片外晶體或陶瓷諧振器一起構成了一個自激振蕩器。
MCS-51雖然有內部振蕩電路,但要形成時鐘,必須外接元件,所以實際構成的振蕩時鐘電路,外接晶振以及電容C1和C2構成了并聯(lián)諧振電路接在放大器的反饋回路中,對接電容的值雖然沒有嚴格的要求,但電容的大小會影響振蕩頻率的高低,振蕩器的穩(wěn)定性,起振的快速性和溫度的穩(wěn)定性。晶振的頻率可在1.2MHZ~12MHZ之間任選,電容C1和C2的典型值在20pf~100pf之間選擇,由于本系統(tǒng)用到定時器,為了方便計算,采用了12MHZ的晶振,采用電容選擇30pf。
顯示模塊電路設計
該模塊由共陽LED數(shù)碼管組成,利用數(shù)碼管的動態(tài)掃描原理,由三極管進行鎖存,當控制數(shù)碼管的IO口P20和P21為低電平時(及三極管基極為低電平),則三極管導通,VCC通三極管給數(shù)碼管供電,則數(shù)碼管被點亮,利用數(shù)碼管點亮的余輝和人眼的視覺暫留原理,則看起來數(shù)碼管是同時被點亮的。
從設計完成的任務與要求來看,顯示通行時間必須用二位數(shù)碼管,從節(jié)省硬件資源的角度考慮,可采用掃描的方式來處理,對于7段數(shù)碼管,占用7個單片機的I/O口,另外設置2個電子開關對2位顯示進行配合,占用2個I/O端口,十字路口共需4組紅綠燈,加上轉換黃燈,一共是12只燈,須用12個端口進行控制,加上兩個方向的緊急通行按鈕,占2個I/O端口和一個蜂鳴器端口,因此實際占用的單片機I/O口為24個,為此,我們可以選用51系列單片機中的ATAT89S52來作為中央處理器。這款單片機的I/O口作為輸出時,具有較大的吸收電流能力,因此我們可以選用共陽型數(shù)碼管,這樣由單片機的I/O口就可以直接驅動,能簡化硬件電路的設計。
三、軟件設計交通信號燈控制系統(tǒng)的設計
交通信號燈由紅燈、綠燈、黃燈組成。紅燈表示禁止通行,綠燈表示準許通行,黃燈表示警示。交通信號燈分為機動車信號燈、非機動車信號燈、人行橫道信號燈、車道信號燈、方向指示信號燈、閃光警告信號燈、道路與鐵路平面交叉道口信號燈。交通信號燈用于道路平面交叉路口,通過對車輛、行人發(fā)出行進或停止的指令,使各同時到達的人、車交通流盡可能減少相互干擾,從而提高路口的通行能力,保障路口暢通和安全。因此必須合理的設計路口主干道的系統(tǒng)。
十字路口交通信號燈具體的控制要求
(1) 交通信號燈分布于東南西北,每個路口均有三個。南北方向綠燈和東西方向的綠燈不能同時亮;如果同時亮,則應自動立即關閉信號燈系統(tǒng),并立即發(fā)出報警信號。系統(tǒng)工作后,首先南北紅燈亮并維持30s;與此同時,東西綠燈亮,并維持25s時間,到25s時,東西綠燈熄滅。在東西綠燈熄滅時,東西黃燈亮并維持5s,然后東西黃燈熄滅,東西紅燈亮,同時南北紅燈熄滅,南北綠燈亮;東西紅燈亮并維持30s;與此同時,南北綠燈亮并維持15s;然后,南北綠燈熄滅南北綠燈熄滅時,南北黃燈亮維持5s后熄滅;同時南北紅燈亮,東西綠燈亮。至此,結束一個工作循環(huán),如下交通信號燈變化表:
交通信號燈變化表
東西
綠燈亮
黃燈亮
紅燈亮
25S
5S
20S
南北
紅燈亮
綠燈亮
黃燈亮
30S
15S
5S
(2)在交通信號燈亮和閃爍的同時,路口設有兩位七段碼的顯示器倒數(shù)計時,讓車輛行人能夠清楚地知道再過多久信號燈就會發(fā)生變化。以便于司機和行人能夠在有限的時間內準確的通行。
十字路口交通信號燈示意圖
交通信號燈共有12盞,每個路口各有紅,黃,綠三盞,具體分布如下圖所示:
交通信號燈控制系統(tǒng)程序編制 軟件設計應用環(huán)境
本設計軟件的設計是在Keil C51的環(huán)境下編譯的。Keil C51是美國KeilSoftware公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到KeilC51生成的目標代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。C語言有以下特點:
1、語言簡潔、緊湊、使用方便、靈活。C語言一共只有32個關鍵字,9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。
2、運算符豐富。C的運算符包含的范圍很廣泛,共有34種運算符,使得C的運算類型極其豐富,表達式類型多樣化,靈活使用各種運算符可以實現(xiàn)在其他高級語言中難以實現(xiàn)的運算。
3、數(shù)據(jù)結構豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結構,能用來實現(xiàn)各種復雜的數(shù)據(jù)結構的運算。
4、具有結構化的控制語句,用函數(shù)作為程序的模塊單位,便于實現(xiàn)程序的模塊化。
5、語法限制不太嚴格,程序設計自由度大。
6、C語言能進行位操作,能實現(xiàn)匯編語言的大部分功能,可以直接對硬件進行操作。因此,C既具有高級語言的功能,又具有低級語言的許多功能,可用來寫系統(tǒng)軟件。C語言的這種雙重性,使它既是成功的系統(tǒng)描述語言,又是通用的程序設計語言。
7、生成目標代碼質量高,程序執(zhí)行效率高。
8、用C語言寫的程序可移植性好。基本上不用修改就能用于各種型號的計算機和各種操作系統(tǒng)。
對操作系統(tǒng)和系統(tǒng)實用程序以及需要對硬件進行操作的場合,用C語言明顯地優(yōu)勢于其他高級語言,有的大型應用軟件也用C語言來編寫。
軟件設計流程
軟件總體設計主要完成各部分的軟件控制和協(xié)調。本系統(tǒng)主程序模塊主要完成的工作是對系統(tǒng)的初始化,發(fā)送顯示數(shù)據(jù),同時對鍵盤進行掃描,等待外部中斷,以及根據(jù)所需要的功能進行相應的操作。
交通燈根據(jù)其顯示情況可以分為四個狀態(tài),可以通過定時來控制每個狀態(tài)的時間;通過定時也可以向LED數(shù)碼管中每隔1秒送一個數(shù),顯示該狀態(tài)剩余的時間。其流程圖如圖所示。
圖4-1 主程序框圖
交通燈定時器模塊
AT89S52單片機內部有3個定時器T0,T1和T2,本次設計中使用T0工作在方式1,即16位定時器,定時50ms,20次中斷產生秒信號,從而控制紅綠燈的點亮時間。
工作方式寄存器TMOD用來設置T0、T1的工作方式。這次實習中設置TMOD=0x01,即T0工作于方式0(16位定時器)。
內部定時器/計數(shù)器用作定時器時,是對機器周期計數(shù),每個機器周期的長度是12個振蕩周期。定時常數(shù)的設置可用一下方式計算:
機器周期=12/12MHz=1us
(65536-定時常數(shù))*1.0us=50ms
所以定時常數(shù)是50000。
源程序代碼
#include <reg52.h> //調用單片機頭文件
#define uchar unsigned char //宏定義"uchar"代替"unsignedchar"。
#define uint unsigned int //宏定義"uint"用來定義無符號整型數(shù)。
//數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9
uchar codesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
// A B C D E F 不顯示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //斷碼
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
uchar smg_i = 4; //顯示數(shù)碼管的個位數(shù)
//數(shù)碼管位選定義
sbit smg_we1 = P2^0; //數(shù)碼管位選定義
sbit smg_we2 = P2^1;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
char dx_s = 0; //東西 南北 倒計時變量
sbit dx_red = P2^4; //東西紅燈
sbit dx_green = P2^3; //東西綠燈
sbit dx_yellow = P2^2; //東西黃燈
sbit nb_red = P2^7; //南北紅燈
sbit nb_green = P2^6; //南北綠燈
sbit nb_yellow = P2^5; //南北黃燈
uchar flag_jtd_mode; //交通燈的模式 根據(jù)時間
bit flag_1s = 0;
bit flag_500ms;
bit flag_dx_nb; //東西南北模式
uchar flag_5m_value;
uchar i;
uchar flag_alarm; //模式
uchar dx_time = 30,nb_time = 20; //東西、南北的時間
uchar flag_jdgz ; //交通管制
/***********************數(shù)碼位選函數(shù)*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case0: smg_we1 = 0; smg_we2 = 1; smg_we3 =1; smg_we4 = 1; break;
case1: smg_we1 = 1; smg_we2 = 0; smg_we3 =1; smg_we4 = 1; break;
case2: smg_we1 = 1; smg_we2 = 1; smg_we3 =0; smg_we4 = 1; break;
case3: smg_we1 = 1; smg_we2 = 1; smg_we3 =1; smg_we4 = 0; break;
}
}
/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
uinti,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display()
{
uchari;
for(i=0;i<smg_i;i++)
{
P0= 0xff; //消隱
smg_we_switch(i); //位選
P0= dis_smg; //段選
delay_1ms(3);
}
}
/*********************定時器0、定時器1初始化******************/
void time0_init()
{
EA = 1; //開總中斷
TMOD= 0X11; //定時器0、定時器1工作方式1
ET0= 1; //開定時器0中斷
TR0= 1; //允許定時器0定時
// ET1= 1; //開定時器1中斷
// TR1= 1; //允許定時器1定時
}
/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
if(flag_1s== 1)
{
flag_1s= 0;
if(dx_s== 0)
{
if(flag_dx_nb== 1)
dx_s= nb_time; //南北時間
else
dx_s= dx_time; //東西時間
flag_dx_nb= ~flag_dx_nb;
}
dx_s--;
}
dis_smg[0]= smg_du[dx_s % 10] ;
dis_smg[1]= smg_du[dx_s / 10] ;
dis_smg[2]= smg_du[dx_s % 10] ;
dis_smg[3]= smg_du[dx_s / 10] ;
/***********************南北時間*********************************/
if(flag_dx_nb== 0)
{
if(dx_s> 5)
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow= 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
flag_5m_value= 0;
}elseif(dx_s <= 5) //當小于5秒時 黃燈要閃了
{
dx_red = 1; //滅
dx_green = 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
if(flag_500ms== 0)
{
dx_yellow= 0;//亮
}
else
{
dx_yellow= 1;//滅
}
}
}
/***********************東西時間*********************************/
if(flag_dx_nb== 1)
{
if(dx_s> 5)
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow= 1; //滅
flag_5m_value = 0;
}elseif(dx_s <= 5) //當小于5秒時 黃燈要閃了
{
dx_red = 0; //滅
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 1; //滅
if(flag_500ms== 0) //黃燈閃爍
{
nb_yellow= 0; //亮
}
else
{
nb_yellow= 1; //滅
}
}
}
}
/********************獨立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨立按鍵程序
{
staticuchar key_new;
key_can= 20; //按鍵值還原
P1|= 0x1f;
if((P1& 0x1f) != 0x1f) //按鍵按下
{
delay_1ms(1); //按鍵消抖動
if(((P1& 0x1f) != 0x1f) && (key_new == 1))
{ //確認是按鍵按下
key_new= 0;
switch(P1& 0x1f)
{
case0x1e: key_can = 1; break; //得到按鍵值
case0x1d: key_can = 2; break; //得到按鍵值
case 0x1b: key_can = 3; break; //得到按鍵值
case0x17: key_can = 4; break; //得到按鍵值
}
}
}
else
key_new= 1;
}
uchar menu_1,flag_s;
/********************設置函數(shù)*****************/
void key_with()
{
if(key_can== 4) //交通管制按鍵
{
flag_jdgz++;
if(flag_jdgz> 5)
flag_jdgz= 0;
if(flag_jdgz== 1) // 全部亮紅燈
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
}
if(flag_jdgz== 2) // 東西紅燈 南北綠燈
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow= 1; //滅
}
if(flag_jdgz== 3) // 南北紅燈 東西綠燈
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow= 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
}
if(flag_jdgz== 4) // 南北綠燈 東西綠燈
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow= 1; //滅
}
if(flag_jdgz== 5) // 南北黃燈 東西黃燈
{
dx_red = 1; //滅
dx_green = 1; //滅
dx_yellow= 0; //亮
nb_red = 1; //滅
nb_green = 1; //滅
nb_yellow= 0; //亮
}
}
if(key_can== 1) //設置鍵
{
menu_1++;
if(menu_1>= 3)
{
menu_1 = 0;
}
}
if(menu_1== 1) //設置東西的時間
{
if(key_can== 2)
{
dx_time++ ; //加1
if(dx_time> 99)
dx_time= 99;
}
if(key_can== 3)
{
dx_time-- ; //減1
if(dx_time<= 10)
dx_time= 10;
}
dis_smg[0]= smg_du[10] ; //顯示為A
dis_smg[1]= smg_du[10] ; //顯示為A
dis_smg[2]= smg_du[dx_time % 10] ; //顯示東西設置的時候
dis_smg[3]= smg_du[dx_time / 10] ;
}
if(menu_1== 2) //設置南北的時間
{
if(key_can== 2)
{
nb_time++ ; //加1
if(nb_time> 99)
nb_time= 99;
}
if(key_can== 3)
{
nb_time-- ; //減1
if(nb_time<= 10)
nb_time= 10;
}
dis_smg[0]= smg_du[11] ; //顯示為B
dis_smg[1]= smg_du[11] ; //顯示為B
dis_smg[2]= smg_du[nb_time % 10] ; //顯示東西設置的時候
dis_smg[3]= smg_du[nb_time / 10] ;
}
}
/********************************************************************
* 名稱 : main()
* 功能 : 實現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
time0_init();
dx_s= nb_time; //東西時間
while(1)
{
key();
if(key_can< 20)
key_with();
// menu_dis();
if((menu_1== 0) && (flag_jdgz == 0))
jiaotongdeng_dis();
display();
}
}
/*********************定時器0中斷服務程序************************/
void time0_int() interrupt 1
{
staticuchar value; //定時10ms中斷一次
TH0= 0x3c;
TL0= 0xb0; //50ms
value++;
flag_5m_value++;
if(flag_5m_value% 10 == 0)
flag_500ms= ~flag_500ms;
if(value>= 20)
{
value= 0;
flag_1s= 1;
}
}
3. 測試
三、設計總結
本論文介紹了一種基于AT89S52單片機的交通燈的設計方法,本論文完成了系統(tǒng)的硬件設計與制作,詳細介紹了系統(tǒng)硬件設計的過程,并結合軟件系統(tǒng)完成了整個系統(tǒng)的軟、硬件聯(lián)調,系統(tǒng)工作良好,實現(xiàn)了基本功能。
通過本次設計,鞏固了我學習過的專業(yè)知識,也使我把理論與實踐從真正意義上相結合了起來,鍛煉了借助互聯(lián)網絡搜集、查閱相關文獻資料和組織材料的綜合能力,從中我也認識到自己的不足之處,我會在日后的學習中加以改進與提高。
經過這次設計,我在各方面都有很大的提高。學到了很多不曾學過的東西,也使我學會了更好地利用一些資源和工具如圖書館及一些軟件查閱資料。在設計過程中也遇到很多的困難,遇到一些原理性不懂的時候就要去有針對性地查找資料或者請教知道老師和其他同學,然后加以吸收利用,提高了自己的應用能力,擴充了自己的知識儲備,同時提高了動手能力。
四、參考文獻
[1] 劉勇.數(shù)字電路[M].電子工業(yè)出版社.2004
[2] 楊子文.單片機原理及應用[M].西安電子科技大學出版社.2006
[3] 劉華東
一、設計內容
本設計以單片機為核心,以LED數(shù)碼管作為倒計時指示,根據(jù)設計的要求我們考慮了各功能模塊的幾種設計方案,以求最佳方案,實現(xiàn)實時顯示系統(tǒng)各種狀態(tài),系統(tǒng)還增設了根據(jù)交通擁擠情況可分別設置主干道和次干道的通行時間,以提高效率,緩減交通擁擠。系統(tǒng)總體設計框圖如圖所示。
交通燈控制的框圖如下圖所示,主要有控制電路、按鍵電路、晶振電路、復位電路、顯示電路、電源電路等電路組成。
二、設計方案1. 總體方案
本設計以單片機為核心,以LED數(shù)碼管作為倒計時指示,根據(jù)設計的要求我們考慮了各功能模塊的幾種設計方案,以求最佳方案,實現(xiàn)實時顯示系統(tǒng)各種狀態(tài),系統(tǒng)還增設了根據(jù)交通擁擠情況可分別設置主干道和次干道的通行時間,以提高效率,緩減交通擁擠。系統(tǒng)總體設計框圖如圖所示。
交通燈控制的框圖如下圖所示,主要有控制電路、按鍵電路、晶振電路、復位電路、顯示電路、電源電路等電路組成。
電源提供方案
為使模塊穩(wěn)定工作,須有可靠電源。本次設計考慮了兩種電源方案:
方案一:采用獨立的穩(wěn)壓電源。此方案的優(yōu)點是穩(wěn)定可靠,且有各種成熟電路可供選用;缺點是各模塊都采用獨立電源,會使系統(tǒng)復雜,且可能影響電路電平。
方案二:采用單片機控制模塊提供電源。該方案的優(yōu)點是系統(tǒng)簡明扼要,節(jié)約成本;缺點是輸出功率不高。
綜上所述,選擇第二種方案。
顯示界面方案
該系統(tǒng)要求完成倒計時功能。基于上述原因,本次設計考慮了兩種方案:
方案一:完全采用點陣式LED顯示。這種方案功能強大,可方便的顯示各種英文字符,漢字,圖形等,但實現(xiàn)復雜,且須完成大量的軟件工作。
方案二:完全采用數(shù)碼管顯示。這種方案優(yōu)點是實現(xiàn)簡單,可以完成倒計時功能。缺點是功能較少,只能顯示有限的符號和數(shù)碼字符。根據(jù)本設計的要求,方案二已經滿足了要求,所以本次設計采用方案二以實現(xiàn)系統(tǒng)的顯示功能。
輸入方案
這里同樣討論了兩種方案:
方案一:采用8155擴展I/O口、鍵盤及顯示等。該方案的優(yōu)點是使用靈活可編程,并且有RAM及計數(shù)器。若用該方案,可提供較多I/O口,但操作起來稍顯復雜。
方案二:直接在I/O口線上接上按鍵開關。因為設計時精簡和優(yōu)化了電路,所以剩余的端口資源還比較多。
由于該系統(tǒng)是對交通燈及數(shù)碼管的控制,只需用單片機本身的I/O口就可實現(xiàn),且本身的計數(shù)器及RAM已經夠用,故選擇方案二。
2. 硬件電路設計
硬件設計是整個系統(tǒng)的基礎,要考慮的方方面面很多,除了實現(xiàn)交通燈基本功能以外,主要還要考慮如下幾個因素:①系統(tǒng)穩(wěn)定度;②器件的通用性或易選購性;③軟件編程的易實現(xiàn)性;④系統(tǒng)其它功能及性能指標;因此硬件設計至關重要。現(xiàn)從各功能模塊的實現(xiàn)逐個進行分析探討。
總體設計
本設計以單片機為控制核心,采用模塊化設計,共分以下幾個功能模塊:單片機控制系統(tǒng)、鍵盤及狀態(tài)顯示、倒計時模塊等。
單片機作為整個硬件系統(tǒng)的核心,它既是協(xié)調整機工作的控制器,又是數(shù)據(jù)處理器。它由單片機振蕩電路、復位電路等組成。
系統(tǒng)采用雙數(shù)碼管倒計時計數(shù)功能,最大顯示數(shù)字99。
友好的人機界面、靈活的控制方式、優(yōu)化的物理結構是本設計的亮點。
單片機的選擇
單片機微型計算機是微型計算機的一個重要分支,也是頗具生命力的機種。單片機微型計算機簡稱單片機,特別適用于控制領域,故又稱為微控制器。
通常,單片機由單塊集成電路芯片構成,內部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當?shù)能浖巴獠吭O備相結合,便可成為一個單片機控制系統(tǒng)。
單片機經過1、2、3、3代的發(fā)展,正朝著多功能、高性能、低電壓、低功耗、低價格、大存儲容量、強I/O功能及較好的結構兼容性方向發(fā)展。其發(fā)展趨勢不外乎以下幾個方面:
1、多功能 單片機中盡可能地把所需要的存儲器和I/O口都集成在一塊芯片上,使得單片機可以實現(xiàn)更多的功能。比如A/D、PWM、PCA(可編程計數(shù)器陣列)、WDT(監(jiān)視定時器---看家狗)、高速I/O口及計數(shù)器的捕獲/比較邏輯等。 有的單片機針對某一個應用領域,集成了相關的控制設備,以減少應用系統(tǒng)的芯片數(shù)量。例如,有的芯片以51內核為核心,集成了USB控制器、SMART CARD接口、MP3解碼器、CAN或者I*I*C總線控制器等,LED、LCD或VFD顯示驅動器也開始集成在8位單片機中。2、高效率和高性能為了提高執(zhí)行速度和執(zhí)行效率,單片機開始使用RISC、流水線和DSP的設計技術,使單片機的性能有了明顯的提高,表現(xiàn)為:單片機的時鐘頻率得到提高;同樣頻率的單片機運行效率也有了很大的提升;由于集成度的提高,單片機的尋址能力、片內ROM(FLASH)和RAM的容量都突破了以往的數(shù)量和限制。 由于系統(tǒng)資源和系統(tǒng)復雜程度的增加,開始使用高級語言(如C語言)來開發(fā)單片機的程序。使用高級語言可以降低開發(fā) 難度,縮短開發(fā)周期,增強軟件的可讀性和可移植性,便于改進和擴充功能。3、低電壓和低功耗 單片機的嵌入式應用決定了低電壓和低功耗的特性十分重要。由于CMOS等工藝的大量采用,很多單片機可以在更低的電壓下工作(1.2V或0.9V),功耗已經降低到uA級。這些特性使得單片機系統(tǒng)可以在更小電源的支持下工作更長的時間。4、低價格 單片機應用面廣,使用數(shù)量大,帶來的直接好處就是成本的降低。目前世界各大公司為了提高競爭力,在提高單片機性能的同時,十分注意降低其產品的價格。下面大致介紹一下單片機的主要應用領域和特點。(1)家用電器領域 用單片機控制系統(tǒng)取代傳統(tǒng)的模擬和數(shù)字控制電路,使家用電器(如洗衣機、空調、冰箱、微波爐、和電視機等)功能更完善,更加智能化和易于使用。(2)辦公自動化領域 單片機作為嵌入式系統(tǒng)廣泛應用于現(xiàn)代辦公設備,如計算機的鍵盤、磁盤驅動、打印機、復印機、電話機和傳真機等。(3)商業(yè)應用領域 商業(yè)應用系統(tǒng)部分與家用和辦公應用系統(tǒng)相似,但更加注重設備的穩(wěn)定性、可靠性和安全性。商用系統(tǒng)中廣泛使用的電子計量儀器、收款機、條形碼閱讀器、安全監(jiān)測系統(tǒng)、空氣調節(jié)系統(tǒng)和冷凍保鮮系統(tǒng)等,都采用了單片機構成的專用系統(tǒng)。與通用計算機相比,這些系統(tǒng)由于比較封閉,可以更有效地防止病毒和電磁干擾等,可靠性更高。(4)工業(yè)自動化 在工業(yè)控制和機電一體化控制系統(tǒng)中,除了采用工控計算機外,很多都是以單片機為核心的單片機和多機系統(tǒng)。(5)智能儀表與集成智能傳感器 目前在各種電氣測量儀表中普遍采用了單片機應用系統(tǒng)來代替?zhèn)鹘y(tǒng)的測量系統(tǒng),使得測量系統(tǒng)具有存儲、數(shù)據(jù)處理、查詢及聯(lián)網等智能功能。將單片機和傳感器相結合,可以構成新一代的智能傳感器。它將傳感器變換后的物理量作進一步的變化和處理,使其成為數(shù)字信號,可以遠距離傳輸并與計算機接口。(6)現(xiàn)代交通與航空航天領域 通常應用于電子綜合顯示系統(tǒng)、動力監(jiān)控系統(tǒng)、自動駕駛系統(tǒng)、通信系統(tǒng)以及運行監(jiān)視系統(tǒng)等。這些領域對體積、功耗、穩(wěn)定性和實時性的要求往往比商用系統(tǒng)還要高,因此采用單片機系統(tǒng)更加重要。單片機的基本結構
AT89S52單片機是一款低功耗、低電壓、高性能CMOS8位單片機,片內含8KB(可經受1000次擦寫周期)的FLASH可編程可反復擦寫的只讀程序存儲器(EPROM),器件采用CMOS工藝和ATMEL公司的高密度,非易失性存儲器(NURAM)技術制造,其輸出引腳和指令系統(tǒng)都與MCS-51兼容,片內的FLASH存儲器允許在系統(tǒng)內可改編程序或用常規(guī)的非易失性存儲編程器來編程。因此,AT89C52是一種功能強,靈活性高且價格合理的單片機,可方便的應用在各個控制領域[1]。
AT89S52具有以下主要性能:
1.8KB可改編程序FLASH存儲器;
2.全表態(tài)工作 :0~24HZ;
3.256X8字節(jié)內部RAM;
4.32個外部雙向輸入,輸出(I、O)口;
引腳說明如圖2-2。
引腳功能說明如下[2]:
VCC:電源電壓。
GND:地。
P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數(shù)據(jù)線復用口。作為輸出口時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端。
在訪問外部數(shù)據(jù)儲存器或程序儲存器時,這組口線分時轉換地址(低8位)和數(shù)據(jù)總線復用,在訪問期間激活內部上拉電阻。FLASH編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。
P1口:P1是一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作為輸入口。作為輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。FLASH編程和程序校驗期間,P1接收低8位地址。
P2口:P2是一個帶內部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作為輸入口。作為輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。在訪問外部程序儲存器或16位地址的外部數(shù)據(jù)儲存器(例如執(zhí)行MOVX@DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)儲存器(例如執(zhí)行MOVX@RI指令)時,P2口線上的內容(也即特殊功能寄存器(SFR)區(qū)中R2寄存器的內容),在整個訪問期間不改變。P3口:P3是一個帶內部上拉電阻的8位雙向I/O口,P3的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作為輸入口。作為輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。
P3除了作為一般的I/O口線外,更重要的用途是它的第二功能,具體功能說明如表2-1。
P3口還接收一些用于FLASH閃速存儲器編程和程序校的控制信號。
RST:復位輸入。當振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復位
ALE/PROG:當訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。
表2-1 P3口的第二功能表
端口引腳
第二功能
P3.0
RXD(穿行輸出口)
P3.1
TXD(穿行輸入口)
P3.2
INT0(外部中斷0)
P3.3
INT1(外部中斷1)
P3.4
T0(定時/計數(shù)器0)
P3.5
T1(定時/計數(shù)器0)
P3.6
WR(外部數(shù)據(jù)寫選通)
P3.7
RD(外部數(shù)據(jù)讀選通)
不訪問外部存儲器,ALE仍以是時鐘振蕩頻率的1/6輸出固定的正脈沖信號,因此他可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。對FLASH存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。
如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令ALE才會被激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應設置ALE無效。
PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT80C51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數(shù)據(jù)存儲器,這兩次有效的PSEN信號不出現(xiàn)。
EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序儲存器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需要注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態(tài)。如EA端為高電平(Vcc端),CPU則執(zhí)行內部程序儲存器中的指令。
FLASH儲存器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12v編程電壓。
XTAL1:振蕩器反相放大器的及內部時鐘發(fā)生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端
單片機外圍電路設計復位電路設計
MCS-51的復位輸入引腳RST為MCS-51提供了初始化的手段,可以使程序從指定處開始執(zhí)行,在MCS-51的時鐘電路工作后,只要RST引腳上出現(xiàn)超過兩個機器周期以上的高電平時,即可產生復位的操作,只要RST保持高電平,則MCS-51循環(huán)復位,只有單RET由高電平變成低電平以后,MCS-51才從0000H地址開始執(zhí)行程序,本系統(tǒng)采用按鍵復位方式的復位電路。
外部晶振時鐘電路設計
MCS-51的時鐘可以由兩種方式產生,一種是內部方式,利用芯片內部的振蕩電路;另外一種為外部方式,本論文根據(jù)實際需要和簡便,采用內部振蕩方式,MCS-51內部有一個用于構成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端,這個放大器與作為反饋元件的片外晶體或陶瓷諧振器一起構成了一個自激振蕩器。
MCS-51雖然有內部振蕩電路,但要形成時鐘,必須外接元件,所以實際構成的振蕩時鐘電路,外接晶振以及電容C1和C2構成了并聯(lián)諧振電路接在放大器的反饋回路中,對接電容的值雖然沒有嚴格的要求,但電容的大小會影響振蕩頻率的高低,振蕩器的穩(wěn)定性,起振的快速性和溫度的穩(wěn)定性。晶振的頻率可在1.2MHZ~12MHZ之間任選,電容C1和C2的典型值在20pf~100pf之間選擇,由于本系統(tǒng)用到定時器,為了方便計算,采用了12MHZ的晶振,采用電容選擇30pf。
顯示模塊電路設計
該模塊由共陽LED數(shù)碼管組成,利用數(shù)碼管的動態(tài)掃描原理,由三極管進行鎖存,當控制數(shù)碼管的IO口P20和P21為低電平時(及三極管基極為低電平),則三極管導通,VCC通三極管給數(shù)碼管供電,則數(shù)碼管被點亮,利用數(shù)碼管點亮的余輝和人眼的視覺暫留原理,則看起來數(shù)碼管是同時被點亮的。
從設計完成的任務與要求來看,顯示通行時間必須用二位數(shù)碼管,從節(jié)省硬件資源的角度考慮,可采用掃描的方式來處理,對于7段數(shù)碼管,占用7個單片機的I/O口,另外設置2個電子開關對2位顯示進行配合,占用2個I/O端口,十字路口共需4組紅綠燈,加上轉換黃燈,一共是12只燈,須用12個端口進行控制,加上兩個方向的緊急通行按鈕,占2個I/O端口和一個蜂鳴器端口,因此實際占用的單片機I/O口為24個,為此,我們可以選用51系列單片機中的ATAT89S52來作為中央處理器。這款單片機的I/O口作為輸出時,具有較大的吸收電流能力,因此我們可以選用共陽型數(shù)碼管,這樣由單片機的I/O口就可以直接驅動,能簡化硬件電路的設計。
三、軟件設計交通信號燈控制系統(tǒng)的設計
交通信號燈由紅燈、綠燈、黃燈組成。紅燈表示禁止通行,綠燈表示準許通行,黃燈表示警示。交通信號燈分為機動車信號燈、非機動車信號燈、人行橫道信號燈、車道信號燈、方向指示信號燈、閃光警告信號燈、道路與鐵路平面交叉道口信號燈。交通信號燈用于道路平面交叉路口,通過對車輛、行人發(fā)出行進或停止的指令,使各同時到達的人、車交通流盡可能減少相互干擾,從而提高路口的通行能力,保障路口暢通和安全。因此必須合理的設計路口主干道的系統(tǒng)。
十字路口交通信號燈具體的控制要求
(1) 交通信號燈分布于東南西北,每個路口均有三個。南北方向綠燈和東西方向的綠燈不能同時亮;如果同時亮,則應自動立即關閉信號燈系統(tǒng),并立即發(fā)出報警信號。系統(tǒng)工作后,首先南北紅燈亮并維持30s;與此同時,東西綠燈亮,并維持25s時間,到25s時,東西綠燈熄滅。在東西綠燈熄滅時,東西黃燈亮并維持5s,然后東西黃燈熄滅,東西紅燈亮,同時南北紅燈熄滅,南北綠燈亮;東西紅燈亮并維持30s;與此同時,南北綠燈亮并維持15s;然后,南北綠燈熄滅南北綠燈熄滅時,南北黃燈亮維持5s后熄滅;同時南北紅燈亮,東西綠燈亮。至此,結束一個工作循環(huán),如下交通信號燈變化表:
交通信號燈變化表
東西
綠燈亮
黃燈亮
紅燈亮
25S
5S
20S
南北
紅燈亮
綠燈亮
黃燈亮
30S
15S
5S
(2)在交通信號燈亮和閃爍的同時,路口設有兩位七段碼的顯示器倒數(shù)計時,讓車輛行人能夠清楚地知道再過多久信號燈就會發(fā)生變化。以便于司機和行人能夠在有限的時間內準確的通行。
十字路口交通信號燈示意圖
交通信號燈共有12盞,每個路口各有紅,黃,綠三盞,具體分布如下圖所示:
交通信號燈控制系統(tǒng)程序編制 軟件設計應用環(huán)境
本設計軟件的設計是在Keil C51的環(huán)境下編譯的。Keil C51是美國KeilSoftware公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到KeilC51生成的目標代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。C語言有以下特點:
1、語言簡潔、緊湊、使用方便、靈活。C語言一共只有32個關鍵字,9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。
2、運算符豐富。C的運算符包含的范圍很廣泛,共有34種運算符,使得C的運算類型極其豐富,表達式類型多樣化,靈活使用各種運算符可以實現(xiàn)在其他高級語言中難以實現(xiàn)的運算。
3、數(shù)據(jù)結構豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結構,能用來實現(xiàn)各種復雜的數(shù)據(jù)結構的運算。
4、具有結構化的控制語句,用函數(shù)作為程序的模塊單位,便于實現(xiàn)程序的模塊化。
5、語法限制不太嚴格,程序設計自由度大。
6、C語言能進行位操作,能實現(xiàn)匯編語言的大部分功能,可以直接對硬件進行操作。因此,C既具有高級語言的功能,又具有低級語言的許多功能,可用來寫系統(tǒng)軟件。C語言的這種雙重性,使它既是成功的系統(tǒng)描述語言,又是通用的程序設計語言。
7、生成目標代碼質量高,程序執(zhí)行效率高。
8、用C語言寫的程序可移植性好。基本上不用修改就能用于各種型號的計算機和各種操作系統(tǒng)。
對操作系統(tǒng)和系統(tǒng)實用程序以及需要對硬件進行操作的場合,用C語言明顯地優(yōu)勢于其他高級語言,有的大型應用軟件也用C語言來編寫。
軟件設計流程
軟件總體設計主要完成各部分的軟件控制和協(xié)調。本系統(tǒng)主程序模塊主要完成的工作是對系統(tǒng)的初始化,發(fā)送顯示數(shù)據(jù),同時對鍵盤進行掃描,等待外部中斷,以及根據(jù)所需要的功能進行相應的操作。
交通燈根據(jù)其顯示情況可以分為四個狀態(tài),可以通過定時來控制每個狀態(tài)的時間;通過定時也可以向LED數(shù)碼管中每隔1秒送一個數(shù),顯示該狀態(tài)剩余的時間。其流程圖如圖所示。
圖4-1 主程序框圖
交通燈定時器模塊
AT89S52單片機內部有3個定時器T0,T1和T2,本次設計中使用T0工作在方式1,即16位定時器,定時50ms,20次中斷產生秒信號,從而控制紅綠燈的點亮時間。
工作方式寄存器TMOD用來設置T0、T1的工作方式。這次實習中設置TMOD=0x01,即T0工作于方式0(16位定時器)。
內部定時器/計數(shù)器用作定時器時,是對機器周期計數(shù),每個機器周期的長度是12個振蕩周期。定時常數(shù)的設置可用一下方式計算:
機器周期=12/12MHz=1us
(65536-定時常數(shù))*1.0us=50ms
所以定時常數(shù)是50000。
源程序代碼
#include <reg52.h> //調用單片機頭文件
#define uchar unsigned char //宏定義"uchar"代替"unsignedchar"。
#define uint unsigned int //宏定義"uint"用來定義無符號整型數(shù)。
//數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9
uchar codesmg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
// A B C D E F 不顯示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //斷碼
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
uchar smg_i = 4; //顯示數(shù)碼管的個位數(shù)
//數(shù)碼管位選定義
sbit smg_we1 = P2^0; //數(shù)碼管位選定義
sbit smg_we2 = P2^1;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
char dx_s = 0; //東西 南北 倒計時變量
sbit dx_red = P2^4; //東西紅燈
sbit dx_green = P2^3; //東西綠燈
sbit dx_yellow = P2^2; //東西黃燈
sbit nb_red = P2^7; //南北紅燈
sbit nb_green = P2^6; //南北綠燈
sbit nb_yellow = P2^5; //南北黃燈
uchar flag_jtd_mode; //交通燈的模式 根據(jù)時間
bit flag_1s = 0;
bit flag_500ms;
bit flag_dx_nb; //東西南北模式
uchar flag_5m_value;
uchar i;
uchar flag_alarm; //模式
uchar dx_time = 30,nb_time = 20; //東西、南北的時間
uchar flag_jdgz ; //交通管制
/***********************數(shù)碼位選函數(shù)*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case0: smg_we1 = 0; smg_we2 = 1; smg_we3 =1; smg_we4 = 1; break;
case1: smg_we1 = 1; smg_we2 = 0; smg_we3 =1; smg_we4 = 1; break;
case2: smg_we1 = 1; smg_we2 = 1; smg_we3 =0; smg_we4 = 1; break;
case3: smg_we1 = 1; smg_we2 = 1; smg_we3 =1; smg_we4 = 0; break;
}
}
/********************************************************************
* 名稱 : delay_1ms()
* 功能 : 延時1ms函數(shù)
* 輸入 : q
* 輸出 : 無
***********************************************************************/
void delay_1ms(uint q)
{
uinti,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/********************************************************************
* 名稱 : display()
* 功能 : 數(shù)碼管顯示
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void display()
{
uchari;
for(i=0;i<smg_i;i++)
{
P0= 0xff; //消隱
smg_we_switch(i); //位選
P0= dis_smg; //段選
delay_1ms(3);
}
}
/*********************定時器0、定時器1初始化******************/
void time0_init()
{
EA = 1; //開總中斷
TMOD= 0X11; //定時器0、定時器1工作方式1
ET0= 1; //開定時器0中斷
TR0= 1; //允許定時器0定時
// ET1= 1; //開定時器1中斷
// TR1= 1; //允許定時器1定時
}
/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
if(flag_1s== 1)
{
flag_1s= 0;
if(dx_s== 0)
{
if(flag_dx_nb== 1)
dx_s= nb_time; //南北時間
else
dx_s= dx_time; //東西時間
flag_dx_nb= ~flag_dx_nb;
}
dx_s--;
}
dis_smg[0]= smg_du[dx_s % 10] ;
dis_smg[1]= smg_du[dx_s / 10] ;
dis_smg[2]= smg_du[dx_s % 10] ;
dis_smg[3]= smg_du[dx_s / 10] ;
/***********************南北時間*********************************/
if(flag_dx_nb== 0)
{
if(dx_s> 5)
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow= 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
flag_5m_value= 0;
}elseif(dx_s <= 5) //當小于5秒時 黃燈要閃了
{
dx_red = 1; //滅
dx_green = 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
if(flag_500ms== 0)
{
dx_yellow= 0;//亮
}
else
{
dx_yellow= 1;//滅
}
}
}
/***********************東西時間*********************************/
if(flag_dx_nb== 1)
{
if(dx_s> 5)
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow= 1; //滅
flag_5m_value = 0;
}elseif(dx_s <= 5) //當小于5秒時 黃燈要閃了
{
dx_red = 0; //滅
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 1; //滅
if(flag_500ms== 0) //黃燈閃爍
{
nb_yellow= 0; //亮
}
else
{
nb_yellow= 1; //滅
}
}
}
}
/********************獨立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨立按鍵程序
{
staticuchar key_new;
key_can= 20; //按鍵值還原
P1|= 0x1f;
if((P1& 0x1f) != 0x1f) //按鍵按下
{
delay_1ms(1); //按鍵消抖動
if(((P1& 0x1f) != 0x1f) && (key_new == 1))
{ //確認是按鍵按下
key_new= 0;
switch(P1& 0x1f)
{
case0x1e: key_can = 1; break; //得到按鍵值
case0x1d: key_can = 2; break; //得到按鍵值
case 0x1b: key_can = 3; break; //得到按鍵值
case0x17: key_can = 4; break; //得到按鍵值
}
}
}
else
key_new= 1;
}
uchar menu_1,flag_s;
/********************設置函數(shù)*****************/
void key_with()
{
if(key_can== 4) //交通管制按鍵
{
flag_jdgz++;
if(flag_jdgz> 5)
flag_jdgz= 0;
if(flag_jdgz== 1) // 全部亮紅燈
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
}
if(flag_jdgz== 2) // 東西紅燈 南北綠燈
{
dx_red = 0; //亮
dx_green = 1; //滅
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow= 1; //滅
}
if(flag_jdgz== 3) // 南北紅燈 東西綠燈
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow= 1; //滅
nb_red = 0; //亮
nb_green = 1; //滅
nb_yellow= 1; //滅
}
if(flag_jdgz== 4) // 南北綠燈 東西綠燈
{
dx_red = 1; //滅
dx_green = 0; //亮
dx_yellow= 1; //滅
nb_red = 1; //滅
nb_green = 0; //亮
nb_yellow= 1; //滅
}
if(flag_jdgz== 5) // 南北黃燈 東西黃燈
{
dx_red = 1; //滅
dx_green = 1; //滅
dx_yellow= 0; //亮
nb_red = 1; //滅
nb_green = 1; //滅
nb_yellow= 0; //亮
}
}
if(key_can== 1) //設置鍵
{
menu_1++;
if(menu_1>= 3)
{
menu_1 = 0;
}
}
if(menu_1== 1) //設置東西的時間
{
if(key_can== 2)
{
dx_time++ ; //加1
if(dx_time> 99)
dx_time= 99;
}
if(key_can== 3)
{
dx_time-- ; //減1
if(dx_time<= 10)
dx_time= 10;
}
dis_smg[0]= smg_du[10] ; //顯示為A
dis_smg[1]= smg_du[10] ; //顯示為A
dis_smg[2]= smg_du[dx_time % 10] ; //顯示東西設置的時候
dis_smg[3]= smg_du[dx_time / 10] ;
}
if(menu_1== 2) //設置南北的時間
{
if(key_can== 2)
{
nb_time++ ; //加1
if(nb_time> 99)
nb_time= 99;
}
if(key_can== 3)
{
nb_time-- ; //減1
if(nb_time<= 10)
nb_time= 10;
}
dis_smg[0]= smg_du[11] ; //顯示為B
dis_smg[1]= smg_du[11] ; //顯示為B
dis_smg[2]= smg_du[nb_time % 10] ; //顯示東西設置的時候
dis_smg[3]= smg_du[nb_time / 10] ;
}
}
/********************************************************************
* 名稱 : main()
* 功能 : 實現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
time0_init();
dx_s= nb_time; //東西時間
while(1)
{
key();
if(key_can< 20)
key_with();
// menu_dis();
if((menu_1== 0) && (flag_jdgz == 0))
jiaotongdeng_dis();
display();
}
}
/*********************定時器0中斷服務程序************************/
void time0_int() interrupt 1
{
staticuchar value; //定時10ms中斷一次
TH0= 0x3c;
TL0= 0xb0; //50ms
value++;
flag_5m_value++;
if(flag_5m_value% 10 == 0)
flag_500ms= ~flag_500ms;
if(value>= 20)
{
value= 0;
flag_1s= 1;
}
}
3. 測試
三、設計總結
本論文介紹了一種基于AT89S52單片機的交通燈的設計方法,本論文完成了系統(tǒng)的硬件設計與制作,詳細介紹了系統(tǒng)硬件設計的過程,并結合軟件系統(tǒng)完成了整個系統(tǒng)的軟、硬件聯(lián)調,系統(tǒng)工作良好,實現(xiàn)了基本功能。
通過本次設計,鞏固了我學習過的專業(yè)知識,也使我把理論與實踐從真正意義上相結合了起來,鍛煉了借助互聯(lián)網絡搜集、查閱相關文獻資料和組織材料的綜合能力,從中我也認識到自己的不足之處,我會在日后的學習中加以改進與提高。
經過這次設計,我在各方面都有很大的提高。學到了很多不曾學過的東西,也使我學會了更好地利用一些資源和工具如圖書館及一些軟件查閱資料。在設計過程中也遇到很多的困難,遇到一些原理性不懂的時候就要去有針對性地查找資料或者請教知道老師和其他同學,然后加以吸收利用,提高了自己的應用能力,擴充了自己的知識儲備,同時提高了動手能力。
四、參考文獻
[1] 劉勇.數(shù)字電路[M].電子工業(yè)出版社.2004
[2] 楊子文.單片機原理及應用[M].西安電子科技大學出版社.2006
[3] 劉華東.單片機原理與應用(第2版)[M].電子工業(yè)出版社.2006.8
[4] 胡漢才.單片機原理及其接口技術[M].清華大學出版社,2006.
[5] 沈精虎.電路設計與制版Protel99入門與提高[M].人民郵電出版社,2004.
[6] 范風強,蘭嬋麗.單片機語言C51應用實戰(zhàn)集錦[M].電子工業(yè)出版社.,2001.
[7] 顧曙敏.單片機與串行時鐘DS1307的接口設計[J].現(xiàn)代電子技術,2003,26(14)85-87.
[8] 孫曉燕.基于8051單片機的交通燈控制系統(tǒng)設計與模擬[J].南寧職業(yè)技術學院學報,2007年03期.
[9] 陳毅,許飛,王學飛.基于單片機的交通燈智能控制系統(tǒng)[J].中國高新技術企業(yè),2009年第15期.
.單片機原理與應用(第2版)[M].電子工業(yè)出版社.2006.8
[4] 胡漢才.單片機原理及其接口技術[M].清華大學出版社,2006.
[5] 沈精虎.電路設計與制版Protel99入門與提高[M].人民郵電出版社,2004.
[6] 范風強,蘭嬋麗.單片機語言C51應用實戰(zhàn)集錦[M].電子工業(yè)出版社.,2001.
[7] 顧曙敏.單片機與串行時鐘DS1307的接口設計[J].現(xiàn)代電子技術,2003,26(14)85-87.
[8] 孫曉燕.基于8051單片機的交通燈控制系統(tǒng)設計與模擬[J].南寧職業(yè)技術學院學報,2007年03期.
[9] 陳毅,許飛,王學飛.基于單片機的交通燈智能控制系統(tǒng)[J].中國高新技術企業(yè),2009年第15期.
|