版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)論文</b></p><p> 基于STC89C52萬年歷的設計</p><p> 2012年11月10日</p><p><b> 目 錄</b></p><p><b> 摘 要1</b></p><p&g
2、t;<b> 前 言2</b></p><p> 1. 系統(tǒng)基本設計思路3</p><p> 2. 單元電路方案論證3</p><p> 2.1 控制器模塊3</p><p> 2.2 計時模塊3</p><p> 2.3 顯示模塊3</p>&l
3、t;p> 2.4 最終方案4</p><p> 3. 主要芯片介紹4</p><p> 3.1 STC89C52單片機4</p><p> 3.2 DS18B20溫度傳感器58</p><p> 4. 程序流程圖6</p><p><b> 結 論7</b>
4、;</p><p><b> 參考文獻8</b></p><p><b> 致 謝9</b></p><p> 附錄 1 原理圖10</p><p> 附錄 2 主要源程序11</p><p> 基于STC89C52萬年歷的設計</p>&l
5、t;p> 摘 要:本設計采用STC89C52單片機作為主控制器,用DS12C887時鐘芯片計時、DS18B20檢測溫度,單片機通過時鐘芯片獲取時間數(shù)據(jù)、DS18B20采集溫度信號,處理后把時間和溫度數(shù)據(jù)通過4-16線譯碼器和鎖存器送給15位共陰數(shù)碼管同步顯示年、月、日、時、分、星期和溫度。該萬年歷設有6個按鍵:S1、S2、S3、S4、S5和S6鍵,使之具備了校時功能。 </p><p> 關鍵詞:單片
6、機,DS18B20,按鍵,LCD12864</p><p><b> 前 言</b></p><p> 隨著微電子技術和超大規(guī)模集成電路技術的不斷發(fā)展 ,家用電子產品種類日益豐富 ,數(shù)字顯示的萬年歷已經越來越流行。</p><p> 單片機是在集成電路芯片上集成了各種元件的微型計算機,這些元件包括中央處理器CPU、數(shù)據(jù)存儲器RAM、程序
7、存儲器ROM、定時/計數(shù)器、中斷系統(tǒng)、時鐘部件的集成和I/O接口電路。由于單片機具有體積小、價格低、可靠性高、開發(fā)應用方便等特點因此在現(xiàn)代電子技術和工業(yè)領域應用較為廣泛,在智能儀表中單片機是應用最多、最活躍的領域之一。在控制領域中,現(xiàn)如今人們更注意計算機的低成本、小體積、運行的可靠性和控制的靈活性。</p><p> 采用單片機的內部定時器實現(xiàn)年月日,時分秒,星期的顯示,硬件設計簡單。</p>&
8、lt;p> 為此設計了計時準確,成本低廉的萬年歷。</p><p> 1. 系統(tǒng)基本設計思路及其主要特點</p><p> 萬年歷是一種用數(shù)字電路記錄時間的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更長的使用壽命。而且可以記錄年、月、日、星期等信息。</p><p> 本設計采用STC89C52單片機作為主控制器,以內部定時器實
9、現(xiàn)時鐘顯示、DS18B20采集溫度,LCD12864實現(xiàn)對時間日期,溫度等顯示:通過程序的設計可以實現(xiàn)閏年和平年的判斷,并且可以判斷出是大月和小月。并且可以通過按鍵修改時鐘日歷信息,及鬧鐘的設置,和報警溫度報警設置。 </p><p> 2. 單元電路方案論證</p><p> 根據(jù)設計要求,本系統(tǒng)主要由控制器模塊、顯示模塊構成。為較好的實現(xiàn)各模塊的功能,我們分別設計了幾種方案并分別進
10、行了論證。</p><p><b> 2.1 控制器模塊</b></p><p> 方案1:采用51系列單片機作為系統(tǒng)控制器</p><p> 單片機算術運算功能強,軟件編程靈活、自由度大,可用軟件編程實現(xiàn)各種算法和邏輯控制。由于其功耗低、體積較小、技術成熟和成本低等優(yōu)點,在各個領域應用廣泛。而且抗干擾性能好。</p>&l
11、t;p> 方案2:采用凌陽系列單片機作為系統(tǒng)的控制器</p><p> 凌陽系列單片機可以實現(xiàn)各種復雜的邏輯功能,模塊大,密度高,它將所有器件集成在一塊芯片上,減少了體積,提高了穩(wěn)定性。凌陽系列單片機提高了系統(tǒng)的處理速度,適合作為大規(guī)模實時系統(tǒng)的控制核心。</p><p> 因51單片機價格比凌陽系列低得多,且本設計不需要很高的處理速度,從經濟和方便使用角度考慮,本設計選擇了方
12、案1。</p><p><b> 2.2 計時模塊</b></p><p> 方案1:采用DS1302為計時時鐘芯片</p><p> 該芯片是串行電路,與單片機接口簡單,但需另備電池和32.768kHz晶振,因焊接工藝和晶振質量等原因會導致精度降低。</p><p> 方案2:采用采用單片機的內部定時器來實現(xiàn)時
13、間的顯示</p><p> 采用單片機的內部定時器來實現(xiàn)時間的顯示,程序設計比較復雜,但是硬件電路十分簡單,由于硬件電路的成功率低。</p><p> 綜合考慮,本設計采用單片機內部定時器作為計時時鐘。</p><p><b> 2.3 顯示模塊</b></p><p> 方案1:采用LED數(shù)碼管</p&g
14、t;<p> 采用LED數(shù)碼管這種方案。由于顯示的內容有限,不夠豐富,不能滿足本設計,而且硬件電路很復雜。</p><p> 方案2:采用無字庫液晶字符顯示器</p><p> 顯示用液晶字符式,可以用軟件達到很好的控制,硬件不復雜,液晶字符顯示器可以顯示很豐富的內容,可以很好的滿足本系統(tǒng)的設計,所以選擇此方案</p><p> 從顯示內容的角
15、度考慮,本設計選擇了方案2。</p><p><b> 2.4 最終方案</b></p><p> 經過反復論證,最終確定了如下方案:</p><p> (1)采用STC89C52單片機作為主控制器。</p><p> (2)采用單片機內部定時器作為計時時鐘。</p><p> (3)采
16、用LCD12864液晶作為顯示器。</p><p><b> 3. 主要芯片介紹</b></p><p> 3.1 STC89C52單片機</p><p> 51系列單片機的引腳配置如圖1所示。主要包括P0、P1、P2、P3口以及讀寫功能輸出,時鐘輸入端等。</p><p> 圖1 STC89C52單片機引腳圖&
17、lt;/p><p> 3.1.1 最小系統(tǒng)設計</p><p> 最小系統(tǒng)包括單片機及其所需的必要的電源、時鐘、復位等部件,能使單片機始終處于正常的運行狀態(tài)。電源、時鐘等電路是使單片機能運行的必備條件,可以將最小系統(tǒng)作為應用系統(tǒng)的核心部分,通過對其進行存儲器擴展、A/D擴展等,使單片機完成較復雜的功能。</p><p> STC89C52是片內有ROM/EPROM
18、的單片機,因此,這種芯片構成的最小系統(tǒng)簡單﹑可靠。用STC89C52單片機構成最小應用系統(tǒng)時,只要將單片機接上時鐘電路和復位電路即可,結構如圖2所示,由于集成度的限制,最小應用系統(tǒng)只能用作一些小型的控制單元。</p><p> 圖2 單片機最小系統(tǒng)原理框圖</p><p> 3.1.2 時鐘電路</p><p> STC89C52單片機的時鐘信號通常有兩種方式
19、產生:一是內部時鐘方式,二是外部時鐘方式。內部時鐘方式如圖3所示。在STC89C52單片機內部有一振蕩電路,只要在單片機的XTAL1(18)和XTAL2(19)引腳外接石英晶體(簡稱晶振),就構成了自激振蕩器并在單片機內部產生時鐘脈沖信號。圖中電容C1和C2的作用是穩(wěn)定頻率和快速起振,電容值在5~30pF,典型值為30pF。晶振CYS的振蕩頻率范圍在1.2~12MHz間選擇,典型值為12MHz和6MHz。</p><
20、p> 圖3 STC89C52內部時鐘電路</p><p> 3.1.3 復位電路</p><p> 當在STC89C52單片機的RST引腳引入高電平并保持2個機器周期時,單片機內部就執(zhí)行復位操作(若該引腳持續(xù)保持高電平,單片機就處于循環(huán)復位狀態(tài))。</p><p> 復位電路通常采用上電自動復位和按鈕復位兩種方式。</p><p&g
21、t; 最簡單的上電自動復位電路中上電自動復位是通過外部復位電路的電容充放電來實現(xiàn)的。只要Vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復位。</p><p> 除了上電復位外,有時還需要按鍵手動復位。本設計就是用的按鍵手動復位。按鍵手動復位有電平方式和脈沖方式兩種。其中電平復位是通過RST(9)端與電源Vcc接通而實現(xiàn)的。按鍵手動復位電路見圖4。時鐘頻率用11.0592MHZ時C取10uF,R取10kΩ。&
22、lt;/p><p> 圖4 STC89C52 復位電路</p><p> 3.2數(shù)字溫度傳感器DS18B20介紹</p><p> 1、DS18B20的主要特性 </p><p> 1.1、適應電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數(shù) 據(jù)線供電 </p><p> 1.2、獨特的單線接口方
23、式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊 </p><p> 1.3、 DS18B20支持多點組網功能,多個DS18B20可以并聯(lián)在唯一的三線上,實現(xiàn)組網多點測溫 </p><p> 1.4、DS18B20在使用中不需要任何外圍元件,全部 傳感元件及轉換電路集成在形如一只三極管的集成電路內 </p><p>
24、 1.5、溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃ </p><p> 1.6、可編程 的分辨率為9~12位,對應的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實現(xiàn)高精度測溫 </p><p> 1.7、在9位分辨率時最多在 93.75ms內把溫度轉換為數(shù)字,12位分辨率時最多在750ms內把溫度值轉換為數(shù)字,速度更快 <
25、;/p><p> 1.8、測量結果直接輸出數(shù)字溫度信號,以"一 線總線"串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力 </p><p> 1.9、負壓特性:電源極性接反時,芯片不會因發(fā)熱而燒毀, 但不能正常工作。 </p><p> 2、DS18B20的外形和內部結構 </p><p> DS18
26、B20內部結構主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。 </p><p> DS18B20的外形及管腳排列如下圖1: </p><p> DS18B20引腳定義: </p><p> (1)DQ為數(shù)字信號輸入/輸出端; </p><p> (2)GND為電源地; </p&g
27、t;<p> (3)VDD為外接供電電源輸入端(在寄生電源接線方式時接地)。 </p><p> 圖2: DS18B20內部結構圖 </p><p> DS18B20的讀寫時序和測溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同,且溫度轉換時的延時時間由2s 減為750ms。 DS18B20測溫原理如圖3所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很
28、小,用于產生固定頻率的脈沖信號送給計數(shù)器1。高溫度系數(shù)晶振 隨溫度變化其振蕩率明顯改變,所產生的信號作為計數(shù)器2的脈沖輸入。計數(shù)器1和溫度寄存器被預置在-55℃所對應的一個基數(shù)值。計數(shù)器1對 低溫度系數(shù)晶振產生的脈沖信號進行減法計數(shù),當計數(shù)器1的預置值減到0時,溫度寄存器的值將加1,計數(shù)器1的預置將重新被裝入,計數(shù)器1重 新開始對低溫度系數(shù)晶振產生的脈沖信號進行計數(shù),如此循環(huán)直到計數(shù)器2計數(shù)到0時,停止溫度寄存器值的累加,此時溫度寄存器
29、中的數(shù)值即 為所測溫度。圖3中的斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于修正計數(shù)器1的預置值。 </p><p> 圖3:DS18B20測溫原理框圖 </p><p> DS18B20有4個主要的數(shù)據(jù)部件: </p><p> (1)光刻ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:
30、開始8位 (28H)是產品類型標號,接著的48位是該DS18B20自身的序列號,最后8位是前面56位的循環(huán)冗余校驗碼(CRC=X8+X5+X4+1)。光刻ROM的作用 是使每一個DS18B20都各不相同,這樣就可以實現(xiàn)一根總線上掛接多個DS18B20的目的。 </p><p> ?。?)DS18B20中的溫度傳感器可完成對溫度的測量,以12位轉化為例:用16位符號擴展的二進制補碼讀數(shù)形式提供,以 0.0625℃/
31、LSB形式表達,其中S為符號位。 </p><p> 表1: DS18B20溫度值格式表 </p><p> 這是12位轉化后得到的12位數(shù)據(jù),存儲在18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0, 這5位為0,只要將測到的數(shù)值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,測到的數(shù)值需要取反加1再乘于0.0625即可得到實際 溫度。
32、例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FE6FH,-55℃的數(shù)字輸出為FC90H 。</p><p> 4.系統(tǒng)各模塊的詳細介紹</p><p><b> 1.電源及下載模塊</b></p><p> 此模塊由四個撥碼開關,其中有兩個控制本系統(tǒng)電源的通斷,另外兩個是控
33、制主控芯片下載程序的開關,由LED指示本系統(tǒng)電源工作的情況,其電路原理圖如下:</p><p><b> 2.主控芯片模塊</b></p><p> 本系統(tǒng)的控制模塊,注意P0端口要接1K的上拉電阻,其電路原理圖如下:</p><p><b> 3.溫度傳感器模塊</b></p><p>
34、此模塊采用溫度傳感器芯片DS18B20,負責采集當前環(huán)境溫度,電路原理圖如下:</p><p><b> 4.報警電路模塊</b></p><p> 負責鬧鐘的報警及溫度報警,注意采用PNP的三極管,因為如果采用NPN三極管,單片機的I/0端口默認輸出為高電平,所以在無任何條件下三極管都會導通,所以采用PNP的三極管,另外在三極管的基極的限流電阻為1K-10K,如
35、果限流電阻接的過大的話,可能導致蜂鳴器的聲音非常小,如果過小的話那么電流會很大可能會燒壞三極管,蜂鳴器</p><p><b> 5.按鍵接口模塊</b></p><p> 其中S1為菜單鍵,主要功能是主頁面和菜單頁面的顯示的切換,S2主要是當處于鬧鐘設置的狀態(tài)時,或者是溫度報警設置設置,可以控制鬧鐘和溫度報警的開關,并且在主頁面時,當鬧鐘或者是溫度報警觸發(fā)報警時
36、,可以按此鍵解除報警,并且不影響下次的報警,S3當處于菜單頁面時當選中某項時,按此鍵可以進入某個菜單功能相對應的頁面,S4當進入某個菜單項時按此鍵可以使光標移動一以便對各功能的設置,S5、S6主要是加減鍵控制,</p><p> 6.12864顯示模塊</p><p> 該模塊采用無字庫的LCD12864,金鵬OCM12864-2</p><p><b&g
37、t; 5.實際顯示的情況</b></p><p><b> 1.主頁面顯示效果</b></p><p> 這個是沒有全部調試完成拍的,實際上顯示年份的地方有顯示平年、閏年的地方,在其后面有個鬧鈴的圖標,當溫度報警設置為開時顯示的為沒有斜線的狀態(tài),當設置為關時顯示的為此圖標,</p><p><b> 菜單界面顯示效
38、果</b></p><p><b> 各菜單項顯示效果</b></p><p> 實際顯在調整時間下面還有星期的調整,當俺S4是要調整的那一項會處于選中狀態(tài)</p><p><b> 結 論</b></p><p> 本設計在調試過程中仿真顯示正常,在實際中溫度顯示卻不正常,查
39、了好久,終于在老師的幫助下發(fā)現(xiàn)是程序的問題,經過改正,溫度顯示正常。這時發(fā)現(xiàn)數(shù)碼管顯示亮度有點低且閃爍嚴重,后來加了三極管驅動電路,將掃描數(shù)碼管時間改短,顯示的問題終于解決了。</p><p> 通過對自己在大學兩年時間里所學的知識的回顧,并充分發(fā)揮對所學知識的理解和對畢業(yè)設計的思考及書面表達能力,最終完成了本設計。這為自己今后進一步深化學習,積累了一定寶貴的經驗。撰寫論文的過程也是專業(yè)知識的學習過程,它使我運
40、用已有的專業(yè)基礎知識,對其進行設計,分析和解決一個理論問題或實際問題,把知識轉化為能力的實際訓練。培養(yǎng)了我運用所學知識解決實際問題的能力。</p><p><b> 附錄 1原理圖</b></p><p> 附錄 2 主要源程序</p><p> #include<reg51.h></p><p>
41、#include<18b20.h></p><p> #include<12864.h></p><p> //#include<ziku.h></p><p> /*********時間變量*********/</p><p> uchar sz=12,fz=0,mz=0,xq=0,yue=1,r
42、i=1; //時,分,秒,星期,月,日</p><p> uint nian=2012; //年</p><p> /***********定義鬧鐘及報警溫度變量******************/</p><p> uchar nshi=0,nfen=0;</p><p> uchar shezhi=27; //設置報溫度的
43、值</p><p> /**********按鍵定義**********/ </p><p> sbit key1=P1^2; //菜單鍵 2.0 1.2</p><p> //sbit key2=P2^1; //功能選擇鍵</p><p> sbit key3=P1^4; //確定鍵3. 4 1.4<
44、;/p><p> sbit key4=P1^5; //選項鍵3.5 1.5</p><p> sbit key5=P1^3; //開關控制鍵 3.6 1.3</p><p> sbit key6=P1^6; //3.2 1.6</p><p> sbit key7=P1^7;//3.3
45、 1.7</p><p> /********蜂鳴器定義************/</p><p> sbit bp=P3^7;</p><p> uchar num,num1; //計數(shù)變量</p><p> bit flag=0; //負溫度標志</p><p> bit flag1=0;
46、 //一秒鐘標志</p><p> bit key_flag1=0; //菜單鍵按下的標志位</p><p> bit key_flag2=0; //確定鍵按下的標志</p><p> bit key_flag3=0;</p><p> bit key_flag4=0;</p><p> bit
47、beep_flag=0; //鬧鐘標志位</p><p> bit temp_flag=0;//溫度報警標志位</p><p> bit error_flag=0; //芯片錯誤標志位</p><p> bit leapyear_flag=0;//閏年的標志</p><p> uchar temp_data,temp_data2;&l
48、t;/p><p> uint temp_t;</p><p> /****按鍵控制變量*******/</p><p> uchar a=0,b=0,c=0,d=0;</p><p> /**********閏年判斷*********/</p><p> void leap_year()</p>&
49、lt;p><b> {</b></p><p> if(nian%4==0&&nian%100!=0||nian%100==0&&nian%400==0)</p><p> leapyear_flag=1;</p><p> else leapyear_flag=0;</p><
50、p><b> }</b></p><p> /*********蜂鳴器控制************///????????????????????</p><p> void beep()</p><p><b> {</b></p><p> if(1 == key_flag3)&
51、lt;/p><p><b> {</b></p><p> if(nshi==sz&&nfen==fz&&mz==0)</p><p><b> {</b></p><p> beep_flag=1;</p><p><b>
52、}</b></p><p><b> } </b></p><p> if(1 == key_flag4) //??????????</p><p><b> {</b></p><p> if(shezhi<=temp_data)</p><p>
53、;<b> {</b></p><p> temp_flag=1; </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temp_f
54、lag=0;</p><p> if(beep_flag==0) bp=1;</p><p><b> }</b></p><p><b> } </b></p><p> if(1 == Rest_18B20())</p><p><b> {</
55、b></p><p> error_flag=1;</p><p><b> } </b></p><p><b> else </b></p><p><b> {</b></p><p> error_flag=0;</p&
56、gt;<p><b> }</b></p><p><b> }</b></p><p> /********溫度提取**********/</p><p> void display_DS18B20()</p><p><b> { </b><
57、/p><p> temp_data = temperature[1];</p><p> temp_data&=0xf0;</p><p> if(0xf0 == temp_data)</p><p><b> {</b></p><p> flag = 1;//負溫度</p&
58、gt;<p> if(0 == temperature[0])</p><p><b> {</b></p><p> temperature[0]=~temperature[0]+1;</p><p> temperature[1]=~temperature[1]+1;</p><p><b
59、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> temperature[0]=~temperature[0]+1;</p><p> temperature[1]=~temperature[1]; &
60、lt;/p><p><b> }</b></p><p><b> }</b></p><p> temp_data=temperature[1]<<4;</p><p> temp_data2=temperature[0]>>4;</p><p>
61、; temp_data=temp_data|temp_data2;</p><p> temp_w[1]=(temp_data%100)/10;</p><p> temp_w[2]=(temp_data%100)%10;</p><p> temperature[0]&=0x0f;</p><p> temp_t=((te
62、mperature[0]&0x0f)*0.0625)*10000;</p><p> temp_w[3]=temp_t/1000;</p><p> //temp_w[4]=(temp_t%1000)/100;</p><p> //temp_w[5]=((temp_t%1000)%100)/10;</p><p> //te
63、mp_w[6]=((temp_t%1000)%100)%10;</p><p><b> }</b></p><p> /***********時間計數(shù)函數(shù)*************/</p><p> void time_dis() //</p><p><b> {</b></
64、p><p> if(1 == flag1)</p><p><b> {</b></p><p> mz++; //秒</p><p><b> if(mz>59)</b></p><p><b> {</b></p>&l
65、t;p><b> mz=0;</b></p><p> fz++; //分</p><p><b> if(fz>59)</b></p><p><b> {</b></p><p><b> fz=0;</b></p&
66、gt;<p> sz++; //時</p><p><b> if(sz>23)</b></p><p><b> {</b></p><p><b> sz=0; </b></p><p><b> ri++; //日</b&g
67、t;</p><p><b> xq++;</b></p><p><b> if(xq>6)</b></p><p><b> {</b></p><p><b> xq=0;</b></p><p><b&
68、gt; }</b></p><p> if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)</p><p><b> {</b></p><p> if(ri==31)</p><p><b> {</b>&l
69、t;/p><p><b> ri=1;</b></p><p> yue++; //月</p><p><b> }</b></p><p><b> }</b></p><p> else if(yue==2)</p>&l
70、t;p><b> {</b></p><p> leap_year();</p><p> if(leapyear_flag==1) //閏年</p><p><b> {</b></p><p> if(ri==29)</p><p><b>
71、{</b></p><p><b> ri=1;</b></p><p><b> yue++;</b></p><p><b> }</b></p><p><b> }</b></p><p> else
72、//平年</p><p><b> {</b></p><p> if(ri==28)</p><p><b> {</b></p><p><b> ri=1;</b></p><p><b> yue++;</b>&
73、lt;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b>&l
74、t;/p><p> if(30 == ri)</p><p><b> {</b></p><p><b> ri=1;</b></p><p> yue++; //月</p><p><b> }</b></p><p&g
75、t;<b> }</b></p><p> if(yue>12)</p><p><b> {</b></p><p><b> yue=1;</b></p><p> nian++; //年</p><p><b>
76、 }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> flag1=0;//秒標志位清零</p><p><b> }</b&
77、gt;</p><p><b> }</b></p><p> /************時間及溫度顯示函數(shù)***********/</p><p> void time_temperature()</p><p><b> {</b></p><p> /****
78、****時間顯示***********/</p><p> if(leapyear_flag==1) display_w(1,0,3*16,run);</p><p> else display_w(1,0,3*16,ping);</p><p> display_e(1,0,2*8,shuzi[nian/1000]); //&l
79、t;/p><p> display_e(1,0,3*8,shuzi[(nian%1000)/100]); //</p><p> display_e(1,0,4*8,shuzi[((nian%1000)%100)/10]); // 年</p><p> display_e(1,0,5*8,shuzi[((nian%1000)%100)%10]);
80、 // -</p><p> display_w(2,0,0*16,nianf);</p><p> if(key_flag4==1)display_w(2,0,2*16,naoicon); //月</p><p> else display_w(2,0,2*16,wricon);</p><p> displ
81、ay_e(1,2,0*8,shuzi[yue/10]); // -</p><p> display_e(1,2,1*8,shuzi[yue%10]); // 日</p><p> display_w(1,2,1*16,yuef); //</p><p> display_e(1,2,4*8,shuzi[ri/1
82、0]); //</p><p> display_e(1,2,5*8,shuzi[ri%10]); //</p><p> display_w(1,2,3*16,riz); // 日</p><p> display_w(2,2,1*16,xing);</p><p> display_w(2,2
83、,2*16,qi);</p><p> display_w(2,2,3*16,shuzi1[xq]);</p><p> //display_e(2,0,6*8,fu);</p><p> display_e(1,4,0*8,shuzi[sz/10]); // 時</p><p> display_e(1,4,1*8,sh
84、uzi[sz%10]); // -</p><p> display_e(1,4,2*8,fu); // 分</p><p> display_e(1,4,3*8,shuzi[fz/10]); // -</p><p> display_e(1,4,4*8,shuzi[fz%10]); // 秒</p
85、><p> display_e(1,4,5*8,fu); //</p><p> display_e(1,4,6*8,shuzi[mz/10]); //</p><p> display_e(1,4,7*8,shuzi[mz%10]); //</p><p> display_w(2,4,1*16,nao);<
86、;/p><p> display_w(2,4,2*16,zhong);</p><p> if(1 == key_flag3) display_w(2,4,3*16,kai);</p><p> else display_w(2,4,3*16,guan);</p><p> display_w(1,6,0*16,dang);<
87、/p><p> display_w(1,6,1*16,qian);</p><p> display_w(1,6,2*16,wen);</p><p> display_w(1,6,3*16,du); </p><p> /********溫度顯示***********/</p><p> //if(1 ==
88、Rest_18B20())</p><p><b> //{</b></p><p> // display_e(2,0,1*8,fu);</p><p><b> // }</b></p><p> //delay_ms(50);</p><p> //Star
89、_18B20();</p><p> //Read_temp(); </p><p> //display_DS18B20();</p><p><b> if(flag)</b></p><p><b> {</b></p><p><b> fl
90、ag=0;</b></p><p> display_e(2,6,1*8,fu); </p><p><b> }</b></p><p> else if(temp_data>=100)</p><p><b> {</b></p><p> t
91、emp_w[0]=temp_data/100;</p><p> display_e(2,6,1*8,shuzi[temp_w[0]]);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p
92、><p> display_e(2,6,1*8,kongge); </p><p><b> }</b></p><p> display_e(2,6,2*8,shuzi[temp_w[1]]);</p><p> display_e(2,6,3*8,shuzi[temp_w[2]]);</p><
93、;p> display_e(2,6,4*8,dian);</p><p> display_e(2,6,5*8,shuzi[temp_w[3]]);</p><p> display_w(2,6,3*16,wendu);</p><p><b> }</b></p><p> /*********按鍵1掃
94、描**********/</p><p> void key1_scan() //菜單鍵</p><p><b> { </b></p><p> if(0 == key1)</p><p><b> {</b></p><p> delay_ms(10)
95、;</p><p> if(0 == key1)</p><p><b> { </b></p><p> //Set_screen(3);</p><p> Clean_screen();</p><p> key_flag1=~key_flag1;</p><
96、p> a=0;b=0;c=0;d=0; //</p><p><b> }</b></p><p> while(key1==0);</p><p><b> }</b></p><p><b> }</b></p><p>
97、 /********按鍵2***************/</p><p> /*void key2_scan() // 功能鍵</p><p><b> {</b></p><p> if(0 == key2)</p><p><b> {</b></p><
98、;p> delay_ms(10);</p><p> if(0 == key2) a++;</p><p> if(a>3) a=0;</p><p> while(key2==0);</p><p><b> }</b></p><p><b> }*/<
99、;/b></p><p> /********按鍵3**************/</p><p> void key3_scan() //確定鍵</p><p><b> {</b></p><p> if(0 == key3)</p><p><b> {<
100、/b></p><p> delay_ms(10);</p><p> if(0 == key3)</p><p><b> {</b></p><p> key_flag2=1;</p><p> //Set_screen(3);</p><p> Cl
101、ean_screen();</p><p><b> }</b></p><p> while(key3==0);</p><p><b> } </b></p><p><b> }</b></p><p> /********按鍵4****
102、**********/</p><p> void key4_scan() //選項鍵</p><p><b> {</b></p><p> if(0 == key4)</p><p><b> {</b></p><p> delay_ms(10);<
103、/p><p> if(0 == key4)</p><p><b> {</b></p><p> b++;c++;d++;</p><p><b> }</b></p><p> while(key4==0);</p><p><b>
104、; }</b></p><p><b> }</b></p><p> /********按鍵5**************/</p><p> void key5_scan() //控制鬧鐘的開關</p><p><b> {</b></p><p>
105、; if(0 == key5)</p><p><b> {</b></p><p> delay_ms(10);</p><p> if(0 == key5)</p><p><b> { </b></p><p> if(beep_flag==0&&
106、amp;temp_flag==0&&error_flag==0)</p><p><b> {</b></p><p> if(a==2) key_flag3=~key_flag3;</p><p> if(a==3) key_flag4=~key_flag4;</p><p><b>
107、 } </b></p><p><b> else </b></p><p><b> {</b></p><p> //beep_flag&&temp_flag&&error_flag=0;</p><p> beep_flag=
108、0;temp_flag=0,error_flag=0;</p><p><b> bp=1;</b></p><p><b> }</b></p><p><b> }</b></p><p> while(key5==0);</p><p>
109、;<b> }</b></p><p><b> }</b></p><p> void key67_scan()</p><p><b> {</b></p><p> if(0 == key6)</p><p><b> {&l
110、t;/b></p><p> delay_ms(10);</p><p> if(0 == key6)</p><p><b> {</b></p><p> if(0 == key_flag2)</p><p><b> {</b></p>&
111、lt;p><b> a++;</b></p><p> if(a>3) a=0;</p><p><b> } </b></p><p> if(2 == c) nshi++;</p><p> if(nshi>23) nshi=0;</p><p
112、> if(3 == c) nfen++;</p><p> if(nfen>59) nfen=0;</p><p> if(1 == b) nian++; </p><p> if(2 == b) yue++;</p><p> if(yue>12) yue=1;</p><p&g
113、t; if(3 == b) ri++;</p><p> leap_year();</p><p> if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)</p><p><b> {</b></p><p> if(ri>31) ri
114、=1; </p><p><b> }</b></p><p> else if(yue==2)</p><p><b> {</b></p><p> if(leapyear_flag==1) </p><p><b> {</b></
115、p><p> if(ri>29) ri=1;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(ri>28) ri=1;</p>
116、<p><b> }</b></p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> if(ri>30) ri=1;</p>&l
117、t;p><b> }</b></p><p> if(4 == b) sz++;</p><p> if(sz>23) sz=0;</p><p> if(5 == b) fz++;</p><p> if(fz>59) fz=0;</p><p> if
118、(6 == b) xq++;</p><p> if(xq>6) xq=0;</p><p> if(2 == d) shezhi++;</p><p> if(shezhi>99) shezhi=0;</p><p><b> }</b></p><p>
119、while(key6==0);</p><p><b> } </b></p><p> if(0 == key7)</p><p><b> {</b></p><p> delay_ms(10);</p><p> if(0 == key7)</p>
120、<p><b> {</b></p><p> if(0 == key_flag2)</p><p><b> {</b></p><p><b> a--;</b></p><p> if(a==255) a=3;</p><p&g
121、t;<b> }</b></p><p> if(2 == c) nshi--;</p><p> if(nshi==255) nshi=23;</p><p> if(3 == c) nfen--;</p><p> if(nfen==255) nfen=59;</p><p>
122、 if(1 == b) nian--; </p><p> if(2 == b) yue--;</p><p> if(yue==0) yue=12;</p><p> if(3 == b) ri--;</p><p> leap_year();</p><p> if(yue==1||yue=
123、=3||yue==5||yue==7||yue==8||yue==10||yue==12)</p><p><b> {</b></p><p> if(ri==0) ri=31; </p><p><b> }</b></p><p> else if(yue==2)</p>
124、<p><b> {</b></p><p> if(leapyear_flag==1) </p><p><b> {</b></p><p> if(ri==0) ri=29;</p><p><b> }</b></p><p&g
125、t;<b> else</b></p><p><b> {</b></p><p> if(ri==0) ri=28;</p><p><b> }</b></p><p><b> }</b></p><p><
126、b> else </b></p><p><b> {</b></p><p> if(ri==0) ri=30;</p><p><b> }</b></p><p> if(4 == b) sz--;</p><p> if(sz==255
127、) sz=23;</p><p> if(5 == b) fz--;</p><p> if(fz==255) fz=59;</p><p> if(6 == b) xq--;</p><p> if(xq==255) xq=6;</p><p> if(2 == d) shezhi--;&
128、lt;/p><p> if(shezhi==255) shezhi=99;</p><p><b> }</b></p><p> while(key7==0);</p><p><b> }</b></p><p><b> }</b><
129、/p><p> /**********設置界面的顯示*************/</p><p> void shezhi_menu()</p><p><b> {</b></p><p> if(0 == a) </p><p><b> {</b></p&g
130、t;<p><b> } </b></p><p> else key3_scan();</p><p> if(1 == a) //功能選擇位于菜單界面的第一項</p><p> { c=0;d=0;</p><p> if(1 == key_flag2) //且按下確定鍵</p
131、><p><b> {</b></p><p> key4_scan();</p><p> display_w(1,0,2*16,shij); //間</p><p> display_w(1,0,3*16,jian); //</p><p> display_w(2,0,0*1
132、6,she); //</p><p> display_w(2,0,1*16,ding); //設</p><p> display_w(1,2,0*16,riz); //</p><p> display_w(1,2,1*16,qi); //</p><p> if(1 == b)</p><p&g
133、t;<b> {</b></p><p> display_e1(1,2,6*8,shuzi[nian/1000]); //</p><p> display_e1(1,2,7*8,shuzi[(nian%1000)/100]); //</p><p> display_e1(2,2,0*8,shuzi[((nian%100
134、0)%100)/10]); // 年</p><p> display_e1(2,2,1*8,shuzi[((nian%1000)%100)%10]); // -</p><p> key67_scan();</p><p><b> }</b></p><p><b> else<
135、/b></p><p><b> {</b></p><p> display_e(1,2,6*8,shuzi[nian/1000]); //</p><p> display_e(1,2,7*8,shuzi[(nian%1000)/100]); //</p><p> display_e(2,
136、2,0*8,shuzi[((nian%1000)%100)/10]); // 年</p><p> display_e(2,2,1*8,shuzi[((nian%1000)%100)%10]); // - </p><p><b> }</b></p><p> display_e(2,2,2*8,fu); //<
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設計--基于stc89c52萬年歷的設計
- 基于89c52的電子萬年歷
- 萬年歷畢業(yè)論文---基于at89s52單片機的電子萬年歷設計
- 畢業(yè)設計----基于at89c系列的電子萬年歷設計
- 基于89c51的萬年歷設計
- 基于at89c51單片機萬年歷畢業(yè)設計
- 基于89c51設計的電子萬年歷
- 基于at89c51單片機萬年歷的畢業(yè)設計
- 電子萬年歷畢業(yè)設計
- 數(shù)字萬年歷畢業(yè)設計
- 電子萬年歷畢業(yè)設計
- 畢業(yè)設計---制作單片機at89s52的萬年歷
- 基于at89c51單片機的萬年歷 畢業(yè)設計
- 電子萬年歷畢業(yè)設計
- 畢業(yè)設計---電子萬年歷設計
- 基于at89s52的電子萬年歷設計報告畢業(yè)論文
- 數(shù)碼萬年歷的畢業(yè)設計
- 數(shù)碼萬年歷的畢業(yè)設計
- 基于at89c52單片機電子萬年歷設計帶程序
- 畢業(yè)設計---電子萬年歷的設計
評論
0/150
提交評論