附件里面有 程序 原理圖 pcb 實物圖 有興趣的小伙伴 可以看看
制作出來的實物圖如下:
0.png (447.79 KB, 下載次數(shù): 172)
下載附件
2018-12-5 02:00 上傳
第二章 單片機控制的交通燈的設計方案
第一節(jié) 系統(tǒng)工作原理和方案
第二節(jié) 本課題主要內(nèi)容
第三章 交通燈的硬件設計
第一節(jié) 電源模塊設計
第二節(jié) 單片機控制模塊設計
一、方案選擇
二、復位電路
三、晶振電路
第三節(jié) LED顯示模塊
一、LED數(shù)碼管介紹
二、LED數(shù)碼管顯示原理
第四節(jié) 按鍵設置模塊
第四章 交通燈的軟件設計
第一節(jié) 主函數(shù)流程
第二節(jié) 中斷程序模塊
第三節(jié) 數(shù)碼管顯示模塊
第四節(jié) 交通燈電路
第五節(jié) 倒計時顯示器電路
第六節(jié) 交通燈設計總電路圖
第五章 Proteus仿真
第一節(jié) Proteus軟件介紹
第二節(jié) Proteus仿真圖片
第六章 調(diào)試心得
結(jié) 論
致 謝
參考文獻
附 錄
一、英文原文
The General Situation of AT89C51
二、英文翻譯
AT89C51概述
三、源程序
第二章 單片機控制的交通燈的設計方案
第一節(jié) 系統(tǒng)工作原理和方案
設計的系統(tǒng)應用在一個車流量大的十字交叉路口,縱向南北方向作為主干道,橫向東西方向為支干道。主、支干道交替通行,兩個干道上的交通燈工作方式同時進行,主干道每次放行15秒,支干道每次放行10秒;每次綠燈變紅之前,黃燈先亮3秒,此時另一干道上的紅燈并閃爍。 主干道和支干道各由一組三色交通燈來控制,分別是主干道方向的紅、黃、綠以及支干道方向的紅、黃、綠。邏輯分析可知,當主干道為綠燈通行時,支干道必須為紅燈禁行;綠燈結(jié)束后,主干道進入黃燈等待狀態(tài),支干道紅燈閃爍;黃燈結(jié)束后,主干道變?yōu)榧t燈禁行,支干道變?yōu)榫G燈通行;支干道綠燈結(jié)束后,支干道進入黃燈等待狀態(tài),主干道紅燈閃爍,如此循環(huán)。從這個過程中可以看出,交通燈控制共分4個狀態(tài),分別為:S1狀態(tài),主干道方向為綠燈,支干道方向為紅燈;S2狀態(tài),主干道方向為黃燈,支干道紅燈閃爍;S3狀態(tài),主干道方向為紅燈,支干道方向為綠燈;S4狀態(tài),支干道方向為黃燈,主干道紅燈閃爍,這四個狀態(tài)不斷循環(huán)。由此我們可以列出4個狀態(tài)的列表和做出4個狀態(tài)的流程圖。 表2.1 信號燈狀態(tài)表
圖2.1 交通燈流程圖
系統(tǒng)設置有4個按鍵,分別為Enter鍵,+鍵,-鍵和Shift鍵。Enter鍵是對設置的確認,+和-是對設置參數(shù)做調(diào)整,Shift鍵是對程序運行和參數(shù)設置兩種狀態(tài)的切換。當系統(tǒng)上電或手動復位之后,默認模式下會按照斷電前程序里記錄的參數(shù)運行。若此時Shift鍵按下,則設置為參數(shù)設置狀態(tài),數(shù)碼管上顯示原本記錄的參數(shù)并閃爍,可通過+或-鍵對參數(shù)進行修改,最后按下Enter鍵將新參數(shù)保存。

圖2.2 系統(tǒng)整體框架圖
然后系統(tǒng)控制狀態(tài)燈和LED數(shù)碼管的顯示,將狀態(tài)碼值以及顯示的時間值的個位和十位送到相應IO口,通過定時器設定1s定時,當定時時間達到時產(chǎn)生定時器中斷,在中斷中將時間減一,然后刷新LED數(shù)碼管的顯示。直到時間值被減為0,判斷下一個指示燈狀態(tài)并裝入對應的狀態(tài)代碼和時間值的狀態(tài)。
圖2.2狀態(tài)燈和LED顯示圖
第二節(jié) 本課題主要內(nèi)容
本課題的主要內(nèi)容是設計了一種基于AT89C51單片機的控制的交通燈設計。這次設計以單片機為主要控制器,可以方便的實現(xiàn)十字路口交通燈的控制,實現(xiàn)行人與車流的分流,該系統(tǒng)控制期間各路轉(zhuǎn)彎不再進行。擬解決的主要問題: ①模擬交通信號燈的交替變換。 ②系統(tǒng)硬件設計與實現(xiàn)。 ③系統(tǒng)軟件設計。 ④系統(tǒng)軟硬件綜合調(diào)試。 研究主要方法: 本設計根據(jù)實際交通法則模擬基本的交通控制系統(tǒng),用紅色LED表示禁行,綠色LED表示通行,黃色LED表示等待的信號,每個方向有一組LED數(shù)碼管,可以倒計時顯示提醒行駛者。據(jù)此,本設計系統(tǒng)以單片機為控制核心,連接成最小系統(tǒng),和按鍵設置模塊等產(chǎn)生輸入,信號燈狀態(tài)模塊,LED倒計時模塊。 研究要求: ①單片機型號:AT89C51 ②縱向為主干道,橫向為支干道。主、支干道交替通行,兩個干道上的交通燈工作方式同時進行。 ③主干道每次放行15秒,支干道每次放行10秒。 ④每次綠燈變紅之前,黃燈先亮3秒,此時另一干道上的紅燈并閃爍。 ⑤給出整個系統(tǒng)的結(jié)構(gòu)圖、軟硬件流程
第三章 交通燈的硬件設計
第一節(jié) 電源模塊設計
系統(tǒng)要想正常而穩(wěn)定的運行,必須要有一套穩(wěn)定的電源電路。為了給單片機和各種芯片提供工作電壓,需要將交流220V轉(zhuǎn)換為直流5V。 根據(jù)模擬電路學到的知識,轉(zhuǎn)換過程如圖3.1所示: 變壓器經(jīng)過一個保險絲連接電源,變壓器或后面的電路如果發(fā)生短路,保險絲會因大電流引發(fā)的高溫溶化而斷開,從而保證后續(xù)電路不會受大電流的損壞。 變壓器后面是一個橋式整流電路,整流后會得到一個紋波很大的直流電源,還需要接一個1000uF/25V的電解電容濾除紋波。 變壓器輸出端的電壓經(jīng)過橋式整流并電容濾波,如果電容兩端直接接負載,當負載變化或交流電源電壓出現(xiàn)波動時,電解電容C1兩端的電壓會發(fā)生較大幅度變化,要得到一個比較穩(wěn)定的電壓,需要在這里接一個三端穩(wěn)壓器。 當負載電流大時穩(wěn)壓器內(nèi)的電阻會變小,當負載電流變小時三端穩(wěn)壓器內(nèi)的電阻又會變大,使的穩(wěn)壓器的輸出電壓基本保持不變。 單片機和大多數(shù)功能芯片的輸入電壓都是直流5V,這里我們需要將交流220V經(jīng)過變壓器轉(zhuǎn)換為9V的電壓,整流后經(jīng)7805穩(wěn)壓成直流5V。LM7805最大輸出電流為1A,內(nèi)部有限流式短路保護,短時間內(nèi)輸出端對地(2腳)短路不會燒壞7805。 三端穩(wěn)壓器后面接一個104的瓷片電容,起濾波和阻尼作用。
圖3.1 220V交流穩(wěn)壓成5V直流原理
第二節(jié) 單片機控制模塊設計
一、方案選擇方案一:AVR單片機。AVR不是一個簡單的外設功能的疊加,但更多的模型以滿足不同設計開發(fā)者的實際需要,同時可以提供一個低成本的OTP芯片。此外,PIC是低功耗的睡眠功能、深度睡眠、上電、掉電復位電路、看門狗電路,外圍設備,占用空間小;成本低,安全技術(shù)也非常可靠,能夠最大程度地滿足開發(fā)者的實際要求。因此,在工業(yè)控制,PIC單片機被廣泛的應用到各行各業(yè)的控制中,其穩(wěn)定性、系統(tǒng)功耗等都為廣大開發(fā)者認可。價格相比同性能產(chǎn)品在中上游水平。 方案二:PIC24H64GP506是16位RISC混合信號處理器,具有以下特點: 工作電壓低,最低工作電壓1.8V下正常工作。 功耗小,在運行模式下,只有200mA的工作電流,在休眠和待機模式下只有3ma的電流,在power off狀態(tài)下只需要用0.1mA;運行狀態(tài)中包含提供6種運行模式,3個時鐘信號,包括1個高頻率的時鐘,1個低頻時鐘和1的DCO,靈活的時鐘選擇使系統(tǒng)能夠在最合理的時鐘工作,大大降低了系統(tǒng)功耗,便于系統(tǒng)的設計。 豐富的外設接口,包括標準的UART,SPI、I2C接口,可以和具有相同接口的設備連接進行通訊采集相關(guān)外設的數(shù)據(jù)。該MCU,具有256位RAM和8 kbit Flash內(nèi)部;中斷喚醒功能,可以通過中斷使單片機從睡眠模式到主動模式。 方案三:選擇價格低廉的51系列單片機,具有51內(nèi)核的低功耗、高性能的8位單片機,內(nèi)含4K字節(jié)Flash只讀程序存儲器,兼容MCS-51指令和80C5l引腳結(jié)構(gòu),功能強大的微型計算機的AT89C51為工業(yè)控制應用系統(tǒng)提供低成本、高可靠性的解決方案。它具有如下特點:128字節(jié)內(nèi)部RAM,32個I/O口線,看門狗,兩個16位定時和計數(shù)單元,一個5兩級中斷結(jié)構(gòu)的向量,一個UART通信口,內(nèi)部晶振和時鐘電路。 根據(jù)系統(tǒng)實際需要,最終選擇成本低廉,便于操作的51系列單片機,型號為STC80C51。如圖3.2所示為51系列單片機內(nèi)核示意圖,圖3.3所示為AT80C51單片機最小系統(tǒng)電路圖。

圖3.2 8051單片機內(nèi)核結(jié)構(gòu)示意圖

圖3.3 STC80C51單片機最小系統(tǒng)電路圖
二、復位電路單片機最小系統(tǒng)是指一個微控制器系統(tǒng)可以正常工作需要具備的最少的元件構(gòu)成的系統(tǒng)。51系列單片機的最小系統(tǒng)一般應包括:單片機,晶振電路,復位電路。 復位電路由電阻電容和電阻串聯(lián)組成,根據(jù)電容電壓不能突然改變的性質(zhì)可以知道,一個系統(tǒng)上電,RST引腳默認為低電平,RC電路來決定高電平的時間。一個典型的51單片機,當RST引腳為高電平兩個機器周期以上的將被重置,所以RC值要選擇適當,才能確保可靠的復位,根據(jù)t=R*C,t要大于兩個機器周期,選擇電阻阻值為10k,電容容值為10uF。當然還有其他的參數(shù)組合,只要滿足原理使RC組合可以產(chǎn)生在RST引腳置高至少兩個機器周期。至于如何具體量化的計算,可以參考電路分析的書籍。 單片機復位電路就像電腦的重啟,按下復位按鈕內(nèi)部的程序?qū)念^開始運行。單片機系統(tǒng)在運行中,可能因為環(huán)境干擾等因素導致運行失控,就可以通過復位按鍵實現(xiàn)對單片機系統(tǒng)的重新啟動。 在電路圖中,電容器的容值為10uF,電阻器阻值為10k。所以根據(jù)公式,充電電容器增大到0.7倍電源電壓,即設備電源是5V,充電電容器電壓增長到5*0.7=3.5V這一過程所需要的時間是10K * 10UF = 0.1S。 也就是說,在計算機啟動0.1S的過程中,電容兩端的電壓會從0增大到3.5V。這段時間內(nèi)在電阻10K兩端的電壓會降低到1.5V(串聯(lián)周圍電路中的電壓和總電壓)。所以在0.1S,RST引腳電壓為5V?1.5V。微控制器啟動之后0.1S,電容C連續(xù)充電到5V,這是10K電阻兩端的電壓接近0V,RST在低電平,以使系統(tǒng)正常工作。當按下按鈕時,該開關(guān)被接通時,這時在電容器兩端形成環(huán)路,電容器被短路,電容器放電。隨著時間的推移,電容器兩端的電壓,從5V釋放成為1.5V,或甚至更小。這時10K電阻器兩端的電壓達到3.5V,或甚至更多,所以RST引腳變?yōu)楦唠娖剑瑔纹瑱C系統(tǒng)自動復位。 原則是微控制器復位電路RST引腳接收超過2US的高電平信號,只要電容器充電和放電時間大于2US,即可復位,該電路的電容值和電阻值可以根據(jù)實際電路做修改。按復位鍵,使電容短路,釋放之前儲存的能量,使電阻兩端電壓升高,從而給RST引腳一個高電平。
三、晶振電路晶振電路是由振蕩晶體和兩個電容組成,為單片機提供指令時鐘。對于51系統(tǒng),外部晶振通常選擇11.0592MHz,這樣可以產(chǎn)生精準的微秒級別的機器時間,準確地得到9600bps和19200bps,用于有串口通訊的場合,方便定時操作。晶振電路在PCB布線設計時一定要盡量靠近單片機,并且兩個引腳到單片機的走線盡量一樣長,如果偏差太大會導致起振不良,或者計時不準確。晶振電路的地一定要和單片機的地共地,51單片機最小系統(tǒng)晶振在正常工作的情況下可以采用更高頻率的晶振,51單片機最小系統(tǒng)晶振的振蕩頻率直接影響單片機的處理速度,頻率越大處理速度越快。在晶振頻率的選擇上,在能夠滿足系統(tǒng)需要的前提下盡可能的選擇低頻率的晶振,晶振頻率越低其功耗的能量越低,所以并不是晶振頻率越高越好,要根據(jù)實際情況對頻率和功耗進行取舍。 單片機的外部晶振如果單獨跟單片機連接,理論上也是可以起振使單片機工作的,只是這樣的結(jié)構(gòu)會使電路中產(chǎn)生很多其他頻率的諧波,諧波會降低時鐘振蕩器的穩(wěn)定性。因此,在外部晶振的旁邊會通過加一對起振電容去過濾諧波。起振電容的容值沒有特別固定的值,根據(jù)不同的單片機會有不同的選擇范圍,51系列單片機的起振電容一般在15~30pF,在做PCB布線時起振電容離晶振越近越好,而晶振離單片機也是越近越好
第三節(jié) LED顯示模塊
一、LED數(shù)碼管介紹LED數(shù)碼管是由多個發(fā)光二極管被封裝在一起,以形成“8”字形的裝置,引線被連接在內(nèi)部,每個二極管有自己的一個引腳,他們共同具有一個公共電極。數(shù)碼管里有顯示7段和一個小數(shù)點的8個發(fā)光二極管,就會看到相應的數(shù)碼管段被點亮。 當一個特定的段的LED被施加電壓時,這些特定的段將被點亮,以形成我們眼睛看到的圖像。8段LED數(shù)碼管只能顯示簡單的0~9的阿拉伯數(shù)字和A~F的英文字母,有一些段數(shù)比較多的LED可以顯示更多的內(nèi)容,總之,數(shù)碼管還是以顯示數(shù)字和字母為主,復雜的顯示信息還是需要考慮使用液晶之類的更為復雜的電子器件。如圖3.4所示為8段LED數(shù)碼管示意圖。

圖3.4 LED數(shù)碼管示意圖
二、LED數(shù)碼管顯示原理LED數(shù)碼管主要是通過點亮相應段的發(fā)光二極管,在視覺上給人們顯示出各個數(shù)字和字母的形狀,驅(qū)動LED數(shù)碼管的方式有兩種,一種是靜態(tài)顯示驅(qū)動,另一種是動態(tài)顯示驅(qū)動。靜態(tài)顯示驅(qū)動,也被稱為直流驅(qū)動。靜態(tài)驅(qū)動的裝置,每個段需要由單片機的一個I / O口來驅(qū)動,或者作為BCD碼兩用。靜態(tài)驅(qū)動的優(yōu)點是編程簡單,顯示亮度高,缺點是占用I/ O端口多,加入需要驅(qū)動4個8段的數(shù)碼管,則需要4*8=32個IO口,而51單片機可用的I/O端口一共只有32。我們在實際應用中必須增加的編解碼驅(qū)動器,來減少I/O口的浪費,同時也增加了硬件電路的復雜性。第二種是動態(tài)顯示驅(qū)動,數(shù)碼管動態(tài)顯示方式在微控制器中被廣泛使用。動態(tài)顯示是利用了人眼具有視覺停留現(xiàn)象,即人眼在看到某一景物后,在很短的時間內(nèi),即使該景物消失,在人眼中還會保留該景物的像。動態(tài)顯示就是將數(shù)字按照個十百千位的格式分開,根據(jù)各個位的數(shù)字分別控制點亮對應數(shù)碼管的發(fā)光二極管的段。每次只點亮一個位對應的數(shù)碼管,其他位的數(shù)碼管被熄滅。 通過依次控制每個LED數(shù)碼管的COM端,它使每一個對應的數(shù)字顯示,這是一個動態(tài)的過程。反過來顯示,每位數(shù)碼管點亮時間為1?2毫秒,由于人的視覺和發(fā)光二極管的余輝效應的持續(xù)性的現(xiàn)象,盡管你不是在同一時間點亮數(shù)碼管,但事實只要掃描速度足夠快,給人的印象是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感,動態(tài)顯示和靜態(tài)顯示的效果是一樣的,但是可以節(jié)省大量的I / O端口,以及更低功耗。因此動態(tài)顯示更為廣泛的被應用。 第四節(jié) 按鍵設置模塊
鍵盤是最常用的單片機系統(tǒng)的人機界面,根據(jù)組合形式可分為兩種:獨立式和陣列式。獨立式鍵盤由于一個按鍵需要對應一個IO口,因此適合用于按鍵數(shù)量少的場合;陣列式是通過橫向和縱向交叉檢測,可以將IO口的使用數(shù)量呈指數(shù)減少,例如三根橫向和三根縱向線交叉可以實現(xiàn)9個鍵碼的分辨,如果按獨立式鍵盤設計,需要9個IO口,而陣列式鍵盤只需要6個IO口,按鍵數(shù)量越多,可以節(jié)省的IO口就越多,所以陣列式非常適用于需要按鍵較多的情況,本系統(tǒng)需要小按鈕控制,單片機的I / O端口足夠,可直接使用獨立式設計。按鍵電路原理圖如圖3.7所示。

圖3.7 獨立式按鍵電路 鍵盤開關(guān)矩陣由多個按鈕組成,是單芯片系統(tǒng)中最常用的輸入裝置,可以將命令,地址和數(shù)據(jù)輸入給單片機。通常單片機系統(tǒng)采用非編碼鍵盤,非編碼鍵盤由軟件識別的鍵盤上的按鍵,它具有結(jié)構(gòu)簡單,靈活的特點,因此被廣泛應用于微處理器系統(tǒng)。鍵盤按鈕分為接觸式和非接觸式兩種,微控制器應用的按鍵通常由一個機械鍵盤接觸組成。 當開關(guān)K沒有被按下時,KeyIn由于通過4.7K的上拉電阻與5V電源連接,因此輸入為高,當K閉合后,KeyIn與GND短接,輸入為低電平。也就是說,程序檢測按鍵是否按下的方法是檢測對應IO由高電平變成低電平,就表示該按鍵被按下。 但是由于按鍵結(jié)構(gòu)采用的是機械觸點,機械觸電在狀態(tài)變化的瞬間會產(chǎn)生電壓的波動,這種抖動對于人的感知來說是極快的,根本感覺不到,但對于處理速度達到微秒級甚至納秒級的單片機來說,這就是一段很長的時間了,在這段時間里,所有的電壓波動都能被單片機一一檢測到,單純的只是檢測IO的邊沿變化就會在機械觸電處于不穩(wěn)定狀態(tài)時誤認為是按鍵被按下,而且會出現(xiàn)多次。如果設置為中斷查詢,程序就是頻繁的進入中斷函數(shù)。 解決這種問題的方法也很簡單,就是我們通常所說的去抖。原理就是避開機械觸點物理上會產(chǎn)生不穩(wěn)定電壓的時間段,再去檢測IO口的電平。不管是通過輪詢檢測還是中斷檢測,一旦檢測到按鍵IO口電平狀態(tài)相比默認狀態(tài)發(fā)生改變,則加入一小段延時,一般為幾十個毫秒,延時過后,再去檢測IO的電平,如果又變回默認狀態(tài),就說明這屬于干擾導致的按鍵抖動,不需要處理;反之,則是真正的按鍵被按下的信號。 根據(jù)去抖的原理,我們也可以發(fā)現(xiàn),去抖的延時時間也不能設置太長,否則會出現(xiàn)延時結(jié)束時按鍵早已經(jīng)被松開,這樣就導致有按鍵被按下卻無法識別到。按鈕在實際應用中千差萬別,要根據(jù)實際按鍵的方式以及硬件電路等多方面因素去靈活運用,但以上的去抖原則是一定要遵循的。 第四章 交通燈的軟件設計
第一節(jié) 主函數(shù)流程
在主函數(shù)流程中,首先單片機要實現(xiàn)自身寄存器的初始化,定時器初始化以及數(shù)碼管和紅綠燈狀態(tài)顯示控制,因為在運行過程中,數(shù)碼管需要顯示倒計時的時間,單片機可利用定時器T0和T1進行計時,設置定時器中斷,在中斷函數(shù)中對時間進行刷新。對于系統(tǒng)按鍵的檢測可以使用主循環(huán)輪詢方式,也可以采用外部中斷處理方式。為了更加快速的響應按鍵信息,在程序中通過外部中斷來實現(xiàn)按鍵的檢測。 根據(jù)系統(tǒng)程序運行的特點分析,每個交通燈的狀態(tài)都是從S1->S2->S3->S4->S1,如此循環(huán)往復,這些狀態(tài)是固定的,而從一個狀態(tài)轉(zhuǎn)變?yōu)榱硪粋狀態(tài)的條件也是固定的,所以,在編程時采用狀態(tài)機的處理方式是最合適的,狀態(tài)機會比普通的邏輯羅列要清楚的多,也不易于出現(xiàn)邏輯上的錯誤,只是需要把各個狀態(tài)都考慮清楚,不要留有狀態(tài)上的漏洞。如圖4.1所示為系統(tǒng)主函數(shù)流程圖。

圖4.1 系統(tǒng)主函數(shù)流程圖 狀態(tài)機是在軟件程序設計中的一個重要的概念。例如,一個按鈕命令,它可以被看作是一個狀態(tài)機:一個狀態(tài)為A,按下按鈕后切換到B狀態(tài);然后觸發(fā)另一個鍵切換到C的狀態(tài),或者返回的狀態(tài)。這是關(guān)鍵的狀態(tài)機的最簡單的例子。實際分析方法比這些要復雜的多,但是這并不影響我們的狀態(tài)機的理解。此外,按鍵本身可以被看作是一個狀態(tài)機。一個小按鍵,包括:釋放,抖動,閉合,抖動等狀態(tài)。 要保證程序高效穩(wěn)定的運行,除了各個功能模塊程序,還需要一個重要的模塊就是看門狗。在單片機系統(tǒng)中,由于微控制器的操作可能會受到來自外部電磁場的干擾,使程序失控陷入死循環(huán)中,程序的正常運行被中斷,由MCU控制的系統(tǒng)不能繼續(xù)工作,這將導致整個系統(tǒng)停頓,造成不可預料的后果,因此為了對微控制器的運行狀況進行實時監(jiān)控,單片機中有一個專門的硬件電路,俗稱“看門狗”。 加入看門狗電路的目的是使微控制器可以實現(xiàn)連續(xù)工作,避免進入程序跑飛的死循環(huán),看門狗功能模塊是內(nèi)嵌在單片機內(nèi)部的,與單片機的I / O引腳相連,該引腳可以通過程序的控制,定期向單片機引腳送出高電平或低電平。一旦受到干擾,單片機程序跑飛,并陷入一個無限循環(huán),看門狗引腳發(fā)送電平的功能不能被執(zhí)行,這個時候,看門狗電路會由于缺乏由MCU發(fā)出的信號,向跟它連在一起的復位電路的引腳發(fā)送一個復位信號,使微控制器重新從程序存儲器的起始位置執(zhí)行代碼,這樣就實現(xiàn)了單芯片自動復位。 以前,看門狗電路需要一個特殊的看門狗芯片連接到單片機來實現(xiàn),但是這會帶來復雜的電路設計。隨著技術(shù)的不斷進步,現(xiàn)在的單片機基本都內(nèi)置看門狗電路,看門狗定時器寄存器,查看其相應的功能知識點。
第二節(jié) 中斷程序模塊
單片機的定時器可以根據(jù)程序設置的分頻頻率進行計數(shù),當計數(shù)達到某個設定值時,可以產(chǎn)生一個中斷事件。比如51單片機外部晶振12M,最大計數(shù)兩個字節(jié),也就是65535,計一個數(shù)的時間為1/12M秒,就算計數(shù)值設為最大值的65535,也不可能計時1s,因此,需要在進入定時中斷后對次數(shù)進行累加,比如中斷累計20次,就表示當前計時為20*65535/12M=0.109225s。因此想要延時1s,需要將計數(shù)值設置為60000的情況下,進入中斷200次。 MCS-51的工作頻率通常情況為12MHz,機器周期與單片機工作頻率相關(guān),機器周期是12倍的工作頻率,因此一個機器周期的時間長度為12 *(1 / 12MHZ)= 1微秒。我們可以知道每個指令周期的特定數(shù)目,這樣我們就可以由一個指令執(zhí)行的數(shù)量確定需要的時間。 中斷程序分為定時器中斷和外部中斷。中斷初始化函數(shù)和中斷處理服務函數(shù)模塊如下: /**************定時器0初始化*********************** * 名稱 : Time0_Init() * 功能 : 定時器的初始化,12MZ晶振,50ms * 輸入 : 無 * 輸出 : 無 ****************************************************/ void Time0_Init() { TMOD = 0x11; TH1 = 0xec; TL1 = 0x78; EA = 1; ET0 = 1; TR0 = 1; } /************外部中斷0 的初始化*********************** * 名稱 : Outside_Init() * 功能 : 外部中斷0 的初始化 * 輸入 : 無 * 輸出 : 無 *******************************************************/ void Outside_Init(void) { EX0 = 1; //開外部中斷0 IT0 = 1; //負邊沿觸發(fā) EA = 1; //開總中斷 } /*****************定時器1*********************************** * 名稱 : Time1_Int() * 功能 : 顯示定時器,工作方式1 * 輸入 : 無 * 輸出 : 無 ****************************************************************/ void Time1_Int() interrupt 3 { TH1 = 0xec; TL1 = 0x78; TR1=1; if(key1<=3) display(); else ndisplay(); } 中斷0服務程序 /****************外部中斷0 服務函數(shù)******************************** * 名稱 : Outside_Int() * 功能 : 外部中斷0 的中斷處理 * 輸入 : 無 * 輸出 : 無 *******************************************************************/ void Outside_Int(void) interrupt 0 { EX0 = 0; delay(30); //對按鍵進行抗干擾處理 if(key1 < 6) { key1++;} else key1=0; delay(30); EX0 = 1; }
第三節(jié) 數(shù)碼管顯示模塊
表4.1為數(shù)碼管顯示數(shù)字與各個段的對應表:
表4.1 數(shù)碼管段位對照表
第四節(jié) 交通燈電路
設計中采用發(fā)光二極管作為交通燈來使用,單片機的I/O接口直接和交通燈(發(fā)光二極管)連接。在十字路口的四組紅、黃、綠三色交通燈中,東西方向道路上的兩組同色燈連接在一起,南北方向道路上的兩組同色的燈也彼此連接在,受單片機P2.2~P2.7控制。單片機的I/O接口與交通燈電路的具體連接方式為:P2.5~P2.7分別接東西方向的紅、黃、綠共6個放光二極管,P2.2~P2.4分別接南北方向的紅、黃、綠共6個發(fā)光二極管。12個發(fā)光二極管采用了共陰極的連接方式,因此I/O口輸出高電平時,與之相連的發(fā)光二極管會亮,I/O口輸出低電平時,相應的發(fā)光二極管會滅。交通燈電路原理圖如下圖所示。
 圖4.2交通燈電路圖
第五節(jié)倒計時顯示器電路
該顯示器選用雙位數(shù)碼管來顯示交通燈轉(zhuǎn)換的剩余時間,根據(jù)設計的要求,每個路口需要1個數(shù)碼管,這樣就要4個數(shù)碼管。我們可以選用共陰型數(shù)碼管。四個路口倒計時顯示被置在同一時刻顯示不同的數(shù)字。電路如下圖 
圖4.3倒計時顯示器電路圖
第六節(jié)交通燈設計總電路圖
我們把倒計時顯示器電路圖、單片機、其他硬件連接起來,就有了總的電路圖。以下是交通燈總電路圖和PCB圖。

圖4.4 交通燈總電路圖
 圖4.5 交通燈PCB圖
第五章 Proteus仿真
第一節(jié) Proteus軟件介紹
Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件,它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機愛好者、從事單片機教學的教師、致力于單片機開發(fā)應用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設計,真正實現(xiàn)了從概念到產(chǎn)品的完整設計。是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即將增加Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯器。本次設計就是用該軟件成功仿真程序運行。
第二節(jié) Proteus仿真圖片
軟件運行后,交通燈開始工作(二極管顯示紅、黃、綠三色燈,LED顯示倒計時),系統(tǒng)自動進入狀態(tài)S1:縱向南北主干道方向綠燈亮,橫向東西支干道方向紅燈亮,南北主干道LED倒計時12秒,東西支干道LED倒計時7秒后,系統(tǒng)進入(S1~S2)然后南北方向黃燈亮3秒,東西方向紅燈閃爍。仿真圖片如下。

圖4.6 S1狀態(tài)

圖4.7 S1~S2
3秒之后,系統(tǒng)進入S3狀態(tài),縱向南北方向紅燈亮,橫向東西方向綠燈亮,仿真圖如下。 
圖4.8 S3狀態(tài) 7秒后系統(tǒng)進入轉(zhuǎn)換階段,縱向南北方向紅燈閃爍,橫向東西方向黃燈亮3秒,仿真圖如下。

圖4.9 轉(zhuǎn)換階段
第六章 調(diào)試心得
在整個系統(tǒng)的調(diào)試過程中,由于自身經(jīng)驗的缺乏,不管是在硬件方面還是軟件方面,都遇到了很多問題,經(jīng)過各方查閱資料和老師同學的幫助,終于將問題一一解決,并總結(jié)了一些經(jīng)驗教訓。 焊接時首先焊接電源部分的器件,如果發(fā)現(xiàn)電源部分工作電壓異常,要立即斷電,檢查焊接線和器件的焊接方向是否正確。確保電源正常后,再焊接電路其他部分,避免其他器件被高電壓損壞。如果焊接一個功能模塊后發(fā)現(xiàn)調(diào)試不正常時候,首先應該先檢查原理圖連線是否正確,在查看原理圖和焊接的板子是否一致。如果都是正確的,就應該確定原理圖和芯片手冊的引腳對應是否正確,檢查是否有漏焊、虛焊、引腳短路的現(xiàn)象出現(xiàn)。可以利用示波器芯片引腳的電平進行測試,找到問題所在。有時我們可以將現(xiàn)在IO口轉(zhuǎn)到別的上去看是否是IO口出現(xiàn)問題引起的。在焊接時候最好一起焊接兩個板子進行對比,排除因為人為焊接原因造成錯誤發(fā)生。軟件和硬件的調(diào)試時相互配合的,如果遇到問題時候不一定都是硬件出現(xiàn)問題造成系統(tǒng)錯誤。 軟件調(diào)試首先根據(jù)系統(tǒng)的整體要求繪制出系統(tǒng)的程序流程圖,根據(jù)程序流程圖里的相關(guān)要求,利用KEIL編譯軟件利用C語言對系統(tǒng)硬件進行驅(qū)動首先要配置單片機各個寄存器的狀態(tài),配置相關(guān)的IO口,調(diào)試過程中盡量使用LED燈來觀察程序的運行狀態(tài)以判斷單片機IO口是否已根據(jù)程序的要求輸出相應的電平。控制繼電器驅(qū)動時候要注意電路的控制,以避免外部的輸入干擾對單片機系統(tǒng)造成影響,同時系統(tǒng)運行過程中要加如看門狗,當程序跑飛的時候及時復位單片機,是系統(tǒng)能夠正常的運行,在按鍵檢測電路的時候要注意對按鍵的抖動造成程序誤操作。
結(jié) 論
通過這次設計,我對所學的專業(yè)知識有了更深的理解,尤其是單片機方面。在51單片機方面做了很多的資料方面的學習,掌握了單片機的基本工作的方法,以及焊接調(diào)試的流程。在設計過程中,查閱了大量的中外文資料,解決了不少難題,使我在分析問題解決問題的能力方面有了提升,增強了對學習的信心,并對電子專業(yè)產(chǎn)生了濃厚的興趣,相信這對我以后的工作和學習有重要的幫助。 本次設計初步實現(xiàn)了51單片機控制十字路口交通等,實現(xiàn)行人與車流的分流的目的。運用了傳統(tǒng)的8位MCU、性能全面、成本造價低、能夠在室溫下安全可靠運行,運行電子制圖軟件和KEIL編程軟件,同時完成系統(tǒng)原理圖和MCU的底層驅(qū)動代碼的編寫。能夠在設計過程中完成對電子專業(yè)的各個節(jié)本技能的強化和所有應用課程的實踐應用,其中包括單片機課程、數(shù)字電路、模擬電路、單片機c語言編程的各個專業(yè)課程的綜合運用,在設計完成時我對自己本專業(yè)的四年所有科目進行的簡單并全面的運行。 系統(tǒng)由于能力和精力的限制,整個系統(tǒng)還存在很多的不足,還可以實現(xiàn)更多的擴展,比如可以加入一些測量道路經(jīng)過車輛數(shù)量的傳感器,根據(jù)傳感器的數(shù)據(jù)可以更加智能的實現(xiàn)對紅綠燈時間的設置,使道路的利用率更高;還可以將單片機通過有線或無線的形式與交通指揮中心實現(xiàn)通信,使指揮中心可以根據(jù)實際交通情況實時的調(diào)整紅綠燈的時間參數(shù)等等,我會在以后的學習中繼續(xù)完善知識體系,盡可能的改善不足。隨著單片機技術(shù)的進一步發(fā)展,這些問題都將被繼續(xù)研究解決。
致 謝
經(jīng)過幾個月資料的查找和對本畢業(yè)設計相關(guān)知識的學習,已經(jīng)完成整個系統(tǒng)的設計,在這個畢業(yè)設計過程中曝露出我許多的問題,由于對有些專業(yè)知識的了解不夠深入,設計有些方面還是不夠完善。在老師的幫助下,解決了遇到的很多設計難題,才使得畢業(yè)設計能夠順利的完成。再次對我的指導教師表示深深的感謝,老師在忙碌的工作中,對我畢業(yè)設計的進行耐心的指導,從設計最初我查找資料的時候,給我很大幫助讓我在眾多的資料中梳理出需要的知識的重點,在畢業(yè)設計的中期我提出系統(tǒng)的設計方案和解決方法,老師對我的設計方案進行了評估,指導我方案中出現(xiàn)的我的問題,并提出了寶貴的經(jīng)驗。在畢業(yè)設計后期對我設計電路和程序進行了指導。使我對單片機硬件電路和軟件程序有了更深入的了解。把我繁瑣的設計變得簡潔、系統(tǒng)功能更合理。深深感受到了張清蓉老師對整個系統(tǒng)全局統(tǒng)籌性很強,使我也從中學到很多在課堂上學不到設計經(jīng)驗。在此,對張老師的嚴謹?shù)闹螌W態(tài)度和對學生負責的態(tài)度表示深深欽佩。其次對和我一起做畢設的同學表示深深的感謝,當我遇到問題時候,幫助我解決好多我能力之外的困難,如果沒有他們的幫助我能這么順利的完成我畢業(yè)設計。
最后感謝大學所有任課教師,他們在我在學校的四年里耐心的傳授我知識,對我的各個方面能力培養(yǎng)付出太多的艱辛工作。為我在以后的工作中更好的學習打下了堅實的基礎,同時感謝所有的同學們正式有你們鼓勵和支持,才讓我在做畢業(yè)設計這段時間不斷改掉缺點,努力的把我的畢業(yè)設計認真的完成。
單片機源程序如下:
- <font style="font-size: 12pt">#include <reg52.h> //調(diào)用單片機頭文件
- #define uchar unsigned char //宏定義"uchar"代替"unsigned char"。
- #define u8 unsigned char //宏定義"uchar"代替"unsigned char"。
- #define uint unsigned int //宏定義"uint"用來定義無符號整型數(shù)。
- //上下南北主干道
- //左右東西輔干道
- u8 code DisplayOther[]={
- 0xff, //0 空
- 0x7f, //1 "."
- 0xbf, //2 "-"
- 0xa7 //3 c
- };
- //數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9 A b C d E F -
- uchar code smg_du[17] = {
- 0xc0, //0
- 0xf9, //1
- 0xa4, //2
- 0xb0, //3
- 0x99, //4
- 0x92, //5
- 0x82, //6
- 0xf8, //7
- 0x80, //8
- 0x90, //9
- 0x88, //A
- 0x83, //b
- 0xc6, //C
- 0xa1, //d
- 0x86, //E
- 0x8e //F
- };
- uchar dis_smg[8 ] = {0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4};
- uchar smg_i = 4; //顯示數(shù)碼管的個位數(shù)
- //數(shù)碼管位選定義
- sbit smg_we1 = P2^0; //東西數(shù)碼管2
- sbit smg_we2 = P2^1; //東西數(shù)碼管1
- sbit smg_we3 = P2^3; //南北數(shù)碼管2
- sbit smg_we4 = P2^2; //南北數(shù)碼管1
- char dx_s = 0; //東西 南北 倒計時變量
- sbit nb_red = P1^0; //南北紅燈
- sbit nb_green = P1^2; //南北綠燈
- sbit nb_yellow = P1^1; //南北黃燈 1
- sbit dx_red = P1^3; //東西紅燈
- sbit dx_green = P1^5; //東西綠燈1
- sbit dx_yellow = P1^4; //東西黃燈1
- uchar flag_jtd_mode; //交通燈的模式 根據(jù)時間
- bit flag_1s = 1; //進入南北方向切換的標志位
- bit flag_500ms;
- bit flag_dx_nb; //東西南北模式
- uchar flag_5m_value;
- uchar i;
- uchar flag_alarm; //模式
- //uchar dx_time = 30,nb_time = 20; //東西、南北的時間
- uchar dx_time = 20,nb_time = 30; //東西、南北的時間
- uchar flag_jdgz ; //交通管制
- /********************************************************************
- * 名稱 : u8 ChangeFor(u8 dat)
- * 功能 : 交換一個字節(jié)位的位置,用于數(shù)碼管顯示
- * 輸入 : 需要改變的數(shù)
- * 輸出 : 改變后的數(shù)
- ***********************************************************************/
- #define LED_a 6 //數(shù)碼管段選的a段接在段選IO口的第0位
- #define LED_b 5
- #define LED_c 0
- #define LED_d 2
- #define LED_e 1
- #define LED_f 4
- #define LED_g 3
- #define LED_dp 7
- u8 ChangeFor(u8 dat)
- {
- u8 temp=0;
- if(dat&0x01) //判斷數(shù)據(jù)的第一位是否為1
- temp|=0x01<<LED_a;//如果為1,放到控制數(shù)碼管a段的位置
- if(dat&0x02)
- temp|=0x01<<LED_b;
- if(dat&0x04)
- temp|=0x01<<LED_c;
- if(dat&0x08)
- temp|=0x01<<LED_d;
- if(dat&0x10)
- temp|=0x01<<LED_e;
- if(dat&0x20)
- temp|=0x01<<LED_f;
- if(dat&0x40)
- temp|=0x01<<LED_g;
- if(dat&0x80)
- temp|=0x01<<LED_dp;
- return temp;
- }
- /***********************數(shù)碼位選函數(shù)*****************************/
- //i: 0,東西數(shù)碼管2
- // 1,東西數(shù)碼管1
- // 2,南北數(shù)碼管2
- // 3,南北數(shù)碼管1
- 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 = 0; smg_we3 = 1; smg_we4 = 1; break;
- case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
- case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
- }
- }
- /********************************************************************
- * 名稱 : delay_1ms()
- * 功能 : 延時1ms函數(shù)
- * 輸入 : q
- * 輸出 : 無
- ***********************************************************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<110;j++);
- }
- /********************************************************************
- * 名稱 : display()
- * 功能 : 數(shù)碼管顯示
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void DisplayScan()
- {
- static uchar i;
- // if(T_MS_SCAN>=3)
- {
- {
- P0 = 0xff; //消隱
- smg_we_switch(i); //位選
- P0 = ChangeFor(dis_smg[i]); //段選
- delay_1ms(3);
- }
- i++;
- if(i>=4)
- i=0;
- // T_MS_SCAN=0;
- }
- }
- /*********************定時器0、定時器1初始化******************/
- void time0_init()
- {
- TMOD = 0x01; //設置定時器0為工作模式1 (16-bit)
- TL0 = 15536; //給定時器低位賦初始值 65536-15536=50000us=50ms,即50ms一個中斷
- TH0 = 15536 >> 8; //給定時器高位賦初始值
- TR0 = 1; //開啟定時器0
- ET0 = 1; //允許定時器0中斷
- EA = 1; //開啟全局中斷
- }
- /*********************交通燈處理函數(shù)*********************************/
- void jiaotongdeng_dis()
- {
- if(flag_1s == 1)//如果切換標志為1
- {
- flag_1s = 0; //清零標志位
- if(dx_s == 0)
- {
- if(flag_dx_nb == 1)
- dx_s = nb_time; //南北時間
- else
- dx_s = dx_time; //東西時間
- flag_dx_nb = ~flag_dx_nb; //切換南北時間
- }
- dx_s --;
- }
- /***********************南北時間*********************************/
- if(flag_dx_nb == 0)
- {
- if(dx_s > 3)
- {
- dis_smg[0] = smg_du[dx_s % 10] ;
- dis_smg[1] = smg_du[dx_s / 10] ;
- dis_smg[2] = smg_du[(dx_s-3) % 10] ;
- dis_smg[3] = smg_du[(dx_s-3) / 10] ;
- dx_red = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- dx_green = 0; //亮
- nb_red = 0; //亮
- flag_5m_value = 0;
- }else if(dx_s <= 3) //當小于3秒時 黃燈要閃了
- {
- 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] ;
- dx_red = 1; //滅
- dx_green = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- nb_red = 0; //亮
- if(flag_500ms == 0)
- {
- dx_yellow = 0;//亮
- }
- else
- {
- dx_yellow = 1;//滅
- }
- }
- }
- /***********************東西時間*********************************/
- if(flag_dx_nb == 1)
- {
- if(dx_s > 3)
- {
- dis_smg[2] = smg_du[dx_s % 10] ;
- dis_smg[3] = smg_du[dx_s / 10] ;
- dis_smg[0] = smg_du[(dx_s-3) % 10] ;
- dis_smg[1] = smg_du[(dx_s-3) / 10] ;
- dx_red = 0; //亮
- nb_green = 0; //亮
- nb_yellow = 1; //滅
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- flag_5m_value = 0;
- }else if(dx_s <= 3) //當小于3秒時 黃燈要閃了
- {
- 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] ;
- 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; //滅
- }
- }
- }
- }
- uchar key_can; //按鍵值
- //按鍵
- sbit Key1=P1^6; //設置鍵
- sbit Key2=P1^7; //加按鍵
- sbit Key3=P3^2; //減按鍵
- sbit Key4=P3^3; //交通管制鍵
- //========================================================================
- // 函數(shù): u8 Key_Scan()
- // 應用: temp=u8 Key_Scan();
- // 描述: 按鍵掃描并返回按下的鍵值
- // 參數(shù): NONE
- // 返回: 按下的鍵值
- // 版本: VER1.0
- // 日期: 2015-05-29
- // 備注: 該函數(shù)帶松手檢測,按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
- //========================================================================
- u8 Key_Scan()
- {
- static u8 key_up=1;//按鍵按松開標志
- if(key_up&&(Key1==0||Key2==0||Key3==0||Key4==0))
- {
- delay_1ms(10);//去抖動
- key_up=0;
- if(Key1==0) return 1;
- else if(Key2==0)return 2;
- else if(Key3==0)return 3;
- else if(Key4==0)return 4;
- }
- else if(Key1==1&&Key2==1&&Key3==1&&Key4==1)
- key_up=1;
- return 0;// 無按鍵按下
- }
- uchar flag_s;
- uchar menu_1;//縱橫加減標示
- /********************設置函數(shù)*****************/
- void key_with()
- {
- if(key_can == 4) //交通管制按鍵
- {
- flag_jdgz ++;
- if(flag_jdgz > 5)
- flag_jdgz = 0;
- if(flag_jdgz == 1) // 全部亮紅燈
- {
- dx_red = 0; //亮
- nb_red = 0; //亮
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 2) // 東西綠燈 南北紅燈
- {
- dx_red = 0; //亮
- nb_green = 0; //亮
- dx_green = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 3) // 南北綠燈 東西紅燈
- {
- dx_green = 0; //亮
- nb_red = 0; //亮
- dx_red = 1; //滅
- dx_yellow = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 4) // 南北綠燈 東西綠燈
- {
- dx_green = 0; //亮
- nb_green = 0; //亮
- dx_red = 1; //滅
- dx_yellow = 1; //滅
- nb_red = 1; //滅
- nb_yellow = 1; //滅
- }
- if(flag_jdgz == 5) // 南北黃燈 東西黃燈
- {
- dx_red = 1; //滅
- dx_green = 1; //滅
- nb_red = 1; //滅
- nb_green = 1; //滅
- nb_yellow = 0; //亮
- dx_yellow = 0; //亮
- }
- }
- if(key_can == 1) //設置鍵
- {
- menu_1 ++;
- if(menu_1 >= 3)
- {
- menu_1 = 0;
- }
- }
- if(menu_1 == 1) //設置東西的時間
- {
- if(key_can == 2)
- {
- dx_time ++ ; //加1
- if(dx_time > 99) //時間最大值為99s
- dx_time = 99;
- }
- if(key_can == 3)
- {
- dx_time -- ; //減1
- if(dx_time <= 5)//時間最小值為5s
- dx_time = 5;
- }
- dis_smg[0] = smg_du[(dx_time-1) % 10] ; //顯示為A
- dis_smg[1] = smg_du[(dx_time-1) / 10] ; //顯示為A
- dis_smg[2] = DisplayOther[2] ; //顯示東西設置的時候
- dis_smg[3] = DisplayOther[2] ;
- }
- if(menu_1 == 2) //設置南北的時間
- {
- if(key_can == 2)
- {
- nb_time ++ ; //加1
- if(nb_time > 99)//時間最大值為99s
- nb_time = 99;
- }
- if(key_can == 3)
- {
- nb_time -- ; //減1
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 Keil代碼與Proteus仿真文檔等資料下載:
交通燈全套資料.7z
(5.65 MB, 下載次數(shù): 782)
2021-12-23 00:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|