国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于AT89C51單片機(jī)的十字路口交通燈設(shè)計(jì)

這篇具有很好參考價(jià)值的文章主要介紹了基于AT89C51單片機(jī)的十字路口交通燈設(shè)計(jì)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖:
https://download.csdn.net/download/qq_64505944/87849986?spm=1001.2014.3001.5503
基于AT89C51單片機(jī)的十字路口交通燈設(shè)計(jì)

源碼獲取
基于AT89C51單片機(jī)的十字路口交通燈設(shè)計(jì)

主要內(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í)到位,甚至是生命通道的延伸。

  1. 可行性分析和需求分析
    可行性研究
    該階段通過對(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

#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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于AT89C51單片機(jī)的溫度計(jì)設(shè)計(jì)

    基于AT89C51單片機(jī)的溫度計(jì)設(shè)計(jì)

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87773445 源碼獲取 主要內(nèi)容: 設(shè)計(jì)一個(gè)簡(jiǎn)易溫度計(jì);要求電路實(shí)現(xiàn)如下功能: 設(shè)計(jì)通過單片機(jī)和數(shù)碼管、led燈等組成,可以顯示溫度,并且可以顯示大于零度的溫度和小于零度的溫度,還可以超出

    2024年02月05日
    瀏覽(23)
  • 基于AT89C51單片機(jī)的電子萬年歷系統(tǒng)

    基于AT89C51單片機(jī)的電子萬年歷系統(tǒng)

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87708258 源碼獲取 主要內(nèi)容: 電子萬年歷系統(tǒng)以實(shí)時(shí)時(shí)鐘芯片DS1302和AT89C52單片機(jī)為主要研究對(duì)象,著重進(jìn)行51單片機(jī)控制系統(tǒng)的設(shè)計(jì)研究和如何讀取DS1302內(nèi)部時(shí)鐘信息的研究。以及運(yùn)用18B20進(jìn)行實(shí)

    2024年02月09日
    瀏覽(27)
  • 基于AT89C51單片機(jī)的電子時(shí)鐘設(shè)計(jì)與仿真

    基于AT89C51單片機(jī)的電子時(shí)鐘設(shè)計(jì)與仿真

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87779867?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 使用DS1302芯片作為計(jì)時(shí)設(shè)備,用6個(gè)7段LED數(shù)碼管或者LCD162作為顯示設(shè)備,實(shí)現(xiàn)時(shí)鐘功能; 基本要求: (1)可以分別設(shè)定小時(shí)、分鐘和秒,復(fù)位后時(shí)

    2024年02月06日
    瀏覽(24)
  • 基于AT89C51單片機(jī)的倒數(shù)計(jì)時(shí)器設(shè)計(jì)

    基于AT89C51單片機(jī)的倒數(shù)計(jì)時(shí)器設(shè)計(jì)

    1.設(shè)計(jì)任務(wù) 利用AT89C51單片機(jī)為核心控制元件,設(shè)計(jì)一個(gè)簡(jiǎn)易的數(shù)字電壓表,設(shè)計(jì)的系統(tǒng)實(shí)用性強(qiáng)、操作簡(jiǎn)單,實(shí)現(xiàn)了智能化、數(shù)字化。 本設(shè)計(jì)采用單片機(jī)為主控芯片,結(jié)合 周邊 電路組成 LED 彩燈的 閃爍 控制系統(tǒng)器,用來控制 紅色 的LED 閃爍 發(fā)光,實(shí)現(xiàn) LED燈在倒計(jì)時(shí)結(jié)束后

    2024年02月03日
    瀏覽(30)
  • 基于AT89C51單片機(jī)的簡(jiǎn)易計(jì)算機(jī)設(shè)計(jì)

    基于AT89C51單片機(jī)的簡(jiǎn)易計(jì)算機(jī)設(shè)計(jì)

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87715642?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 本設(shè)計(jì)是以單片機(jī)AT89C51為核心的簡(jiǎn)易計(jì)算器設(shè)計(jì),要通過芯片AT89C51實(shí)現(xiàn)計(jì)算器程序運(yùn)行來完成加、減、乘和除的簡(jiǎn)單計(jì)算功能。 基本要求: 1、采

    2024年02月08日
    瀏覽(26)
  • 基于AT89C51單片機(jī)的電子秒表設(shè)計(jì)與仿真

    基于AT89C51單片機(jī)的電子秒表設(shè)計(jì)與仿真

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87775018添加鏈接描述 源碼獲取 主要內(nèi)容: 設(shè)計(jì)一個(gè)電子秒表,至少具有以下功能:開始/暫停、記錄、復(fù)位等。設(shè)計(jì)方案主要分為實(shí)驗(yàn)的系統(tǒng)分析,具體的設(shè)計(jì)方案,以及最終的測(cè)試,最終完成實(shí)

    2024年02月16日
    瀏覽(35)
  • 基于AT89C51單片機(jī)的電子琴設(shè)計(jì)與仿真

    基于AT89C51單片機(jī)的電子琴設(shè)計(jì)與仿真

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87848430?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 設(shè)計(jì)一個(gè)簡(jiǎn)易的電子琴,至少具有可以彈奏并發(fā)出不同的音調(diào)。電子琴方案主要分為實(shí)驗(yàn)的系統(tǒng)分析,具體的實(shí)施方案,以及最終的實(shí)驗(yàn)檢驗(yàn),最終

    2024年02月07日
    瀏覽(26)
  • 基于AT89C51單片機(jī)的智能澆花系統(tǒng)設(shè)計(jì)

    基于AT89C51單片機(jī)的智能澆花系統(tǒng)設(shè)計(jì)

    目 錄 摘 要 I ABSTRACT I 1 緒論 1 1.1 課題背景和意義 1 1.1.1選題背景 1 1.1.2研究意義 1 1.2 國內(nèi)外發(fā)展現(xiàn)狀及趨勢(shì) 2 1.3研究主要內(nèi)容 3 2 總體設(shè)計(jì)方案 5 2.1 澆灌系統(tǒng)設(shè)計(jì)的需求 5 2.2 總體設(shè)計(jì)方案選定 5 3 系統(tǒng)硬件設(shè)計(jì) 6 3.1 LCD1602顯示接口線路 6 3.2 ADC0832簡(jiǎn)介 6 3.3 濕度傳感器介紹 7

    2024年02月05日
    瀏覽(30)
  • 基于AT89C51單片機(jī)的交通燈設(shè)計(jì)與仿真

    基于AT89C51單片機(jī)的交通燈設(shè)計(jì)與仿真

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87763760?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 設(shè)計(jì)一個(gè)能夠控制十二盞交通信號(hào)燈的模擬系統(tǒng),:利用單片機(jī)的定時(shí)器定時(shí),令十字路口的紅綠燈交替點(diǎn)亮和熄滅,并用LED燈顯示倒計(jì)時(shí)間。 基本要

    2024年02月08日
    瀏覽(18)
  • 基于AT89C51單片機(jī)的計(jì)算器設(shè)計(jì)與仿真

    基于AT89C51單片機(jī)的計(jì)算器設(shè)計(jì)與仿真

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87759134?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 本次設(shè)計(jì)所提出的一種基于單片機(jī)技術(shù)的簡(jiǎn)易計(jì)算器的方案,能更好的解決計(jì)算機(jī)計(jì)算的問題,隨著數(shù)字生活的到來,單片機(jī)在生活中越來越重要,它

    2024年02月03日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包