版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 分類號 編號</p><p> 畢 業(yè) 論 文(設 計)</p><p> 申請學位: </p><p> 院 系:光電信息科學技術學院 </p><p> 專 業(yè): 電子信息工程
2、 </p><p> 姓 名: </p><p> 學 號: </p><p> 指導老師: </p><p> 2024年10月29日</p><p> 畢業(yè)論文(設計)
3、任務書</p><p> 院(系):光電信息科學技術學院</p><p> [摘要]在當今信息科技飛速發(fā)展的時代,時間和每一個人都有非常密切的相互聯(lián)系,時間對任何人都產(chǎn)生非常重要的影響。隨著科技的快速發(fā)展,流逝的時間,我們走過了根據(jù)太陽來判斷時間,發(fā)展到了鐘擺,又有了現(xiàn)在的電子表等。當各類電子表在我們生活中廣泛應用的時候,電子萬年歷的的出現(xiàn)又把我們引入到一個全新的時代??茖W的發(fā)展為電子
4、萬年歷的性能完善提供了條件,現(xiàn)在電子萬年歷已經(jīng)成為了我們生活中不可缺少的生活必需品,例如:在銀行、車站、碼頭、辦公室、家庭等各種場所,該產(chǎn)品具有很大的市場前景和發(fā)展空間。</p><p> 單片機作為一個高性能、低功耗的產(chǎn)品,把很多產(chǎn)品領入一個全新的時代,這個設計是在單片機的基礎上進行的,電子萬年歷不僅要用到軟件而且還有用到硬件。軟件的程序編寫采用C語言,硬件是用到的元件有:主要的控制部分是單片機AT89C52
5、,時鐘電路為DS1302,溫度傳感器DS18B20組成的溫度檢測電路、LCD1602組成的顯示電路、鍵盤接口5個模塊組成。</p><p> [關鍵詞]電子萬年歷;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單片機的定義1</p><p> 2 方案論證與設計2</p><p> 2.1 電子萬年歷的主控制系統(tǒng)2</p><p> 2.2 選擇時鐘芯片
12、2</p><p> 2.3 測溫部分的選擇2</p><p> 2.4 顯示部分方案的選擇3</p><p> 3 硬件電路設計及仿真結果4</p><p> 3.1 電路設計框圖4</p><p> 3.2 控制電路的選擇4</p><p> 3.2.1 電
13、路的選擇4</p><p> 3.2.2 選擇元器件5</p><p> 3.3 時鐘電路的選擇與計算7</p><p> 3.3.1 電路的選擇7</p><p> 3.3.2 時鐘芯片7</p><p> 3.4 顯示電路的選擇9</p><p> 3.4.
14、1 電路的選擇9</p><p> 3.4.2 元件的設計及計算10</p><p> 3.5 測溫電路的選擇10</p><p> 3.5.1 測溫的電路圖10</p><p> 3.5.2 元件的選擇及設計計算10</p><p> 3.6 硬件的仿真12</p>&
15、lt;p> 3.6.1 硬件的調(diào)試12</p><p> 3.6.2 溫度報警器13</p><p> 3.6.3 時間的調(diào)整14</p><p> 4 系統(tǒng)程序設計15</p><p> 4.1 陽歷程序設計15</p><p> 4.2 時間調(diào)整程序設計15</p&g
16、t;<p> 4.3 陰歷程序設計16</p><p> 4.4 軟件測試16</p><p> 5 結論與展望17</p><p> 5.1 結論17</p><p> 5.2 展望17</p><p><b> 致 謝18</b></p&
17、gt;<p><b> 參考文獻19</b></p><p> 附 錄 A20</p><p> 附 錄 B21</p><p><b> 1 緒 論</b></p><p><b> 研究背景及意義</b></p>&l
18、t;p> 萬年歷的說法起源于我國古代,雖然它記錄的時間范圍可能達不到一萬年,但是為了紀念古時候人們對時間的記錄則起名叫萬年歷。由于單片機的性能好,可靠性強,低功耗,抗干擾和使用輕便快捷等優(yōu)點,且最近幾年發(fā)展迅速,單片機已經(jīng)應用于眾多行業(yè)。在單片機發(fā)展的同時,為萬年歷的發(fā)展提供了新方法、新理論。</p><p> 時間的記載經(jīng)歷了觀天日、看擺鐘、機械表到現(xiàn)在的電子鐘,在經(jīng)驗的基礎上,我們一直在不斷研究更先
19、進、更便捷的顯示時間的鐘表,那么電子萬年歷的出現(xiàn)就成為了必然,成為了我們生活中的必需品。</p><p><b> 單片機的定義</b></p><p> 微控制器把中央處理器(CPU)、隨機存儲器(RAM)、只讀存儲器(ROM)、中斷系統(tǒng)、定時器/計數(shù)器及I/O接口電路等主要部件集成在一塊芯片上??梢园阉喎Q為單片機[1]。</p><p&g
20、t; 2 方案論證與設計</p><p> 2.1 電子萬年歷的主控制系統(tǒng)</p><p><b> 方案一:</b></p><p> 采用AT89S52,片內(nèi)ROM的全都采用Flash ROM;工作電壓可以為3V的低壓;同時存儲空間同MCS-51系列單片機芯片內(nèi)部為8KB ROM,也具有89C51的功能,具有在線編程和多次使用功
21、能。</p><p><b> 方案二:</b></p><p> AT89c52是一種8位CMOS微處理芯片,具有高性能、低功耗的功能。其中8KB Flash ROM,擦除次數(shù)多可以使用很多次,可以把數(shù)據(jù)保留很長時間,方便以后查詢等。它采用電源控制模式,中斷源、中斷優(yōu)先級、8位I/O口、16位定時/計數(shù)器,它們的個數(shù)分別為六、四、四、三 [2]。</p&g
22、t;<p> 綜上所述:采取AT89C52為主控制系統(tǒng)。</p><p> 2.2 選擇時鐘芯片</p><p><b> 方案一:</b></p><p> 直接用單片機作為定時計數(shù)器,用程序計算時間。用這種方法芯片的使用次數(shù)沒有以前那么多了,但是測出來的時間不精確,與正確的時間差比變大了。</p>&l
23、t;p><b> 方案二:</b></p><p> 包括實時時鐘/日歷和31位的靜態(tài)RAM。它與微處理器之間進行信息交流是靠1個串行接口完成的,它可以顯示時間、日期等信息,且在溫度超過一定界限的時候報警。這種時鐘芯片與單片機之間進行通信方式為同步串行,僅需用到i個口線:REs、I/O、SCLK(串行時鐘)。工作時功耗小,精度高。有Vcc2作主電源和Vcc1作備份電源,備份電源在主
24、電源沒有通電的情況下使時鐘芯片正常運行[3]。</p><p> 經(jīng)過以上兩個方案的對比,時鐘芯片為。</p><p> 2.3 測溫部分的選擇</p><p> 1.傳統(tǒng)的測溫元件在測溫時需接外部硬件,這樣一來會較麻煩且容易出錯,需要錢也較多,而軟件方面也不容易做。</p><p> 2.與前面相比,檢測元件則采用美國DALLAS
25、半導體公司繼DS1820之后推出的一種DS18B20(智能溫度傳感器),測溫范圍為-56~124°C,最大分辨率可達0.06°C。DS18B20在與單片機相連時為三線制,外接部件沒那么多了,則在買硬件時不用花那么多錢了,也不容易出錯了。</p><p> 2.4 顯示部分方案的選擇</p><p> 方案一: 若LED 做顯示部分,他在顯示數(shù)字和成本方面還可以,但
26、是在與單片機連接時,即使使用單片機的接口不多,但接線還需要花費一點時間。 </p><p> 方案二: 若 LCD1602 液晶做顯示部分,它的內(nèi)存大,且在顯示文字等時很清楚,它消耗的功率低、使用時間較長、在環(huán)境復雜的情況下不容易被干擾等優(yōu)點。</p><p> 綜上所述,顯示部分采用普通的LCDl602顯示.第一行分別表示某年、某月、某日和星期;第二行分別為時、分、秒和溫度。芯片工作
27、電壓為4.5v-5.5V,電流2.0mA(5.0V)最佳工作電壓為5.OV。</p><p> 3 硬件電路設計及仿真結果</p><p> 3.1 電路設計框圖</p><p> 圖3.1電路設計框圖</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單片機AT89C52</p><p> ATMEL公司生產(chǎn)的AT89C52單片機采用高性能的靜態(tài)80C51設計,由先進工藝制造且程序存儲器為F
29、LASH。它的主要性能特點有:</p><p> 8KB Flash ROM,可以檫寫1000次以上,數(shù)據(jù)保存10年。</p><p> 256字節(jié)內(nèi)部RAM。</p><p> 電源控制模式:時鐘設置、空閑模式、掉電模式。</p><p> 全雙工增強型UART;T0、T1(標準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、單片機晶振電路</b&g
31、t;</p><p> 晶振電路采用的晶體振蕩器,頻率為12MHz。在晶振的兩端接兩個電容值為22pF,電容的作用是過濾不需要的信號。如圖3.5所示為。</p><p> 圖3.5 晶振電路連接圖</p><p><b> 3、單片機復位電路</b></p><p> 采用的是上電式復位。接通電源的瞬間,通過電
32、容的那條線等于沒有電阻,這個時候自動復位;電容兩端的電壓為電源電壓時,電阻最大,流過電容的電流為0, 這個時候?qū)﹄娐窡o影響,程序正常運行。如圖3.6所示為復位電路圖</p><p> 圖3.6 復位電路圖</p><p> 3.3 時鐘電路的選擇與計算</p><p> 3.3.1 電路的選擇 </p><p><
33、b> 圖3.7時鐘電路圖</b></p><p> 3.3.2 時鐘芯片</p><p><b> 的性能特性</b></p><p> 最少引腳的串行I/O;</p><p> 2.5~5.5V的電壓工作范圍;</p><p> 2.5V時耗電小于300nA;&l
34、t;/p><p><b> 簡單的3線接口;</b></p><p><b> 充電方式可以選擇。</b></p><p> 中Vcc1在提供低電源和低功率時可以作為后備電源,當Vcc2在雙電源系統(tǒng)中作為主電源時,Vcc1作為備份電源,防止在主電源掉電的情況下能保存信息,使時鐘正常工作。DS1302由Vcc1或Vcc2中
35、較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給供電;當Vcc2小于Vcc1時, 由Vcc1供電。</p><p><b> 數(shù)據(jù)操作原理</b></p><p> 在數(shù)據(jù)傳送過程中若RST腳為低電平,則不再傳送數(shù)據(jù)。接通電源運行時,在VCC大于等于2.5V之前,RST腳必須保持“0”狀態(tài)不變。只有在SCLK為“1”時, RST才能置為“0”。</
36、p><p> 表3.1為各引腳的功能</p><p> 表 3.1 DS1302引腳功能</p><p> 如圖3.8所示的控制字。控制字節(jié)的第7位必須是高電平;如果它為低電平,則中則不能寫入數(shù)據(jù)。位6為0和1時分別表示存取日歷時鐘數(shù)據(jù)和RAM數(shù)據(jù)。指示操作單元的地址為位5~1(A5~A1)。A0和A1分別表示進行寫操作和進行讀操作??刂谱止?jié)則是從A0開始輸入
37、或輸出[4]。</p><p> 7 6 5 4 3 2 1 0</p><p> 圖 3.8 DS1302的控制字</p><p> 表 3.2 的日歷、時間內(nèi)部寄存器地址和內(nèi)容</p><p> 的 日歷、時間寄存器及其控制字見表3.2,當讀取的數(shù)
38、是偶數(shù)時則將寫入相關內(nèi)容,否則是讀出相關內(nèi)容。 A7決定時間是12小時制還是24小時制。它為高電平時則為12小時制。在這種情況下,A5是AM/PM位,此位是高電平時表示PM低電平表示AM。在24h方式下,A5為第二個10h位(20~23h)。</p><p><b> 2、晶振電路</b></p><p> 單片機的晶振電路基本差不多,不同之處在于它們的頻率,所選
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 元件的設計及計算</p>
40、<p> LCD1602的特性</p><p> 內(nèi)建有160個5X7點陣的字型的字符發(fā)生器CGROM</p><p> 8個可由用戶自定義的5X7的字符發(fā)生器CGRAM</p><p> 3.5 測溫電路的選擇</p><p> 3.5.1 測溫的電路圖</p><p> 圖3.11測溫的電
41、路圖</p><p> 3.5.2 元件的選擇及設計計算</p><p> DS18B20溫度傳感器的優(yōu)點:</p><p> 1、接口方式采用單總線。單總線具有使用經(jīng)濟、方便快捷、抗干擾能力強等優(yōu)點,特別適用于惡劣環(huán)境的測溫,為構建測量系統(tǒng)創(chuàng)建了新方法。</p><p> 2、當多個DS18B20同時使用時可達到多點測溫的目的,且
42、不需要外接元件</p><p> 3、多變的供電方式。DS18B20既可以在外部接電源,又可以在內(nèi)部通過數(shù)據(jù)線獲取電源,在這種情況子下可以使系統(tǒng)具有簡單的結構,較高的可靠性。</p><p> 4、負壓特性。在電源沒有正確接線時,溫度計將會繼續(xù)正常工作且不會燒毀。</p><p> 5、防止掉電。DS18B20有EEPROM,在沒有電時仍然可以繼續(xù)工作。<
43、;/p><p> DS18B20的性能特點如下:</p><p><b> 不需要外部器件;</b></p><p> 電壓工作范圍為3.0~3.5V,可由數(shù)據(jù)線提供電源且待機時不需要消耗功率;</p><p> 溫度以一定的數(shù)字讀出;</p><p> 設置的溫度報警器數(shù)據(jù)不容易丟失。&l
44、t;/p><p> DS18B20溫度傳感器還有容量為八字節(jié)的RAM作為暫存和信息可重復使用的EERAM。溫度信息在前兩個字節(jié),接著的兩個字節(jié)為 TH和TL的拷貝,信息不容易保存,且在通電時信息被刷新。配置寄存器位于第五個字節(jié)。DS18B20工作時按配置寄存器中的分辨率將溫度轉換為相對需要的值。</p><p> 表3.3 DS18B20分辨率的定義規(guī)定</p><p
45、> 由表3.3可見,在應用DS18B20時分辨率和轉換時間要綜合考慮,隨著分辨率增長溫度數(shù)據(jù)轉換時間就越多。暫存RAM的六七八沒有用到,全部用高字節(jié)表示。第九字節(jié)將顯示前面的CRC碼,通過數(shù)據(jù)的檢測來確保通信數(shù)據(jù)無誤。</p><p> S為符號位,S取值為零時,可以直接進行2進制到10進制變換;當S取值為一時,測的溫度為零度以下,則不可以直接求出10進制的數(shù)值。</p><p>
46、; DS18B20是單線通信且分時完成,要求較嚴格,所以看重讀寫時序。DS18B20的操作流程為:首先對 DS18B20初始化,其次把ROM的各個指令發(fā)出,接著把存儲器的各個操作指令發(fā)出,最后進行數(shù)據(jù)的處理[5]。</p><p> 2、DS18B20內(nèi)部結構:</p><p> DS18B20主要由64位ROM、溫度傳感器、不容易揮發(fā)的溫度報警除法器TH和TL、配置寄存器四個部分組
47、成。ROM中的64位序列號可以看做是DS18B20的地址序列碼,它是出廠前就被定義好的,則每個DS18B20的64位序列號均不相同,即所有的DS18B20都各不相同,因此可以多個DS18B20并聯(lián)在一根總線上。</p><p> DS18B20可以采用兩種方式供電,一種是由電源提供供電,此時DS18B20的1腳接地,2腳作為引線,3腳外接電源。另一種是寄生電源供電方式。為了使DS18B20正常使用,單片機端口用
48、MOSFET管來控制單線總線。</p><p> 單線總線開啟時間非常短,而它的引腳驅(qū)動能力有限,只能輸出低電平,無法輸出高電平,為了保證寫存儲器操作和溫度A/D轉換操作能正常進行必須使用外部上拉</p><p> 3.6 硬件的仿真</p><p> 3.6.1 硬件的調(diào)試</p><p> 首先根據(jù)硬件電路圖利用PROTEUS
49、把電路圖鏈接好,如圖3.12硬件實際圖:</p><p> 圖3.12硬件模擬圖</p><p> 然后保存文件的格式為.DSN,以便下次使用的時候調(diào)用。</p><p> 然后再雙擊單片機,在Progame File欄調(diào)出程序生成的以.hex為后綴的文件,然后單擊確定,如圖3.13所示:</p><p> 圖3.13 調(diào)用程序<
50、;/p><p> 硬件仿真的結果如圖3.14</p><p> 圖3.14 硬件仿真結果</p><p> 3.6.2 溫度報警器</p><p> LED顯示屏顯示的為年/月/日、星期、時分秒、溫度。U3為溫度的調(diào)試,左/右邊分別表示為溫度減/加1。當溫度超過35度時,將會報警,如圖3.15在R2和報警器之間的符號變?yōu)榧t的并且有滴滴的
51、聲音發(fā)出。</p><p> 圖3.15報警時的圖</p><p> 3.6.3 時間的調(diào)整</p><p> 年、月、日、星期、時、分、秒的調(diào)整為R3、R4、R5和R6下面的那個BUTTON,它們分別表示啟動、加、減、恢復。單擊啟動時,可以調(diào)整秒,加減調(diào)整結束后,如果還不正確,在單擊調(diào)試,則可以調(diào)試分,以此類推,可以調(diào)試時、星期、日、月、年,調(diào)整結束后單擊
52、恢復,則可以恢復,調(diào)整結束。如圖3.16時間的調(diào)整</p><p><b> 3.16時間的調(diào)整</b></p><p><b> 4 系統(tǒng)程序設計</b></p><p> 4.1 陽歷程序設計</p><p> 因為在該程序中使用DS1302時鐘芯片,陽歷程序只需從DS1302各寄存
53、器中讀出年、月、日、周、[小]時、分、秒等數(shù)據(jù),再處理即可。對DS1302進行首次操作之前,先初始化,把經(jīng)過處理的從DS1302中讀出數(shù)據(jù)送給顯示緩沖單元。陽歷時間顯示的程序流程圖見圖4.1所示。</p><p> 4.2 時間調(diào)整程序設計</p><p> 時間的修改用4個按鈕鍵來控制,它們分別為開始、加、減、停止。在時間修改的過程中,要修改的位與不需要修改的位應該把它們給分別開。
54、把需要修改的位一直在閃,直到修改完繼續(xù)修改下一個。需要修改的位一直閃的原理是利用定時器把需要修改的位亮和熄滅一定時間,比如說每次亮和熄滅的時間均為為40ms。利用定時器計時,每次達到40ms溢出時,由亮變滅或由滅變亮,不斷交替,直到不再調(diào)整。這個時候把正確的數(shù)定住,不在閃,然后使下一個需要修改的數(shù)不停的閃。</p><p> 4.3 陰歷程序設計</p><p> 根據(jù)陽歷日期來推算
55、陰歷日期。先要根據(jù)當前陽歷的日期,算出陽歷為該年中的第多少天,設為A,該年春節(jié)和元旦的日差為B,當A>=B時,則A-B=C時,C就是陰歷在該年中的第多少天,然后就可以算出當前陰歷日期;當A<B時,則陰歷比陽歷小一年,通常此時陰歷會是11月或者12月,此時B-A=D,而D表示距離過新年還剩的天數(shù)。再根據(jù)查表所得的該年的陰歷的閏月,以及哪些月份有30號和哪些月份沒有30號,這樣就可以計算出在陰歷時為幾月幾號。</p>
56、<p><b> 4.4 軟件測試</b></p><p> 首先在Keil uVision3軟件上在File中把寫好的程序調(diào)用出來,程序見附錄B,然后再Project中通過New Project把生成的以.Uv2為后綴的文件打開如圖4.2</p><p> 圖4.2 工程的調(diào)用</p><p> 最后為程序的調(diào)試,程序
57、的調(diào)試為單擊左邊的第一個如圖4.3,調(diào)試的結果如圖4.4</p><p> 圖4.3 程序的調(diào)試圖</p><p> 4.4 程序的調(diào)試結果</p><p><b> 5 結論與展望</b></p><p><b> 5.1 結論</b></p><p> 此次
58、設計具有可以顯示陽歷日期、按鍵調(diào)整時間和可動態(tài)顯示年等功能。這個設計的硬件電路用的器件比較少,電路比較簡單,電路的主要部分為AT89C52單片機,DS1302時鐘芯片和LCD12864作為顯示器,可以達到目的。</p><p><b> 5.2 展望</b></p><p> 這次設計雖然完成了,但是還存在著缺點:</p><p> 1
59、、顯示的年限過短,只能顯示2000年—2100年之間的部分。</p><p> 2、通過按鍵調(diào)節(jié)年、月、日后,如果不調(diào)節(jié)星期,星期的顯示就會出現(xiàn)與正常的星期不一樣,導致出現(xiàn)錯誤,現(xiàn)在還沒有想出如何可以自動調(diào)整,只能自己調(diào)節(jié)才能糾正過來。</p><p> 3、于未來的陰歷日期是不能準確預測出的,所以,未來所顯示的陰歷日期有可能與別人設計的電子萬年歷所表示的時間不一樣。</p>
60、;<p> 4、編程采用的是C語言,不是匯編語言,比較復雜,所以看起來沒有匯編語言簡潔,整齊。</p><p> 5、仿真出來的溫度不能自動感受溫度,必須用手動調(diào)節(jié)。</p><p> 6、電子萬年歷的功能還可以繼續(xù)增加,比如可以添加跑馬燈等等,所以發(fā)展空間很大,需要我們不斷繼續(xù)創(chuàng)新、探索。</p><p><b> 致 謝<
61、/b></p><p> 正是至此論文全部結束,在論文創(chuàng)作工程中,我特別感謝所有關心、愛護我的人們,謝謝他們的鼓勵和幫助。</p><p> 首先,本文是在*老師的指導下完成的。在此,我衷心地感謝我的指導老師*老師!不管在選題階段,還是在設計階段、在制作階段,他對我的悉心指導,使我得以順利的完成畢業(yè)設計。在此過程中,遇到的難題,他們總是耐心細致地幫我解決,使我不僅在硬件技術方面有
62、了一定的提高,同時,對軟件使用能力也得到了提高。最重要的是提高我對實際問題的分析能力與解決能力。培養(yǎng)了我獨立完成課題的能力。因此,在這里我衷心地感謝他,謝謝您對我的指導和關心。</p><p><b> 參考文獻</b></p><p> [1] 江志紅. 51 單片機技術與應用系統(tǒng)開發(fā)案例精選[M]. 清華大學出版社, 2008.</p><
63、p> [2]潘永雄. 新編單片機原理與應用[M]. 西安電子科技大學出版社, 2007.</p><p> [3] 馬鴻文. 基于 AT89C52 單片機的自動存取柜的設計與實現(xiàn) [J][J]. 微計算機信息, 2006, 22(1): 101-103.</p><p> [4] 程利民, 王軍, 歐陽德祥, 等. 基于 STC89C54 的單片機實踐教學系統(tǒng)設計[J]. 武漢
64、職業(yè)技術學院學報, 2007, 3: 77-79.</p><p> [5]錢超, 王福明. 基于單片機的多功能電子萬年歷設計[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 //設置溫度上限</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ù)</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> 延時子程序</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延時</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)整后更新標志</p><p> if((temp&0x7f)>0x59) //超過59秒,清零</p><p> temp=0; </p><p><b> break;</b></p><p>&
77、lt;b> case 2:</b></p><p> temp=Read1302(DS1302_MINUTE);//讀取分數(shù)</p><p> temp=temp+1; //分數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x59)
78、 //超過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ù)<
79、;/p><p> temp=temp+1; //小時數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x23) //超過23小時,清零</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)整后更新標志</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) //讀取分數(shù)</p><p> temp=temp-1; //分數(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ù)</p><p> temp
93、=temp-1; //小時數(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; //進入調(diào)整模式</p><p> while(Set==0);</p><p><b> }</b></p><p><b> }</b></p><p> /***************************
104、***********************************</p><p> 跳出調(diào)整模式,返回默認顯示</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); //寫入允許</
107、p><p> Write1302(0x80,Second&0x7f);</p><p> Write1302(0x8E,0x80); //禁止寫入</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) //關閉時鐘,停止計時</p><
110、;p> { Write1302(0x8e,0x00); //寫入允許</p><p> temp=Read1302(0x80);</p><p> Write1302(0x80,temp|0x80);</p><p> Write1302(0x8e,0x80); //禁止寫入</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ù)更新,重新寫入新的數(shù)據(jù)</p><p><b> {</b></p><p> Write1302(0x8e,0x00); //寫入允許</p><p> Write1302(0x80,temp|0x80);
114、 //寫入新的秒數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫入</p><p> up_flag=0;</p><p> down_flag=0;</p><p><b> }</b></p><p> hide_sec+
115、+; //位閃計數(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); //寫入允許</p><p> Write1302(0x82,temp); //寫入新的分數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫入</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)整小時</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); //寫入允許</p><p> Write1302(0x84,temp); //寫入新的小時數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫入</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); //寫入允許</p><p> Write1302(0x8a,temp); //寫入新的星期數(shù)</p><p> Write1302(0x8e,0x80); //禁止寫入</p><p> up_flag=0;</p><p> down_flag=0;</p><p><b> }&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)論文(設計)基于單片機的電子萬年歷
- 萬年歷畢業(yè)論文---基于at89s52單片機的電子萬年歷設計
- 單片機電子萬年歷畢業(yè)論文
- 單片機電子萬年歷畢業(yè)論文
- 單片機電子萬年歷畢業(yè)論文
- 基于單片機的電子萬年歷
- 基于單片機的電子萬年歷
- 基于單片機萬年歷的設計畢業(yè)論文
- 基于51單片機的電子萬年歷畢業(yè)論文設計
- 基于51單片機的電子萬年歷設計畢業(yè)論文
- 基于單片機萬年歷的設計畢業(yè)論文
- 基于51單片機電子萬年歷畢業(yè)論文
- 畢業(yè)論文——基于51單片機的電子萬年歷的設計
- 基于單片機電子萬年歷的設計畢業(yè)論文
- 基于單片機的電子萬年歷大學
- 基于51單片機的電子萬年歷設計-畢業(yè)論文設計
- 單片機的電子萬年歷設計
- 基于單片機的電子萬年歷的設計論文
- 基于單片機的電子萬年歷設計制作論文
- 基于單片機的電子萬年歷畢業(yè)設計
評論
0/150
提交評論