版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 分類號(hào) 編號(hào)</p><p> 畢 業(yè) 論 文(設(shè) 計(jì))</p><p> 申請(qǐng)學(xué)位: </p><p> 院 系:光電信息科學(xué)技術(shù)學(xué)院 </p><p> 專 業(yè): 電子信息工程
2、 </p><p> 姓 名: </p><p> 學(xué) 號(hào): </p><p> 指導(dǎo)老師: </p><p> 2024年10月29日</p><p> 畢業(yè)論文(設(shè)計(jì))
3、任務(wù)書(shū)</p><p> 院(系):光電信息科學(xué)技術(shù)學(xué)院</p><p> [摘要]在當(dāng)今信息科技飛速發(fā)展的時(shí)代,時(shí)間和每一個(gè)人都有非常密切的相互聯(lián)系,時(shí)間對(duì)任何人都產(chǎn)生非常重要的影響。隨著科技的快速發(fā)展,流逝的時(shí)間,我們走過(guò)了根據(jù)太陽(yáng)來(lái)判斷時(shí)間,發(fā)展到了鐘擺,又有了現(xiàn)在的電子表等。當(dāng)各類電子表在我們生活中廣泛應(yīng)用的時(shí)候,電子萬(wàn)年歷的的出現(xiàn)又把我們引入到一個(gè)全新的時(shí)代??茖W(xué)的發(fā)展為電子
4、萬(wàn)年歷的性能完善提供了條件,現(xiàn)在電子萬(wàn)年歷已經(jīng)成為了我們生活中不可缺少的生活必需品,例如:在銀行、車(chē)站、碼頭、辦公室、家庭等各種場(chǎng)所,該產(chǎn)品具有很大的市場(chǎng)前景和發(fā)展空間。</p><p> 單片機(jī)作為一個(gè)高性能、低功耗的產(chǎn)品,把很多產(chǎn)品領(lǐng)入一個(gè)全新的時(shí)代,這個(gè)設(shè)計(jì)是在單片機(jī)的基礎(chǔ)上進(jìn)行的,電子萬(wàn)年歷不僅要用到軟件而且還有用到硬件。軟件的程序編寫(xiě)采用C語(yǔ)言,硬件是用到的元件有:主要的控制部分是單片機(jī)AT89C52
5、,時(shí)鐘電路為DS1302,溫度傳感器DS18B20組成的溫度檢測(cè)電路、LCD1602組成的顯示電路、鍵盤(pán)接口5個(gè)模塊組成。</p><p> [關(guān)鍵詞]電子萬(wàn)年歷;AT89C52;DS1302;DS18B20;LCD1602</p><p> [Abstract] In today's information era of rapid development of scienc
6、e and technology, time and each person has a very close contact each other, time is very important influence on anyone. With the rapid development of science and technology, the passage of time, we walked through the tim
7、e, according to the sun to the pendulum, and the current electronic watch, etc. When all kinds of electronic watch is widely used in our life, the emergence of electronic calendar and introduce us to a new era. S</p&g
8、t;<p> Single chip microcomputer as a high performance, low power consumption products, put a lot of products into a new era, this design is based on single chip microcomputer, electronic perpetual calendar is no
9、t only to use the software and hardware used. Programming using C language software, hardware device is used are: the main control part is SCM AT89C52, for DS1302 clock circuit, temperature detection circuit composed of
10、temperature sensor DS18B20, LCD1602 display circuit, keyboard interface com</p><p> [Keywords] electronic calendar; DS1302 ; DS18B20;LCD1602 AT89C52</p><p><b> 目 錄</b></p>
11、<p><b> 1 緒 論1</b></p><p> 1.1研究背景及意義1</p><p> 1.2單片機(jī)的定義1</p><p> 2 方案論證與設(shè)計(jì)2</p><p> 2.1 電子萬(wàn)年歷的主控制系統(tǒng)2</p><p> 2.2 選擇時(shí)鐘芯片
12、2</p><p> 2.3 測(cè)溫部分的選擇2</p><p> 2.4 顯示部分方案的選擇3</p><p> 3 硬件電路設(shè)計(jì)及仿真結(jié)果4</p><p> 3.1 電路設(shè)計(jì)框圖4</p><p> 3.2 控制電路的選擇4</p><p> 3.2.1 電
13、路的選擇4</p><p> 3.2.2 選擇元器件5</p><p> 3.3 時(shí)鐘電路的選擇與計(jì)算7</p><p> 3.3.1 電路的選擇7</p><p> 3.3.2 時(shí)鐘芯片7</p><p> 3.4 顯示電路的選擇9</p><p> 3.4.
14、1 電路的選擇9</p><p> 3.4.2 元件的設(shè)計(jì)及計(jì)算10</p><p> 3.5 測(cè)溫電路的選擇10</p><p> 3.5.1 測(cè)溫的電路圖10</p><p> 3.5.2 元件的選擇及設(shè)計(jì)計(jì)算10</p><p> 3.6 硬件的仿真12</p>&
15、lt;p> 3.6.1 硬件的調(diào)試12</p><p> 3.6.2 溫度報(bào)警器13</p><p> 3.6.3 時(shí)間的調(diào)整14</p><p> 4 系統(tǒng)程序設(shè)計(jì)15</p><p> 4.1 陽(yáng)歷程序設(shè)計(jì)15</p><p> 4.2 時(shí)間調(diào)整程序設(shè)計(jì)15</p&g
16、t;<p> 4.3 陰歷程序設(shè)計(jì)16</p><p> 4.4 軟件測(cè)試16</p><p> 5 結(jié)論與展望17</p><p> 5.1 結(jié)論17</p><p> 5.2 展望17</p><p><b> 致 謝18</b></p&
17、gt;<p><b> 參考文獻(xiàn)19</b></p><p> 附 錄 A20</p><p> 附 錄 B21</p><p><b> 1 緒 論</b></p><p><b> 研究背景及意義</b></p>&l
18、t;p> 萬(wàn)年歷的說(shuō)法起源于我國(guó)古代,雖然它記錄的時(shí)間范圍可能達(dá)不到一萬(wàn)年,但是為了紀(jì)念古時(shí)候人們對(duì)時(shí)間的記錄則起名叫萬(wàn)年歷。由于單片機(jī)的性能好,可靠性強(qiáng),低功耗,抗干擾和使用輕便快捷等優(yōu)點(diǎn),且最近幾年發(fā)展迅速,單片機(jī)已經(jīng)應(yīng)用于眾多行業(yè)。在單片機(jī)發(fā)展的同時(shí),為萬(wàn)年歷的發(fā)展提供了新方法、新理論。</p><p> 時(shí)間的記載經(jīng)歷了觀天日、看擺鐘、機(jī)械表到現(xiàn)在的電子鐘,在經(jīng)驗(yàn)的基礎(chǔ)上,我們一直在不斷研究更先
19、進(jìn)、更便捷的顯示時(shí)間的鐘表,那么電子萬(wàn)年歷的出現(xiàn)就成為了必然,成為了我們生活中的必需品。</p><p><b> 單片機(jī)的定義</b></p><p> 微控制器把中央處理器(CPU)、隨機(jī)存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、中斷系統(tǒng)、定時(shí)器/計(jì)數(shù)器及I/O接口電路等主要部件集成在一塊芯片上。可以把它簡(jiǎn)稱為單片機(jī)[1]。</p><p&g
20、t; 2 方案論證與設(shè)計(jì)</p><p> 2.1 電子萬(wàn)年歷的主控制系統(tǒng)</p><p><b> 方案一:</b></p><p> 采用AT89S52,片內(nèi)ROM的全都采用Flash ROM;工作電壓可以為3V的低壓;同時(shí)存儲(chǔ)空間同MCS-51系列單片機(jī)芯片內(nèi)部為8KB ROM,也具有89C51的功能,具有在線編程和多次使用功
21、能。</p><p><b> 方案二:</b></p><p> AT89c52是一種8位CMOS微處理芯片,具有高性能、低功耗的功能。其中8KB Flash ROM,擦除次數(shù)多可以使用很多次,可以把數(shù)據(jù)保留很長(zhǎng)時(shí)間,方便以后查詢等。它采用電源控制模式,中斷源、中斷優(yōu)先級(jí)、8位I/O口、16位定時(shí)/計(jì)數(shù)器,它們的個(gè)數(shù)分別為六、四、四、三 [2]。</p&g
22、t;<p> 綜上所述:采取AT89C52為主控制系統(tǒng)。</p><p> 2.2 選擇時(shí)鐘芯片</p><p><b> 方案一:</b></p><p> 直接用單片機(jī)作為定時(shí)計(jì)數(shù)器,用程序計(jì)算時(shí)間。用這種方法芯片的使用次數(shù)沒(méi)有以前那么多了,但是測(cè)出來(lái)的時(shí)間不精確,與正確的時(shí)間差比變大了。</p>&l
23、t;p><b> 方案二:</b></p><p> 包括實(shí)時(shí)時(shí)鐘/日歷和31位的靜態(tài)RAM。它與微處理器之間進(jìn)行信息交流是靠1個(gè)串行接口完成的,它可以顯示時(shí)間、日期等信息,且在溫度超過(guò)一定界限的時(shí)候報(bào)警。這種時(shí)鐘芯片與單片機(jī)之間進(jìn)行通信方式為同步串行,僅需用到i個(gè)口線:REs、I/O、SCLK(串行時(shí)鐘)。工作時(shí)功耗小,精度高。有Vcc2作主電源和Vcc1作備份電源,備份電源在主
24、電源沒(méi)有通電的情況下使時(shí)鐘芯片正常運(yùn)行[3]。</p><p> 經(jīng)過(guò)以上兩個(gè)方案的對(duì)比,時(shí)鐘芯片為。</p><p> 2.3 測(cè)溫部分的選擇</p><p> 1.傳統(tǒng)的測(cè)溫元件在測(cè)溫時(shí)需接外部硬件,這樣一來(lái)會(huì)較麻煩且容易出錯(cuò),需要錢(qián)也較多,而軟件方面也不容易做。</p><p> 2.與前面相比,檢測(cè)元件則采用美國(guó)DALLAS
25、半導(dǎo)體公司繼DS1820之后推出的一種DS18B20(智能溫度傳感器),測(cè)溫范圍為-56~124°C,最大分辨率可達(dá)0.06°C。DS18B20在與單片機(jī)相連時(shí)為三線制,外接部件沒(méi)那么多了,則在買(mǎi)硬件時(shí)不用花那么多錢(qián)了,也不容易出錯(cuò)了。</p><p> 2.4 顯示部分方案的選擇</p><p> 方案一: 若LED 做顯示部分,他在顯示數(shù)字和成本方面還可以,但
26、是在與單片機(jī)連接時(shí),即使使用單片機(jī)的接口不多,但接線還需要花費(fèi)一點(diǎn)時(shí)間。 </p><p> 方案二: 若 LCD1602 液晶做顯示部分,它的內(nèi)存大,且在顯示文字等時(shí)很清楚,它消耗的功率低、使用時(shí)間較長(zhǎng)、在環(huán)境復(fù)雜的情況下不容易被干擾等優(yōu)點(diǎn)。</p><p> 綜上所述,顯示部分采用普通的LCDl602顯示.第一行分別表示某年、某月、某日和星期;第二行分別為時(shí)、分、秒和溫度。芯片工作
27、電壓為4.5v-5.5V,電流2.0mA(5.0V)最佳工作電壓為5.OV。</p><p> 3 硬件電路設(shè)計(jì)及仿真結(jié)果</p><p> 3.1 電路設(shè)計(jì)框圖</p><p> 圖3.1電路設(shè)計(jì)框圖</p><p> 3.2 控制電路的選擇</p><p> 3.2.1 電路的選擇</p>
28、;<p> 如圖3.2所示為主控電路:</p><p><b> 圖3.2主控電路</b></p><p> 3.2.2 選擇元器件</p><p> 1單片機(jī)AT89C52</p><p> ATMEL公司生產(chǎn)的AT89C52單片機(jī)采用高性能的靜態(tài)80C51設(shè)計(jì),由先進(jìn)工藝制造且程序存儲(chǔ)器為F
29、LASH。它的主要性能特點(diǎn)有:</p><p> 8KB Flash ROM,可以檫寫(xiě)1000次以上,數(shù)據(jù)保存10年。</p><p> 256字節(jié)內(nèi)部RAM。</p><p> 電源控制模式:時(shí)鐘設(shè)置、空閑模式、掉電模式。</p><p> 全雙工增強(qiáng)型UART;T0、T1(標(biāo)準(zhǔn)80C51)和增加的T2(捕獲和比較)。</p&
30、gt;<p> 全靜態(tài)工作方式:0~24MHz。</p><p> 圖3.3 AT89C52的引腳圖</p><p> 如圖3.4所示是AT89C52P0口的上拉電阻電路連接圖</p><p> 圖3.4是AT89C52P0口的上拉電阻電路連接圖</p><p><b> 2、單片機(jī)晶振電路</b&g
31、t;</p><p> 晶振電路采用的晶體振蕩器,頻率為12MHz。在晶振的兩端接兩個(gè)電容值為22pF,電容的作用是過(guò)濾不需要的信號(hào)。如圖3.5所示為。</p><p> 圖3.5 晶振電路連接圖</p><p><b> 3、單片機(jī)復(fù)位電路</b></p><p> 采用的是上電式復(fù)位。接通電源的瞬間,通過(guò)電
32、容的那條線等于沒(méi)有電阻,這個(gè)時(shí)候自動(dòng)復(fù)位;電容兩端的電壓為電源電壓時(shí),電阻最大,流過(guò)電容的電流為0, 這個(gè)時(shí)候?qū)﹄娐窡o(wú)影響,程序正常運(yùn)行。如圖3.6所示為復(fù)位電路圖</p><p> 圖3.6 復(fù)位電路圖</p><p> 3.3 時(shí)鐘電路的選擇與計(jì)算</p><p> 3.3.1 電路的選擇 </p><p><
33、b> 圖3.7時(shí)鐘電路圖</b></p><p> 3.3.2 時(shí)鐘芯片</p><p><b> 的性能特性</b></p><p> 最少引腳的串行I/O;</p><p> 2.5~5.5V的電壓工作范圍;</p><p> 2.5V時(shí)耗電小于300nA;&l
34、t;/p><p><b> 簡(jiǎn)單的3線接口;</b></p><p><b> 充電方式可以選擇。</b></p><p> 中Vcc1在提供低電源和低功率時(shí)可以作為后備電源,當(dāng)Vcc2在雙電源系統(tǒng)中作為主電源時(shí),Vcc1作為備份電源,防止在主電源掉電的情況下能保存信息,使時(shí)鐘正常工作。DS1302由Vcc1或Vcc2中
35、較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給供電;當(dāng)Vcc2小于Vcc1時(shí), 由Vcc1供電。</p><p><b> 數(shù)據(jù)操作原理</b></p><p> 在數(shù)據(jù)傳送過(guò)程中若RST腳為低電平,則不再傳送數(shù)據(jù)。接通電源運(yùn)行時(shí),在VCC大于等于2.5V之前,RST腳必須保持“0”狀態(tài)不變。只有在SCLK為“1”時(shí), RST才能置為“0”。</
36、p><p> 表3.1為各引腳的功能</p><p> 表 3.1 DS1302引腳功能</p><p> 如圖3.8所示的控制字??刂谱止?jié)的第7位必須是高電平;如果它為低電平,則中則不能寫(xiě)入數(shù)據(jù)。位6為0和1時(shí)分別表示存取日歷時(shí)鐘數(shù)據(jù)和RAM數(shù)據(jù)。指示操作單元的地址為位5~1(A5~A1)。A0和A1分別表示進(jìn)行寫(xiě)操作和進(jìn)行讀操作??刂谱止?jié)則是從A0開(kāi)始輸入
37、或輸出[4]。</p><p> 7 6 5 4 3 2 1 0</p><p> 圖 3.8 DS1302的控制字</p><p> 表 3.2 的日歷、時(shí)間內(nèi)部寄存器地址和內(nèi)容</p><p> 的 日歷、時(shí)間寄存器及其控制字見(jiàn)表3.2,當(dāng)讀取的數(shù)
38、是偶數(shù)時(shí)則將寫(xiě)入相關(guān)內(nèi)容,否則是讀出相關(guān)內(nèi)容。 A7決定時(shí)間是12小時(shí)制還是24小時(shí)制。它為高電平時(shí)則為12小時(shí)制。在這種情況下,A5是AM/PM位,此位是高電平時(shí)表示PM低電平表示AM。在24h方式下,A5為第二個(gè)10h位(20~23h)。</p><p><b> 2、晶振電路</b></p><p> 單片機(jī)的晶振電路基本差不多,不同之處在于它們的頻率,所選
39、晶振頻率為32768Hz。如圖3.9所示為DS1302的晶振電路</p><p> 圖3.9 的晶振電路</p><p> 3.4 顯示電路的選擇</p><p> 3.4.1 電路的選擇</p><p> 圖3.10 顯示電路</p><p> 3.4.2 元件的設(shè)計(jì)及計(jì)算</p>
40、<p> LCD1602的特性</p><p> 內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM</p><p> 8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM</p><p> 3.5 測(cè)溫電路的選擇</p><p> 3.5.1 測(cè)溫的電路圖</p><p> 圖3.11測(cè)溫的電
41、路圖</p><p> 3.5.2 元件的選擇及設(shè)計(jì)計(jì)算</p><p> DS18B20溫度傳感器的優(yōu)點(diǎn):</p><p> 1、接口方式采用單總線。單總線具有使用經(jīng)濟(jì)、方便快捷、抗干擾能力強(qiáng)等優(yōu)點(diǎn),特別適用于惡劣環(huán)境的測(cè)溫,為構(gòu)建測(cè)量系統(tǒng)創(chuàng)建了新方法。</p><p> 2、當(dāng)多個(gè)DS18B20同時(shí)使用時(shí)可達(dá)到多點(diǎn)測(cè)溫的目的,且
42、不需要外接元件</p><p> 3、多變的供電方式。DS18B20既可以在外部接電源,又可以在內(nèi)部通過(guò)數(shù)據(jù)線獲取電源,在這種情況子下可以使系統(tǒng)具有簡(jiǎn)單的結(jié)構(gòu),較高的可靠性。</p><p> 4、負(fù)壓特性。在電源沒(méi)有正確接線時(shí),溫度計(jì)將會(huì)繼續(xù)正常工作且不會(huì)燒毀。</p><p> 5、防止掉電。DS18B20有EEPROM,在沒(méi)有電時(shí)仍然可以繼續(xù)工作。<
43、;/p><p> DS18B20的性能特點(diǎn)如下:</p><p><b> 不需要外部器件;</b></p><p> 電壓工作范圍為3.0~3.5V,可由數(shù)據(jù)線提供電源且待機(jī)時(shí)不需要消耗功率;</p><p> 溫度以一定的數(shù)字讀出;</p><p> 設(shè)置的溫度報(bào)警器數(shù)據(jù)不容易丟失。&l
44、t;/p><p> DS18B20溫度傳感器還有容量為八字節(jié)的RAM作為暫存和信息可重復(fù)使用的EERAM。溫度信息在前兩個(gè)字節(jié),接著的兩個(gè)字節(jié)為 TH和TL的拷貝,信息不容易保存,且在通電時(shí)信息被刷新。配置寄存器位于第五個(gè)字節(jié)。DS18B20工作時(shí)按配置寄存器中的分辨率將溫度轉(zhuǎn)換為相對(duì)需要的值。</p><p> 表3.3 DS18B20分辨率的定義規(guī)定</p><p
45、> 由表3.3可見(jiàn),在應(yīng)用DS18B20時(shí)分辨率和轉(zhuǎn)換時(shí)間要綜合考慮,隨著分辨率增長(zhǎng)溫度數(shù)據(jù)轉(zhuǎn)換時(shí)間就越多。暫存RAM的六七八沒(méi)有用到,全部用高字節(jié)表示。第九字節(jié)將顯示前面的CRC碼,通過(guò)數(shù)據(jù)的檢測(cè)來(lái)確保通信數(shù)據(jù)無(wú)誤。</p><p> S為符號(hào)位,S取值為零時(shí),可以直接進(jìn)行2進(jìn)制到10進(jìn)制變換;當(dāng)S取值為一時(shí),測(cè)的溫度為零度以下,則不可以直接求出10進(jìn)制的數(shù)值。</p><p>
46、; DS18B20是單線通信且分時(shí)完成,要求較嚴(yán)格,所以看重讀寫(xiě)時(shí)序。DS18B20的操作流程為:首先對(duì) DS18B20初始化,其次把ROM的各個(gè)指令發(fā)出,接著把存儲(chǔ)器的各個(gè)操作指令發(fā)出,最后進(jìn)行數(shù)據(jù)的處理[5]。</p><p> 2、DS18B20內(nèi)部結(jié)構(gòu):</p><p> DS18B20主要由64位ROM、溫度傳感器、不容易揮發(fā)的溫度報(bào)警除法器TH和TL、配置寄存器四個(gè)部分組
47、成。ROM中的64位序列號(hào)可以看做是DS18B20的地址序列碼,它是出廠前就被定義好的,則每個(gè)DS18B20的64位序列號(hào)均不相同,即所有的DS18B20都各不相同,因此可以多個(gè)DS18B20并聯(lián)在一根總線上。</p><p> DS18B20可以采用兩種方式供電,一種是由電源提供供電,此時(shí)DS18B20的1腳接地,2腳作為引線,3腳外接電源。另一種是寄生電源供電方式。為了使DS18B20正常使用,單片機(jī)端口用
48、MOSFET管來(lái)控制單線總線。</p><p> 單線總線開(kāi)啟時(shí)間非常短,而它的引腳驅(qū)動(dòng)能力有限,只能輸出低電平,無(wú)法輸出高電平,為了保證寫(xiě)存儲(chǔ)器操作和溫度A/D轉(zhuǎn)換操作能正常進(jìn)行必須使用外部上拉</p><p> 3.6 硬件的仿真</p><p> 3.6.1 硬件的調(diào)試</p><p> 首先根據(jù)硬件電路圖利用PROTEUS
49、把電路圖鏈接好,如圖3.12硬件實(shí)際圖:</p><p> 圖3.12硬件模擬圖</p><p> 然后保存文件的格式為.DSN,以便下次使用的時(shí)候調(diào)用。</p><p> 然后再雙擊單片機(jī),在Progame File欄調(diào)出程序生成的以.hex為后綴的文件,然后單擊確定,如圖3.13所示:</p><p> 圖3.13 調(diào)用程序<
50、;/p><p> 硬件仿真的結(jié)果如圖3.14</p><p> 圖3.14 硬件仿真結(jié)果</p><p> 3.6.2 溫度報(bào)警器</p><p> LED顯示屏顯示的為年/月/日、星期、時(shí)分秒、溫度。U3為溫度的調(diào)試,左/右邊分別表示為溫度減/加1。當(dāng)溫度超過(guò)35度時(shí),將會(huì)報(bào)警,如圖3.15在R2和報(bào)警器之間的符號(hào)變?yōu)榧t的并且有滴滴的
51、聲音發(fā)出。</p><p> 圖3.15報(bào)警時(shí)的圖</p><p> 3.6.3 時(shí)間的調(diào)整</p><p> 年、月、日、星期、時(shí)、分、秒的調(diào)整為R3、R4、R5和R6下面的那個(gè)BUTTON,它們分別表示啟動(dòng)、加、減、恢復(fù)。單擊啟動(dòng)時(shí),可以調(diào)整秒,加減調(diào)整結(jié)束后,如果還不正確,在單擊調(diào)試,則可以調(diào)試分,以此類推,可以調(diào)試時(shí)、星期、日、月、年,調(diào)整結(jié)束后單擊
52、恢復(fù),則可以恢復(fù),調(diào)整結(jié)束。如圖3.16時(shí)間的調(diào)整</p><p><b> 3.16時(shí)間的調(diào)整</b></p><p><b> 4 系統(tǒng)程序設(shè)計(jì)</b></p><p> 4.1 陽(yáng)歷程序設(shè)計(jì)</p><p> 因?yàn)樵谠摮绦蛑惺褂肈S1302時(shí)鐘芯片,陽(yáng)歷程序只需從DS1302各寄存
53、器中讀出年、月、日、周、[小]時(shí)、分、秒等數(shù)據(jù),再處理即可。對(duì)DS1302進(jìn)行首次操作之前,先初始化,把經(jīng)過(guò)處理的從DS1302中讀出數(shù)據(jù)送給顯示緩沖單元。陽(yáng)歷時(shí)間顯示的程序流程圖見(jiàn)圖4.1所示。</p><p> 4.2 時(shí)間調(diào)整程序設(shè)計(jì)</p><p> 時(shí)間的修改用4個(gè)按鈕鍵來(lái)控制,它們分別為開(kāi)始、加、減、停止。在時(shí)間修改的過(guò)程中,要修改的位與不需要修改的位應(yīng)該把它們給分別開(kāi)。
54、把需要修改的位一直在閃,直到修改完繼續(xù)修改下一個(gè)。需要修改的位一直閃的原理是利用定時(shí)器把需要修改的位亮和熄滅一定時(shí)間,比如說(shuō)每次亮和熄滅的時(shí)間均為為40ms。利用定時(shí)器計(jì)時(shí),每次達(dá)到40ms溢出時(shí),由亮變滅或由滅變亮,不斷交替,直到不再調(diào)整。這個(gè)時(shí)候把正確的數(shù)定住,不在閃,然后使下一個(gè)需要修改的數(shù)不停的閃。</p><p> 4.3 陰歷程序設(shè)計(jì)</p><p> 根據(jù)陽(yáng)歷日期來(lái)推算
55、陰歷日期。先要根據(jù)當(dāng)前陽(yáng)歷的日期,算出陽(yáng)歷為該年中的第多少天,設(shè)為A,該年春節(jié)和元旦的日差為B,當(dāng)A>=B時(shí),則A-B=C時(shí),C就是陰歷在該年中的第多少天,然后就可以算出當(dāng)前陰歷日期;當(dāng)A<B時(shí),則陰歷比陽(yáng)歷小一年,通常此時(shí)陰歷會(huì)是11月或者12月,此時(shí)B-A=D,而D表示距離過(guò)新年還剩的天數(shù)。再根據(jù)查表所得的該年的陰歷的閏月,以及哪些月份有30號(hào)和哪些月份沒(méi)有30號(hào),這樣就可以計(jì)算出在陰歷時(shí)為幾月幾號(hào)。</p>
56、<p><b> 4.4 軟件測(cè)試</b></p><p> 首先在Keil uVision3軟件上在File中把寫(xiě)好的程序調(diào)用出來(lái),程序見(jiàn)附錄B,然后再Project中通過(guò)New Project把生成的以.Uv2為后綴的文件打開(kāi)如圖4.2</p><p> 圖4.2 工程的調(diào)用</p><p> 最后為程序的調(diào)試,程序
57、的調(diào)試為單擊左邊的第一個(gè)如圖4.3,調(diào)試的結(jié)果如圖4.4</p><p> 圖4.3 程序的調(diào)試圖</p><p> 4.4 程序的調(diào)試結(jié)果</p><p><b> 5 結(jié)論與展望</b></p><p><b> 5.1 結(jié)論</b></p><p> 此次
58、設(shè)計(jì)具有可以顯示陽(yáng)歷日期、按鍵調(diào)整時(shí)間和可動(dòng)態(tài)顯示年等功能。這個(gè)設(shè)計(jì)的硬件電路用的器件比較少,電路比較簡(jiǎn)單,電路的主要部分為AT89C52單片機(jī),DS1302時(shí)鐘芯片和LCD12864作為顯示器,可以達(dá)到目的。</p><p><b> 5.2 展望</b></p><p> 這次設(shè)計(jì)雖然完成了,但是還存在著缺點(diǎn):</p><p> 1
59、、顯示的年限過(guò)短,只能顯示2000年—2100年之間的部分。</p><p> 2、通過(guò)按鍵調(diào)節(jié)年、月、日后,如果不調(diào)節(jié)星期,星期的顯示就會(huì)出現(xiàn)與正常的星期不一樣,導(dǎo)致出現(xiàn)錯(cuò)誤,現(xiàn)在還沒(méi)有想出如何可以自動(dòng)調(diào)整,只能自己調(diào)節(jié)才能糾正過(guò)來(lái)。</p><p> 3、于未來(lái)的陰歷日期是不能準(zhǔn)確預(yù)測(cè)出的,所以,未來(lái)所顯示的陰歷日期有可能與別人設(shè)計(jì)的電子萬(wàn)年歷所表示的時(shí)間不一樣。</p>
60、;<p> 4、編程采用的是C語(yǔ)言,不是匯編語(yǔ)言,比較復(fù)雜,所以看起來(lái)沒(méi)有匯編語(yǔ)言簡(jiǎn)潔,整齊。</p><p> 5、仿真出來(lái)的溫度不能自動(dòng)感受溫度,必須用手動(dòng)調(diào)節(jié)。</p><p> 6、電子萬(wàn)年歷的功能還可以繼續(xù)增加,比如可以添加跑馬燈等等,所以發(fā)展空間很大,需要我們不斷繼續(xù)創(chuàng)新、探索。</p><p><b> 致 謝<
61、/b></p><p> 正是至此論文全部結(jié)束,在論文創(chuàng)作工程中,我特別感謝所有關(guān)心、愛(ài)護(hù)我的人們,謝謝他們的鼓勵(lì)和幫助。</p><p> 首先,本文是在*老師的指導(dǎo)下完成的。在此,我衷心地感謝我的指導(dǎo)老師*老師!不管在選題階段,還是在設(shè)計(jì)階段、在制作階段,他對(duì)我的悉心指導(dǎo),使我得以順利的完成畢業(yè)設(shè)計(jì)。在此過(guò)程中,遇到的難題,他們總是耐心細(xì)致地幫我解決,使我不僅在硬件技術(shù)方面有
62、了一定的提高,同時(shí),對(duì)軟件使用能力也得到了提高。最重要的是提高我對(duì)實(shí)際問(wèn)題的分析能力與解決能力。培養(yǎng)了我獨(dú)立完成課題的能力。因此,在這里我衷心地感謝他,謝謝您對(duì)我的指導(dǎo)和關(guān)心。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 江志紅. 51 單片機(jī)技術(shù)與應(yīng)用系統(tǒng)開(kāi)發(fā)案例精選[M]. 清華大學(xué)出版社, 2008.</p><
63、p> [2]潘永雄. 新編單片機(jī)原理與應(yīng)用[M]. 西安電子科技大學(xué)出版社, 2007.</p><p> [3] 馬鴻文. 基于 AT89C52 單片機(jī)的自動(dòng)存取柜的設(shè)計(jì)與實(shí)現(xiàn) [J][J]. 微計(jì)算機(jī)信息, 2006, 22(1): 101-103.</p><p> [4] 程利民, 王軍, 歐陽(yáng)德祥, 等. 基于 STC89C54 的單片機(jī)實(shí)踐教學(xué)系統(tǒng)設(shè)計(jì)[J]. 武漢
64、職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2007, 3: 77-79.</p><p> [5]錢(qián)超, 王福明. 基于單片機(jī)的多功能電子萬(wàn)年歷設(shè)計(jì)[J]. 世界電子元器件, 2012, 5: 020.</p><p><b> 附 錄 A</b></p><p><b> 附 錄 B </b></p><p
65、> #include <REG52.H></p><p> #include "LCD1602.H"</p><p> #include "DS18B20.H"</p><p> #include "DS1302.H"</p><p> #define u
66、int unsigned int</p><p> #define uchar unsigned char</p><p> #define TH 35 //設(shè)置溫度上限</p><p> extern unsigned char week_value[2],TempBuffer[5]
67、; //聲明外部變量</p><p> extern int temp_value;</p><p> char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)</p><p> sbit Set = P3^0;
68、 //模式切換鍵</p><p> sbit Up = P3^1; //加法按鈕</p><p> sbit Down = P3^2; //減法按鈕</p><p>
69、 sbit out = P3^3; //立刻跳出調(diào)整模式按鈕</p><p> sbit deng = P1^1; </p><p> char done,count,temp,flag,up_flag,down_flag;</p><p> char SD=1;</p>&
70、lt;p> void show_time(); //液晶顯示函數(shù)聲明</p><p> /**************************************************************</p><p><b> 延時(shí)子程序</b></p><
71、p> **************************************************************/</p><p> void mdelay(uint delay)</p><p><b> {uint i;</b></p><p> for(;delay>0;delay--)</p
72、><p> {for(i=0;i<62;i++) //1ms延時(shí)</p><p><b> {;}</b></p><p><b> }</b></p><p><b> }</b></p><
73、;p> /**************************************************************</p><p><b> 升序按鍵</b></p><p> **************************************************************/</p><p
74、> void Upkey()</p><p><b> { </b></p><p><b> Up=1;</b></p><p><b> if(Up==0)</b></p><p><b> {</b></p>&l
75、t;p> mdelay(8);</p><p> switch(count)</p><p><b> {case 1:</b></p><p> temp=Read1302(DS1302_SECOND);//讀取秒數(shù)</p><p> temp=temp+1; //秒數(shù)加1
76、</p><p> up_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志</p><p> if((temp&0x7f)>0x59) //超過(guò)59秒,清零</p><p> temp=0; </p><p><b> break;</b></p><p>&
77、lt;b> case 2:</b></p><p> temp=Read1302(DS1302_MINUTE);//讀取分?jǐn)?shù)</p><p> temp=temp+1; //分?jǐn)?shù)加1</p><p> up_flag=1;</p><p> if(temp>0x59)
78、 //超過(guò)59分,清零</p><p><b> temp=0;</b></p><p><b> break;</b></p><p><b> case 3:</b></p><p> temp=Read1302(DS1302_HOUR);//讀取小時(shí)數(shù)<
79、;/p><p> temp=temp+1; //小時(shí)數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x23) //超過(guò)23小時(shí),清零</p><p><b> temp=0;</b></p><p><b&
80、gt; break;</b></p><p><b> case 4:</b></p><p> temp=Read1302(DS1302_WEEK);//讀取星期數(shù)</p><p> temp=temp+1; //星期數(shù)加1</p><p> up_flag=1;<
81、;/p><p> if(temp>0x7) </p><p><b> temp=1;</b></p><p><b> break;</b></p><p><b> case 5:</b></p><p> temp=Read1302(
82、DS1302_DAY);//讀取日數(shù)</p><p> temp=temp+1; //日數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x31)</p><p><b> temp=1;</b></p><p><
83、;b> break;</b></p><p><b> case 6:</b></p><p> temp=Read1302(DS1302_MONTH);//讀取月數(shù)</p><p> temp=temp+1; //月數(shù)加1</p><p> up_flag=1
84、;</p><p> if(temp>0x12)</p><p><b> temp=1;</b></p><p><b> break;</b></p><p><b> case 7:</b></p><p> temp=Read13
85、02(DS1302_YEAR); //讀取年數(shù)</p><p> temp=temp+1; //年數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x85)</p><p><b> temp=0;</b></p><p
86、><b> break;</b></p><p> default:break;</p><p><b> }</b></p><p> while(Up==0);</p><p><b> }</b></p><p><b>
87、 }</b></p><p> /**************************************************************</p><p><b> 降序按鍵</b></p><p> ****************************************************
88、**********/</p><p> void Downkey()</p><p><b> { </b></p><p><b> Down=1;</b></p><p> if(Down==0)</p><p><b> {</b&g
89、t;</p><p> mdelay(8);</p><p> switch(count)</p><p><b> {case 1:</b></p><p> temp=Read1302(DS1302_SECOND);//讀取秒數(shù)</p><p> temp=temp-1;
90、 //秒數(shù)減1</p><p> down_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志</p><p> if(temp==0x7f) //小于0秒,返回59秒</p><p> temp=0x59;</p><p><b> break;</b></p><p><b>
91、 case 2:</b></p><p> temp=Read1302(DS1302_MINUTE) //讀取分?jǐn)?shù)</p><p> temp=temp-1; //分?jǐn)?shù)減1</p><p> down_flag=1;</p><p> if(temp==-1)</p><
92、;p> temp=0x59; //小于0秒,返回59秒</p><p><b> break;</b></p><p><b> case 3:</b></p><p> temp=Read1302(DS1302_HOUR);//讀取小時(shí)數(shù)</p><p> temp
93、=temp-1; //小時(shí)數(shù)減1</p><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x23;</p><p><b> break;</b></p><p><b> case 4:
94、</b></p><p> temp=Read1302(DS1302_WEEK);//讀取星期數(shù)</p><p> temp=temp-1; //星期數(shù)減1</p><p> down_flag=1;</p><p> if(temp==0)</p><p> temp
95、=0x7;;</p><p><b> break;</b></p><p><b> case 5:</b></p><p> temp=Read1302(DS1302_DAY);//讀取日數(shù)</p><p> temp=temp-1; //日數(shù)減1<
96、/p><p> down_flag=1;</p><p> if(temp==0)</p><p><b> temp=31;</b></p><p><b> break;</b></p><p><b> case 6:</b></p&g
97、t;<p> temp=Read1302(DS1302_MONTH);//讀取月數(shù)</p><p> temp=temp-1; //月數(shù)減1</p><p> down_flag=1;</p><p> if(temp==0)</p><p><b> temp=12;<
98、/b></p><p><b> break;</b></p><p><b> case 7:</b></p><p> temp=Read1302(DS1302_YEAR);//讀取年數(shù)</p><p> temp=temp-1; //年數(shù)減1<
99、;/p><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x85;</p><p><b> break;</b></p><p> default:break;</p><p><b> }&l
100、t;/b></p><p> while(Down==0);</p><p><b> }</b></p><p><b> }</b></p><p> /**************************************************************&l
101、t;/p><p><b> 模式選擇按鍵</b></p><p> **************************************************************/</p><p> void Setkey()</p><p><b> {</b></p>
102、;<p><b> Set=1;</b></p><p> if(Set==0)</p><p><b> {</b></p><p> mdelay(8);</p><p> count=count+1; //Setkey按一次,count就加1</p
103、><p> done=1; //進(jìn)入調(diào)整模式</p><p> while(Set==0);</p><p><b> }</b></p><p><b> }</b></p><p> /***************************
104、***********************************</p><p> 跳出調(diào)整模式,返回默認(rèn)顯示</p><p> **************************************************************/</p><p> void outkey() </p&
105、gt;<p> { uchar Second;</p><p><b> out=1;</b></p><p> if(out==0) </p><p><b> { </b></p><p><b> count=0;</b><
106、/p><p> hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;</p><p> Second=Read1302(DS1302_SECOND);</p><p> Write1302(0x8e,0x00); //寫(xiě)入允許</
107、p><p> Write1302(0x80,Second&0x7f);</p><p> Write1302(0x8E,0x80); //禁止寫(xiě)入</p><p> done=0; </p><p> while(out==0);</p><p><b>
108、}</b></p><p><b> }</b></p><p> /**************************************************************</p><p><b> 按鍵功能執(zhí)行</b></p><p> *********
109、*****************************************************/</p><p> void keydone()</p><p> { uchar Second;</p><p> if(flag==0) //關(guān)閉時(shí)鐘,停止計(jì)時(shí)</p><
110、;p> { Write1302(0x8e,0x00); //寫(xiě)入允許</p><p> temp=Read1302(0x80);</p><p> Write1302(0x80,temp|0x80);</p><p> Write1302(0x8e,0x80); //禁止寫(xiě)入</p><p&g
111、t;<b> flag=1;</b></p><p><b> }</b></p><p> Setkey(); //掃描模式切換按鍵</p><p> switch(count)</p><p> {case 1:do //count
112、=1,調(diào)整秒</p><p><b> {</b></p><p> outkey(); //掃描跳出按鈕</p><p> Upkey(); //掃描加按鈕</p><p> Downkey(); //掃描減按鈕</p><p
113、> if(up_flag==1||down_flag==1) //數(shù)據(jù)更新,重新寫(xiě)入新的數(shù)據(jù)</p><p><b> {</b></p><p> Write1302(0x8e,0x00); //寫(xiě)入允許</p><p> Write1302(0x80,temp|0x80);
114、 //寫(xiě)入新的秒數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫(xiě)入</p><p> up_flag=0;</p><p> down_flag=0;</p><p><b> }</b></p><p> hide_sec+
115、+; //位閃計(jì)數(shù)</p><p> if(hide_sec>3)</p><p> hide_sec=0;</p><p> show_time(); //液晶顯示數(shù)據(jù)</p><p> }while(count==2);break; </p><p> case
116、2:do //count=2,調(diào)整分</p><p><b> {</b></p><p> hide_sec=0;</p><p><b> outkey();</b></p><p><b> Upkey();</b></p>
117、<p> Downkey();</p><p> if(temp>0x60)</p><p><b> temp=0;</b></p><p> if(up_flag==1||down_flag==1)</p><p><b> {</b></p><p
118、> Write1302(0x8e,0x00); //寫(xiě)入允許</p><p> Write1302(0x82,temp); //寫(xiě)入新的分?jǐn)?shù)</p><p> Write1302(0x8e,0x80); //禁止寫(xiě)入</p><p> up_flag=0;&
119、lt;/p><p> down_flag=0;</p><p><b> }</b></p><p> hide_min++;</p><p> if(hide_min>3)</p><p> hide_min=0;</p><p> show_time();
120、</p><p> }while(count==3);break;</p><p> case 3:do //count=3,調(diào)整小時(shí)</p><p><b> {</b></p><p> hide_min=0; </p><p><b>
121、; outkey();</b></p><p><b> Upkey();</b></p><p> Downkey();</p><p> if(up_flag==1||down_flag==1)</p><p><b> {</b></p><p>
122、 Write1302(0x8e,0x00); //寫(xiě)入允許</p><p> Write1302(0x84,temp); //寫(xiě)入新的小時(shí)數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫(xiě)入</p><p> up_flag=0;</p><
123、;p> down_flag=0;</p><p><b> }</b></p><p> hide_hour++;</p><p> if(hide_hour>3)</p><p> hide_hour=0;</p><p> show_time();</p>
124、<p> }while(count==4);break;</p><p> case 4:do //count=4,調(diào)整星期</p><p><b> {</b></p><p> hide_hour=0; </p><p><b> outkey();</b
125、></p><p><b> Upkey();</b></p><p> Downkey();</p><p> if(up_flag==1||down_flag==1)</p><p><b> {</b></p><p> Write1302(0x8e,0
126、x00); //寫(xiě)入允許</p><p> Write1302(0x8a,temp); //寫(xiě)入新的星期數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫(xiě)入</p><p> up_flag=0;</p><p> down_flag=0;</p><p><b> }&l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文(設(shè)計(jì))基于單片機(jī)的電子萬(wàn)年歷
- 萬(wàn)年歷畢業(yè)論文---基于at89s52單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)
- 單片機(jī)電子萬(wàn)年歷畢業(yè)論文
- 單片機(jī)電子萬(wàn)年歷畢業(yè)論文
- 單片機(jī)電子萬(wàn)年歷畢業(yè)論文
- 基于單片機(jī)的電子萬(wàn)年歷
- 基于單片機(jī)的電子萬(wàn)年歷
- 基于單片機(jī)萬(wàn)年歷的設(shè)計(jì)畢業(yè)論文
- 基于51單片機(jī)的電子萬(wàn)年歷畢業(yè)論文設(shè)計(jì)
- 基于51單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)萬(wàn)年歷的設(shè)計(jì)畢業(yè)論文
- 基于51單片機(jī)電子萬(wàn)年歷畢業(yè)論文
- 畢業(yè)論文——基于51單片機(jī)的電子萬(wàn)年歷的設(shè)計(jì)
- 基于單片機(jī)電子萬(wàn)年歷的設(shè)計(jì)畢業(yè)論文
- 基于單片機(jī)的電子萬(wàn)年歷大學(xué)
- 基于51單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)-畢業(yè)論文設(shè)計(jì)
- 單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)
- 基于單片機(jī)的電子萬(wàn)年歷的設(shè)計(jì)論文
- 基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)制作論文
- 基于單片機(jī)的電子萬(wàn)年歷畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論