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