制作出來(lái)的實(shí)物圖如下:
元件清單:
摘要
隨著社會(huì)主義的建設(shè),城市的規(guī)模在不斷擴(kuò)大,城市的交通也在不斷的提高和改進(jìn),交通的順暢已經(jīng)成為制約社會(huì)主義建設(shè)的一個(gè)重要因素。目前,伴隨著機(jī)動(dòng)車(chē)輛的不斷增加,尤其是十字路口的交通建設(shè)?頗為關(guān)鍵,嚴(yán)重的影響到城市交通安全。社會(huì)主義建設(shè)以來(lái),有許許多多的設(shè)計(jì)工作者投身于十字路口交通建設(shè)的研究之中,創(chuàng)造和設(shè)計(jì)出了很多新型的方案,把我國(guó)交通建設(shè)推向了更高的發(fā)展階段。當(dāng)前,十字路口都采用了信號(hào)燈來(lái)控制車(chē)輛和人的通行,不僅便于維護(hù)管理,而且有較強(qiáng)的自動(dòng)化。大量的信號(hào)燈電路正向著數(shù)字化、小功率、多樣化、方便人、車(chē)、路三者關(guān)系的協(xié)調(diào),多值化方向發(fā)展隨著社會(huì)經(jīng)濟(jì)的發(fā)展,城市交通問(wèn)題越來(lái)越引起人們的關(guān)注。它的出現(xiàn)使交通得以有效管制,對(duì)于疏導(dǎo)交通流量、提高道路通行能力,減少交通事故有明顯效果。十字路口車(chē)輛穿梭,行人熙攘,車(chē)行車(chē)道,人行人道,有條不紊。那么靠什么來(lái)實(shí)現(xiàn)這井然秩序呢?靠的就是交通信號(hào)燈的自動(dòng)指揮系統(tǒng)。交通信號(hào)燈控制方式很多。本系統(tǒng)采用單片機(jī)AT89S52來(lái)設(shè)計(jì)交通燈控制器,實(shí)現(xiàn)了能根據(jù)實(shí)際車(chē)流量通過(guò)AT89S52芯片的P1口設(shè)置紅、綠燈燃亮?xí)r間的功能;紅綠燈循環(huán)點(diǎn)亮,倒計(jì)時(shí)剩5秒時(shí)黃燈閃爍警示。本系統(tǒng)實(shí)用性強(qiáng)、操作簡(jiǎn)單、擴(kuò)展功能強(qiáng)。
目錄
第一章 緒 論
1.1交通信號(hào)燈的發(fā)展及研究意義
1.2現(xiàn)在城市路口交通燈控制技術(shù)現(xiàn)狀
1.3單片機(jī)概述
1.4方案的設(shè)計(jì)與論證
第二章 系統(tǒng)硬件設(shè)計(jì)
2.1總體設(shè)計(jì)
2.2 單片機(jī)的選擇
2.3 單片機(jī)的基本結(jié)構(gòu)
2.4單片機(jī)外圍電路設(shè)計(jì)
第三章 交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)
3.1 十字路口交通信號(hào)燈具體的控制要求
3.2十字路口交通信號(hào)燈示意圖
第四章 交通信號(hào)燈控制系統(tǒng)程序編制
4.1 軟件設(shè)計(jì)應(yīng)用環(huán)境
4.2 軟件設(shè)計(jì)流程
第五章 結(jié)論
第六章 謝辭
第七章 參考文獻(xiàn)
附件一:總體原理圖
附件二:源程序代碼
第一章 緒 論
1.1交通信號(hào)燈的發(fā)展及研究意義當(dāng)今,紅綠燈安裝在各個(gè)道口上,已經(jīng)成為疏導(dǎo)交通車(chē)輛最常見(jiàn)和最有效的手段,這一技術(shù)已經(jīng)有相當(dāng)長(zhǎng)的發(fā)展歷史了。 1858年,在英國(guó)倫敦主要街頭安裝了以燃煤氣為光源的紅,藍(lán)兩色的機(jī)械扳手式信號(hào)燈,用以指揮馬車(chē)通行。這是世界上最早的交通信號(hào)燈。1868年,英國(guó)機(jī)械工程師納伊特在倫敦威斯敏斯特區(qū)的議會(huì)大廈前的廣場(chǎng)上,安裝了世界上最早的煤氣紅綠燈。它由紅綠兩以旋轉(zhuǎn)式方形玻璃提燈組成,紅色表示“停止”,綠色表示“注意”。1869年1月2日,煤氣燈爆炸,使警察受傷,遂被取消。 電氣啟動(dòng)的紅綠燈出現(xiàn)在美國(guó),這種紅綠燈由紅綠黃三色圓形的投光器組成,1914年始安裝于紐約市5號(hào)大街的一座高塔上。紅燈亮表示“停止”,綠燈亮表示“通行”。 1918年,又出現(xiàn)了帶控制的紅綠燈和紅外線紅綠燈。帶控制的紅綠燈,一種是把壓力探測(cè)器安在地下,車(chē)輛一接近紅燈便變?yōu)榫G燈;另一種是用擴(kuò)音器來(lái)啟動(dòng)紅綠燈,司機(jī)遇紅燈時(shí)按一下嗽叭,就使紅燈變?yōu)榫G燈。紅外線紅綠燈當(dāng)行人踏上對(duì)壓力敏感的路面時(shí),它就能察覺(jué)到有人要過(guò)馬路。紅外光束能把信號(hào)燈的紅燈延長(zhǎng)一段時(shí)間,推遲汽車(chē)放行,以免發(fā)生交通事故。 又經(jīng)過(guò)前人的設(shè)計(jì)和改造,交通信號(hào)燈終于普及整個(gè)城市的十字路口。 交通信號(hào)燈的出現(xiàn),使交通得以有效管制,對(duì)于疏導(dǎo)交通流量、提高道路通行能力,減少交通事故有明顯效果,更改變了交警輪流指揮和疏散交通擁擠的現(xiàn)狀,實(shí)現(xiàn)了人,車(chē),路三者的同步協(xié)調(diào)。現(xiàn)階段,許多設(shè)計(jì)工作者又設(shè)計(jì)出許多智能化,自動(dòng)化,數(shù)字化等更先進(jìn)的交通燈控制方案,這更方便于維護(hù)管理,給人們提供了更加便利的交通環(huán)境。 目前,城市規(guī)模還在不斷的擴(kuò)大,人們對(duì)交通信號(hào)燈的控制也越來(lái)越高,我們需要更高層次的去了解交通信號(hào)燈,結(jié)合城市十字路口交通的需要,不斷地去創(chuàng)新,才能達(dá)到發(fā)展的需求,所以研究交通信號(hào)燈的極為重要。 1.2現(xiàn)在城市路口交通燈控制技術(shù)現(xiàn)狀隨著城市機(jī)動(dòng)車(chē)量的不斷增加,許多大城市出現(xiàn)了交通超負(fù)荷運(yùn)行的情況,因此,自80年代后期,這些城市紛紛修建城市高速道路,在高速道路建設(shè)完成的初期,它們也曾有效地改善了交通狀況。然而,隨著交通量的快速增長(zhǎng)和缺乏對(duì)高澎路的系統(tǒng)研究和控制,高速道路沒(méi)有充分發(fā)揮出預(yù)期的作用。而城市高速道路在構(gòu)造上的特點(diǎn),也決定了城市高速道路的交通狀況必然受高速道路與普通道路藕合處交通狀況的制約。所以,如何采用合適的控制方法,最大限度利用好耗費(fèi)巨資修建的城市高速道路,緩解主干道車(chē)流量繁忙的交通擁堵?tīng)顩r,越來(lái)越成為交通運(yùn)輸管理和城市規(guī)劃部門(mén)待解決的主要問(wèn)題。 1.3單片機(jī)概述計(jì)算機(jī)系統(tǒng)的發(fā)展已明顯地朝三個(gè)方向發(fā)展;這三個(gè)方向就是:巨型化,單片化,網(wǎng)絡(luò)化。以解決復(fù)雜系統(tǒng)計(jì)算和高速數(shù)據(jù)處理的仍然是巨型機(jī)在起作用,故而,巨型機(jī)在目前在朝高速及處理能力的方向努力。單片機(jī)在出現(xiàn)時(shí),Intel公司就給其單片機(jī)取名為嵌入式微控制器(embedded microcontroller)。單片機(jī)的最明顯的優(yōu)勢(shì),就是可以嵌入到各種儀器、設(shè)備中。這一點(diǎn)是巨型機(jī)和網(wǎng)絡(luò)不可能做到的 單片機(jī)在目前的發(fā)展形勢(shì)下,表現(xiàn)出幾大趨勢(shì): (1)可靠性及應(yīng)用越來(lái)越水平高和互聯(lián)網(wǎng)連接已是一種明顯的走向。 (2)所集成的部件越來(lái)越多;NS(美國(guó)國(guó)家半導(dǎo)體)公司的單片機(jī)已把語(yǔ)音、圖象部件也集成到單片機(jī)中,也就是說(shuō),單片機(jī)的意義只是在于單片集成電路,而不在于其功能了;如果從功能上講它可以講是萬(wàn)用機(jī)。原因是其內(nèi)部已集成上各種應(yīng)用電路。 (3)功耗越來(lái)越低和模擬電路結(jié)合越來(lái)越多。 隨著半導(dǎo)體工藝技術(shù)的發(fā)展及系統(tǒng)設(shè)計(jì)水平的提高,單片機(jī)還會(huì)不斷產(chǎn)生新的變化和進(jìn)步,最終人們可能發(fā)現(xiàn):?jiǎn)纹瑱C(jī)與微機(jī)系統(tǒng)之間的距離越來(lái)越小,甚至難以辨認(rèn)。 1.4方案的設(shè)計(jì)與論證本設(shè)計(jì)以單片機(jī)為核心,以LED數(shù)碼管作為倒計(jì)時(shí)指示,根據(jù)設(shè)計(jì)的要求我們考慮了各功能模塊的幾種設(shè)計(jì)方案,以求最佳方案,實(shí)現(xiàn)實(shí)時(shí)顯示系統(tǒng)各種狀態(tài),系統(tǒng)還增設(shè)了根據(jù)交通擁擠情況可分別設(shè)置主干道和次干道的通行時(shí)間,以提高效率,緩減交通擁擠。系統(tǒng)總體設(shè)計(jì)框圖如圖所示。 交通燈控制的框圖如下圖所示,主要有控制電路、按鍵電路、晶振電路、復(fù)位電路、顯示電路、電源電路等電路組成。
1.4.1電源提供方案為使模塊穩(wěn)定工作,須有可靠電源。本次設(shè)計(jì)考慮了兩種電源方案: 方案一:采用獨(dú)立的穩(wěn)壓電源。此方案的優(yōu)點(diǎn)是穩(wěn)定可靠,且有各種成熟電路可供選用;缺點(diǎn)是各模塊都采用獨(dú)立電源,會(huì)使系統(tǒng)復(fù)雜,且可能影響電路電平。 方案二:采用單片機(jī)控制模塊提供電源。該方案的優(yōu)點(diǎn)是系統(tǒng)簡(jiǎn)明扼要,節(jié)約成本;缺點(diǎn)是輸出功率不高。 綜上所述,選擇第二種方案。 1.4.2顯示界面方案該系統(tǒng)要求完成倒計(jì)時(shí)功能。基于上述原因,本次設(shè)計(jì)考慮了兩種方案: 方案一:完全采用點(diǎn)陣式LED顯示。這種方案功能強(qiáng)大,可方便的顯示各種英文字符,漢字,圖形等,但實(shí)現(xiàn)復(fù)雜,且須完成大量的軟件工作。 方案二:完全采用數(shù)碼管顯示。這種方案優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,可以完成倒計(jì)時(shí)功能。缺點(diǎn)是功能較少,只能顯示有限的符號(hào)和數(shù)碼字符。根據(jù)本設(shè)計(jì)的要求,方案二已經(jīng)滿足了要求,所以本次設(shè)計(jì)采用方案二以實(shí)現(xiàn)系統(tǒng)的顯示功能。 1.4.3輸入方案 這里同樣討論了兩種方案: 方案一:采用8155擴(kuò)展I/O口、鍵盤(pán)及顯示等。該方案的優(yōu)點(diǎn)是使用靈活可編程,并且有RAM及計(jì)數(shù)器。若用該方案,可提供較多I/O口,但操作起來(lái)稍顯復(fù)雜。 方案二:直接在I/O口線上接上按鍵開(kāi)關(guān)。因?yàn)樵O(shè)計(jì)時(shí)精簡(jiǎn)和優(yōu)化了電路,所以剩余的端口資源還比較多。 由于該系統(tǒng)是對(duì)交通燈及數(shù)碼管的控制,只需用單片機(jī)本身的I/O口就可實(shí)現(xiàn),且本身的計(jì)數(shù)器及RAM已經(jīng)夠用,故選擇方案二。 第二章 系統(tǒng)硬件設(shè)計(jì)硬件設(shè)計(jì)是整個(gè)系統(tǒng)的基礎(chǔ),要考慮的方方面面很多,除了實(shí)現(xiàn)交通燈基本功能以外,主要還要考慮如下幾個(gè)因素:①系統(tǒng)穩(wěn)定度;②器件的通用性或易選購(gòu)性;③軟件編程的易實(shí)現(xiàn)性;④系統(tǒng)其它功能及性能指標(biāo);因此硬件設(shè)計(jì)至關(guān)重要。現(xiàn)從各功能模塊的實(shí)現(xiàn)逐個(gè)進(jìn)行分析探討。 2.1總體設(shè)計(jì)本設(shè)計(jì)以單片機(jī)為控制核心,采用模塊化設(shè)計(jì),共分以下幾個(gè)功能模塊:?jiǎn)纹瑱C(jī)控制系統(tǒng)、鍵盤(pán)及狀態(tài)顯示、倒計(jì)時(shí)模塊等。 單片機(jī)作為整個(gè)硬件系統(tǒng)的核心,它既是協(xié)調(diào)整機(jī)工作的控制器,又是數(shù)據(jù)處理器。它由單片機(jī)振蕩電路、復(fù)位電路等組成。 系統(tǒng)采用雙數(shù)碼管倒計(jì)時(shí)計(jì)數(shù)功能,最大顯示數(shù)字99。 友好的人機(jī)界面、靈活的控制方式、優(yōu)化的物理結(jié)構(gòu)是本設(shè)計(jì)的亮點(diǎn)。
2.4單片機(jī)外圍電路設(shè)計(jì)
2.4.1復(fù)位電路設(shè)計(jì)MCS-51的復(fù)位輸入引腳RST為MCS-51提供了初始化的手段,可以使程序從指定處開(kāi)始執(zhí)行,在MCS-51的時(shí)鐘電路工作后,只要RST引腳上出現(xiàn)超過(guò)兩個(gè)機(jī)器周期以上的高電平時(shí),即可產(chǎn)生復(fù)位的操作,只要RST保持高電平,則MCS-51循環(huán)復(fù)位,只有單RET由高電平變成低電平以后,MCS-51才從0000H地址開(kāi)始執(zhí)行程序,本系統(tǒng)采用按鍵復(fù)位方式的復(fù)位電路。
2.2.2外部晶振時(shí)鐘電路設(shè)計(jì)MCS-51的時(shí)鐘可以由兩種方式產(chǎn)生,一種是內(nèi)部方式,利用芯片內(nèi)部的振蕩電路;另外一種為外部方式,本論文根據(jù)實(shí)際需要和簡(jiǎn)便,采用內(nèi)部振蕩方式,MCS-51內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端,這個(gè)放大器與作為反饋元件的片外晶體或陶瓷諧振器一起構(gòu)成了一個(gè)自激振蕩器。 MCS-51雖然有內(nèi)部振蕩電路,但要形成時(shí)鐘,必須外接元件,所以實(shí)際構(gòu)成的振蕩時(shí)鐘電路,外接晶振以及電容C1和C2構(gòu)成了并聯(lián)諧振電路接在放大器的反饋回路中,對(duì)接電容的值雖然沒(méi)有嚴(yán)格的要求,但電容的大小會(huì)影響振蕩頻率的高低,振蕩器的穩(wěn)定性,起振的快速性和溫度的穩(wěn)定性。晶振的頻率可在1.2MHZ~12MHZ之間任選,電容C1和C2的典型值在20pf~100pf之間選擇,由于本系統(tǒng)用到定時(shí)器,為了方便計(jì)算,采用了12MHZ的晶振,采用電容選擇30pf。 2.2.3 顯示模塊電路設(shè)計(jì)該模塊由共陽(yáng)LED數(shù)碼管組成,利用數(shù)碼管的動(dòng)態(tài)掃描原理,由三極管進(jìn)行鎖存,當(dāng)控制數(shù)碼管的IO口P20和P21為低電平時(shí)(及三極管基極為低電平),則三極管導(dǎo)通,VCC通三極管給數(shù)碼管供電,則數(shù)碼管被點(diǎn)亮,利用數(shù)碼管點(diǎn)亮的余輝和人眼的視覺(jué)暫留原理,則看起來(lái)數(shù)碼管是同時(shí)被點(diǎn)亮的。
從設(shè)計(jì)完成的任務(wù)與要求來(lái)看,顯示通行時(shí)間必須用二位數(shù)碼管,從節(jié)省硬件資源的角度考慮,可采用掃描的方式來(lái)處理,對(duì)于7段數(shù)碼管,占用7個(gè)單片機(jī)的I/O口,另外設(shè)置2個(gè)電子開(kāi)關(guān)對(duì)2位顯示進(jìn)行配合,占用2個(gè)I/O端口,十字路口共需4組紅綠燈,加上轉(zhuǎn)換黃燈,一共是12只燈,須用12個(gè)端口進(jìn)行控制,加上兩個(gè)方向的緊急通行按鈕,占2個(gè)I/O端口和一個(gè)蜂鳴器端口,因此實(shí)際占用的單片機(jī)I/O口為24個(gè),為此,我們可以選用51系列單片機(jī)中的ATAT89S52來(lái)作為中央處理器。這款單片機(jī)的I/O口作為輸出時(shí),具有較大的吸收電流能力,因此我們可以選用共陽(yáng)型數(shù)碼管,這樣由單片機(jī)的I/O口就可以直接驅(qū)動(dòng),能簡(jiǎn)化硬件電路的設(shè)計(jì)。 第三章 交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)交通信號(hào)燈由紅燈、綠燈、黃燈組成。紅燈表示禁止通行,綠燈表示準(zhǔn)許通行,黃燈表示警示。交通信號(hào)燈分為機(jī)動(dòng)車(chē)信號(hào)燈、非機(jī)動(dòng)車(chē)信號(hào)燈、人行橫道信號(hào)燈、車(chē)道信號(hào)燈、方向指示信號(hào)燈、閃光警告信號(hào)燈、道路與鐵路平面交叉道口信號(hào)燈。交通信號(hào)燈用于道路平面交叉路口,通過(guò)對(duì)車(chē)輛、行人發(fā)出行進(jìn)或停止的指令,使各同時(shí)到達(dá)的人、車(chē)交通流盡可能減少相互干擾,從而提高路口的通行能力,保障路口暢通和安全。因此必須合理的設(shè)計(jì)路口主干道的系統(tǒng)。 3.1 十字路口交通信號(hào)燈具體的控制要求 (1) 交通信號(hào)燈分布于東南西北,每個(gè)路口均有三個(gè)。南北方向綠燈和東西方向的綠燈不能同時(shí)亮;如果同時(shí)亮,則應(yīng)自動(dòng)立即關(guān)閉信號(hào)燈系統(tǒng),并立即發(fā)出報(bào)警信號(hào)。系統(tǒng)工作后,首先南北紅燈亮并維持30s;與此同時(shí),東西綠燈亮,并維持25s時(shí)間,到25s時(shí),東西綠燈熄滅。在東西綠燈熄滅時(shí),東西黃燈亮并維持5s,然后東西黃燈熄滅,東西紅燈亮,同時(shí)南北紅燈熄滅,南北綠燈亮;東西紅燈亮并維持30s;與此同時(shí),南北綠燈亮并維持15s;然后,南北綠燈熄滅南北綠燈熄滅時(shí),南北黃燈亮維持5s后熄滅;同時(shí)南北紅燈亮,東西綠燈亮。至此,結(jié)束一個(gè)工作循環(huán),如下交通信號(hào)燈變化表:
(2)在交通信號(hào)燈亮和閃爍的同時(shí),路口設(shè)有兩位七段碼的顯示器倒數(shù)計(jì)時(shí),讓車(chē)輛行人能夠清楚地知道再過(guò)多久信號(hào)燈就會(huì)發(fā)生變化。以便于司機(jī)和行人能夠在有限的時(shí)間內(nèi)準(zhǔn)確的通行。
3.2十字路口交通信號(hào)燈示意圖 交通信號(hào)燈共有12盞,每個(gè)路口各有紅,黃,綠三盞,具體分布如下圖所示:
第四章 交通信號(hào)燈控制系統(tǒng)程序編制4.1 軟件設(shè)計(jì)應(yīng)用環(huán)境本設(shè)計(jì)軟件的設(shè)計(jì)是在Keil C51的環(huán)境下編譯的。Keil C51是美國(guó)Keil Software公司出品的51系列兼容單片機(jī)C語(yǔ)言軟件開(kāi)發(fā)系統(tǒng),軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的集成開(kāi)發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊,容易理解。在開(kāi)發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語(yǔ)言的優(yōu)勢(shì)。C語(yǔ)言有以下特點(diǎn): 1、語(yǔ)言簡(jiǎn)潔、緊湊、使用方便、靈活。C語(yǔ)言一共只有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,程序書(shū)寫(xiě)自由,主要用小寫(xiě)字母表示,壓縮了一切不必要的成分。 2、運(yùn)算符豐富。C的運(yùn)算符包含的范圍很廣泛,共有34種運(yùn)算符,使得C的運(yùn)算類(lèi)型極其豐富,表達(dá)式類(lèi)型多樣化,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其他高級(jí)語(yǔ)言中難以實(shí)現(xiàn)的運(yùn)算。 3、數(shù)據(jù)結(jié)構(gòu)豐富,具有現(xiàn)代化語(yǔ)言的各種數(shù)據(jù)結(jié)構(gòu),能用來(lái)實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的運(yùn)算。 4、具有結(jié)構(gòu)化的控制語(yǔ)句,用函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。 5、語(yǔ)法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。 6、C語(yǔ)言能進(jìn)行位操作,能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,可以直接對(duì)硬件進(jìn)行操作。因此,C既具有高級(jí)語(yǔ)言的功能,又具有低級(jí)語(yǔ)言的許多功能,可用來(lái)寫(xiě)系統(tǒng)軟件。C語(yǔ)言的這種雙重性,使它既是成功的系統(tǒng)描述語(yǔ)言,又是通用的程序設(shè)計(jì)語(yǔ)言。 7、生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。 8、用C語(yǔ)言寫(xiě)的程序可移植性好。基本上不用修改就能用于各種型號(hào)的計(jì)算機(jī)和各種操作系統(tǒng)。 對(duì)操作系統(tǒng)和系統(tǒng)實(shí)用程序以及需要對(duì)硬件進(jìn)行操作的場(chǎng)合,用C語(yǔ)言明顯地優(yōu)勢(shì)于其他高級(jí)語(yǔ)言,有的大型應(yīng)用軟件也用C語(yǔ)言來(lái)編寫(xiě)。 4.2 軟件設(shè)計(jì)流程軟件總體設(shè)計(jì)主要完成各部分的軟件控制和協(xié)調(diào)。本系統(tǒng)主程序模塊主要完成的工作是對(duì)系統(tǒng)的初始化,發(fā)送顯示數(shù)據(jù),同時(shí)對(duì)鍵盤(pán)進(jìn)行掃描,等待外部中斷,以及根據(jù)所需要的功能進(jìn)行相應(yīng)的操作。 交通燈根據(jù)其顯示情況可以分為四個(gè)狀態(tài),可以通過(guò)定時(shí)來(lái)控制每個(gè)狀態(tài)的時(shí)間;通過(guò)定時(shí)也可以向LED數(shù)碼管中每隔1秒送一個(gè)數(shù),顯示該狀態(tài)剩余的時(shí)間。其流程圖如圖所示。
圖4-1 主程序框圖 4.2交通燈定時(shí)器模塊 AT89S52單片機(jī)內(nèi)部有3個(gè)定時(shí)器T0,T1和T2,本次設(shè)計(jì)中使用T0工作在方式1,即16位定時(shí)器,定時(shí)50ms,20次中斷產(chǎn)生秒信號(hào),從而控制紅綠燈的點(diǎn)亮?xí)r間。 工作方式寄存器TMOD用來(lái)設(shè)置T0、T1的工作方式。這次實(shí)習(xí)中設(shè)置TMOD=0x01,即T0工作于方式0(16位定時(shí)器)。 內(nèi)部定時(shí)器/計(jì)數(shù)器用作定時(shí)器時(shí),是對(duì)機(jī)器周期計(jì)數(shù),每個(gè)機(jī)器周期的長(zhǎng)度是12個(gè)振蕩周期。定時(shí)常數(shù)的設(shè)置可用一下方式計(jì)算: 機(jī)器周期=12/12MHz=1us (65536-定時(shí)常數(shù))*1.0us=50ms 所以定時(shí)常數(shù)是50000。
第五章 結(jié)論本論文介紹了一種基于AT89S52單片機(jī)的交通燈的設(shè)計(jì)方法,本論文完成了系統(tǒng)的硬件設(shè)計(jì)與制作,詳細(xì)介紹了系統(tǒng)硬件設(shè)計(jì)的過(guò)程,并結(jié)合軟件系統(tǒng)完成了整個(gè)系統(tǒng)的軟、硬件聯(lián)調(diào),系統(tǒng)工作良好,實(shí)現(xiàn)了基本功能。 通過(guò)本次設(shè)計(jì),鞏固了我學(xué)習(xí)過(guò)的專(zhuān)業(yè)知識(shí),也使我把理論與實(shí)踐從真正意義上相結(jié)合了起來(lái),鍛煉了借助互聯(lián)網(wǎng)絡(luò)搜集、查閱相關(guān)文獻(xiàn)資料和組織材料的綜合能力,從中我也認(rèn)識(shí)到自己的不足之處,我會(huì)在日后的學(xué)習(xí)中加以改進(jìn)與提高。 經(jīng)過(guò)這次畢業(yè)設(shè)計(jì),我在各方面都有很大的提高。學(xué)到了很多不曾學(xué)過(guò)的東西,也使我學(xué)會(huì)了更好地利用一些資源和工具如圖書(shū)館及一些軟件查閱資料。在設(shè)計(jì)過(guò)程中也遇到很多的困難,遇到一些原理性不懂的時(shí)候就要去有針對(duì)性地查找資料或者請(qǐng)教知道老師和其他同學(xué),然后加以吸收利用,提高了自己的應(yīng)用能力,擴(kuò)充了自己的知識(shí)儲(chǔ)備,同時(shí)提高了動(dòng)手能力。
第六章 謝辭值此論文完成之際,謹(jǐn)向我的導(dǎo)師老師表示衷心的感謝!從選題,設(shè)計(jì)以及后來(lái)的調(diào)試都得到了老師的幫助。盡管老師很忙,但是在我編寫(xiě)上位機(jī)軟件期間,每天多次在實(shí)驗(yàn)室進(jìn)行指導(dǎo),詢(xún)問(wèn)進(jìn)度情況,督促我的工作,盡心盡力,甚至周末,也不曾休息,通過(guò)電話等方式詢(xún)問(wèn)進(jìn)展情況。我能順利完成,與老師的幫助密不可分。在我對(duì)實(shí)驗(yàn)板功能進(jìn)行調(diào)試的時(shí)候,老師更給了我們不少建議與意見(jiàn),讓我們少走了不少的彎路。
附件一:總體原理圖
單片機(jī)源程序如下:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //宏定義"uchar"代替"unsigned char"。
- #define uint unsigned int //宏定義"uint"用來(lái)定義無(wú)符號(hào)整型數(shù)。
- ////數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9
- uchar smg_du[]={0x6f,0x03,0x3d,0x4b,0x53,0x75,0x7e,0x28,0x7f,0x7b,
- // A B C D E F 不顯示
- 0x77,0x5e,0x4a,0x05,0x0a,0x2a,0xff}; //斷碼
- uchar dis_smg[8] = {0};
- uchar smg_i = 4; //顯示數(shù)碼管的個(gè)位數(shù)
- //數(shù)碼管位選定義
- sbit smg_we1 = P2^1; //數(shù)碼管位選定義
- sbit smg_we2 = P2^0;
- sbit smg_we3 = P3^6;
- sbit smg_we4 = P3^7;
- uint dx_zong = 0;
- uint nb_zong = 0;
- int dx_s = 0,nb_s = 0; //東西 南北 倒計(jì)時(shí)變量
- sbit dx_red = P2^7; //東西紅燈
- sbit dx_yellow = P2^6; //東西黃燈
- sbit dx_green = P2^5; //東西綠燈
- sbit nb_red = P2^4; //南北紅燈
- sbit nb_yellow = P2^3; //南北黃燈
- sbit nb_green = P2^2; //南北綠燈
- sbit nb_green_ll = P1^6; //南北左轉(zhuǎn)綠燈
- sbit dx_green_ll = P1^7; //東西左轉(zhuǎn)綠燈
- sbit dx_h_red = P3^5; //東西人行橫道紅燈
- sbit dx_h_green = P3^4; //東西人行橫道紅燈
- sbit nb_h_red = P3^2; //南北人行橫道紅燈
- sbit nb_h_green = P3^3; //南北人行橫道紅燈
- uint nb_che_value;
- uint dx_che_value;
- uchar flag_jtd_mode; //交通燈的模式 根據(jù)時(shí)間
- bit flag_1s = 0;
- bit flag_500ms;
- bit flag_dx_nb = 0; //東西南北模式
- uchar flag_5m_value;
- uchar i;
- uchar dx_time = 30,nb_time = 20; //東西、南北的時(shí)間
- uchar nb_time_ll = 20,dx_time_ll = 20; //東西、南北左轉(zhuǎn)的時(shí)間
- uchar yellow_time = 5;
- uchar flag_jdgz ; //交通管制
- uchar nb_ll,dx_ll; //南北 東西加的時(shí)間
- /***********************數(shù)碼位選函數(shù)*****************************/
- void smg_we_switch(uchar i)
- {
- switch(i)
- {
- case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
- case 1: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
- case 2: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
- case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
- }
- }
- /********************************************************************
- * 名稱(chēng) : delay_1ms()
- * 功能 : 延時(shí)1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- /********************************************************************
- * 名稱(chēng) : display()
- * 功能 : 數(shù)碼管顯示
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void display()
- {
- uchar i;
- for(i=0;i<smg_i;i++)
- {
- smg_we_switch(i); //位選
- P0 = dis_smg[i]; //段選
- }
- }
- /*********************定時(shí)器0、定時(shí)器1初始化******************/
- void time0_init()
- {
- EA = 1; //開(kāi)總中斷
- TMOD = 0X11; //定時(shí)器0、定時(shí)器1工作方式1
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- TR0 = 1; //允許定時(shí)器0定時(shí)
- }
- uchar flag_csf=1;
- uchar f_value=0;
-
- /*********************交通燈處理函數(shù)*********************************/
- void jiaotongdeng_dis()
- {
- /***********************南北時(shí)間*********************************/
- if(f_value < nb_ll + nb_time) //南北綠燈時(shí)間
- {
- if(flag_csf == 1) //意思是只初始化一次
- {
- flag_csf = 2;
- dx_zong = dx_s = nb_ll + nb_time_ll + yellow_time; //是顯示南北的總時(shí)間
- nb_s = nb_ll + nb_time; //給南北倒計(jì)時(shí)顯示初始化值
- }
- dx_red = 0;
- dx_green = 1;//滅
- dx_yellow = 1;//滅
- nb_red = 1;
- nb_green = 0;
- nb_yellow = 1; //滅
-
- nb_green_ll = 1;
- dx_green_ll = 1;
- flag_5m_value = 0;
- }
- else if(f_value < nb_ll + nb_time + yellow_time) //當(dāng)小于5秒時(shí) 黃燈要閃了
- {
- if(flag_csf == 2) //意思是只初始化一次
- {
- flag_csf = 3;
- dx_s = nb_time_ll + 2*yellow_time; //是顯示南北的總時(shí)間
- nb_s = yellow_time; //給南北倒計(jì)時(shí)顯示初始化值
- }
- 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;
- }
- dx_h_green = 1;
- dx_h_red = 0;
- nb_h_green = 0;
- nb_h_red = 1;
- }
- else if(f_value < nb_ll + nb_time + nb_time_ll) //當(dāng)左轉(zhuǎn)的綠燈閃
- {
- if(flag_csf == 3) //意思是只初始化一次
- {
- flag_csf = 4;
- dx_s = nb_time_ll + yellow_time; //是顯示南北的總時(shí)間
- nb_s = nb_time_ll; //給南北倒計(jì)時(shí)顯示初始化值
- }
- dx_red = 0;
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- dx_h_green = 1;
- dx_h_red = 0;
- nb_h_green = 1;
- }
- else if(f_value < nb_ll + nb_time + nb_time_ll) //當(dāng)小于5秒時(shí) 黃燈要閃了
- {
- if(flag_csf == 4) //意思是只初始化一次
- {
- flag_csf = 1;
- dx_s = nb_s = yellow_time; //給南北倒計(jì)時(shí)顯示初始化值
- }
- dx_red = 0;
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- if(flag_500ms == 0) //黃燈閃爍
- {
- nb_yellow = 0;
- }
- else
- {
- nb_yellow = 1; //滅
- }
- dx_h_green = 1; //滅
- nb_h_green = 1; //滅
- nb_h_red = 0;
-
- nb_green_ll = 1; //滅
- dx_green_ll = 1; //滅
- }
- /***********************東西時(shí)間*********************************/
- if(flag_dx_nb == 1)
- {
- if(f_value < dx_ll + dx_time) //東西綠燈時(shí)間
- {
- if(flag_csf == 1) //意思是只初始化一次
- {
- flag_csf = 2;
- nb_zong = nb_s = dx_ll + dx_time_ll + 2*yellow_time; //是顯示南北的總時(shí)間
- dx_s = dx_ll + dx_time; //給南北倒計(jì)時(shí)顯示初始化值
- }
- dx_red = 1; //滅
- dx_green = 0;
- dx_yellow = 1; //滅
- nb_red = 0;
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- dx_h_green = 0;
- dx_h_red = 1; //滅
- nb_h_green = 1; //滅
- nb_h_red = 0;
- nb_green_ll = 1; //滅
- dx_green_ll = 1; //滅
- flag_5m_value = 0;
- }
- else if(f_value < dx_ll + dx_time+ yellow_time) //當(dāng)小于5秒時(shí) 黃燈要閃了
- {
- if(flag_csf == 2) //意思是只初始化一次
- {
- flag_csf = 3;
- nb_s = dx_time_ll + 2*yellow_time; //是顯示南北的總時(shí)間
- dx_s = yellow_time; //給南北倒計(jì)時(shí)顯示初始化值
- // while(1);
- }
- 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; //滅
- }
- dx_h_green = 0;
- dx_h_red = 1; //滅
- nb_h_green = 1; //滅
- nb_h_red = 0;
- }
- else if(f_value < dx_ll + dx_time+dx_time_ll+ yellow_time) //東西左轉(zhuǎn)
- {
- if(flag_csf == 3) //意思是只初始化一次
- {
- flag_csf = 4;
- nb_s = dx_time_ll + yellow_time; //是顯示南北的總時(shí)間
- dx_s = dx_time_ll; //給南北倒計(jì)時(shí)顯示初始化值
- }
- dx_red = 1; //滅
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 0;
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- dx_h_green = 1; //滅
- nb_h_green = 1; //滅
- nb_h_red = 0;
- nb_green_ll = 1;
- dx_green_ll = 0;
- }
- else if(f_value < dx_ll + dx_time+dx_time_ll+ yellow_time*2) //當(dāng)小于5秒時(shí) 黃燈要閃了
- {
- if(flag_csf == 4) //意思是只初始化一次
- {
- flag_csf = 1;
- nb_s = yellow_time; //是顯示南北的總時(shí)間
- dx_s = yellow_time; //給南北倒計(jì)時(shí)顯示初始化值
- }
- 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; //滅
- }
- dx_h_green = 1; //滅
- dx_h_red = 0;
- nb_h_green = 1; //滅
- nb_h_red = 0;
- nb_green_ll = 1; //滅
- dx_green_ll = 1; //滅
- }
- }
- if(flag_1s == 1)
- {
- flag_1s = 0;
- dx_che_value = 0;
- dx_s --;
- nb_s --;
- f_value ++;
- if(flag_dx_nb == 0) //南北時(shí)間
- {
- if(f_value >= dx_zong)
- {
- f_value = 0;
- flag_dx_nb = 1; //東西綠燈模式
- }
- }
- if(flag_dx_nb == 1) //東西時(shí)間
- {
- if(f_value >= nb_zong)
- {
- f_value = 0;
- flag_dx_nb = 0; //南北綠燈模式
- }
- }
- }
- dis_smg[0] = smg_du[dx_s % 10] ; //顯示
- dis_smg[1] = smg_du[dx_s / 10] ;
- dis_smg[2] = smg_du[nb_s % 10] ;
- dis_smg[3] = smg_du[nb_s / 10] ;
- }
- /********************獨(dú)立按鍵程序*****************/
- uchar key_can; //按鍵值
- void key() //獨(dú)立按鍵程序
- {
- static uchar key_new;
- key_can = 20; //按鍵值還原
- P1 |= 0x0f;
- if((P1 & 0x0f) != 0x0f) //按鍵按下
- {
- delay_1ms(1); //按鍵消抖動(dòng)
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- { //確認(rèn)是按鍵按下
- key_new = 0;
- switch(P1 & 0x0f)
- {
- case 0x0e: key_can = 4; break; //得到按鍵值
- case 0x0d: key_can = 3; break; //得到按鍵值
- case 0x0b: key_can = 2; break; //得到按鍵值
- case 0x07: key_can = 1; break; //得到按鍵值
- }
- }
- }
- else
- key_new = 1;
- }
- uchar menu_1,flag_s;
- /********************設(shè)置函數(shù)*****************/
- void key_with()
- {
- if(key_can == 4) //交通管制按鍵
- {
- flag_jdgz ++;
- if(flag_jdgz > 6)
- {
- flag_jdgz = 0;
- }
- if(flag_jdgz == 1) // 全部亮紅燈
- {
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- nb_green_ll = 1; //滅
- dx_green_ll = 1; //滅
- }
- if(flag_jdgz == 2) // 南北黃燈 東西黃燈
- {
- dx_red = 1; //滅
- dx_green = 1; //滅
- dx_yellow = 0; //亮
- nb_red = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 0; //亮
-
- nb_green_ll = 1; //滅
- dx_green_ll = 1; //滅
- }
- if(flag_jdgz == 3) // 東西紅燈 南北綠燈
- {
- dx_red = 0; //亮
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- nb_green = 0; //亮
- nb_yellow = 1; //滅
-
- dx_h_green = 1; //滅
- dx_h_red = 1; //亮
- nb_h_green = 0; //亮
- nb_h_red = 1; //滅
- nb_green_ll = 1; //滅
- dx_green_ll = 1; //滅
- }
- if(flag_jdgz == 4) // 南北紅燈 東西綠燈
- {
- dx_red = 1; //滅
- dx_green = 0; //亮
- dx_yellow = 1; //滅
- nb_red = 0; //亮
- dx_h_green = 0; //亮
- dx_h_red = 1; //滅
- nb_h_green = 1; //滅
- nb_h_red = 0; //亮
- }
- if(flag_jdgz == 5) // 南北左轉(zhuǎn)綠燈
- {
- dx_red = 0; //亮
- dx_green = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- dx_h_green = 1; //滅
- dx_h_red = 0; //亮
- nb_h_green = 1; //滅
- nb_h_red = 0; //亮
- }
- if(flag_jdgz == 6) // 南北紅燈 東西左轉(zhuǎn)綠燈
- {
- dx_red = 0; //亮
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_yellow = 1; //滅
- dx_h_green = 1; //滅
- dx_h_red = 0; //亮
- nb_h_green = 1; //滅
- nb_h_red = 0; //亮
- nb_green_ll = 1; //滅
- dx_green_ll = 0;
- }
- }
- if(key_can == 1) //設(shè)置鍵
- {
- menu_1 ++;
- if(menu_1 > 5)
- {
- menu_1 = 0;
- }
- }
- if(menu_1 == 1) //設(shè)置東西的時(shí)間
- {
- if(key_can == 2)
- {
- dx_time ++ ; //加1
- if(dx_time > 99)
- dx_time = 99;
- }
- if(key_can == 3)
- {
- dx_time -- ; //減1
- if(dx_time <= 5)
- dx_time = 5;
- }
- dis_smg[0] = smg_du[dx_time % 10] ; //顯示東西設(shè)置的時(shí)候
- dis_smg[1] = smg_du[dx_time / 10] ;
- }
- if(menu_1 == 2) //設(shè)置南北的時(shí)間
- {
- if(key_can == 2)
- {
- nb_time ++ ; //加1
- if(nb_time > 99)
- nb_time = 99;
- }
- if(key_can == 3)
- {
- nb_time -- ; //減1
- if(nb_time <= 5)
- nb_time = 5;
- }
- dis_smg[2] = smg_du[nb_time % 10] ; //顯示東西設(shè)置的時(shí)候
- dis_smg[3] = smg_du[nb_time / 10] ;
- }
- if(menu_1 == 3) //設(shè)置黃燈的時(shí)間
- {
- if(key_can == 2)
- {
- yellow_time ++ ; //加1
- if(yellow_time > 99)
- yellow_time = 99;
- }
- if(key_can == 3)
- {
- yellow_time -- ; //減1
- if(yellow_time <= 1)
- yellow_time = 1;
- }
- dis_smg[0] = smg_du[yellow_time % 10] ; //顯示黃燈時(shí)間
- dis_smg[1] = smg_du[yellow_time / 10] ;
- dis_smg[2] = smg_du[yellow_time % 10] ; //顯示黃燈時(shí)間
- dis_smg[3] = smg_du[yellow_time / 10] ;
- }
- if(menu_1 == 4) //設(shè)置東西左邊的時(shí)間
- {
- if(key_can == 2)
- {
- dx_time_ll ++ ; //加1
- if(dx_time_ll > 99)
- dx_time_ll = 99;
- }
- if(key_can == 3)
- {
- dx_time_ll -- ; //減1
- if(dx_time_ll <= 5)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī)交通燈 4個(gè)數(shù)碼管 新 交通燈人行道 交通燈左轉(zhuǎn).rar
(739.59 KB, 下載次數(shù): 241)
2018-11-28 18:17 上傳
點(diǎn)擊文件名下載附件
|