點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖:
https://download.csdn.net/download/qq_64505944/87849986?spm=1001.2014.3001.5503
源碼獲取
主要內(nèi)容:
本項(xiàng)目中采用單片機(jī) AT89C51為中心器件來設(shè)計(jì)交通信號(hào)燈控制器, 系統(tǒng)實(shí)用性強(qiáng)、操作簡(jiǎn)單、擴(kuò)展性強(qiáng)。本設(shè)計(jì)系統(tǒng)就是由單片機(jī)最小系統(tǒng)、交通燈狀態(tài)顯示系統(tǒng)、 LED數(shù)碼顯示系統(tǒng)、復(fù)位電路和按鍵操作電路等幾大部分組成。系統(tǒng)除具有基本的交通信號(hào)燈功能外,還具有倒計(jì)時(shí)和緊急情況處理功能,較好的模擬實(shí)現(xiàn)了十字路口可能出現(xiàn)的狀況。軟件上采用 C 語言編程,主要編寫了主程序, LED數(shù)碼管顯示程序,中斷程序,延時(shí)程序等。經(jīng)過整機(jī)調(diào)試,實(shí)現(xiàn)了對(duì)十字路口交通燈的模擬。
基本要求:
1、熟悉單片機(jī)交通燈的設(shè)計(jì);進(jìn)行需求分析,設(shè)計(jì)十字路口交通燈;
2、初步掌握由單片機(jī)設(shè)計(jì)的十字路口交通燈的基本方法;
3、進(jìn)行交通燈的設(shè)計(jì),分析、構(gòu)建模型、功能體現(xiàn)、詳細(xì)設(shè)計(jì)
4、交通燈需基本滿足現(xiàn)實(shí)需求,與實(shí)際相符合
主要參考資料:
[1] 李建中.單片機(jī)原理及應(yīng)用[M].西安電子科技大學(xué)出版社,2010.
[2] 周航慈.單片機(jī)應(yīng)用程序設(shè)計(jì)技術(shù)[M].北京:北京航空航大大學(xué)出版社,2005.
[3]何立民.單片機(jī)高級(jí)教程[M].北京:北京航空航天大學(xué)出版社,2001.
[4] 夏繼強(qiáng).單片機(jī)實(shí)驗(yàn)與實(shí)踐教程[M].北京:北京航空航天大學(xué)出版社,2001.
[5] 趙曉安.MCS-51單片機(jī)原理及應(yīng)用[M].天津:天津大學(xué)出版社,2001.
完 成 期 限:
指導(dǎo)教師簽名:
課程負(fù)責(zé)人簽名:
年 月 日
摘 要
交通燈安裝在各個(gè)路口上,成為疏導(dǎo)交通工具的有效手段,單片機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,特別適用于控制領(lǐng)域,故又被稱為微控制器,對(duì)基于單片機(jī)的交通燈控制系統(tǒng)進(jìn)行了設(shè)計(jì)。本次課程設(shè)計(jì)中硬件設(shè)計(jì)我們采用采用單片機(jī) 89C51,用P1口設(shè)置紅燈黃燈,綠燈的控制,用PO口控制數(shù)碼顯示管的十位數(shù)字,用P2口控制數(shù)碼顯示管的個(gè)位數(shù)字,P3口作為特殊功能鍵用途。單片機(jī)系統(tǒng)采用直流5V供電,系統(tǒng)功能為:以89C51系列單片機(jī)為控制核心,設(shè)計(jì)并制作交通控制系統(tǒng),東西南北四個(gè)方向具有直行通行指示燈。
在對(duì)系統(tǒng)分析的基礎(chǔ)上,我們采用了性能比較優(yōu)異的LED動(dòng)態(tài)循環(huán)先是方案進(jìn)行設(shè)計(jì)。設(shè)計(jì)包括硬件和軟件兩大部分。硬件部分包括單片機(jī)時(shí)鐘電路,時(shí)間顯示,交通燈顯示。時(shí)間顯示采用兩位共陰極數(shù)碼顯示管。軟件采用了模塊化的設(shè)計(jì)方法,主要分為主程序,定時(shí)中斷,中斷服務(wù)子程序,倒計(jì)時(shí)顯示子程序,交通燈模擬顯示子程序四部分。
關(guān)鍵詞:?jiǎn)纹瑱C(jī);交通燈;控制
目 錄
摘 要 1
1.概述 3
項(xiàng)目設(shè)計(jì)原理: 3
項(xiàng)目開發(fā)目的: 3
項(xiàng)目開發(fā)意義: 3
2. 可行性分析和需求分析 4
可行性研究 4
經(jīng)濟(jì)可行性 4
技術(shù)可行性 4
操作可行性 4
3 系統(tǒng)方案設(shè)計(jì) 5
3.1 設(shè)計(jì)思路 5
3.2 總體設(shè)計(jì)框圖 5
4 硬件設(shè)計(jì) 6
4.1 硬件選型 6
4.2 系統(tǒng)硬件電路原理詳圖 7
4.3 實(shí)際連線 7
4.3.1紅綠燈模擬仿真電路 7
4.3.2所用工具: 8
5 軟件設(shè)計(jì) 9
5.1 軟件功能設(shè)計(jì) 9
5.2 軟件流程設(shè)計(jì) 9
5.2.1 主流程圖 9
5.2.2 按鍵判斷 10
5.2.3 數(shù)碼管顯時(shí) 10
6 軟件調(diào)試 11
6.1 單元測(cè)試 11
6.1.1 顯示模塊測(cè)試 11
6.1.2 按鍵模塊測(cè)試 11
6.2 總體測(cè)試 11
總結(jié) 13
參考文獻(xiàn) 14
1.概述
項(xiàng)目設(shè)計(jì)原理:
實(shí)際交通燈分為東南西北四個(gè)方向以及左轉(zhuǎn)右轉(zhuǎn),本次課程設(shè)計(jì)我們涉及的是簡(jiǎn)易交通燈,不包含左轉(zhuǎn)右轉(zhuǎn),只包括東西直行和南北直行,原理較為簡(jiǎn)單??偣舶跏蓟癁榫G燈、紅燈,兩次全為黃燈的間隔時(shí)間,以及東西綠燈南北紅燈和南北紅燈東西綠燈四種狀態(tài)情況。首先是初始狀態(tài)全為紅燈;然后依次是南北綠燈亮,黃燈全亮,東西綠燈亮,黃燈全亮,然后照此循環(huán)。
項(xiàng)目開發(fā)目的:
通過單片機(jī)課程設(shè)計(jì),熟練C語言的編程方法,將理論聯(lián)系到實(shí)踐中去,提高我們的動(dòng)腦和動(dòng)手的能力。訓(xùn)練我們綜合運(yùn)用已學(xué)課程單片機(jī)的基本知識(shí),獨(dú)立進(jìn)行單片機(jī)應(yīng)用的技術(shù)可開發(fā)工作,掌握單片機(jī)程序設(shè)計(jì),調(diào)試和應(yīng)用電路設(shè)計(jì),分析及調(diào)試檢測(cè)。通過交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì),掌握定時(shí)/計(jì)數(shù)器及中斷的使用方法,和簡(jiǎn)單程序的編寫,最終提高我們的邏輯抽象能力。
項(xiàng)目開發(fā)意義:
交通控制研究的發(fā)展,主要是為解決人類交通因車輛的增多而日益擁堵帶來的問題,局限于道路建設(shè)的暫時(shí)不足和交通工具的快速增長,就要使更多的車輛安全高效的利用有限的道路資源,避免因無序和搶行等控制原因造成的不必要阻塞甚至癱瘓,另外,針對(duì)整個(gè)交通線路車輛的多少實(shí)時(shí)調(diào)整和轉(zhuǎn)移多條線路的分流也十分必要。
交通網(wǎng)絡(luò)是城市的動(dòng)脈,象征著一個(gè)城市的工業(yè)發(fā)展水平。交通關(guān)系著人們對(duì)于財(cái)產(chǎn),安全和時(shí)間相關(guān)的利益,保證交通線路的暢通安全,才能保證出行舒暢,物流準(zhǔn)時(shí)到位,甚至是生命通道的延伸。
-
可行性分析和需求分析
可行性研究
該階段通過對(duì)系統(tǒng)目標(biāo)的初步調(diào)研和分析,提出可行性方案并進(jìn)行論證。要求從系統(tǒng)總體出發(fā),對(duì)技術(shù)、經(jīng)濟(jì)、條件、商業(yè)以至國家政策、法律等多個(gè)方面進(jìn)行分析和論證,以確定建設(shè)項(xiàng)目是否可行,為正確進(jìn)行相關(guān)商業(yè)行為提供科學(xué)依據(jù)。其目的就是為了判斷本設(shè)計(jì)方案是否可以最大程度的便利人民,更容易接受以及更容易使用。主要從技術(shù)可行性、經(jīng)濟(jì)可行性和操作可行性三方面進(jìn)行分析。
經(jīng)濟(jì)可行性
開發(fā)本系統(tǒng)所需的相關(guān)資料可以通過已存在的十字路口交通燈進(jìn)行調(diào)查采集,所需的其他應(yīng)用軟件、硬件系統(tǒng)也易于獲得。因此,開發(fā)成本較低。引用使用本系統(tǒng)后,與傳統(tǒng)方式相比,具有高效率、低成本、高質(zhì)量的特點(diǎn),可以節(jié)省不少人力、物力及財(cái)力。所以,從經(jīng)濟(jì)的角度看,該系統(tǒng)可行。
技術(shù)可行性
開發(fā)工具:Keil
Proteus
系統(tǒng)環(huán)境:window 10
系統(tǒng)實(shí)現(xiàn)依靠相對(duì)熟悉的C語言,暫無技術(shù)問題
操作可行性
系統(tǒng)采用工作人員操作,界面干凈整潔,操作方便、工作人員只需對(duì)控制開關(guān)和控制開關(guān)的功能查詢了解即可,不需要掌握單片機(jī)和C語言等相關(guān)知識(shí)。
隨著計(jì)算機(jī)技術(shù)的飛速發(fā)展,計(jì)算機(jī)在企業(yè)管理的應(yīng)用和普及,利用計(jì)算機(jī)實(shí)現(xiàn)道路交通管理已成為趨勢(shì)。以十字路口交通燈為對(duì)象,對(duì)于交通管理要面對(duì)大量的車輛來往,對(duì)于路上交通安全,這就需要一個(gè)課程設(shè)計(jì)來提高管理效率。通過本系統(tǒng),可以做到交通的規(guī)范化管理、科學(xué)統(tǒng)計(jì)和安全高效處理交通擁堵等情況,從而減少事故工作方面的工作量。
每個(gè)十字路口都有較多車輛和行人,發(fā)生交通事故的可能性比較大,規(guī)范和合理的處理交通是十分有必要的,依照傳統(tǒng)方式工作量比較大。
每天出現(xiàn)的事情都是變化莫測(cè),比較多,按傳統(tǒng)方式處理繁瑣。
遇到假期,過年等節(jié)假日,人流量大,對(duì)于交通的處理壓力就很大,如果有一個(gè)這個(gè)交通燈設(shè)計(jì),信息處理可以高效,滿足人們出行以及需求
對(duì)于工作人員,可以及時(shí)對(duì)突發(fā)情況進(jìn)行緊急按鈕控制,安全性也比較高
系統(tǒng)功能分析:
紅燈時(shí)長和綠燈時(shí)長可通過按鍵設(shè)置,即按鍵列中的上面4個(gè),當(dāng)這4個(gè)按鍵有一個(gè)按下后便進(jìn)入時(shí)長設(shè)置功能,設(shè)置完成后按最下面兩個(gè)按鍵(緊急控制按鈕)任意一個(gè)便可退出該功能。
??有緊急控制功能,按下緊急控制按鈕后,便進(jìn)入該功能,保持紅燈或綠燈常亮,且關(guān)閉數(shù)碼管,當(dāng)按下時(shí)長控制按鈕即最上面的4個(gè)按鈕便可退出該功能。
3 系統(tǒng)方案設(shè)計(jì)
3.1 設(shè)計(jì)思路
為了實(shí)現(xiàn)十字路口交通燈的模擬,我們首先在網(wǎng)上收集相關(guān)資料,然后再到實(shí)際交通路口觀察紅綠燈工作情況,在然后進(jìn)行仿真軟件的仿真,最后進(jìn)行單片機(jī)實(shí)物的模擬測(cè)試。
此設(shè)計(jì)的時(shí)間控制用AT89C51的定時(shí)器進(jìn)行,設(shè)定定時(shí)器初值為46080,(由于晶振為11.0592,故所記次數(shù)應(yīng)為46080,計(jì)時(shí)器每隔50000微秒發(fā)起一次中斷),記錄20次中斷標(biāo)志為1s,同時(shí)用ⅠO口的電平轉(zhuǎn)換來檢測(cè)按鍵,來判斷相應(yīng)的功能。用數(shù)碼管顯示時(shí)刻相應(yīng)的時(shí)間。
3.2 總體設(shè)計(jì)框圖開始執(zhí)行
檢查按鍵情況
處理按鍵程序
定時(shí)器
是否啟動(dòng)是
數(shù)碼管顯示程序啟動(dòng)
圖3-1 總體設(shè)計(jì)圖
4 硬件設(shè)計(jì)
4.1 硬件選型
單片機(jī)特點(diǎn):
(1)高集成度,體積小,高可靠性―單片機(jī)將各功能部件集成在一塊晶體芯片上,集成度很高,體積自然也是最小的。芯片本身是按工業(yè)測(cè)控環(huán)境要求設(shè)計(jì)的,內(nèi)部布線很短,其抗工業(yè)噪音性能優(yōu)于一般通用的CPU。單片機(jī)程序指令,常數(shù)及表格等固化在ROM中不易破壞,許多信號(hào)通道均在一個(gè)芯片內(nèi),故可靠性高。
(2)控制功能強(qiáng)為了滿足對(duì)對(duì)象的控制要求,單片機(jī)的指令系統(tǒng)均有極豐富的條件:分支轉(zhuǎn)移能力,I/0口的邏輯操作及位處理能力,非常適用于專門的控制功能。
(3)低電壓,低功耗,便于生產(chǎn)便攜式產(chǎn)品為了滿足廣泛使用于便攜式系統(tǒng),許多單片機(jī)內(nèi)的工作電壓僅為1.8V~3.6V,而工作電流僅為數(shù)百微安。
(4)易擴(kuò)展片內(nèi)具有計(jì)算機(jī)正常運(yùn)行所必需的部件。芯片外部有許多供擴(kuò)展用的三總線及并行、串行輸入/輸出管腳,很容易構(gòu)成各種規(guī)模的計(jì)算機(jī)應(yīng)用系統(tǒng)。
(5)優(yōu)異的性能價(jià)格比―單片機(jī)的性能極高。為了提高速度和運(yùn)行效率,單片機(jī)已開始使用RISC流水線和 DSP等技術(shù)。單片機(jī)的尋址能力也已突破64KB的限制,有的已可達(dá)到1MB和16MB,片內(nèi)的ROM容量可達(dá)62MB,RAM容量則可達(dá)2MB。由于單片機(jī)的廣泛使用,因而銷量極大,各大公司的商業(yè)競(jìng)爭(zhēng)更使其價(jià)格十分低廉,其性能價(jià)格比極高。
4.2 系統(tǒng)硬件電路原理詳圖
圖4-1 硬件電路圖
4.3 實(shí)際連線
4.3.1紅綠燈模擬仿真電路
圖4-2 模擬仿真電路圖
4.3.2所用工具:
圖4-3 工具圖
5 軟件設(shè)計(jì)
5.1 軟件功能設(shè)計(jì)
利用單片機(jī)的定時(shí)器產(chǎn)生準(zhǔn)確的時(shí)鐘信號(hào),從而進(jìn)行時(shí)間控制,控制十字路口的紅、黃、綠燈交替亮滅。并且使用共陰極兩位LED數(shù)碼管,時(shí)刻顯示當(dāng)前路口的紅燈或者綠燈還將持續(xù)的時(shí)間。兩個(gè)方向的通行時(shí)間可用按鍵進(jìn)行設(shè)置,可以控制路口的紅綠燈的持續(xù)時(shí)間,這樣模擬現(xiàn)實(shí)中的不同時(shí)間段,車流量不同而智能控制時(shí)間,這樣更加合理的控制路口的通行,提高道路的通行效率,系統(tǒng)的啟停和復(fù)位也由按鍵控制。
5.2 軟件流程設(shè)計(jì)
5.2.1 主流程圖
圖5-1 主流程圖
5.2.2 按鍵判斷
圖5-2 按鍵判斷圖
5.2.3 數(shù)碼管顯時(shí)
一次中斷程序
N值自動(dòng)調(diào)整 時(shí)間變量N--
是
否 判斷N是否在
合理值范圍
執(zhí)行數(shù)碼管顯示程序 秒時(shí)間=N%10
+秒時(shí)間=N/10
圖5-3 數(shù)碼管顯時(shí)圖
6 軟件調(diào)試
6.1 單元測(cè)試
6.1.1 顯示模塊測(cè)試
首先在硬件電路上按照要求連接數(shù)碼管,然后由單片機(jī)控制,看能否控制數(shù)碼管顯示任何組合,測(cè)試通過則開始調(diào)試紅綠燈程序代碼,不通過則檢查問題,硬件問題或者軟件問題。
然后連接6個(gè)LED燈,模擬交通燈的過程中,由于南北方向和東西方向的情況分別一樣,所以只是用一組LED,連接好硬件電路之后,用萬用表的測(cè)試通斷檔檢測(cè)每個(gè)LED的好壞,有問題則更換LED,沒有問題則進(jìn)去軟件調(diào)試。
最后在中斷完成掃描一次數(shù)碼管,看數(shù)碼管的顯示是否良好,消隱是否消徹底,測(cè)試完成后,確認(rèn)無誤則進(jìn)行下一步測(cè)試。
6.1.2 按鍵模塊測(cè)試
在按鍵接入電路之后,用萬用表的測(cè)試通斷檔檢測(cè)每個(gè)按鍵按下時(shí),按鍵是否接通如果接通,則按鍵電路硬件無誤,在軟件程序里面測(cè)試,每個(gè)檢測(cè)按鍵的程序都延時(shí)一小段時(shí)間在檢測(cè)按鍵情況,如果按鍵情況不變,則判斷執(zhí)行按鍵程序,如若延時(shí)后按鍵情況消失,則判斷為系統(tǒng)的電源抖動(dòng),不予處理。
6.2 總體測(cè)試
在程序搭建完成之后,結(jié)合硬件進(jìn)行最后的測(cè)試,用按鍵控制時(shí)間加減,然后觀察程序的BUG,做多種嘗試,盡量消除完程序存在的BUG,比如時(shí)間如果減為0,或者時(shí)間加到數(shù)碼管顯示的最大值之后怎么處理,都是我們程序里面要考慮到的問題,然后檢測(cè)中斷程序控制的時(shí)間與實(shí)際時(shí)間的差距,盡量調(diào)整時(shí)間沒有差距,這也是程序控制與實(shí)際的結(jié)合,達(dá)到誤差標(biāo)準(zhǔn)之后,然后運(yùn)行程序,要求時(shí)間持續(xù)時(shí)間長,如果出現(xiàn)問題,那么就要分析問題原因,是硬件問題還是軟件 BUG,將問題處理完之后,本次十字路口交通燈設(shè)計(jì)成功。
實(shí)驗(yàn)結(jié)果如下:
圖6-1 運(yùn)行實(shí)現(xiàn)圖
總結(jié)
在這次課程設(shè)計(jì)中我學(xué)會(huì)了很多東西,更好的掌握了單片機(jī)設(shè)計(jì)中的一些知識(shí)。誠然,這次課程設(shè)計(jì)讓我感觸很深,通過這次課程設(shè)計(jì),我掌握了單片機(jī)與C語言結(jié)合,學(xué)會(huì)了Keil以及Proteus中運(yùn)行程序和觀察仿真效果,遇到錯(cuò)誤查詢并解決,最終程序成功運(yùn)行并出現(xiàn)正確結(jié)果。
在這次難得的課程設(shè)計(jì)過程中我鍛煉了自己的思考能力和動(dòng)手能力。通過題目選擇和設(shè)計(jì)電路的過程中,加強(qiáng)了我思考問題的完整性和實(shí)際生活聯(lián)系的可行性。在方案設(shè)計(jì)選擇和芯片的選擇上,培養(yǎng)了我們綜合應(yīng)用單片機(jī)的能力,對(duì)單片機(jī)的各個(gè)管腳的功能也有了進(jìn)一步的認(rèn)識(shí)。還鍛煉我們個(gè)人的查閱技術(shù)資料的能力,動(dòng)手能力,發(fā)現(xiàn)問題,解決問題的能力。并且我們熟練掌握了有關(guān)器件的性能及測(cè)試方法。
這也激發(fā)了我今后的學(xué)習(xí)的興趣,這將對(duì)我以后的學(xué)習(xí)會(huì)有很大的幫助,在設(shè)計(jì)時(shí)遇到一些問題,同學(xué)也認(rèn)真給我講解,十分感謝。我也懂得了學(xué)習(xí)的重要性,了解到理論知識(shí)和實(shí)踐知識(shí)相結(jié)合的好處,學(xué)會(huì)了堅(jiān)持、耐心和努力。更重要的是如何讓把自己所學(xué)的知識(shí)應(yīng)用到實(shí)踐中去。我覺得課程的設(shè)計(jì)的過程相當(dāng)重要,學(xué)到了很多,收獲了很多,它也是一個(gè)從理論到實(shí)際應(yīng)用的過程。所以我認(rèn)為這次的課程設(shè)計(jì)好處很多。
確實(shí),人是需要不斷的磨練的﹐在這次課程設(shè)計(jì)的磨練中,也讓我體會(huì)到了以后工作的辛苦,所以我應(yīng)該更加的努力,為更好的明天而奮斗。
參考文獻(xiàn)
[1] 李建中.單片機(jī)原理及應(yīng)用[M].西安電子科技大學(xué)出版社,2010.
[2] 周航慈.單片機(jī)應(yīng)用程序設(shè)計(jì)技術(shù)[M].北京:北京航空航大大學(xué)出版社,2005.
[3]何立民.單片機(jī)高級(jí)教程[M].北京:北京航空航天大學(xué)出版社,2001.
[4] 夏繼強(qiáng).單片機(jī)實(shí)驗(yàn)與實(shí)踐教程[M].北京:北京航空航天大學(xué)出版社,2001.
[5] 趙曉安.MCS-51單片機(jī)原理及應(yīng)用[M].天津:天津大學(xué)出版社,2001.
[6]楊清梅,孫建民.傳感器與測(cè)試技術(shù)[M].哈爾濱:哈爾濱工程大學(xué)出版社,2005.
[7]范晶彥.傳感器與檢測(cè)技術(shù)應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2005.
[8]李廣第.單片機(jī)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社, 1999.文章來源:http://www.zghlxwxcb.cn/news/detail-488454.html
附錄:文章來源地址http://www.zghlxwxcb.cn/news/detail-488454.html
#include <reg52.h>
//數(shù)碼管選擇位
sbit EW_1=P1^0;
sbit EW_2=P1^1;
sbit NS_1=P1^2;
sbit NS_2=P1^3;
sbit add_red_time=P1^4; //加紅燈時(shí)間按鈕
sbit add_green_time=P1^5; //加綠燈時(shí)間按鈕
sbit reduce_red_time=P1^6; //減紅燈時(shí)間按鈕
sbit reduce_green_time=P1^7; //減綠燈時(shí)間按鈕
sbit NS_led=P2^6; //南北向燈緊急控制按鈕
sbit EW_led=P2^7; //東西向燈緊急控制按鈕
sbit EW_red=P2^0; //東西向紅燈
sbit EW_green=P2^1; //東西向綠燈
sbit EW_yellow=P2^2; //東西向黃燈
sbit NS_red=P2^3; //南北向紅燈
sbit NS_green=P2^4; //南北向綠燈
sbit NS_yellow=P2^5; //南北向黃燈
char count=0; //計(jì)數(shù),count=20表示1s
char red_time=30; //紅燈停留時(shí)間
char green_time=25; //綠燈停留時(shí)間
char yellow_time=0; //黃燈停留時(shí)間
char NS_second=0; //南北紅綠燈秒計(jì)時(shí)
char EW_second=0; //東西紅綠燈秒計(jì)時(shí)
char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽數(shù)碼管段碼表,仿真中用的是共陰數(shù)碼管,所以使用時(shí)需對(duì)段碼取反
char display_data[4]={0}; //show_data[0]顯示南北計(jì)時(shí)十位,show_data[1]顯示南北計(jì)時(shí)個(gè)位,show_data[2]顯示東西計(jì)時(shí)十位,show_data[3]顯示東西計(jì)時(shí)個(gè)位
char temp_data[4]={0};
char NS_R_G_mode=0; //南北紅綠燈亮模式 0 紅燈 1 綠燈 2 黃燈
char EW_R_G_mode=1; //東西紅綠燈亮模式 0 紅燈 1 綠燈 2 黃燈
bit NS_R_G_flag=0; //南北紅綠燈標(biāo)識(shí)位 0 紅燈 1 綠燈
bit EW_R_G_flag=0; //東西紅綠燈標(biāo)識(shí)位 0 紅燈 1 綠燈
void delay(unsigned int i) //簡(jiǎn)單延時(shí)
{
while(i--);
}
void Timer_init() //定時(shí)器初始化
{
//定時(shí)50ms
TMOD = 0x01; //定時(shí)器方式1
TH0 = 0x3C; //定時(shí)器賦初值
TL0 = 0xB0;
EA = 1; //開啟總中斷
ET0 = 1; //開啟定時(shí)器中斷
TR0 = 1; //開啟定時(shí)器
}
void Init() //系統(tǒng)初始化
{
P0=0x00;
P2=0x00;
EW_1=1;
EW_2=1;
NS_1=1;
NS_2=1;
NS_led=1;
EW_led=1;
NS_second=red_time; //默認(rèn)初始時(shí)南北向燈亮紅燈,并賦紅燈時(shí)長
EW_second=green_time; //默認(rèn)初始時(shí)東西向燈亮綠燈,并賦綠燈時(shí)長
yellow_time=red_time-green_time;//黃燈時(shí)間為紅燈時(shí)間與綠燈時(shí)間差
Timer_init();
}
void NS_SMG_drive(char *buff) //南北向數(shù)碼管驅(qū)動(dòng)
{
//顯示十位
NS_1=0;
NS_2=1;
P0=~smgduan[buff[0]]; //段碼取反
delay(5); //間隔一段時(shí)間掃描
P0=0x00; //消隱
//顯示個(gè)位
NS_1=1;
NS_2=0;
P0=~smgduan[buff[1]];
delay(5);
P0=0x00;
//關(guān)閉南北向數(shù)碼管
NS_1=1;
NS_2=1;
}
void EW_SMG_drive(char *buff) //東西向數(shù)碼管驅(qū)動(dòng)
{
//顯示十位
EW_1=0;
EW_2=1;
P0=~smgduan[buff[2]]; //段碼取反
delay(5); //間隔一段時(shí)間掃描
P0=0x00; //消隱
//顯示個(gè)位
EW_1=1;
EW_2=0;
P0=~smgduan[buff[3]];
delay(5);
P0=0x00;
//關(guān)閉東西向數(shù)碼管
EW_1=1;
EW_2=1;
}
void data_del(char *buff,char data1,char data2) //數(shù)據(jù)處理
{
buff[0]=data1/10; //取data1的十位
buff[1]=data1%10; //取data1的個(gè)位
buff[2]=data2/10; //取data2的十位
buff[3]=data2%10; //取data2的個(gè)位
}
void Time_del() //計(jì)時(shí)處理
{
if(count>=20) //判斷是否滿1s
{
NS_second--; //南北向燈計(jì)時(shí)自減
EW_second--; //東北向燈計(jì)時(shí)自減
switch(NS_R_G_mode) //南北向燈
{
case 0: //紅燈
{
if(NS_second<0)
{
NS_second=green_time; //開始綠燈倒計(jì)時(shí)
NS_R_G_mode=1; //紅燈亮完綠燈亮
}
}break;
case 1: //綠燈
{
if(NS_second<0)
{
NS_second=yellow_time; //開始黃燈倒計(jì)時(shí)
NS_R_G_mode=2; //綠燈亮完黃燈亮
}
}break;
case 2: //黃燈
{
if(NS_second<0)
{
NS_second=red_time; //開始紅燈到計(jì)時(shí)
NS_R_G_mode=0; //黃燈亮完紅燈亮
}
}break;
default:break;
}
switch(EW_R_G_mode) //東西向燈
{
case 0: //紅燈
{
if(EW_second<0)
{
EW_second=green_time; //開始綠燈倒計(jì)時(shí)
EW_R_G_mode=1; //紅燈亮完綠燈亮
}
}break;
case 1: //綠燈
{
if(EW_second<0)
{
EW_second=yellow_time; //開始黃燈倒計(jì)時(shí)
EW_R_G_mode=2; //綠燈亮完黃燈亮
}
}break;
case 2: //黃燈
{
if(EW_second<0)
{
EW_second=red_time; //開始紅燈倒計(jì)時(shí)
EW_R_G_mode=0; //黃燈亮完紅燈亮
}
}break;
default:break;
}
count=0; //計(jì)數(shù)值清零
}
}
void R_G_Y_led() //紅綠燈驅(qū)動(dòng)
{
switch(NS_R_G_mode) //南北向
{
case 0: //紅燈
{
NS_yellow=0; //黃燈滅
NS_red=1; //紅燈亮
}break;
case 1: //綠燈
{
NS_red=0; //紅燈滅
NS_green=1; //綠燈亮
}break;
case 2: //黃燈
{
NS_green=0; //綠燈滅
if(count<10) //黃燈以1hz頻率閃爍
NS_yellow=1;
else
NS_yellow=0;
}break;
default:break;
}
switch(EW_R_G_mode) //東西向
{
case 0: //紅燈
{
EW_yellow=0; //黃燈滅
EW_red=1; //紅燈亮
}break;
case 1: //綠燈
{
EW_red=0; //紅燈滅
EW_green=1; //綠燈亮
}break;
case 2: //黃燈
{
EW_green=0; //綠燈滅
if(count<10) //黃燈以1hz頻率閃爍
EW_yellow=1;
else
EW_yellow=0;
}break;
default:break;
}
}
void Set_time() //設(shè)置紅綠燈亮的時(shí)長
{
if((add_red_time==0)||(add_green_time==0)||(reduce_red_time==0)||(reduce_green_time==0))//設(shè)置紅綠燈時(shí)長時(shí)任一設(shè)置按鈕都可觸發(fā)
{
TR0 = 0; //關(guān)閉定時(shí)器
P2=0x00; //清零P2寄存器
EW_led=1; //EW_led、NS_led引腳也在P2寄存器內(nèi),但是后面需要這兩個(gè)按鈕結(jié)束設(shè)置紅綠燈時(shí)長任務(wù),故而這兩個(gè)引腳要拉高
NS_led=1;
while(1)
{
data_del(temp_data,red_time,green_time);//顯示當(dāng)前紅綠燈時(shí)長
NS_SMG_drive(temp_data);
EW_SMG_drive(temp_data);
if(add_red_time==0) //判斷加紅燈時(shí)間按鈕是否按下
{
delay(5); //消抖
if(add_red_time==0)
{
red_time++; //紅燈時(shí)間自加
if(red_time>99) //限制紅燈時(shí)間最大值為99
red_time=99;
data_del(temp_data,red_time,red_time);//南北向數(shù)碼管顯示紅燈時(shí)長
NS_SMG_drive(temp_data);
}while(!add_red_time); //等待加紅燈時(shí)間按鈕彈起
}
if(add_green_time==0) //判斷加綠燈時(shí)間按鈕是否按下
{
delay(5);
if(add_green_time==0)
{
green_time++; //綠燈時(shí)間自加
if(green_time>95) //限制綠燈時(shí)間最大值95
green_time=95;
data_del(temp_data,green_time,green_time);//東西向數(shù)碼管顯示綠燈時(shí)長
EW_SMG_drive(temp_data);
}while(!add_green_time); //等待加綠燈時(shí)間按鈕彈起
}
if(reduce_red_time==0) //判斷減紅燈時(shí)間按鈕是否按下
{
delay(5);
if(reduce_red_time==0)
{
red_time--; //紅燈時(shí)間自減
if(red_time<10) //限制紅燈時(shí)間最小值10
red_time=10;
data_del(temp_data,red_time,red_time);
NS_SMG_drive(temp_data);
}while(!reduce_red_time); //等待減紅燈時(shí)間按鈕彈起
}
if(reduce_green_time==0) //判斷減綠燈時(shí)間按鈕是否按下
{
delay(5);
if(reduce_green_time==0)
{
green_time--; //綠燈時(shí)間自減
if(green_time<5) //限制綠燈時(shí)間最小值5
green_time=5;
data_del(temp_data,green_time,green_time);
EW_SMG_drive(temp_data);
}while(!reduce_green_time); //等待減綠燈時(shí)間按鈕彈起
}
if((NS_led==0)||(EW_led==0)) //任一緊急控制按鈕按下則結(jié)束設(shè)置紅路燈時(shí)長任務(wù)
{
break;
}
}while((!NS_led)||(!EW_led)); //等待緊急控制按鈕彈起
TR0 = 1; //開啟定時(shí)器
yellow_time=red_time-green_time; //更新黃燈時(shí)間
}
}
void Urgent() //紅綠燈緊急控制
{
if((NS_led==0)||(EW_led==0)) //任一緊急控制按鈕按下觸發(fā)
{
TR0 = 0; //關(guān)閉定時(shí)器
P2=0x00;
EW_led=1;
NS_led=1;
EW_1=1; //關(guān)閉所有數(shù)碼管
EW_2=1;
NS_1=1;
NS_2=1;
while((!NS_led)||(!EW_led)); //判斷緊急控制按鈕按是否彈起
while(1)
{
if(NS_R_G_flag) //根據(jù)NS_R_G_flag狀態(tài)交替亮紅燈或者綠燈
{
NS_green=1;
NS_red=0;
}
else
{
NS_red=1;
NS_green=0;
}
if(EW_R_G_flag) //根據(jù)EW_R_G_flag狀態(tài)交替亮紅燈或者綠燈
{
EW_green=1;
EW_red=0;
}
else
{
EW_red=1;
EW_green=0;
}
if(NS_led==0) //判斷南北向緊急控制按鈕是否按下
{
delay(5);
if(NS_led==0)
{
NS_R_G_flag=!NS_R_G_flag; //NS_R_G_flag狀態(tài)取反
}while(!NS_led); //等待南北向緊急控制按鈕彈起
}
if(EW_led==0) //判斷東西向緊急控制按鈕是否按下
{
delay(5);
if(EW_led==0)
{
EW_R_G_flag=!EW_R_G_flag; //EW_R_G_flag狀態(tài)取反
}while(!EW_led); //等待東西向緊急控制按鈕彈起
}
if((add_red_time==0)||(add_green_time==0)||(reduce_red_time==0)||(reduce_green_time==0))//任一紅綠燈設(shè)置時(shí)長按鈕按下結(jié)束緊急控制人物
{
TR0 = 1; //開啟定時(shí)器
break;
}
}while((!add_red_time)||(!add_green_time)||(!reduce_red_time)||(!reduce_green_time));//等待紅綠燈時(shí)間設(shè)置按鈕彈起
P2=0x00;
EW_led=1;
NS_led=1;
}
}
void main()
{
Init();
while(1)
{
Time_del(); //時(shí)間處理
data_del(display_data,NS_second,EW_second);//數(shù)據(jù)處理
NS_SMG_drive(display_data); //南北向數(shù)碼管驅(qū)動(dòng)
EW_SMG_drive(display_data); //東西向數(shù)碼管驅(qū)動(dòng)
R_G_Y_led(); //紅綠燈驅(qū)動(dòng)
Set_time(); //紅綠燈時(shí)長設(shè)置
Urgent(); //緊急控制
}
}
void Timer0(void) interrupt 1 //定時(shí)器中斷
{
TH0 = 0x3C;
TL0 = 0xB0;
count++; //觸發(fā)中斷后計(jì)數(shù)值自加,定時(shí)器中斷每50ms觸發(fā)一次
}
到了這里,關(guān)于基于AT89C51單片機(jī)的十字路口交通燈設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!