版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 畢業(yè)論文</b></p><p> 基于STC89C52萬(wàn)年歷的設(shè)計(jì)</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)基本設(shè)計(jì)思路3</p><p> 2. 單元電路方案論證3</p><p> 2.1 控制器模塊3</p><p> 2.2 計(jì)時(shí)模塊3</p><p> 2.3 顯示模塊3</p>&l
3、t;p> 2.4 最終方案4</p><p> 3. 主要芯片介紹4</p><p> 3.1 STC89C52單片機(jī)4</p><p> 3.2 DS18B20溫度傳感器58</p><p> 4. 程序流程圖6</p><p><b> 結(jié) 論7</b>
4、;</p><p><b> 參考文獻(xiàn)8</b></p><p><b> 致 謝9</b></p><p> 附錄 1 原理圖10</p><p> 附錄 2 主要源程序11</p><p> 基于STC89C52萬(wàn)年歷的設(shè)計(jì)</p>&l
5、t;p> 摘 要:本設(shè)計(jì)采用STC89C52單片機(jī)作為主控制器,用DS12C887時(shí)鐘芯片計(jì)時(shí)、DS18B20檢測(cè)溫度,單片機(jī)通過(guò)時(shí)鐘芯片獲取時(shí)間數(shù)據(jù)、DS18B20采集溫度信號(hào),處理后把時(shí)間和溫度數(shù)據(jù)通過(guò)4-16線譯碼器和鎖存器送給15位共陰數(shù)碼管同步顯示年、月、日、時(shí)、分、星期和溫度。該萬(wàn)年歷設(shè)有6個(gè)按鍵:S1、S2、S3、S4、S5和S6鍵,使之具備了校時(shí)功能。 </p><p> 關(guān)鍵詞:?jiǎn)纹?/p>
6、機(jī),DS18B20,按鍵,LCD12864</p><p><b> 前 言</b></p><p> 隨著微電子技術(shù)和超大規(guī)模集成電路技術(shù)的不斷發(fā)展 ,家用電子產(chǎn)品種類日益豐富 ,數(shù)字顯示的萬(wàn)年歷已經(jīng)越來(lái)越流行。</p><p> 單片機(jī)是在集成電路芯片上集成了各種元件的微型計(jì)算機(jī),這些元件包括中央處理器CPU、數(shù)據(jù)存儲(chǔ)器RAM、程序
7、存儲(chǔ)器ROM、定時(shí)/計(jì)數(shù)器、中斷系統(tǒng)、時(shí)鐘部件的集成和I/O接口電路。由于單片機(jī)具有體積小、價(jià)格低、可靠性高、開(kāi)發(fā)應(yīng)用方便等特點(diǎn)因此在現(xiàn)代電子技術(shù)和工業(yè)領(lǐng)域應(yīng)用較為廣泛,在智能儀表中單片機(jī)是應(yīng)用最多、最活躍的領(lǐng)域之一。在控制領(lǐng)域中,現(xiàn)如今人們更注意計(jì)算機(jī)的低成本、小體積、運(yùn)行的可靠性和控制的靈活性。</p><p> 采用單片機(jī)的內(nèi)部定時(shí)器實(shí)現(xiàn)年月日,時(shí)分秒,星期的顯示,硬件設(shè)計(jì)簡(jiǎn)單。</p>&
8、lt;p> 為此設(shè)計(jì)了計(jì)時(shí)準(zhǔn)確,成本低廉的萬(wàn)年歷。</p><p> 1. 系統(tǒng)基本設(shè)計(jì)思路及其主要特點(diǎn)</p><p> 萬(wàn)年歷是一種用數(shù)字電路記錄時(shí)間的裝置,與機(jī)械式時(shí)鐘相比具有更高的準(zhǔn)確性和直觀性,且無(wú)機(jī)械裝置,具有更長(zhǎng)的使用壽命。而且可以記錄年、月、日、星期等信息。</p><p> 本設(shè)計(jì)采用STC89C52單片機(jī)作為主控制器,以內(nèi)部定時(shí)器實(shí)
9、現(xiàn)時(shí)鐘顯示、DS18B20采集溫度,LCD12864實(shí)現(xiàn)對(duì)時(shí)間日期,溫度等顯示:通過(guò)程序的設(shè)計(jì)可以實(shí)現(xiàn)閏年和平年的判斷,并且可以判斷出是大月和小月。并且可以通過(guò)按鍵修改時(shí)鐘日歷信息,及鬧鐘的設(shè)置,和報(bào)警溫度報(bào)警設(shè)置。 </p><p> 2. 單元電路方案論證</p><p> 根據(jù)設(shè)計(jì)要求,本系統(tǒng)主要由控制器模塊、顯示模塊構(gòu)成。為較好的實(shí)現(xiàn)各模塊的功能,我們分別設(shè)計(jì)了幾種方案并分別進(jìn)
10、行了論證。</p><p><b> 2.1 控制器模塊</b></p><p> 方案1:采用51系列單片機(jī)作為系統(tǒng)控制器</p><p> 單片機(jī)算術(shù)運(yùn)算功能強(qiáng),軟件編程靈活、自由度大,可用軟件編程實(shí)現(xiàn)各種算法和邏輯控制。由于其功耗低、體積較小、技術(shù)成熟和成本低等優(yōu)點(diǎn),在各個(gè)領(lǐng)域應(yīng)用廣泛。而且抗干擾性能好。</p>&l
11、t;p> 方案2:采用凌陽(yáng)系列單片機(jī)作為系統(tǒng)的控制器</p><p> 凌陽(yáng)系列單片機(jī)可以實(shí)現(xiàn)各種復(fù)雜的邏輯功能,模塊大,密度高,它將所有器件集成在一塊芯片上,減少了體積,提高了穩(wěn)定性。凌陽(yáng)系列單片機(jī)提高了系統(tǒng)的處理速度,適合作為大規(guī)模實(shí)時(shí)系統(tǒng)的控制核心。</p><p> 因51單片機(jī)價(jià)格比凌陽(yáng)系列低得多,且本設(shè)計(jì)不需要很高的處理速度,從經(jīng)濟(jì)和方便使用角度考慮,本設(shè)計(jì)選擇了方
12、案1。</p><p><b> 2.2 計(jì)時(shí)模塊</b></p><p> 方案1:采用DS1302為計(jì)時(shí)時(shí)鐘芯片</p><p> 該芯片是串行電路,與單片機(jī)接口簡(jiǎn)單,但需另備電池和32.768kHz晶振,因焊接工藝和晶振質(zhì)量等原因會(huì)導(dǎo)致精度降低。</p><p> 方案2:采用采用單片機(jī)的內(nèi)部定時(shí)器來(lái)實(shí)現(xiàn)時(shí)
13、間的顯示</p><p> 采用單片機(jī)的內(nèi)部定時(shí)器來(lái)實(shí)現(xiàn)時(shí)間的顯示,程序設(shè)計(jì)比較復(fù)雜,但是硬件電路十分簡(jiǎn)單,由于硬件電路的成功率低。</p><p> 綜合考慮,本設(shè)計(jì)采用單片機(jī)內(nèi)部定時(shí)器作為計(jì)時(shí)時(shí)鐘。</p><p><b> 2.3 顯示模塊</b></p><p> 方案1:采用LED數(shù)碼管</p&g
14、t;<p> 采用LED數(shù)碼管這種方案。由于顯示的內(nèi)容有限,不夠豐富,不能滿足本設(shè)計(jì),而且硬件電路很復(fù)雜。</p><p> 方案2:采用無(wú)字庫(kù)液晶字符顯示器</p><p> 顯示用液晶字符式,可以用軟件達(dá)到很好的控制,硬件不復(fù)雜,液晶字符顯示器可以顯示很豐富的內(nèi)容,可以很好的滿足本系統(tǒng)的設(shè)計(jì),所以選擇此方案</p><p> 從顯示內(nèi)容的角
15、度考慮,本設(shè)計(jì)選擇了方案2。</p><p><b> 2.4 最終方案</b></p><p> 經(jīng)過(guò)反復(fù)論證,最終確定了如下方案:</p><p> (1)采用STC89C52單片機(jī)作為主控制器。</p><p> (2)采用單片機(jī)內(nèi)部定時(shí)器作為計(jì)時(shí)時(shí)鐘。</p><p> (3)采
16、用LCD12864液晶作為顯示器。</p><p><b> 3. 主要芯片介紹</b></p><p> 3.1 STC89C52單片機(jī)</p><p> 51系列單片機(jī)的引腳配置如圖1所示。主要包括P0、P1、P2、P3口以及讀寫(xiě)功能輸出,時(shí)鐘輸入端等。</p><p> 圖1 STC89C52單片機(jī)引腳圖&
17、lt;/p><p> 3.1.1 最小系統(tǒng)設(shè)計(jì)</p><p> 最小系統(tǒng)包括單片機(jī)及其所需的必要的電源、時(shí)鐘、復(fù)位等部件,能使單片機(jī)始終處于正常的運(yùn)行狀態(tài)。電源、時(shí)鐘等電路是使單片機(jī)能運(yùn)行的必備條件,可以將最小系統(tǒng)作為應(yīng)用系統(tǒng)的核心部分,通過(guò)對(duì)其進(jìn)行存儲(chǔ)器擴(kuò)展、A/D擴(kuò)展等,使單片機(jī)完成較復(fù)雜的功能。</p><p> STC89C52是片內(nèi)有ROM/EPROM
18、的單片機(jī),因此,這種芯片構(gòu)成的最小系統(tǒng)簡(jiǎn)單﹑可靠。用STC89C52單片機(jī)構(gòu)成最小應(yīng)用系統(tǒng)時(shí),只要將單片機(jī)接上時(shí)鐘電路和復(fù)位電路即可,結(jié)構(gòu)如圖2所示,由于集成度的限制,最小應(yīng)用系統(tǒng)只能用作一些小型的控制單元。</p><p> 圖2 單片機(jī)最小系統(tǒng)原理框圖</p><p> 3.1.2 時(shí)鐘電路</p><p> STC89C52單片機(jī)的時(shí)鐘信號(hào)通常有兩種方式
19、產(chǎn)生:一是內(nèi)部時(shí)鐘方式,二是外部時(shí)鐘方式。內(nèi)部時(shí)鐘方式如圖3所示。在STC89C52單片機(jī)內(nèi)部有一振蕩電路,只要在單片機(jī)的XTAL1(18)和XTAL2(19)引腳外接石英晶體(簡(jiǎn)稱晶振),就構(gòu)成了自激振蕩器并在單片機(jī)內(nèi)部產(chǎn)生時(shí)鐘脈沖信號(hào)。圖中電容C1和C2的作用是穩(wěn)定頻率和快速起振,電容值在5~30pF,典型值為30pF。晶振CYS的振蕩頻率范圍在1.2~12MHz間選擇,典型值為12MHz和6MHz。</p><
20、p> 圖3 STC89C52內(nèi)部時(shí)鐘電路</p><p> 3.1.3 復(fù)位電路</p><p> 當(dāng)在STC89C52單片機(jī)的RST引腳引入高電平并保持2個(gè)機(jī)器周期時(shí),單片機(jī)內(nèi)部就執(zhí)行復(fù)位操作(若該引腳持續(xù)保持高電平,單片機(jī)就處于循環(huán)復(fù)位狀態(tài))。</p><p> 復(fù)位電路通常采用上電自動(dòng)復(fù)位和按鈕復(fù)位兩種方式。</p><p&g
21、t; 最簡(jiǎn)單的上電自動(dòng)復(fù)位電路中上電自動(dòng)復(fù)位是通過(guò)外部復(fù)位電路的電容充放電來(lái)實(shí)現(xiàn)的。只要Vcc的上升時(shí)間不超過(guò)1ms,就可以實(shí)現(xiàn)自動(dòng)上電復(fù)位。</p><p> 除了上電復(fù)位外,有時(shí)還需要按鍵手動(dòng)復(fù)位。本設(shè)計(jì)就是用的按鍵手動(dòng)復(fù)位。按鍵手動(dòng)復(fù)位有電平方式和脈沖方式兩種。其中電平復(fù)位是通過(guò)RST(9)端與電源Vcc接通而實(shí)現(xiàn)的。按鍵手動(dòng)復(fù)位電路見(jiàn)圖4。時(shí)鐘頻率用11.0592MHZ時(shí)C取10uF,R取10kΩ。&
22、lt;/p><p> 圖4 STC89C52 復(fù)位電路</p><p> 3.2數(shù)字溫度傳感器DS18B20介紹</p><p> 1、DS18B20的主要特性 </p><p> 1.1、適應(yīng)電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數(shù) 據(jù)線供電 </p><p> 1.2、獨(dú)特的單線接口方
23、式,DS18B20在與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊 </p><p> 1.3、 DS18B20支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以并聯(lián)在唯一的三線上,實(shí)現(xiàn)組網(wǎng)多點(diǎn)測(cè)溫 </p><p> 1.4、DS18B20在使用中不需要任何外圍元件,全部 傳感元件及轉(zhuǎn)換電路集成在形如一只三極管的集成電路內(nèi) </p><p>
24、 1.5、溫范圍-55℃~+125℃,在-10~+85℃時(shí)精度為±0.5℃ </p><p> 1.6、可編程 的分辨率為9~12位,對(duì)應(yīng)的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實(shí)現(xiàn)高精度測(cè)溫 </p><p> 1.7、在9位分辨率時(shí)最多在 93.75ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字,12位分辨率時(shí)最多在750ms內(nèi)把溫度值轉(zhuǎn)換為數(shù)字,速度更快 <
25、;/p><p> 1.8、測(cè)量結(jié)果直接輸出數(shù)字溫度信號(hào),以"一 線總線"串行傳送給CPU,同時(shí)可傳送CRC校驗(yàn)碼,具有極強(qiáng)的抗干擾糾錯(cuò)能力 </p><p> 1.9、負(fù)壓特性:電源極性接反時(shí),芯片不會(huì)因發(fā)熱而燒毀, 但不能正常工作。 </p><p> 2、DS18B20的外形和內(nèi)部結(jié)構(gòu) </p><p> DS18
26、B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM 、溫度傳感器、非揮發(fā)的溫度報(bào)警觸發(fā)器TH和TL、配置寄存器。 </p><p> DS18B20的外形及管腳排列如下圖1: </p><p> DS18B20引腳定義: </p><p> (1)DQ為數(shù)字信號(hào)輸入/輸出端; </p><p> (2)GND為電源地; </p&g
27、t;<p> (3)VDD為外接供電電源輸入端(在寄生電源接線方式時(shí)接地)。 </p><p> 圖2: DS18B20內(nèi)部結(jié)構(gòu)圖 </p><p> DS18B20的讀寫(xiě)時(shí)序和測(cè)溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同,且溫度轉(zhuǎn)換時(shí)的延時(shí)時(shí)間由2s 減為750ms。 DS18B20測(cè)溫原理如圖3所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很
28、小,用于產(chǎn)生固定頻率的脈沖信號(hào)送給計(jì)數(shù)器1。高溫度系數(shù)晶振 隨溫度變化其振蕩率明顯改變,所產(chǎn)生的信號(hào)作為計(jì)數(shù)器2的脈沖輸入。計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55℃所對(duì)應(yīng)的一個(gè)基數(shù)值。計(jì)數(shù)器1對(duì) 低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行減法計(jì)數(shù),當(dāng)計(jì)數(shù)器1的預(yù)置值減到0時(shí),溫度寄存器的值將加1,計(jì)數(shù)器1的預(yù)置將重新被裝入,計(jì)數(shù)器1重 新開(kāi)始對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù),如此循環(huán)直到計(jì)數(shù)器2計(jì)數(shù)到0時(shí),停止溫度寄存器值的累加,此時(shí)溫度寄存器
29、中的數(shù)值即 為所測(cè)溫度。圖3中的斜率累加器用于補(bǔ)償和修正測(cè)溫過(guò)程中的非線性,其輸出用于修正計(jì)數(shù)器1的預(yù)置值。 </p><p> 圖3:DS18B20測(cè)溫原理框圖 </p><p> DS18B20有4個(gè)主要的數(shù)據(jù)部件: </p><p> ?。?)光刻ROM中的64位序列號(hào)是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼。64位光刻ROM的排列是:
30、開(kāi)始8位 (28H)是產(chǎn)品類型標(biāo)號(hào),接著的48位是該DS18B20自身的序列號(hào),最后8位是前面56位的循環(huán)冗余校驗(yàn)碼(CRC=X8+X5+X4+1)。光刻ROM的作用 是使每一個(gè)DS18B20都各不相同,這樣就可以實(shí)現(xiàn)一根總線上掛接多個(gè)DS18B20的目的。 </p><p> (2)DS18B20中的溫度傳感器可完成對(duì)溫度的測(cè)量,以12位轉(zhuǎn)化為例:用16位符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼讀數(shù)形式提供,以 0.0625℃/
31、LSB形式表達(dá),其中S為符號(hào)位。 </p><p> 表1: DS18B20溫度值格式表 </p><p> 這是12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在18B20的兩個(gè)8比特的RAM中,二進(jìn)制中的前面5位是符號(hào)位,如果測(cè)得的溫度大于0, 這5位為0,只要將測(cè)到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際 溫度。
32、例如+125℃的數(shù)字輸出為07D0H,+25.0625℃的數(shù)字輸出為0191H,-25.0625℃的數(shù)字輸出為FE6FH,-55℃的數(shù)字輸出為FC90H 。</p><p> 4.系統(tǒng)各模塊的詳細(xì)介紹</p><p><b> 1.電源及下載模塊</b></p><p> 此模塊由四個(gè)撥碼開(kāi)關(guān),其中有兩個(gè)控制本系統(tǒng)電源的通斷,另外兩個(gè)是控
33、制主控芯片下載程序的開(kāi)關(guān),由LED指示本系統(tǒng)電源工作的情況,其電路原理圖如下:</p><p><b> 2.主控芯片模塊</b></p><p> 本系統(tǒng)的控制模塊,注意P0端口要接1K的上拉電阻,其電路原理圖如下:</p><p><b> 3.溫度傳感器模塊</b></p><p>
34、此模塊采用溫度傳感器芯片DS18B20,負(fù)責(zé)采集當(dāng)前環(huán)境溫度,電路原理圖如下:</p><p><b> 4.報(bào)警電路模塊</b></p><p> 負(fù)責(zé)鬧鐘的報(bào)警及溫度報(bào)警,注意采用PNP的三極管,因?yàn)槿绻捎肗PN三極管,單片機(jī)的I/0端口默認(rèn)輸出為高電平,所以在無(wú)任何條件下三極管都會(huì)導(dǎo)通,所以采用PNP的三極管,另外在三極管的基極的限流電阻為1K-10K,如
35、果限流電阻接的過(guò)大的話,可能導(dǎo)致蜂鳴器的聲音非常小,如果過(guò)小的話那么電流會(huì)很大可能會(huì)燒壞三極管,蜂鳴器</p><p><b> 5.按鍵接口模塊</b></p><p> 其中S1為菜單鍵,主要功能是主頁(yè)面和菜單頁(yè)面的顯示的切換,S2主要是當(dāng)處于鬧鐘設(shè)置的狀態(tài)時(shí),或者是溫度報(bào)警設(shè)置設(shè)置,可以控制鬧鐘和溫度報(bào)警的開(kāi)關(guān),并且在主頁(yè)面時(shí),當(dāng)鬧鐘或者是溫度報(bào)警觸發(fā)報(bào)警時(shí)
36、,可以按此鍵解除報(bào)警,并且不影響下次的報(bào)警,S3當(dāng)處于菜單頁(yè)面時(shí)當(dāng)選中某項(xiàng)時(shí),按此鍵可以進(jìn)入某個(gè)菜單功能相對(duì)應(yīng)的頁(yè)面,S4當(dāng)進(jìn)入某個(gè)菜單項(xiàng)時(shí)按此鍵可以使光標(biāo)移動(dòng)一以便對(duì)各功能的設(shè)置,S5、S6主要是加減鍵控制,</p><p> 6.12864顯示模塊</p><p> 該模塊采用無(wú)字庫(kù)的LCD12864,金鵬OCM12864-2</p><p><b&g
37、t; 5.實(shí)際顯示的情況</b></p><p><b> 1.主頁(yè)面顯示效果</b></p><p> 這個(gè)是沒(méi)有全部調(diào)試完成拍的,實(shí)際上顯示年份的地方有顯示平年、閏年的地方,在其后面有個(gè)鬧鈴的圖標(biāo),當(dāng)溫度報(bào)警設(shè)置為開(kāi)時(shí)顯示的為沒(méi)有斜線的狀態(tài),當(dāng)設(shè)置為關(guān)時(shí)顯示的為此圖標(biāo),</p><p><b> 菜單界面顯示效
38、果</b></p><p><b> 各菜單項(xiàng)顯示效果</b></p><p> 實(shí)際顯在調(diào)整時(shí)間下面還有星期的調(diào)整,當(dāng)俺S4是要調(diào)整的那一項(xiàng)會(huì)處于選中狀態(tài)</p><p><b> 結(jié) 論</b></p><p> 本設(shè)計(jì)在調(diào)試過(guò)程中仿真顯示正常,在實(shí)際中溫度顯示卻不正常,查
39、了好久,終于在老師的幫助下發(fā)現(xiàn)是程序的問(wèn)題,經(jīng)過(guò)改正,溫度顯示正常。這時(shí)發(fā)現(xiàn)數(shù)碼管顯示亮度有點(diǎn)低且閃爍嚴(yán)重,后來(lái)加了三極管驅(qū)動(dòng)電路,將掃描數(shù)碼管時(shí)間改短,顯示的問(wèn)題終于解決了。</p><p> 通過(guò)對(duì)自己在大學(xué)兩年時(shí)間里所學(xué)的知識(shí)的回顧,并充分發(fā)揮對(duì)所學(xué)知識(shí)的理解和對(duì)畢業(yè)設(shè)計(jì)的思考及書(shū)面表達(dá)能力,最終完成了本設(shè)計(jì)。這為自己今后進(jìn)一步深化學(xué)習(xí),積累了一定寶貴的經(jīng)驗(yàn)。撰寫(xiě)論文的過(guò)程也是專業(yè)知識(shí)的學(xué)習(xí)過(guò)程,它使我運(yùn)
40、用已有的專業(yè)基礎(chǔ)知識(shí),對(duì)其進(jìn)行設(shè)計(jì),分析和解決一個(gè)理論問(wèn)題或?qū)嶋H問(wèn)題,把知識(shí)轉(zhuǎn)化為能力的實(shí)際訓(xùn)練。培養(yǎng)了我運(yùn)用所學(xué)知識(shí)解決實(shí)際問(wèn)題的能力。</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> /*********時(shí)間變量*********/</p><p> uchar sz=12,fz=0,mz=0,xq=0,yue=1,r
42、i=1; //時(shí),分,秒,星期,月,日</p><p> uint nian=2012; //年</p><p> /***********定義鬧鐘及報(bào)警溫度變量******************/</p><p> uchar nshi=0,nfen=0;</p><p> uchar shezhi=27; //設(shè)置報(bào)溫度的
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; //選項(xiàng)鍵3.5 1.5</p><p> sbit key5=P1^3; //開(kāi)關(guān)控制鍵 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; //計(jì)數(shù)變量</p><p> bit flag=0; //負(fù)溫度標(biāo)志</p><p> bit flag1=0;
46、 //一秒鐘標(biāo)志</p><p> bit key_flag1=0; //菜單鍵按下的標(biāo)志位</p><p> bit key_flag2=0; //確定鍵按下的標(biāo)志</p><p> bit key_flag3=0;</p><p> bit key_flag4=0;</p><p> bit
47、beep_flag=0; //鬧鐘標(biāo)志位</p><p> bit temp_flag=0;//溫度報(bào)警標(biāo)志位</p><p> bit error_flag=0; //芯片錯(cuò)誤標(biāo)志位</p><p> bit leapyear_flag=0;//閏年的標(biāo)志</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;//負(fù)溫度</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í)間計(jì)數(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++; //時(shí)</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;//秒標(biāo)志位清零</p><p><b> }</b&
77、gt;</p><p><b> }</b></p><p> /************時(shí)間及溫度顯示函數(shù)***********/</p><p> void time_temperature()</p><p><b> {</b></p><p> /****
78、****時(shí)間顯示***********/</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]); // 時(shí)</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() //選項(xiàng)鍵</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() //控制鬧鐘的開(kāi)關(guān)</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> /**********設(shè)置界面的顯示*************/</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) //功能選擇位于菜單界面的第一項(xiàng)</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); //設(shè)</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. 本站所有資源如無(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ì)--基于stc89c52萬(wàn)年歷的設(shè)計(jì)
- 基于89c52的電子萬(wàn)年歷
- 萬(wàn)年歷畢業(yè)論文---基于at89s52單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----基于at89c系列的電子萬(wàn)年歷設(shè)計(jì)
- 基于89c51的萬(wàn)年歷設(shè)計(jì)
- 基于at89c51單片機(jī)萬(wàn)年歷畢業(yè)設(shè)計(jì)
- 基于89c51設(shè)計(jì)的電子萬(wàn)年歷
- 基于at89c51單片機(jī)萬(wàn)年歷的畢業(yè)設(shè)計(jì)
- 電子萬(wàn)年歷畢業(yè)設(shè)計(jì)
- 數(shù)字萬(wàn)年歷畢業(yè)設(shè)計(jì)
- 電子萬(wàn)年歷畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---制作單片機(jī)at89s52的萬(wàn)年歷
- 基于at89c51單片機(jī)的萬(wàn)年歷 畢業(yè)設(shè)計(jì)
- 電子萬(wàn)年歷畢業(yè)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---電子萬(wàn)年歷設(shè)計(jì)
- 基于at89s52的電子萬(wàn)年歷設(shè)計(jì)報(bào)告畢業(yè)論文
- 數(shù)碼萬(wàn)年歷的畢業(yè)設(shè)計(jì)
- 數(shù)碼萬(wàn)年歷的畢業(yè)設(shè)計(jì)
- 基于at89c52單片機(jī)電子萬(wàn)年歷設(shè)計(jì)帶程序
- 畢業(yè)設(shè)計(jì)---電子萬(wàn)年歷的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論