欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 交通燈 [打印本頁]

作者: 2654065156    時(shí)間: 2018-7-12 08:49
標(biāo)題: 交通燈
一、設(shè)計(jì)內(nèi)容
本設(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ù)位電路、顯示電路、電源電路等電路組成。
二、設(shè)計(jì)方案1.       總體方案
本設(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ù)位電路、顯示電路、電源電路等電路組成。


   

電源提供方案
為使模塊穩(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é)約成本;缺點(diǎn)是輸出功率不高。
綜上所述,選擇第二種方案。
顯示界面方案
該系統(tǒng)要求完成倒計(jì)時(shí)功能。基于上述原因,本次設(shè)計(jì)考慮了兩種方案:
方案一:完全采用點(diǎn)陣式LED顯示。這種方案功能強(qiáng)大,可方便的顯示各種英文字符,漢字,圖形等,但實(shí)現(xiàn)復(fù)雜,且須完成大量的軟件工作。
方案二:完全采用數(shù)碼管顯示。這種方案優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,可以完成倒計(jì)時(shí)功能。缺點(diǎn)是功能較少,只能顯示有限的符號(hào)和數(shù)碼字符。根據(jù)本設(shè)計(jì)的要求,方案二已經(jīng)滿足了要求,所以本次設(shè)計(jì)采用方案二以實(shí)現(xiàn)系統(tǒng)的顯示功能。
輸入方案
這里同樣討論了兩種方案:
方案一:采用8155擴(kuò)展I/O口、鍵盤及顯示等。該方案的優(yōu)點(diǎn)是使用靈活可編程,并且有RAM及計(jì)數(shù)器。若用該方案,可提供較多I/O口,但操作起來稍顯復(fù)雜。
方案二:直接在I/O口線上接上按鍵開關(guān)。因?yàn)樵O(shè)計(jì)時(shí)精簡和優(yōu)化了電路,所以剩余的端口資源還比較多。
由于該系統(tǒng)是對交通燈及數(shù)碼管的控制,只需用單片機(jī)本身的I/O口就可實(shí)現(xiàn),且本身的計(jì)數(shù)器及RAM已經(jīng)夠用,故選擇方案二。
2.       硬件電路設(shè)計(jì)
硬件設(shè)計(jì)是整個(gè)系統(tǒng)的基礎(chǔ),要考慮的方方面面很多,除了實(shí)現(xiàn)交通燈基本功能以外,主要還要考慮如下幾個(gè)因素:①系統(tǒng)穩(wěn)定度;②器件的通用性或易選購性;③軟件編程的易實(shí)現(xiàn)性;④系統(tǒng)其它功能及性能指標(biāo);因此硬件設(shè)計(jì)至關(guān)重要。現(xiàn)從各功能模塊的實(shí)現(xiàn)逐個(gè)進(jìn)行分析探討。
總體設(shè)計(jì)
本設(shè)計(jì)以單片機(jī)為控制核心,采用模塊化設(shè)計(jì),共分以下幾個(gè)功能模塊:單片機(jī)控制系統(tǒng)、鍵盤及狀態(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)。
單片機(jī)的選擇
單片機(jī)微型計(jì)算機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,也是頗具生命力的機(jī)種。單片機(jī)微型計(jì)算機(jī)簡稱單片機(jī),特別適用于控制領(lǐng)域,故又稱為微控制器。
通常,單片機(jī)由單塊集成電路芯片構(gòu)成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件:中央處理器、存儲(chǔ)器和I/O接口電路等。因此,單片機(jī)只需要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。
單片機(jī)經(jīng)過1、2、3、3代的發(fā)展,正朝著多功能、高性能、低電壓、低功耗、低價(jià)格、大存儲(chǔ)容量、強(qiáng)I/O功能及較好的結(jié)構(gòu)兼容性方向發(fā)展。其發(fā)展趨勢不外乎以下幾個(gè)方面:
1、多功能         單片機(jī)中盡可能地把所需要的存儲(chǔ)器和I/O口都集成在一塊芯片上,使得單片機(jī)可以實(shí)現(xiàn)更多的功能。比如A/D、PWM、PCA(可編程計(jì)數(shù)器陣列)、WDT(監(jiān)視定時(shí)器---看家狗)、高速I/O口及計(jì)數(shù)器的捕獲/比較邏輯等。    有的單片機(jī)針對某一個(gè)應(yīng)用領(lǐng)域,集成了相關(guān)的控制設(shè)備,以減少應(yīng)用系統(tǒng)的芯片數(shù)量。例如,有的芯片以51內(nèi)核為核心,集成了USB控制器、SMART CARD接口、MP3解碼器、CAN或者I*I*C總線控制器等,LED、LCD或VFD顯示驅(qū)動(dòng)器也開始集成在8位單片機(jī)中。2、高效率和高性能為了提高執(zhí)行速度和執(zhí)行效率,單片機(jī)開始使用RISC、流水線和DSP的設(shè)計(jì)技術(shù),使單片機(jī)的性能有了明顯的提高,表現(xiàn)為:單片機(jī)的時(shí)鐘頻率得到提高;同樣頻率的單片機(jī)運(yùn)行效率也有了很大的提升;由于集成度的提高,單片機(jī)的尋址能力、片內(nèi)ROM(FLASH)和RAM的容量都突破了以往的數(shù)量和限制。 由于系統(tǒng)資源和系統(tǒng)復(fù)雜程度的增加,開始使用高級語言(如C語言)來開發(fā)單片機(jī)的程序。使用高級語言可以降低開發(fā) 難度,縮短開發(fā)周期,增強(qiáng)軟件的可讀性和可移植性,便于改進(jìn)和擴(kuò)充功能。3、低電壓和低功耗   單片機(jī)的嵌入式應(yīng)用決定了低電壓和低功耗的特性十分重要。由于CMOS等工藝的大量采用,很多單片機(jī)可以在更低的電壓下工作(1.2V或0.9V),功耗已經(jīng)降低到uA級。這些特性使得單片機(jī)系統(tǒng)可以在更小電源的支持下工作更長的時(shí)間。4、低價(jià)格    單片機(jī)應(yīng)用面廣,使用數(shù)量大,帶來的直接好處就是成本的降低。目前世界各大公司為了提高競爭力,在提高單片機(jī)性能的同時(shí),十分注意降低其產(chǎn)品的價(jià)格。下面大致介紹一下單片機(jī)的主要應(yīng)用領(lǐng)域和特點(diǎn)。(1)家用電器領(lǐng)域    用單片機(jī)控制系統(tǒng)取代傳統(tǒng)的模擬和數(shù)字控制電路,使家用電器(如洗衣機(jī)、空調(diào)、冰箱、微波爐、和電視機(jī)等)功能更完善,更加智能化和易于使用。(2)辦公自動(dòng)化領(lǐng)域   單片機(jī)作為嵌入式系統(tǒng)廣泛應(yīng)用于現(xiàn)代辦公設(shè)備,如計(jì)算機(jī)的鍵盤、磁盤驅(qū)動(dòng)、打印機(jī)、復(fù)印機(jī)、電話機(jī)和傳真機(jī)等。(3)商業(yè)應(yīng)用領(lǐng)域    商業(yè)應(yīng)用系統(tǒng)部分與家用和辦公應(yīng)用系統(tǒng)相似,但更加注重設(shè)備的穩(wěn)定性、可靠性和安全性。商用系統(tǒng)中廣泛使用的電子計(jì)量儀器、收款機(jī)、條形碼閱讀器、安全監(jiān)測系統(tǒng)、空氣調(diào)節(jié)系統(tǒng)和冷凍保鮮系統(tǒng)等,都采用了單片機(jī)構(gòu)成的專用系統(tǒng)。與通用計(jì)算機(jī)相比,這些系統(tǒng)由于比較封閉,可以更有效地防止病毒和電磁干擾等,可靠性更高。(4)工業(yè)自動(dòng)化    在工業(yè)控制和機(jī)電一體化控制系統(tǒng)中,除了采用工控計(jì)算機(jī)外,很多都是以單片機(jī)為核心的單片機(jī)和多機(jī)系統(tǒng)。(5)智能儀表與集成智能傳感器    目前在各種電氣測量儀表中普遍采用了單片機(jī)應(yīng)用系統(tǒng)來代替?zhèn)鹘y(tǒng)的測量系統(tǒng),使得測量系統(tǒng)具有存儲(chǔ)、數(shù)據(jù)處理、查詢及聯(lián)網(wǎng)等智能功能。將單片機(jī)和傳感器相結(jié)合,可以構(gòu)成新一代的智能傳感器。它將傳感器變換后的物理量作進(jìn)一步的變化和處理,使其成為數(shù)字信號(hào),可以遠(yuǎn)距離傳輸并與計(jì)算機(jī)接口。(6)現(xiàn)代交通與航空航天領(lǐng)域    通常應(yīng)用于電子綜合顯示系統(tǒng)、動(dòng)力監(jiān)控系統(tǒng)、自動(dòng)駕駛系統(tǒng)、通信系統(tǒng)以及運(yùn)行監(jiān)視系統(tǒng)等。這些領(lǐng)域?qū)w積、功耗、穩(wěn)定性和實(shí)時(shí)性的要求往往比商用系統(tǒng)還要高,因此采用單片機(jī)系統(tǒng)更加重要。單片機(jī)的基本結(jié)構(gòu)
   AT89S52單片機(jī)是一款低功耗、低電壓、高性能CMOS8位單片機(jī),片內(nèi)含8KB(可經(jīng)受1000次擦寫周期)的FLASH可編程可反復(fù)擦寫的只讀程序存儲(chǔ)器(EPROM),器件采用CMOS工藝和ATMEL公司的高密度,非易失性存儲(chǔ)器(NURAM)技術(shù)制造,其輸出引腳和指令系統(tǒng)都與MCS-51兼容,片內(nèi)的FLASH存儲(chǔ)器允許在系統(tǒng)內(nèi)可改編程序或用常規(guī)的非易失性存儲(chǔ)編程器來編程。因此,AT89C52是一種功能強(qiáng),靈活性高且價(jià)格合理的單片機(jī),可方便的應(yīng)用在各個(gè)控制領(lǐng)域[1]。
AT89S52具有以下主要性能:
1.8KB可改編程序FLASH存儲(chǔ)器;
2.全表態(tài)工作 :0~24HZ;
3.256X8字節(jié)內(nèi)部RAM;
4.32個(gè)外部雙向輸入,輸出(I、O)口;
引腳說明如圖2-2。


   

引腳功能說明如下[2]:
VCC:電源電壓。
GND:地。
P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數(shù)據(jù)線復(fù)用口。作為輸出口時(shí),每位能吸收電流的方式驅(qū)動(dòng)8個(gè)TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端。
在訪問外部數(shù)據(jù)儲(chǔ)存器或程序儲(chǔ)存器時(shí),這組口線分時(shí)轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。FLASH編程時(shí),P0口接收指令字節(jié),而在程序校驗(yàn)時(shí),輸出指令字節(jié),校驗(yàn)時(shí),要求外接上拉電阻。
P1口:P1是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作為輸入口。作為輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。FLASH編程和程序校驗(yàn)期間,P1接收低8位地址。
P2口:P2是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作為輸入口。作為輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。在訪問外部程序儲(chǔ)存器或16位地址的外部數(shù)據(jù)儲(chǔ)存器(例如執(zhí)行MOVX@DPTR指令)時(shí),P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)儲(chǔ)存器(例如執(zhí)行MOVX@RI指令)時(shí),P2口線上的內(nèi)容(也即特殊功能寄存器(SFR)區(qū)中R2寄存器的內(nèi)容),在整個(gè)訪問期間不改變。P3口:P3是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P3的輸出緩沖級可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作為輸入口。作為輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。
P3除了作為一般的I/O口線外,更重要的用途是它的第二功能,具體功能說明如表2-1。
P3口還接收一些用于FLASH閃速存儲(chǔ)器編程和程序校的控制信號(hào)。
RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將使單片機(jī)復(fù)位
ALE/PROG:當(dāng)訪問外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。
表2-1 P3口的第二功能表
  
端口引腳
      
第二功能
  
P3.0
      
RXD(穿行輸出口)
  
P3.1
      
TXD(穿行輸入口)
  
P3.2
      
INT0(外部中斷0)
  
  
P3.3
      
INT1(外部中斷1)
  
P3.4
      
T0(定時(shí)/計(jì)數(shù)器0)
  
P3.5
      
T1(定時(shí)/計(jì)數(shù)器0)
  
P3.6
      
WR(外部數(shù)據(jù)寫選通)
  
P3.7
      
RD(外部數(shù)據(jù)讀選通)
不訪問外部存儲(chǔ)器,ALE仍以是時(shí)鐘振蕩頻率的1/6輸出固定的正脈沖信號(hào),因此他可對外輸出時(shí)鐘或用于定時(shí)目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過一個(gè)ALE脈沖。對FLASH存儲(chǔ)器編程期間,該引腳還用于輸入編程脈沖(PROG)。
如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令A(yù)LE才會(huì)被激活。此外,該引腳會(huì)被微弱拉高,單片機(jī)執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE無效。
PSEN:程序儲(chǔ)存允許(PSEN)輸出是外部程序存儲(chǔ)器的讀選通信號(hào),當(dāng)AT80C51由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSEN有效,即輸出兩個(gè)脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器,這兩次有效的PSEN信號(hào)不出現(xiàn)。
EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序儲(chǔ)存器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需要注意的是:如果加密位LB1被編程,復(fù)位時(shí)內(nèi)部會(huì)鎖存EA端狀態(tài)。如EA端為高電平(Vcc端),CPU則執(zhí)行內(nèi)部程序儲(chǔ)存器中的指令。
FLASH儲(chǔ)存器編程時(shí),該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12v編程電壓。
XTAL1:振蕩器反相放大器的及內(nèi)部時(shí)鐘發(fā)生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端
單片機(jī)外圍電路設(shè)計(jì)復(fù)位電路設(shè)計(jì)
MCS-51的復(fù)位輸入引腳RST為MCS-51提供了初始化的手段,可以使程序從指定處開始執(zhí)行,在MCS-51的時(shí)鐘電路工作后,只要RST引腳上出現(xiàn)超過兩個(gè)機(jī)器周期以上的高電平時(shí),即可產(chǎn)生復(fù)位的操作,只要RST保持高電平,則MCS-51循環(huán)復(fù)位,只有單RET由高電平變成低電平以后,MCS-51才從0000H地址開始執(zhí)行程序,本系統(tǒng)采用按鍵復(fù)位方式的復(fù)位電路。
                                 
外部晶振時(shí)鐘電路設(shè)計(jì)
MCS-51的時(shí)鐘可以由兩種方式產(chǎn)生,一種是內(nèi)部方式,利用芯片內(nèi)部的振蕩電路;另外一種為外部方式,本論文根據(jù)實(shí)際需要和簡便,采用內(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)諧振電路接在放大器的反饋回路中,對接電容的值雖然沒有嚴(yán)格的要求,但電容的大小會(huì)影響振蕩頻率的高低,振蕩器的穩(wěn)定性,起振的快速性和溫度的穩(wěn)定性。晶振的頻率可在1.2MHZ~12MHZ之間任選,電容C1和C2的典型值在20pf~100pf之間選擇,由于本系統(tǒng)用到定時(shí)器,為了方便計(jì)算,采用了12MHZ的晶振,采用電容選擇30pf。
顯示模塊電路設(shè)計(jì)
該模塊由共陽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)亮的余輝和人眼的視覺暫留原理,則看起來數(shù)碼管是同時(shí)被點(diǎn)亮的。
        
從設(shè)計(jì)完成的任務(wù)與要求來看,顯示通行時(shí)間必須用二位數(shù)碼管,從節(jié)省硬件資源的角度考慮,可采用掃描的方式來處理,對于7段數(shù)碼管,占用7個(gè)單片機(jī)的I/O口,另外設(shè)置2個(gè)電子開關(guān)對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來作為中央處理器。這款單片機(jī)的I/O口作為輸出時(shí),具有較大的吸收電流能力,因此我們可以選用共陽型數(shù)碼管,這樣由單片機(jī)的I/O口就可以直接驅(qū)動(dòng),能簡化硬件電路的設(shè)計(jì)。
三、軟件設(shè)計(jì)交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)
交通信號(hào)燈由紅燈、綠燈、黃燈組成。紅燈表示禁止通行,綠燈表示準(zhǔn)許通行,黃燈表示警示。交通信號(hào)燈分為機(jī)動(dòng)車信號(hào)燈、非機(jī)動(dòng)車信號(hào)燈、人行橫道信號(hào)燈、車道信號(hào)燈、方向指示信號(hào)燈、閃光警告信號(hào)燈、道路與鐵路平面交叉道口信號(hào)燈。交通信號(hào)燈用于道路平面交叉路口,通過對車輛、行人發(fā)出行進(jìn)或停止的指令,使各同時(shí)到達(dá)的人、車交通流盡可能減少相互干擾,從而提高路口的通行能力,保障路口暢通和安全。因此必須合理的設(shè)計(jì)路口主干道的系統(tǒng)。
十字路口交通信號(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)燈變化表:
  
交通信號(hào)燈變化表
  
  
東西
      
綠燈亮
   
黃燈亮
   
紅燈亮
25S
   
5S
   
20S
  
南北
      
紅燈亮
   
綠燈亮
   
黃燈亮
30S
   
15S
   
5S
(2)在交通信號(hào)燈亮和閃爍的同時(shí),路口設(shè)有兩位七段碼的顯示器倒數(shù)計(jì)時(shí),讓車輛行人能夠清楚地知道再過多久信號(hào)燈就會(huì)發(fā)生變化。以便于司機(jī)和行人能夠在有限的時(shí)間內(nèi)準(zhǔn)確的通行。
十字路口交通信號(hào)燈示意圖
    交通信號(hào)燈共有12盞,每個(gè)路口各有紅,黃,綠三盞,具體分布如下圖所示:
交通信號(hào)燈控制系統(tǒng)程序編制 軟件設(shè)計(jì)應(yīng)用環(huán)境
本設(shè)計(jì)軟件的設(shè)計(jì)是在Keil C51的環(huán)境下編譯的。Keil C51是美國KeilSoftware公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到KeilC51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級語言的優(yōu)勢。C語言有以下特點(diǎn):
1、語言簡潔、緊湊、使用方便、靈活。C語言一共只有32個(gè)關(guān)鍵字,9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。
2、運(yùn)算符豐富。C的運(yùn)算符包含的范圍很廣泛,共有34種運(yùn)算符,使得C的運(yùn)算類型極其豐富,表達(dá)式類型多樣化,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其他高級語言中難以實(shí)現(xiàn)的運(yùn)算。
3、數(shù)據(jù)結(jié)構(gòu)豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結(jié)構(gòu),能用來實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的運(yùn)算。
4、具有結(jié)構(gòu)化的控制語句,用函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。
5、語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。
6、C語言能進(jìn)行位操作,能實(shí)現(xiàn)匯編語言的大部分功能,可以直接對硬件進(jìn)行操作。因此,C既具有高級語言的功能,又具有低級語言的許多功能,可用來寫系統(tǒng)軟件。C語言的這種雙重性,使它既是成功的系統(tǒng)描述語言,又是通用的程序設(shè)計(jì)語言。
7、生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。
8、用C語言寫的程序可移植性好。基本上不用修改就能用于各種型號(hào)的計(jì)算機(jī)和各種操作系統(tǒng)。
對操作系統(tǒng)和系統(tǒng)實(shí)用程序以及需要對硬件進(jìn)行操作的場合,用C語言明顯地優(yōu)勢于其他高級語言,有的大型應(yīng)用軟件也用C語言來編寫。
軟件設(shè)計(jì)流程
軟件總體設(shè)計(jì)主要完成各部分的軟件控制和協(xié)調(diào)。本系統(tǒng)主程序模塊主要完成的工作是對系統(tǒng)的初始化,發(fā)送顯示數(shù)據(jù),同時(shí)對鍵盤進(jìn)行掃描,等待外部中斷,以及根據(jù)所需要的功能進(jìn)行相應(yīng)的操作。
交通燈根據(jù)其顯示情況可以分為四個(gè)狀態(tài),可以通過定時(shí)來控制每個(gè)狀態(tài)的時(shí)間;通過定時(shí)也可以向LED數(shù)碼管中每隔1秒送一個(gè)數(shù),顯示該狀態(tài)剩余的時(shí)間。其流程圖如圖所示。
        圖4-1  主程序框圖
交通燈定時(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用來設(shè)置T0、T1的工作方式。這次實(shí)習(xí)中設(shè)置TMOD=0x01,即T0工作于方式0(16位定時(shí)器)。
內(nèi)部定時(shí)器/計(jì)數(shù)器用作定時(shí)器時(shí),是對機(jī)器周期計(jì)數(shù),每個(gè)機(jī)器周期的長度是12個(gè)振蕩周期。定時(shí)常數(shù)的設(shè)置可用一下方式計(jì)算:
機(jī)器周期=12/12MHz=1us
(65536-定時(shí)常數(shù))*1.0us=50ms
所以定時(shí)常數(shù)是50000。
源程序代碼
#include <reg52.h>                 //調(diào)用單片機(jī)頭文件
#define uchar unsigned char   //宏定義"uchar"代替"unsignedchar"。
#define uint  unsigned int      //宏定義"uint"用來定義無符號(hào)整型數(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ù)碼管的個(gè)位數(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; //東西  南北 倒計(jì)時(shí)變量
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ù)時(shí)間
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;   //東西、南北的時(shí)間
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()
* 功能 : 延時(shí)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);
         }
}
/*********************定時(shí)器0、定時(shí)器1初始化******************/
void time0_init()      
{
         EA  = 1;            //開總中斷
         TMOD= 0X11;           //定時(shí)器0、定時(shí)器1工作方式1
         ET0= 1;              //開定時(shí)器0中斷
         TR0= 1;              //允許定時(shí)器0定時(shí)
//     ET1= 1;              //開定時(shí)器1中斷
//     TR1= 1;              //允許定時(shí)器1定時(shí)         
}
/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
         if(flag_1s== 1)
         {
                  flag_1s= 0;
                  if(dx_s== 0)
                  {
                          if(flag_dx_nb== 1)
                                   dx_s= nb_time;        //南北時(shí)間
                          else
                                   dx_s= dx_time;         //東西時(shí)間
                          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] ;
/***********************南北時(shí)間*********************************/
                  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)             //當(dāng)小于5秒時(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;//滅
                                   }
                          }
                  }
/***********************東西時(shí)間*********************************/
                  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)             //當(dāng)小于5秒時(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;         //滅
                                   }
                          }
         }                        
}
/********************獨(dú)立按鍵程序*****************/
uchar key_can;         //按鍵值
void key()         //獨(dú)立按鍵程序
{
         staticuchar key_new;
         key_can= 20;                   //按鍵值還原
         P1|= 0x1f;
         if((P1& 0x1f) != 0x1f)              //按鍵按下
         {
                  delay_1ms(1);            //按鍵消抖動(dòng)
                  if(((P1& 0x1f) != 0x1f) && (key_new == 1))
                  {                                                   //確認(rèn)是按鍵按下
                          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è)置函數(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)         //設(shè)置鍵
         {
                  menu_1++;
                  if(menu_1>= 3)
                  {
                          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<= 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] ;           //顯示東西設(shè)置的時(shí)候
                  dis_smg[3]= 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<= 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] ;          //顯示東西設(shè)置的時(shí)候
                  dis_smg[3]= smg_du[nb_time / 10] ;   
         }
}
/********************************************************************
* 名稱 : main()
* 功能 : 實(shí)現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
         time0_init();
         dx_s= nb_time;        //東西時(shí)間
         while(1)
         {
                  key();
                  if(key_can< 20)
                          key_with();
//              menu_dis();
                  if((menu_1== 0) && (flag_jdgz == 0))
                          jiaotongdeng_dis();
                  display();
         }
}  
/*********************定時(shí)器0中斷服務(wù)程序************************/
void time0_int() interrupt 1  
{                                                      
         staticuchar value;                    //定時(shí)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.       測試
三、設(shè)計(jì)總結(jié)
本論文介紹了一種基于AT89S52單片機(jī)的交通燈的設(shè)計(jì)方法,本論文完成了系統(tǒng)的硬件設(shè)計(jì)與制作,詳細(xì)介紹了系統(tǒng)硬件設(shè)計(jì)的過程,并結(jié)合軟件系統(tǒng)完成了整個(gè)系統(tǒng)的軟、硬件聯(lián)調(diào),系統(tǒng)工作良好,實(shí)現(xiàn)了基本功能。
通過本次設(shè)計(jì),鞏固了我學(xué)習(xí)過的專業(yè)知識(shí),也使我把理論與實(shí)踐從真正意義上相結(jié)合了起來,鍛煉了借助互聯(lián)網(wǎng)絡(luò)搜集、查閱相關(guān)文獻(xiàn)資料和組織材料的綜合能力,從中我也認(rèn)識(shí)到自己的不足之處,我會(huì)在日后的學(xué)習(xí)中加以改進(jìn)與提高。
經(jīng)過這次設(shè)計(jì),我在各方面都有很大的提高。學(xué)到了很多不曾學(xué)過的東西,也使我學(xué)會(huì)了更好地利用一些資源和工具如圖書館及一些軟件查閱資料。在設(shè)計(jì)過程中也遇到很多的困難,遇到一些原理性不懂的時(shí)候就要去有針對性地查找資料或者請教知道老師和其他同學(xué),然后加以吸收利用,提高了自己的應(yīng)用能力,擴(kuò)充了自己的知識(shí)儲(chǔ)備,同時(shí)提高了動(dòng)手能力。
四、參考文獻(xiàn)
[1] 劉勇.數(shù)字電路[M].電子工業(yè)出版社.2004
[2] 楊子文.單片機(jī)原理及應(yīng)用[M].西安電子科技大學(xué)出版社.2006
[3] 劉華東
一、設(shè)計(jì)內(nèi)容
本設(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ù)位電路、顯示電路、電源電路等電路組成。
二、設(shè)計(jì)方案1.       總體方案
本設(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ù)位電路、顯示電路、電源電路等電路組成。


   

電源提供方案
為使模塊穩(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é)約成本;缺點(diǎn)是輸出功率不高。
綜上所述,選擇第二種方案。
顯示界面方案
該系統(tǒng)要求完成倒計(jì)時(shí)功能。基于上述原因,本次設(shè)計(jì)考慮了兩種方案:
方案一:完全采用點(diǎn)陣式LED顯示。這種方案功能強(qiáng)大,可方便的顯示各種英文字符,漢字,圖形等,但實(shí)現(xiàn)復(fù)雜,且須完成大量的軟件工作。
方案二:完全采用數(shù)碼管顯示。這種方案優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,可以完成倒計(jì)時(shí)功能。缺點(diǎn)是功能較少,只能顯示有限的符號(hào)和數(shù)碼字符。根據(jù)本設(shè)計(jì)的要求,方案二已經(jīng)滿足了要求,所以本次設(shè)計(jì)采用方案二以實(shí)現(xiàn)系統(tǒng)的顯示功能。
輸入方案
這里同樣討論了兩種方案:
方案一:采用8155擴(kuò)展I/O口、鍵盤及顯示等。該方案的優(yōu)點(diǎn)是使用靈活可編程,并且有RAM及計(jì)數(shù)器。若用該方案,可提供較多I/O口,但操作起來稍顯復(fù)雜。
方案二:直接在I/O口線上接上按鍵開關(guān)。因?yàn)樵O(shè)計(jì)時(shí)精簡和優(yōu)化了電路,所以剩余的端口資源還比較多。
由于該系統(tǒng)是對交通燈及數(shù)碼管的控制,只需用單片機(jī)本身的I/O口就可實(shí)現(xiàn),且本身的計(jì)數(shù)器及RAM已經(jīng)夠用,故選擇方案二。
2.       硬件電路設(shè)計(jì)
硬件設(shè)計(jì)是整個(gè)系統(tǒng)的基礎(chǔ),要考慮的方方面面很多,除了實(shí)現(xiàn)交通燈基本功能以外,主要還要考慮如下幾個(gè)因素:①系統(tǒng)穩(wěn)定度;②器件的通用性或易選購性;③軟件編程的易實(shí)現(xiàn)性;④系統(tǒng)其它功能及性能指標(biāo);因此硬件設(shè)計(jì)至關(guān)重要。現(xiàn)從各功能模塊的實(shí)現(xiàn)逐個(gè)進(jìn)行分析探討。
總體設(shè)計(jì)
本設(shè)計(jì)以單片機(jī)為控制核心,采用模塊化設(shè)計(jì),共分以下幾個(gè)功能模塊:單片機(jī)控制系統(tǒng)、鍵盤及狀態(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)。
單片機(jī)的選擇
單片機(jī)微型計(jì)算機(jī)是微型計(jì)算機(jī)的一個(gè)重要分支,也是頗具生命力的機(jī)種。單片機(jī)微型計(jì)算機(jī)簡稱單片機(jī),特別適用于控制領(lǐng)域,故又稱為微控制器。
通常,單片機(jī)由單塊集成電路芯片構(gòu)成,內(nèi)部包含有計(jì)算機(jī)的基本功能部件:中央處理器、存儲(chǔ)器和I/O接口電路等。因此,單片機(jī)只需要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個(gè)單片機(jī)控制系統(tǒng)。
單片機(jī)經(jīng)過1、2、3、3代的發(fā)展,正朝著多功能、高性能、低電壓、低功耗、低價(jià)格、大存儲(chǔ)容量、強(qiáng)I/O功能及較好的結(jié)構(gòu)兼容性方向發(fā)展。其發(fā)展趨勢不外乎以下幾個(gè)方面:
1、多功能         單片機(jī)中盡可能地把所需要的存儲(chǔ)器和I/O口都集成在一塊芯片上,使得單片機(jī)可以實(shí)現(xiàn)更多的功能。比如A/D、PWM、PCA(可編程計(jì)數(shù)器陣列)、WDT(監(jiān)視定時(shí)器---看家狗)、高速I/O口及計(jì)數(shù)器的捕獲/比較邏輯等。    有的單片機(jī)針對某一個(gè)應(yīng)用領(lǐng)域,集成了相關(guān)的控制設(shè)備,以減少應(yīng)用系統(tǒng)的芯片數(shù)量。例如,有的芯片以51內(nèi)核為核心,集成了USB控制器、SMART CARD接口、MP3解碼器、CAN或者I*I*C總線控制器等,LED、LCD或VFD顯示驅(qū)動(dòng)器也開始集成在8位單片機(jī)中。2、高效率和高性能為了提高執(zhí)行速度和執(zhí)行效率,單片機(jī)開始使用RISC、流水線和DSP的設(shè)計(jì)技術(shù),使單片機(jī)的性能有了明顯的提高,表現(xiàn)為:單片機(jī)的時(shí)鐘頻率得到提高;同樣頻率的單片機(jī)運(yùn)行效率也有了很大的提升;由于集成度的提高,單片機(jī)的尋址能力、片內(nèi)ROM(FLASH)和RAM的容量都突破了以往的數(shù)量和限制。 由于系統(tǒng)資源和系統(tǒng)復(fù)雜程度的增加,開始使用高級語言(如C語言)來開發(fā)單片機(jī)的程序。使用高級語言可以降低開發(fā) 難度,縮短開發(fā)周期,增強(qiáng)軟件的可讀性和可移植性,便于改進(jìn)和擴(kuò)充功能。3、低電壓和低功耗   單片機(jī)的嵌入式應(yīng)用決定了低電壓和低功耗的特性十分重要。由于CMOS等工藝的大量采用,很多單片機(jī)可以在更低的電壓下工作(1.2V或0.9V),功耗已經(jīng)降低到uA級。這些特性使得單片機(jī)系統(tǒng)可以在更小電源的支持下工作更長的時(shí)間。4、低價(jià)格    單片機(jī)應(yīng)用面廣,使用數(shù)量大,帶來的直接好處就是成本的降低。目前世界各大公司為了提高競爭力,在提高單片機(jī)性能的同時(shí),十分注意降低其產(chǎn)品的價(jià)格。下面大致介紹一下單片機(jī)的主要應(yīng)用領(lǐng)域和特點(diǎn)。(1)家用電器領(lǐng)域    用單片機(jī)控制系統(tǒng)取代傳統(tǒng)的模擬和數(shù)字控制電路,使家用電器(如洗衣機(jī)、空調(diào)、冰箱、微波爐、和電視機(jī)等)功能更完善,更加智能化和易于使用。(2)辦公自動(dòng)化領(lǐng)域   單片機(jī)作為嵌入式系統(tǒng)廣泛應(yīng)用于現(xiàn)代辦公設(shè)備,如計(jì)算機(jī)的鍵盤、磁盤驅(qū)動(dòng)、打印機(jī)、復(fù)印機(jī)、電話機(jī)和傳真機(jī)等。(3)商業(yè)應(yīng)用領(lǐng)域    商業(yè)應(yīng)用系統(tǒng)部分與家用和辦公應(yīng)用系統(tǒng)相似,但更加注重設(shè)備的穩(wěn)定性、可靠性和安全性。商用系統(tǒng)中廣泛使用的電子計(jì)量儀器、收款機(jī)、條形碼閱讀器、安全監(jiān)測系統(tǒng)、空氣調(diào)節(jié)系統(tǒng)和冷凍保鮮系統(tǒng)等,都采用了單片機(jī)構(gòu)成的專用系統(tǒng)。與通用計(jì)算機(jī)相比,這些系統(tǒng)由于比較封閉,可以更有效地防止病毒和電磁干擾等,可靠性更高。(4)工業(yè)自動(dòng)化    在工業(yè)控制和機(jī)電一體化控制系統(tǒng)中,除了采用工控計(jì)算機(jī)外,很多都是以單片機(jī)為核心的單片機(jī)和多機(jī)系統(tǒng)。(5)智能儀表與集成智能傳感器    目前在各種電氣測量儀表中普遍采用了單片機(jī)應(yīng)用系統(tǒng)來代替?zhèn)鹘y(tǒng)的測量系統(tǒng),使得測量系統(tǒng)具有存儲(chǔ)、數(shù)據(jù)處理、查詢及聯(lián)網(wǎng)等智能功能。將單片機(jī)和傳感器相結(jié)合,可以構(gòu)成新一代的智能傳感器。它將傳感器變換后的物理量作進(jìn)一步的變化和處理,使其成為數(shù)字信號(hào),可以遠(yuǎn)距離傳輸并與計(jì)算機(jī)接口。(6)現(xiàn)代交通與航空航天領(lǐng)域    通常應(yīng)用于電子綜合顯示系統(tǒng)、動(dòng)力監(jiān)控系統(tǒng)、自動(dòng)駕駛系統(tǒng)、通信系統(tǒng)以及運(yùn)行監(jiān)視系統(tǒng)等。這些領(lǐng)域?qū)w積、功耗、穩(wěn)定性和實(shí)時(shí)性的要求往往比商用系統(tǒng)還要高,因此采用單片機(jī)系統(tǒng)更加重要。單片機(jī)的基本結(jié)構(gòu)
   AT89S52單片機(jī)是一款低功耗、低電壓、高性能CMOS8位單片機(jī),片內(nèi)含8KB(可經(jīng)受1000次擦寫周期)的FLASH可編程可反復(fù)擦寫的只讀程序存儲(chǔ)器(EPROM),器件采用CMOS工藝和ATMEL公司的高密度,非易失性存儲(chǔ)器(NURAM)技術(shù)制造,其輸出引腳和指令系統(tǒng)都與MCS-51兼容,片內(nèi)的FLASH存儲(chǔ)器允許在系統(tǒng)內(nèi)可改編程序或用常規(guī)的非易失性存儲(chǔ)編程器來編程。因此,AT89C52是一種功能強(qiáng),靈活性高且價(jià)格合理的單片機(jī),可方便的應(yīng)用在各個(gè)控制領(lǐng)域[1]。
AT89S52具有以下主要性能:
1.8KB可改編程序FLASH存儲(chǔ)器;
2.全表態(tài)工作 :0~24HZ;
3.256X8字節(jié)內(nèi)部RAM;
4.32個(gè)外部雙向輸入,輸出(I、O)口;
引腳說明如圖2-2。


   

引腳功能說明如下[2]:
VCC:電源電壓。
GND:地。
P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數(shù)據(jù)線復(fù)用口。作為輸出口時(shí),每位能吸收電流的方式驅(qū)動(dòng)8個(gè)TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端。
在訪問外部數(shù)據(jù)儲(chǔ)存器或程序儲(chǔ)存器時(shí),這組口線分時(shí)轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。FLASH編程時(shí),P0口接收指令字節(jié),而在程序校驗(yàn)時(shí),輸出指令字節(jié),校驗(yàn)時(shí),要求外接上拉電阻。
P1口:P1是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作為輸入口。作為輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。FLASH編程和程序校驗(yàn)期間,P1接收低8位地址。
P2口:P2是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作為輸入口。作為輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。在訪問外部程序儲(chǔ)存器或16位地址的外部數(shù)據(jù)儲(chǔ)存器(例如執(zhí)行MOVX@DPTR指令)時(shí),P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)儲(chǔ)存器(例如執(zhí)行MOVX@RI指令)時(shí),P2口線上的內(nèi)容(也即特殊功能寄存器(SFR)區(qū)中R2寄存器的內(nèi)容),在整個(gè)訪問期間不改變。P3口:P3是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,P3的輸出緩沖級可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作為輸入口。作為輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流。
P3除了作為一般的I/O口線外,更重要的用途是它的第二功能,具體功能說明如表2-1。
P3口還接收一些用于FLASH閃速存儲(chǔ)器編程和程序校的控制信號(hào)。
RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將使單片機(jī)復(fù)位
ALE/PROG:當(dāng)訪問外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。
表2-1 P3口的第二功能表
  
端口引腳
      
第二功能
  
P3.0
      
RXD(穿行輸出口)
  
P3.1
      
TXD(穿行輸入口)
  
P3.2
      
INT0(外部中斷0)
  
  
P3.3
      
INT1(外部中斷1)
  
P3.4
      
T0(定時(shí)/計(jì)數(shù)器0)
  
P3.5
      
T1(定時(shí)/計(jì)數(shù)器0)
  
P3.6
      
WR(外部數(shù)據(jù)寫選通)
  
P3.7
      
RD(外部數(shù)據(jù)讀選通)
不訪問外部存儲(chǔ)器,ALE仍以是時(shí)鐘振蕩頻率的1/6輸出固定的正脈沖信號(hào),因此他可對外輸出時(shí)鐘或用于定時(shí)目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過一個(gè)ALE脈沖。對FLASH存儲(chǔ)器編程期間,該引腳還用于輸入編程脈沖(PROG)。
如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令A(yù)LE才會(huì)被激活。此外,該引腳會(huì)被微弱拉高,單片機(jī)執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE無效。
PSEN:程序儲(chǔ)存允許(PSEN)輸出是外部程序存儲(chǔ)器的讀選通信號(hào),當(dāng)AT80C51由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSEN有效,即輸出兩個(gè)脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器,這兩次有效的PSEN信號(hào)不出現(xiàn)。
EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序儲(chǔ)存器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需要注意的是:如果加密位LB1被編程,復(fù)位時(shí)內(nèi)部會(huì)鎖存EA端狀態(tài)。如EA端為高電平(Vcc端),CPU則執(zhí)行內(nèi)部程序儲(chǔ)存器中的指令。
FLASH儲(chǔ)存器編程時(shí),該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12v編程電壓。
XTAL1:振蕩器反相放大器的及內(nèi)部時(shí)鐘發(fā)生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端
單片機(jī)外圍電路設(shè)計(jì)復(fù)位電路設(shè)計(jì)
MCS-51的復(fù)位輸入引腳RST為MCS-51提供了初始化的手段,可以使程序從指定處開始執(zhí)行,在MCS-51的時(shí)鐘電路工作后,只要RST引腳上出現(xiàn)超過兩個(gè)機(jī)器周期以上的高電平時(shí),即可產(chǎn)生復(fù)位的操作,只要RST保持高電平,則MCS-51循環(huán)復(fù)位,只有單RET由高電平變成低電平以后,MCS-51才從0000H地址開始執(zhí)行程序,本系統(tǒng)采用按鍵復(fù)位方式的復(fù)位電路。
                                 
外部晶振時(shí)鐘電路設(shè)計(jì)
MCS-51的時(shí)鐘可以由兩種方式產(chǎn)生,一種是內(nèi)部方式,利用芯片內(nèi)部的振蕩電路;另外一種為外部方式,本論文根據(jù)實(shí)際需要和簡便,采用內(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)諧振電路接在放大器的反饋回路中,對接電容的值雖然沒有嚴(yán)格的要求,但電容的大小會(huì)影響振蕩頻率的高低,振蕩器的穩(wěn)定性,起振的快速性和溫度的穩(wěn)定性。晶振的頻率可在1.2MHZ~12MHZ之間任選,電容C1和C2的典型值在20pf~100pf之間選擇,由于本系統(tǒng)用到定時(shí)器,為了方便計(jì)算,采用了12MHZ的晶振,采用電容選擇30pf。
顯示模塊電路設(shè)計(jì)
該模塊由共陽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)亮的余輝和人眼的視覺暫留原理,則看起來數(shù)碼管是同時(shí)被點(diǎn)亮的。
        
從設(shè)計(jì)完成的任務(wù)與要求來看,顯示通行時(shí)間必須用二位數(shù)碼管,從節(jié)省硬件資源的角度考慮,可采用掃描的方式來處理,對于7段數(shù)碼管,占用7個(gè)單片機(jī)的I/O口,另外設(shè)置2個(gè)電子開關(guān)對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來作為中央處理器。這款單片機(jī)的I/O口作為輸出時(shí),具有較大的吸收電流能力,因此我們可以選用共陽型數(shù)碼管,這樣由單片機(jī)的I/O口就可以直接驅(qū)動(dòng),能簡化硬件電路的設(shè)計(jì)。
三、軟件設(shè)計(jì)交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)
交通信號(hào)燈由紅燈、綠燈、黃燈組成。紅燈表示禁止通行,綠燈表示準(zhǔn)許通行,黃燈表示警示。交通信號(hào)燈分為機(jī)動(dòng)車信號(hào)燈、非機(jī)動(dòng)車信號(hào)燈、人行橫道信號(hào)燈、車道信號(hào)燈、方向指示信號(hào)燈、閃光警告信號(hào)燈、道路與鐵路平面交叉道口信號(hào)燈。交通信號(hào)燈用于道路平面交叉路口,通過對車輛、行人發(fā)出行進(jìn)或停止的指令,使各同時(shí)到達(dá)的人、車交通流盡可能減少相互干擾,從而提高路口的通行能力,保障路口暢通和安全。因此必須合理的設(shè)計(jì)路口主干道的系統(tǒng)。
十字路口交通信號(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)燈變化表:
  
交通信號(hào)燈變化表
  
  
東西
      
綠燈亮
   
黃燈亮
   
紅燈亮
25S
   
5S
   
20S
  
南北
      
紅燈亮
   
綠燈亮
   
黃燈亮
30S
   
15S
   
5S
(2)在交通信號(hào)燈亮和閃爍的同時(shí),路口設(shè)有兩位七段碼的顯示器倒數(shù)計(jì)時(shí),讓車輛行人能夠清楚地知道再過多久信號(hào)燈就會(huì)發(fā)生變化。以便于司機(jī)和行人能夠在有限的時(shí)間內(nèi)準(zhǔn)確的通行。
十字路口交通信號(hào)燈示意圖
    交通信號(hào)燈共有12盞,每個(gè)路口各有紅,黃,綠三盞,具體分布如下圖所示:
交通信號(hào)燈控制系統(tǒng)程序編制 軟件設(shè)計(jì)應(yīng)用環(huán)境
本設(shè)計(jì)軟件的設(shè)計(jì)是在Keil C51的環(huán)境下編譯的。Keil C51是美國KeilSoftware公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到KeilC51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級語言的優(yōu)勢。C語言有以下特點(diǎn):
1、語言簡潔、緊湊、使用方便、靈活。C語言一共只有32個(gè)關(guān)鍵字,9種控制語句,程序書寫自由,主要用小寫字母表示,壓縮了一切不必要的成分。
2、運(yùn)算符豐富。C的運(yùn)算符包含的范圍很廣泛,共有34種運(yùn)算符,使得C的運(yùn)算類型極其豐富,表達(dá)式類型多樣化,靈活使用各種運(yùn)算符可以實(shí)現(xiàn)在其他高級語言中難以實(shí)現(xiàn)的運(yùn)算。
3、數(shù)據(jù)結(jié)構(gòu)豐富,具有現(xiàn)代化語言的各種數(shù)據(jù)結(jié)構(gòu),能用來實(shí)現(xiàn)各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的運(yùn)算。
4、具有結(jié)構(gòu)化的控制語句,用函數(shù)作為程序的模塊單位,便于實(shí)現(xiàn)程序的模塊化。
5、語法限制不太嚴(yán)格,程序設(shè)計(jì)自由度大。
6、C語言能進(jìn)行位操作,能實(shí)現(xiàn)匯編語言的大部分功能,可以直接對硬件進(jìn)行操作。因此,C既具有高級語言的功能,又具有低級語言的許多功能,可用來寫系統(tǒng)軟件。C語言的這種雙重性,使它既是成功的系統(tǒng)描述語言,又是通用的程序設(shè)計(jì)語言。
7、生成目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。
8、用C語言寫的程序可移植性好。基本上不用修改就能用于各種型號(hào)的計(jì)算機(jī)和各種操作系統(tǒng)。
對操作系統(tǒng)和系統(tǒng)實(shí)用程序以及需要對硬件進(jìn)行操作的場合,用C語言明顯地優(yōu)勢于其他高級語言,有的大型應(yīng)用軟件也用C語言來編寫。
軟件設(shè)計(jì)流程
軟件總體設(shè)計(jì)主要完成各部分的軟件控制和協(xié)調(diào)。本系統(tǒng)主程序模塊主要完成的工作是對系統(tǒng)的初始化,發(fā)送顯示數(shù)據(jù),同時(shí)對鍵盤進(jìn)行掃描,等待外部中斷,以及根據(jù)所需要的功能進(jìn)行相應(yīng)的操作。
交通燈根據(jù)其顯示情況可以分為四個(gè)狀態(tài),可以通過定時(shí)來控制每個(gè)狀態(tài)的時(shí)間;通過定時(shí)也可以向LED數(shù)碼管中每隔1秒送一個(gè)數(shù),顯示該狀態(tài)剩余的時(shí)間。其流程圖如圖所示。
        圖4-1  主程序框圖
交通燈定時(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用來設(shè)置T0、T1的工作方式。這次實(shí)習(xí)中設(shè)置TMOD=0x01,即T0工作于方式0(16位定時(shí)器)。
內(nèi)部定時(shí)器/計(jì)數(shù)器用作定時(shí)器時(shí),是對機(jī)器周期計(jì)數(shù),每個(gè)機(jī)器周期的長度是12個(gè)振蕩周期。定時(shí)常數(shù)的設(shè)置可用一下方式計(jì)算:
機(jī)器周期=12/12MHz=1us
(65536-定時(shí)常數(shù))*1.0us=50ms
所以定時(shí)常數(shù)是50000。
源程序代碼
#include <reg52.h>                 //調(diào)用單片機(jī)頭文件
#define uchar unsigned char   //宏定義"uchar"代替"unsignedchar"。
#define uint  unsigned int      //宏定義"uint"用來定義無符號(hào)整型數(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ù)碼管的個(gè)位數(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; //東西  南北 倒計(jì)時(shí)變量
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ù)時(shí)間
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;   //東西、南北的時(shí)間
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()
* 功能 : 延時(shí)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);
         }
}
/*********************定時(shí)器0、定時(shí)器1初始化******************/
void time0_init()      
{
         EA  = 1;            //開總中斷
         TMOD= 0X11;           //定時(shí)器0、定時(shí)器1工作方式1
         ET0= 1;              //開定時(shí)器0中斷
         TR0= 1;              //允許定時(shí)器0定時(shí)
//     ET1= 1;              //開定時(shí)器1中斷
//     TR1= 1;              //允許定時(shí)器1定時(shí)         
}
/*********************交通燈處理函數(shù)*********************************/
void jiaotongdeng_dis()
{
         if(flag_1s== 1)
         {
                  flag_1s= 0;
                  if(dx_s== 0)
                  {
                          if(flag_dx_nb== 1)
                                   dx_s= nb_time;        //南北時(shí)間
                          else
                                   dx_s= dx_time;         //東西時(shí)間
                          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] ;
/***********************南北時(shí)間*********************************/
                  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)             //當(dāng)小于5秒時(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;//滅
                                   }
                          }
                  }
/***********************東西時(shí)間*********************************/
                  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)             //當(dāng)小于5秒時(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;         //滅
                                   }
                          }
         }                        
}
/********************獨(dú)立按鍵程序*****************/
uchar key_can;         //按鍵值
void key()         //獨(dú)立按鍵程序
{
         staticuchar key_new;
         key_can= 20;                   //按鍵值還原
         P1|= 0x1f;
         if((P1& 0x1f) != 0x1f)              //按鍵按下
         {
                  delay_1ms(1);            //按鍵消抖動(dòng)
                  if(((P1& 0x1f) != 0x1f) && (key_new == 1))
                  {                                                   //確認(rèn)是按鍵按下
                          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è)置函數(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)         //設(shè)置鍵
         {
                  menu_1++;
                  if(menu_1>= 3)
                  {
                          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<= 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] ;           //顯示東西設(shè)置的時(shí)候
                  dis_smg[3]= 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<= 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] ;          //顯示東西設(shè)置的時(shí)候
                  dis_smg[3]= smg_du[nb_time / 10] ;   
         }
}
/********************************************************************
* 名稱 : main()
* 功能 : 實(shí)現(xiàn)燈的閃爍
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void main()
{
         time0_init();
         dx_s= nb_time;        //東西時(shí)間
         while(1)
         {
                  key();
                  if(key_can< 20)
                          key_with();
//              menu_dis();
                  if((menu_1== 0) && (flag_jdgz == 0))
                          jiaotongdeng_dis();
                  display();
         }
}  
/*********************定時(shí)器0中斷服務(wù)程序************************/
void time0_int() interrupt 1  
{                                                      
         staticuchar value;                    //定時(shí)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.       測試
三、設(shè)計(jì)總結(jié)
本論文介紹了一種基于AT89S52單片機(jī)的交通燈的設(shè)計(jì)方法,本論文完成了系統(tǒng)的硬件設(shè)計(jì)與制作,詳細(xì)介紹了系統(tǒng)硬件設(shè)計(jì)的過程,并結(jié)合軟件系統(tǒng)完成了整個(gè)系統(tǒng)的軟、硬件聯(lián)調(diào),系統(tǒng)工作良好,實(shí)現(xiàn)了基本功能。
通過本次設(shè)計(jì),鞏固了我學(xué)習(xí)過的專業(yè)知識(shí),也使我把理論與實(shí)踐從真正意義上相結(jié)合了起來,鍛煉了借助互聯(lián)網(wǎng)絡(luò)搜集、查閱相關(guān)文獻(xiàn)資料和組織材料的綜合能力,從中我也認(rèn)識(shí)到自己的不足之處,我會(huì)在日后的學(xué)習(xí)中加以改進(jìn)與提高。
經(jīng)過這次設(shè)計(jì),我在各方面都有很大的提高。學(xué)到了很多不曾學(xué)過的東西,也使我學(xué)會(huì)了更好地利用一些資源和工具如圖書館及一些軟件查閱資料。在設(shè)計(jì)過程中也遇到很多的困難,遇到一些原理性不懂的時(shí)候就要去有針對性地查找資料或者請教知道老師和其他同學(xué),然后加以吸收利用,提高了自己的應(yīng)用能力,擴(kuò)充了自己的知識(shí)儲(chǔ)備,同時(shí)提高了動(dòng)手能力。
四、參考文獻(xiàn)
[1] 劉勇.數(shù)字電路[M].電子工業(yè)出版社.2004
[2] 楊子文.單片機(jī)原理及應(yīng)用[M].西安電子科技大學(xué)出版社.2006
[3] 劉華東.單片機(jī)原理與應(yīng)用(第2版)[M].電子工業(yè)出版社.2006.8
[4] 胡漢才.單片機(jī)原理及其接口技術(shù)[M].清華大學(xué)出版社,2006.
[5] 沈精虎.電路設(shè)計(jì)與制版Protel99入門與提高[M].人民郵電出版社,2004.
[6] 范風(fēng)強(qiáng),蘭嬋麗.單片機(jī)語言C51應(yīng)用實(shí)戰(zhàn)集錦[M].電子工業(yè)出版社.,2001.
[7] 顧曙敏.單片機(jī)與串行時(shí)鐘DS1307的接口設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2003,26(14)85-87.
[8] 孫曉燕.基于8051單片機(jī)的交通燈控制系統(tǒng)設(shè)計(jì)與模擬[J].南寧職業(yè)技術(shù)學(xué)院學(xué)報(bào),2007年03期.
[9] 陳毅,許飛,王學(xué)飛.基于單片機(jī)的交通燈智能控制系統(tǒng)[J].中國高新技術(shù)企業(yè),2009年第15期.
.單片機(jī)原理與應(yīng)用(第2版)[M].電子工業(yè)出版社.2006.8
[4] 胡漢才.單片機(jī)原理及其接口技術(shù)[M].清華大學(xué)出版社,2006.
[5] 沈精虎.電路設(shè)計(jì)與制版Protel99入門與提高[M].人民郵電出版社,2004.
[6] 范風(fēng)強(qiáng),蘭嬋麗.單片機(jī)語言C51應(yīng)用實(shí)戰(zhàn)集錦[M].電子工業(yè)出版社.,2001.
[7] 顧曙敏.單片機(jī)與串行時(shí)鐘DS1307的接口設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2003,26(14)85-87.
[8] 孫曉燕.基于8051單片機(jī)的交通燈控制系統(tǒng)設(shè)計(jì)與模擬[J].南寧職業(yè)技術(shù)學(xué)院學(xué)報(bào),2007年03期.
[9] 陳毅,許飛,王學(xué)飛.基于單片機(jī)的交通燈智能控制系統(tǒng)[J].中國高新技術(shù)企業(yè),2009年第15期.



作者: a89588038    時(shí)間: 2018-7-26 15:17
好貼   ,簡直就是神操作,讓那些學(xué)生直接搬運(yùn)過去




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1