2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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

提交評論