版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 圖書館收藏</b></p><p> 中圖分類號:密級:</p><p> UDC:編號:1331</p><p><b> 畢業(yè)設(shè)計說明書</b></p><p> 雙休日交通信號燈控制系統(tǒng)</p&g
2、t;<p> 黃昕彤</p><p><b> 目錄</b></p><p><b> 1 概述1</b></p><p> 1.1 單片機的定義1</p><p> 1.2 單片機的應(yīng)用1</p><p><b> 2 開發(fā)工具4&
3、lt;/b></p><p> 2.1 Proteus 8.14</p><p> 2.1.1 Proteus簡介4</p><p> 2.1.2 Proteus特點4</p><p> 2.2 Keil 55</p><p><b> 3 系統(tǒng)設(shè)計6</b></p
4、><p> 3.1 設(shè)計背景6</p><p> 3.2 設(shè)計簡介6</p><p> 3.3 設(shè)計原理6</p><p> 3.4 設(shè)計框圖7</p><p><b> 4 硬件設(shè)計8</b></p><p> 4.1 芯片選用8</p>
5、<p> 4.1.1 AT899C51簡介8</p><p> 4.1.2 引腳功能9</p><p> 4.1.3 內(nèi)部結(jié)構(gòu)9</p><p> 4.2 液晶顯示屏10</p><p> 4.2.1 LCD1602簡介10</p><p> 4.2.2 引腳功能10</p&g
6、t;<p> 4.3 串行時鐘電路11</p><p> 4.3.1 時鐘電路DS1302簡介11</p><p> 4.3.2 引腳功能12</p><p><b> 5 程序設(shè)計13</b></p><p> 5.1 主程序設(shè)計13</p><p> 5.1
7、.1 中斷介紹13</p><p> 5.1.2 程序內(nèi)容14</p><p> 5.2 兩個子功能18</p><p> 5.2.1 功能介紹18</p><p> 5.2.2 程序內(nèi)容19</p><p> 5.3 液晶屏顯示23</p><p> 5.3.1 顯示流
8、程圖23</p><p> 5.3.2 程序內(nèi)容23</p><p> 5.4 萬年歷計算28</p><p> 5.5 延時程序31</p><p> 5.6 按鍵調(diào)節(jié)程序31</p><p> 5.6.1 按鍵功能介紹31</p><p> 5.6.2 程序內(nèi)容32
9、</p><p><b> 參考文獻39</b></p><p><b> 致謝40</b></p><p><b> 摘要</b></p><p> 雙休日交通信號燈控制系統(tǒng),本項設(shè)計涉及智能交通及自動控制技術(shù)領(lǐng)域;提供一種結(jié)構(gòu)簡單、設(shè)計合理、使用方便的雙休日交通
10、信號燈控制系統(tǒng),解決現(xiàn)有的紅綠燈控制系統(tǒng)周期固定造成交通擁堵和時間浪費的問題。</p><p> 為實現(xiàn)上述目的,本詳設(shè)計采用的技術(shù)方案是:單片機處理器,單片機處理器分別電路連接液晶屏?xí)r鐘顯示模塊、交通燈模塊和按鍵調(diào)節(jié)模塊。</p><p> 關(guān)鍵詞:單片機,交通燈,萬年歷,AT89C51,LCD,DS1302</p><p><b> 概述<
11、/b></p><p><b> 單片機的定義</b></p><p> 所謂單片機,就是把微型計算機的各個零件,如具有數(shù)據(jù)處理功能中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、輸入/輸出I/O口、定時/計數(shù)器以及串行通信接口等集成在一塊芯片中,構(gòu)成一個微型的計算機系統(tǒng)。這些元件能在計算機系統(tǒng)的控制下準(zhǔn)確、迅速、高效地依據(jù)事先設(shè)定的程序完成任務(wù)。單獨
12、地完成現(xiàn)代工業(yè)控制所要求的智能化控制功能,擁有大規(guī)模的集成電路技術(shù),是單片機最大的特征,也是它與微型計算機的不同之處。</p><p> 圖1-1AT89C51單片機</p><p><b> 單片機的應(yīng)用</b></p><p> 單片機廣泛應(yīng)用于儀器儀表、家用電器、醫(yī)用設(shè)備、航空航天、專用設(shè)備的智能化管理及過程控制等領(lǐng)域,大致可分為如
13、下幾個。</p><p> 1·計算機網(wǎng)絡(luò)和通信領(lǐng)域</p><p> 現(xiàn)代的單片機普遍具備通信接口,可以很方便地與計算機進行數(shù)據(jù)通信,為在計算機網(wǎng)絡(luò)和通信設(shè)備間的應(yīng)用提供了極好的物質(zhì)條件,現(xiàn)在的通信設(shè)備基本上都實現(xiàn)了單片機智能控制,從手機,電話機、小型程控交換機、樓宇自動通信呼叫系統(tǒng)、列車無線通信、再到日常工作中隨處可見的移動電話,集群移動通信,無線電對講機等。</p
14、><p><b> 2·工業(yè)控制</b></p><p> 單片機體積小而價格便宜的特點倍受工業(yè)控制的青睞,應(yīng)用于工業(yè)極大的提高了工業(yè)設(shè)備的智能化,提高了處理能力和處理效率。其在工業(yè)中主要運用于變頻控制,運動控制、數(shù)據(jù)采集、信號采集與檢測、無線感知等控制系統(tǒng)。</p><p> 圖1-2塑料包裝印刷機械人機界面單片機控制器</
15、p><p><b> 3·家用電器</b></p><p> 隨著單片機技術(shù)日新月異的發(fā)展,單片機取代傳統(tǒng)家電中的機械控制部件,減小家電體積也使傳統(tǒng)的產(chǎn)品走向智能化。如能識別衣物臟物程度控制洗滌液用量,自動選擇洗滌時間和強度的洗衣機;能識別食物類型、保鮮程度,自動調(diào)節(jié)儲藏溫度的冰箱等。這類高智能的全自動家用電器充分發(fā)揮了單片機和家電系統(tǒng)的融合優(yōu)勢。</
16、p><p> 圖1-3電地暖溫控器 圖1-4電子時鐘</p><p><b> 4·智能儀器儀表</b></p><p> 在科學(xué)技術(shù)及工農(nóng)業(yè)生產(chǎn)水平不斷提高的當(dāng)代社會,儀器儀表需擴展大量的外圍功能部件來滿足其復(fù)雜性、高性能及智能化的要求,單片機是最優(yōu)之選。單片機將功能復(fù)雜的眾多外圍功能部
17、件全部或大部分集成到內(nèi)部,他的介入大大提高了儀器儀表系統(tǒng)的可靠性,同時又使系統(tǒng)的成本得以降低。</p><p><b> 圖1-4甲烷檢測儀</b></p><p><b> 5·醫(yī)用設(shè)備領(lǐng)域</b></p><p> 單片機的應(yīng)用在我們的生活中已是相當(dāng)常見,除了上面介紹的幾個方面,他在醫(yī)用設(shè)備中的用途亦相
18、當(dāng)廣泛,例如醫(yī)用呼吸機,各種分析儀,監(jiān)護儀,超聲診斷設(shè)備及病床呼叫系統(tǒng)等等。</p><p> 圖1-5醫(yī)用分析檢測儀器</p><p><b> 開發(fā)工具</b></p><p> Proteus 8.1</p><p><b> Proteus簡介</b></p><
19、p> Proteus軟件是英國Labcenter公司開發(fā)的電路分析與實物仿真軟件。它運行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路。具有強大的原理圖繪制功能,實現(xiàn)了單片機仿真和SPICE電路仿真的相結(jié)合。</p><p> 圖2-1Proteus8.1</p><p><b> Proteus特點</b></p&g
20、t;<p> 1·Proteus提供30多個元件庫,有仿真數(shù)字和模擬、交流和直流等上千種元器件。還提供示波器、邏輯分析儀、虛擬終端、信號發(fā)生器、交直流電流表等各種仿真儀表資源。在一個電路中,同一種儀器可以隨意調(diào)用。</p><p> 2·Proteus擁有特殊的圖形顯示功能,可以將線路上變化的信號,以圖形的方式實時的顯示出來,其作用與示波器相似,但是具有更多的功能。這些虛擬儀
21、器儀表具有理想的參數(shù)指標(biāo),例如極高的輸入阻抗、極低的輸出阻抗。這些都盡可能減少了儀器對測量結(jié)果的影響。</p><p> 3·Proteus支持多種主流單片機系統(tǒng)的仿真,如51系列、AVR系列、PIC系列、Z8系列等;提供軟件調(diào)試功能;提供豐富的外圍接口器件及其仿真,如RAM、鍵盤、馬達、LCD、LED、一些IIC器件等。這些很接近實際,在訓(xùn)練時,可以有不同的方案選擇。</p><
22、p> 4·具有強大的原理繪圖功能</p><p><b> Keil 5</b></p><p> Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil C51的實用簡單方便,隨著漢化版及破解版本的出現(xiàn),更大限度的
23、方便了國人的使用。Keil可與PROTUES聯(lián)機仿真,不過需要聯(lián)調(diào)補丁,也可以生成HEX文件在PROTUES里仿真。</p><p><b> 圖2-2keil5</b></p><p><b> 系統(tǒng)設(shè)計</b></p><p><b> 設(shè)計背景</b></p><p&g
24、t; 目前城市十字路口所使用的交通信號燈都是設(shè)定好固定的時間間隔,一直循環(huán)工作的,此類信號燈根據(jù)十字路口的平均車流量將紅綠交替工作間隔設(shè)定在一個合適的時間長度,但是現(xiàn)在車輛的急劇增加導(dǎo)致工作日與雙休日的車流量出現(xiàn)巨大的反差,普通的信號燈已經(jīng)無法滿足交通的正常運行,這也就是普通燈的缺陷。雙休日交通信號燈完全克服普通型的不足,它可以通過自帶的萬年歷判斷出當(dāng)前的日期是否為雙休日,假日將延長綠燈時間使汽車能夠全部通過路口,減少路口的擁堵現(xiàn)象。
25、</p><p><b> 設(shè)計簡介</b></p><p> 本項設(shè)計的目的在于針對現(xiàn)有技術(shù)的缺陷和不足,提供一種結(jié)構(gòu)簡單、設(shè)計合理、使用方便的雙休日交通信號燈控制系統(tǒng),解決現(xiàn)有的紅綠燈控制系統(tǒng)周期固定造成交通擁堵和時間浪費的問題。所采用的設(shè)計方案包括單片機處理器,單片機處理器分別電路連接液晶屏?xí)r鐘顯示模塊、LED交通燈模塊和按鍵調(diào)節(jié)模塊。</p>
26、<p><b> 設(shè)計原理</b></p><p> 液晶顯示屏顯示當(dāng)前年月日時分秒,當(dāng)當(dāng)前日期為雙休日時紅綠燈的周期延長。首先,萬年歷顯示當(dāng)前日期;其次,判斷是否為雙休日;最后,使用單片機切換雙休日與非雙休日的紅綠燈循環(huán)程序,若當(dāng)前為雙休日,紅綠燈的間隔時間為T2秒,反之為T1秒。</p><p> 交通燈的工作過程如下:南北路口的綠燈亮,東西路口
27、的紅燈亮,南北路口方向通車,兩個路口的LED開始倒計時40秒。40秒后,南北路口的綠燈熄滅,同時南北路口的黃燈開始閃爍。閃爍3次后,南北路口的紅燈亮,同時東西路口的綠燈亮,東西路口方向開始通車,2個路口的LED重新開始倒計時40秒。403當(dāng)前日期為周六周日時,通車時間延長至60s,倒計時60s后,黃燈閃爍3次,切換方向。</p><p><b> 設(shè)計框圖</b></p>&
28、lt;p> 圖3-1系統(tǒng)設(shè)計框圖</p><p><b> 硬件設(shè)計</b></p><p><b> 芯片選用</b></p><p> AT899C51簡介</p><p> AT89C51單片機是把那些作為控制應(yīng)用所必須的基本內(nèi)容都集中在一個尺寸有限的集成電路芯片上。它由如下功
29、能部件組成,具有數(shù)據(jù)處理功能中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、輸入/輸出I/O口、定時/計數(shù)器以及串行通信接口等。它們都是通過芯片內(nèi)單一總線串聯(lián)而成,其基本結(jié)構(gòu)還是微處理器(CPU)加上外圍芯片的傳統(tǒng)結(jié)構(gòu)模式。但對各種功能部件的控制是采用特殊功能寄存器的集中控制方式,以實現(xiàn)不同的功能。</p><p> 圖4-1AT89C51</p><p><b> 引
30、腳功能</b></p><p> XTAL1(19引腳):片內(nèi)振蕩器反相放大器和時鐘發(fā)生器電路的輸入端。</p><p> XTAL2(18引腳):片內(nèi)振蕩器反相放大器的輸出端。</p><p> RST:復(fù)位引腳,高電平有效。</p><p> EA:外部程序存儲器訪問允許控制端。</p><p>
31、; ALE:低8位地址鎖存允許信號端。</p><p> PSEN:讀外部程序存儲器的選通信號端。</p><p> P0口:8位,漏極開路的雙向I/O口。</p><p> P1口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。</p><p> P2口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。</p><p>
32、 P3口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。</p><p><b> 內(nèi)部結(jié)構(gòu)</b></p><p> ?。?)1個8位的中央處理器(CPU),是單片機的核心。</p><p> ?。?)128個字節(jié)的內(nèi)部數(shù)據(jù)RAM,地址為00H~7FH。</p><p> ?。?)21個特殊功能的寄存器SFR,離散分布于
33、地址80H~FFH中</p><p> 程序計數(shù)器PC,是物理上獨立的16位專用寄存器</p><p> 4K字節(jié)FLASH內(nèi)部程序存儲器(內(nèi)ROM)</p><p> 4個8位可編程I/O口(P0、P1、P2、P3)</p><p> 1個UART串行通信口</p><p> 2個16位定時器、計數(shù)器<
34、;/p><p> 5個中斷源,兩個中斷優(yōu)先級的中斷控制系統(tǒng)</p><p> 1個片內(nèi)振蕩器和時鐘電路</p><p> 用于擴展外RAM、外ROM等的結(jié)構(gòu)</p><p><b> 液晶顯示屏</b></p><p><b> LCD1602簡介</b></p&
35、gt;<p> 1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形。</p><p> LCD1602使用方便,體積小巧,在很多領(lǐng)域都用大用途,在平常的生活物品中也極為
36、常見,如電動車的顯示屏,智能儀表的顯示屏等等。</p><p> 圖4-2LCD1602液晶顯示屏</p><p><b> 引腳功能</b></p><p> 1602采用標(biāo)準(zhǔn)的16腳接口,其中:</p><p><b> VSS:接地極</b></p><p>
37、 VCC:接5V電源正極</p><p> V0:為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。</p><p> RS:為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。</p><p> RW:為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。
38、</p><p> E(或EN):為使能(enable)端,高電平時讀取信息,負(fù)跳變時執(zhí)行指令。</p><p> 7~14引腳:D0~D7為8位雙向數(shù)據(jù)端。</p><p> 15~16引腳:空腳或背燈電源。15引腳背光正極,16引腳背光負(fù)極。</p><p> 表4-1LCD控制器接口信號說明</p><p&g
39、t;<b> 串行時鐘電路</b></p><p> 時鐘電路DS1302簡介</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)
40、。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力,它廣泛應(yīng)用于電話、傳真、便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領(lǐng)域。</p><p> 圖4-3時鐘電路DS1302</p><p><b> 引腳功能</
41、b></p><p> Vcc:為后備電源。</p><p> VCC:為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。</p><p> X1和X2:振蕩源,外接32.768kHz晶振。</p><p> RST:復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的
42、數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。</p><p
43、> I/O:串行數(shù)據(jù)輸入輸出端(雙向)。</p><p> SCLK:時鐘輸入端。</p><p><b> 程序設(shè)計</b></p><p><b> 主程序設(shè)計</b></p><p><b> 中斷介紹</b></p><p>
44、在主程序的運行中利用了中斷這一技術(shù)。下面先來介紹一下什么是中端:</p><p> 在計算機執(zhí)行程序的過程中,當(dāng)出現(xiàn)某種情況,有服務(wù)對象向CPU發(fā)出請求當(dāng)前程序中斷的信號,要求CPU暫時停止當(dāng)前程序的執(zhí)行,而轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,待處理程序執(zhí)行完畢后,再返回繼續(xù)執(zhí)行被中斷的程序,這樣的過程稱為中斷過程。把引起中斷的原因和觸發(fā)中斷請求的來源稱為中斷源。為實現(xiàn)中斷而設(shè)置的各種硬件和軟件稱為終端系統(tǒng)。</p&
45、gt;<p> 有了中斷功能,一方面,PC系統(tǒng)就可以使CPU和外設(shè)同時工作,使系統(tǒng)可以及時地響應(yīng)外部事件。而且有了中斷功能,CPU可允許多個外設(shè)同時工作。這樣就大大提高了CPU的利用率,也提高了數(shù)據(jù)輸入、輸出的速度。另一方面,有了中斷功能,就可以使CPU及時處理各種軟硬件故障。計算機在運行過程中,往往會出現(xiàn)事先預(yù)料不到的情況或出現(xiàn)一些故障,如電源掉電、存儲出錯,運算溢出等等。計算機可以利用中斷系統(tǒng)自行處理,而不必停機或報
46、告工作人員。</p><p> 中斷的處理過程主要包括中斷請求、中斷響應(yīng)、中斷服務(wù)和中斷返回四個階段,如圖5-1所示。</p><p> 首先由中斷源發(fā)出中斷請求信號,CPU在運行主程序時,不斷地檢測是否有中斷請求產(chǎn)生,在檢測到有中斷請求信號后,決定是否響應(yīng)中斷。當(dāng)CPU滿足條件響應(yīng)中斷后,進入中斷服務(wù)程序,為申請中斷的對象服務(wù)。當(dāng)服務(wù)對象的任務(wù)完成后,CPU重新返回到原來的程序中繼續(xù)
47、工作。這就是中斷處理的全過程。</p><p> 圖5-1中斷處理過程</p><p><b> 程序內(nèi)容</b></p><p> 圖5-2主程序流程圖</p><p> #include<reg52.h></p><p> #include<intrins.h>
48、;</p><p> #include<define.h></p><p> #include<yanshi.h></p><p> #include<shizhong.h></p><p> #include<xianshi.h></p><p> #incl
49、ude<anjian.h></p><p> #include<gongneng.h></p><p> void play()</p><p><b> {</b></p><p> hour=read1302(0x85);//讀1302上的數(shù)據(jù),將時分秒十進制化</p>
50、;<p> hour=deci(hour);</p><p> min=read1302(0x83);</p><p> min=deci(min);</p><p> sec=read1302(0x81);</p><p> sec=deci(sec);</p><p> years=rea
51、d1302(0x8d);//將年月日十進制化</p><p> years=deci(years);</p><p> month=read1302(0x89);</p><p> month=deci(month);</p><p> day=read1302(0x87);</p><p> da
52、y=deci(day);</p><p> week=read1302(0x8b);//將星期十進制化</p><p> week=deci(week);</p><p> write_sfm(0,hour);//在液晶屏上顯示時間</p><p> write_sfm(3,min);</p><p
53、> write_sfm(6,sec);</p><p> write_nyr(0,years);</p><p> write_nyr(3,month);</p><p> write_nyr(6,day);</p><p> write_week(week);</p><p> write_com(
54、0x80+0x40+11);</p><p> write_date(0x30+RH_data/10);</p><p> write_date(0x30+RH_data%10);</p><p> write_com(0x80+0x40+14);</p><p> write_date(0x30+TH_data/10);</p
55、><p> write_date(0x30+TH_data%10);</p><p><b> }</b></p><p> /**********************初始化函數(shù)*************************/</p><p> void init()</p><p>
56、<b> {</b></p><p> uchar num;</p><p> s1num=0;//s1按鍵定義</p><p><b> flag=0;</b></p><p> TMOD=0x01;</p><p> TH0=65536-50000
57、/256;</p><p> TL0=65536-50000%256;</p><p> EA=1;//總中斷打開</p><p> ET0=1;//定時器0打開</p><p> TR0=1;//定時器0啟動</p><p> if(deci((read1302(0
58、xc1)))!=0x05)</p><p><b> {</b></p><p> init1302();</p><p><b> }</b></p><p> write_com(0x38);//設(shè)置8位、2行、5×7點陣</p><p> w
59、rite_com(0x0c);//設(shè)置顯示數(shù)據(jù),不顯示光標(biāo)</p><p> write_com(0x06);//每寫一個字符指針地址加一</p><p> write_com(0x01);//清零</p><p> write_com(0x80);//將指針移到第一位</p><p> for(num
60、=0;num<9;num++)</p><p><b> {</b></p><p> write_date(riqi[num]);</p><p> yanshi(2);</p><p><b> }</b></p><p> write_com(0x80+
61、0x40);</p><p> for(num=0;num<16;num++)//顯示年月日和星期</p><p><b> {</b></p><p> write_date(shijian[num]);</p><p> yanshi(2);</p><p><b>
62、; }</b></p><p><b> }</b></p><p> /************************主函數(shù)***********************/</p><p> void main()</p><p><b> {</b></p>
63、<p><b> init();</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> anjian();//按鍵掃描</p><p> if(flag==0)</p>
64、<p><b> {</b></p><p><b> play();</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
65、<p> void T0timer() interrupt 1</p><p><b> {</b></p><p> TH0=65536-50000/256;//50ms</p><p> TL0=65536-50000%256;</p><p> if(week>=6)</p
66、><p><b> {</b></p><p> shuangxiuri();//雙休日運行功能一</p><p><b> }</b></p><p> else if(week<=5)</p><p><b> {</b><
67、;/p><p> common();//工作日運行功二</p><p><b> }</b></p><p><b> }</b></p><p><b> 兩個子功能</b></p><p><b> 功能介紹</b>
68、;</p><p> 根據(jù)萬年歷顯示的星期判斷當(dāng)前日期是否為雙休日,若是雙休日,則運行功能一:綠燈時間延長至60s;如是正常工作日,則運行功能二:綠燈時間為40s。紅綠燈顯示仿真模塊如圖5-3。</p><p> 圖5-3紅綠燈顯示模塊</p><p> 實現(xiàn)的兩個子功能參考表5-1。</p><p><b> 表5-1子功
69、能表</b></p><p><b> 程序內(nèi)容</b></p><p> #ifndef _gongneng_H_</p><p> #define _gongneng_H_</p><p> /*************************兩個子功能**********************
70、***/</p><p> void shuangxiuri()//功能一:雙休日</p><p><b> {</b></p><p> switch(Dnum0)</p><p><b> {</b></p><p><b> cas
71、e 1:</b></p><p> RED_A=0;YELLOW_A=0;GREEN_A=1;</p><p> RED_B=1;YELLOW_B=0;GREEN_B=0;</p><p> if(++Time0_Count!=1200) return;//南北綠燈持續(xù)60s</p><p> Time0_Count=
72、0;</p><p> Dnum0 = 2;</p><p><b> break;</b></p><p><b> case 2:</b></p><p> if(++Time0_Count!=20) return;</p><p> Time0_Count=0
73、;</p><p> YELLOW_A=!YELLOW_A;</p><p> GREEN_A=0;</p><p> if(++Flash0_Count!=6) return;//黃燈閃爍3下</p><p> Flash0_Count=0;</p><p><b> Dnum0= 3;<
74、;/b></p><p><b> break;</b></p><p><b> case 3:</b></p><p> RED_A=1;YELLOW_A=0;GREEN_A=0;</p><p> RED_B=0;YELLOW_B=0;GREEN_B=1;</p>
75、<p> if(++Time0_Count!=1200) return;//東西綠燈持續(xù)60s</p><p> Time0_Count=0;</p><p> Dnum0 = 4;</p><p><b> break;</b></p><p><b> case 4:</b&
76、gt;</p><p> if(++Time0_Count!=20) return;</p><p> Time0_Count=0;</p><p> YELLOW_B=!YELLOW_B;</p><p> GREEN_B=0;</p><p> if(++Flash0_Count!=6) return
77、;//黃燈閃爍3下</p><p> Flash0_Count=0;</p><p> Dnum0= 1;//四個場景循環(huán)</p><p><b> break;</b></p><p><b> }</b></p><p><b> }&
78、lt;/b></p><p> void common()//功能二:工作日</p><p> switch(Dnum0)</p><p><b> {</b></p><p><b> case 1:</b></p><p> RED_A
79、=0;YELLOW_A=0;GREEN_A=1;</p><p> RED_B=1;YELLOW_B=0;GREEN_B=0;</p><p> if(++Time0_Count!=800) return;//南北綠燈持續(xù)40s</p><p> Time0_Count=0;</p><p> Dnum0 = 2;</p&g
80、t;<p><b> break;</b></p><p><b> case 2:</b></p><p> if(++Time0_Count!=20) return;</p><p> Time0_Count=0;</p><p> YELLOW_A=!YELLOW_A;
81、</p><p> GREEN_A=0;</p><p> if(++Flash0_Count!=6) return;//黃燈閃爍3下</p><p> Flash0_Count=0;</p><p><b> Dnum0= 3;</b></p><p><b> brea
82、k;</b></p><p><b> case 3:</b></p><p> RED_A=1;YELLOW_A=0;GREEN_A=0;</p><p> RED_B=0;YELLOW_B=0;GREEN_B=1;</p><p> if(++Time0_Count!=800) return;
83、//東西綠燈持續(xù)40s</p><p> Time0_Count=0;</p><p> Dnum0 = 4;</p><p><b> break;</b></p><p><b> case 4:</b></p><p> if(++Time0_Count!=
84、20) return;</p><p> Time0_Count=0;</p><p> YELLOW_B=!YELLOW_B;</p><p> GREEN_B=0;</p><p> if(++Flash0_Count!=6) return;//黃燈閃爍3下</p><p> Flash0_Cou
85、nt=0;</p><p> Dnum0= 1;//四個場景循環(huán)</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> #en
86、dif</b></p><p><b> 液晶屏顯示</b></p><p><b> 顯示流程圖</b></p><p> 圖5-3液晶屏顯示流程圖</p><p><b> 程序內(nèi)容</b></p><p> #ifndef _
87、xianshi_H_</p><p> #define _xianshi_H_</p><p> void write_com(char com)//寫指令函數(shù)</p><p><b> {</b></p><p><b> RS=0;</b></p><p&
88、gt;<b> RW=0;</b></p><p><b> E=0;</b></p><p><b> P2=com;</b></p><p> yanshi(5);</p><p><b> E=1;</b></p><p
89、> yanshi(5);</p><p><b> E=0;</b></p><p><b> RW=1;</b></p><p><b> }</b></p><p> void write_date(char date)//寫數(shù)據(jù)函數(shù)</p
90、><p><b> {</b></p><p><b> RS=1;</b></p><p><b> RW=0;</b></p><p><b> E=0;</b></p><p><b> P2=date;<
91、;/b></p><p> yanshi(5);</p><p><b> E=1;</b></p><p> yanshi(5);</p><p><b> E=0;</b></p><p><b> RW=1;</b></p&g
92、t;<p><b> }</b></p><p> void write_sfm(uchar add,char date)//寫時分秒函數(shù)</p><p><b> {</b></p><p> uchar shi,ge;</p><p> shi=date/10;&
93、lt;/p><p> ge=date%10;</p><p> write_com(0x80+0x40+add);</p><p> write_date(0x30+hour);</p><p> write_date(0x30+ge);</p><p><b> }</b></p&g
94、t;<p> void write_nyr(uchar add,char date)//寫年月日函數(shù)</p><p><b> {</b></p><p> char shi,ge;</p><p> shi=date/10;</p><p> ge=date%10;</p>
95、<p> write_com(0x80+add);</p><p> write_date(0x30+hour);</p><p> write_date(0x30+ge);</p><p><b> }</b></p><p> 圖5-4星期選擇語句</p><p> v
96、oid write_week(uchar week)//寫星期函數(shù)</p><p><b> {</b></p><p> write_com(0x80+12);</p><p> switch(week)</p><p><b> {</b></p><p&
97、gt; case 1:write_date('M');</p><p> yanshi(5);</p><p> write_date('O');</p><p> yanshi(5);</p><p> write_date('N');</p><p><
98、;b> break;</b></p><p> case 2:write_date('T');</p><p> yanshi(5);</p><p> write_date('U');</p><p> yanshi(5);</p><p> write_
99、date('E');</p><p><b> break;</b></p><p> case 3:write_date('W');</p><p> yanshi(5);</p><p> write_date('E');</p><p>
100、; yanshi(5);</p><p> write_date('D');</p><p><b> break;</b></p><p> case 4: write_date('T');</p><p> yanshi(5);</p><p> w
101、rite_date('H');</p><p> yanshi(5);</p><p> write_date('U');</p><p><b> break;</b></p><p> case 5:write_date('F');</p><
102、;p> yanshi(5);</p><p> write_date('R');</p><p> yanshi(5);</p><p> write_date('I');</p><p><b> break;</b></p><p> case
103、 6:write_date('S');</p><p> yanshi(5);</p><p> write_date('A');</p><p> yanshi(5);</p><p> write_date('T');</p><p><b> b
104、reak;</b></p><p> case 7:write_date('S');</p><p> yanshi(5);</p><p> write_date('U');</p><p> yanshi(5);</p><p> write_date('
105、;N');</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> #endif</b></p><p><b>
106、; 萬年歷計算</b></p><p> 圖5-5DS1302程序流程圖</p><p> //***************************DS1302**********************//</p><p> void write_byte(char da)</p><p><b> {&l
107、t;/b></p><p><b> uchar i;</b></p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> tda=(bit)(da&0x01);</p><p><b>
108、 _nop_();</b></p><p><b> clk=0;</b></p><p><b> _nop_();</b></p><p><b> clk=1;</b></p><p><b> _nop_();</b></
109、p><p><b> da>>=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> uchar read_byte(void)</p><p><b> {</b&
110、gt;</p><p> uchar i,j,AC;</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> clk = 1;</b></p><p><b> _nop_();</b
111、></p><p><b> clk = 0;</b></p><p><b> _nop_();</b></p><p><b> j=tda;</b></p><p><b> _nop_();</b></p><p&
112、gt; AC =(j<<7)|(AC>>1);</p><p><b> }</b></p><p> return(AC);</p><p><b> }</b></p><p> void write1302(char addr,char da)</p&g
113、t;<p><b> {</b></p><p><b> =0;</b></p><p><b> clk=0;</b></p><p><b> reset=1;</b></p><p> write_byte(addr);&l
114、t;/p><p> write_byte(da);</p><p><b> reset=0;</b></p><p><b> clk=1;</b></p><p><b> }</b></p><p> char read1302(char a
115、ddr)</p><p><b> {</b></p><p> char temp;</p><p><b> reset=0;</b></p><p><b> clk=0;</b></p><p><b> reset=1;&l
116、t;/b></p><p> write_byte(addr);</p><p> temp=read_byte();</p><p><b> reset=0;</b></p><p><b> clk=1;</b></p><p> return(temp
117、);</p><p><b> }</b></p><p> void init1302(void)</p><p><b> {</b></p><p> write1302(0x8e,0X00);</p><p> write1302(0x80,0X00);&l
118、t;/p><p> write1302(0x82,0X25);</p><p> write1302(0x84,0X06);</p><p> write1302(0X8a,0X02);</p><p> write1302(0X86,0X20);</p><p> write1302(0X88,0X05);&l
119、t;/p><p> write1302(0X8C,0X15);</p><p> write1302(0xc0,0x05);</p><p> write1302(0x8e,0X80);</p><p><b> }</b></p><p> char bcd(char a)</p&g
120、t;<p><b> {</b></p><p> uchar b,c;</p><p><b> b=a/10;</b></p><p><b> c=a%10;</b></p><p><b> b=b&0x0f;</b>
121、;</p><p><b> c=c&0x0f;</b></p><p><b> b<<=4;</b></p><p><b> a=b|c;</b></p><p> return(a);</p><p><b>
122、; }</b></p><p> char deci(char c)</p><p><b> {</b></p><p><b> char d,e;</b></p><p><b> d=c/16;</b></p><p>&l
123、t;b> e=c%16;</b></p><p><b> c=d*10+e;</b></p><p> return(c);</p><p><b> }</b></p><p><b> 延時程序</b></p><p>
124、 #ifndef _yanshi_H_</p><p> #define _yanshi_H_</p><p> /******************延時函數(shù)****************/</p><p> void yanshi(uint z)</p><p><b> {</b></p>
125、<p><b> uint i,j;</b></p><p> for(i=z;i>0;i--)</p><p> for(j=110;j>0;j--);</p><p><b> }</b></p><p><b> #endif</b>&l
126、t;/p><p><b> 按鍵調(diào)節(jié)程序</b></p><p><b> 按鍵功能介紹</b></p><p> K1為選擇鍵,K2為加號鍵,K3為減號鍵,K4為確定鍵。調(diào)節(jié)步驟:第一步點擊K1選擇鍵,按一下光標(biāo)往后退一格,反復(fù)按下K1使光標(biāo)停留在要更改的對象上。第二步點擊K2或者K3上下調(diào)節(jié)數(shù)字。第三步點擊K4確定鍵
127、,改好日期之后按下確定鍵,萬年歷更新完成。</p><p> 圖5-6按鍵仿真模塊</p><p><b> 程序內(nèi)容</b></p><p> #ifndef _anjian_H_</p><p> #define_anjian_H_</p><p> /***************
128、*********按鍵控制函數(shù)************************/</p><p> void anjian()</p><p><b> {</b></p><p> if(s1==0)//按下K1</p><p><b> {</b></p>
129、;<p> yanshi(10);//延時消抖</p><p> if(s1==0)//再次讀按鍵狀態(tài)</p><p><b> {</b></p><p><b> flag=1;</b></p><p><b> s1nu
130、m++;</b></p><p> while(!s1);</p><p> switch(s1num)//根據(jù)鍵值轉(zhuǎn)向不同的函數(shù)</p><p> {//定位光標(biāo)閃爍點</p><p> case 1:write_com(0x80+0);//年</p><p&g
131、t; write_com(0x0f);//光標(biāo)閃爍顯示</p><p><b> break;</b></p><p> case 2:write_com(0x80+3);//月</p><p><b> break;</b></p><p> case 3:write_c
132、om(0x80+6);//日</p><p><b> break;</b></p><p> case 4:write_com(0x80+12);//星期</p><p><b> break;</b></p><p> case 5:write_com(0x80+0x40
133、+0);//時</p><p><b> break;</b></p><p> case 6:write_com(0x80+0x40+3);//分</p><p><b> break;</b></p><p> case 7:write_com(0x80+0x40+6);
134、//秒</p><p><b> break;</b></p><p> case 8:s1num=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b
135、></p><p><b> }</b></p><p> if(s1num!=0)</p><p><b> {</b></p><p> if(s2==0)//按下K2</p><p><b> {</b><
136、/p><p> yanshi(10);//延時消抖</p><p> if(s2==0)//再次讀按鍵狀態(tài)</p><p><b> {</b></p><p> while(!s2);</p><p> switch(s1num)//根據(jù)鍵值轉(zhuǎn)向
137、不同的函數(shù)</p><p><b> {</b></p><p> case 1:years++;</p><p> if(years>=100)</p><p><b> years=0;</b></p><p> write_nyr(0,years);&l
138、t;/p><p> write_com(0x80+0);</p><p><b> break;</b></p><p> case 2:month++;</p><p> if(month>=13)</p><p><b> month=1;</b></p
139、><p> write_nyr(3,month);</p><p> write_com(0x80+3);</p><p><b> break;</b></p><p> case 3:day++;</p><p> if(day>=32)</p><p>&
140、lt;b> day=0;</b></p><p> write_nyr(6,day);</p><p> write_com(0x80+6);</p><p><b> break;</b></p><p> case 4: week++;</p><p> if(w
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論