基于STC89C52單片機(jī)的多功能電子萬年歷_第1頁
基于STC89C52單片機(jī)的多功能電子萬年歷_第2頁
基于STC89C52單片機(jī)的多功能電子萬年歷_第3頁
基于STC89C52單片機(jī)的多功能電子萬年歷_第4頁
基于STC89C52單片機(jī)的多功能電子萬年歷_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

摘要本文介紹了基于STC89C52單片機(jī)的多功能電子萬年歷的硬件結(jié)構(gòu)和軟硬件設(shè)計方法。本設(shè)計由數(shù)據(jù)顯示模塊、溫度采集模塊、時間處理模塊和調(diào)整設(shè)置模塊四個模塊組成。系統(tǒng)以STC89C52單片機(jī)為控制器,以串行時鐘日歷芯片DS1302記錄日歷和時間,它可以對年、月、日、時、分、秒進(jìn)行計時,還具有閏年補(bǔ)償?shù)榷喾N功能。溫度采集選用DS18B20芯片,萬年歷采用直觀的數(shù)字顯示,數(shù)據(jù)顯示采用1602A液晶顯示模塊,可以在LCD上同時顯示年、月、日、周日、時、分、秒,還具有時間校準(zhǔn)等功能。此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、本錢低廉等諸多優(yōu)點,具有廣闊的市場前景。關(guān)鍵字:萬年歷溫度計液晶顯示ABSTRACTThispaperintroducesthebasedonSTC89C52multi-functionelectroniccalendarofthehardwarestructureandsoftwareandhardwaredesignmethod.Thisdesignbydatadisplaymodule,temperatureacquisitionmodule,timeprocessingmoduleandsetmodulefourmodules.WithSTC89C52single-chipmicrocomputersystemforthecontrollertoserialclockcalendarchipDS1302recordcalendarandtime,itcanbetodateandtime,minutesandsecondsforthetime,alsohasaleapyearcompensationandotherfunctions.TemperaturegatheringchooseDS18B20chip,calendarbyusingobjectdigitaldisplay,datashowedthatthe1602Aliquidcrystaldisplaymodule,canbeintheLCDshowsatthesametimeyear,month,day,Sunday,when,minutesandseconds,stillhavetimecalibrationetc.Function.Thiscalendarhasreadtheconvenient,directdisplay,functionaldiversity,simplecircuit,lowcost,andmanyotheradvantages,hasabroadmarketprospect.Keywords:PerpetualCalendarthermometerLCDdisplay目錄TOC\o"1-2"\h\z\u摘要IABSTRACTII前言V1緒論11.1課題研究的背景11.2課題的研究目的與意義11.3課題解決的主要內(nèi)容12系統(tǒng)的方案設(shè)計與論證22.1單片機(jī)芯片設(shè)計與論證32.2按鍵控制模塊設(shè)計與論證32.3時鐘模塊設(shè)計與論證32.4溫度采集模塊設(shè)計與論證42.5顯示模塊模塊設(shè)計與論證43系統(tǒng)硬件的設(shè)計53.1STC89C52單片機(jī)53.2時鐘芯片DS1302接口設(shè)計與性能分析83.3溫度芯片DS18B20接口設(shè)計與性能分析113.4LCD顯示模塊153.5按鍵模塊設(shè)計173.6復(fù)位電路的設(shè)計174系統(tǒng)的軟件設(shè)計194.1主程序流程圖的設(shè)計194.2程序設(shè)計205系統(tǒng)的機(jī)體設(shè)計245.1系統(tǒng)的模塊組成245.2功能實現(xiàn)24結(jié)論26參考文獻(xiàn)27致謝28附錄29前言隨著科技的快速開展,時間的流逝,從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀(jì)錄。目前,單片機(jī)技術(shù)的應(yīng)用產(chǎn)品已經(jīng)走進(jìn)了千家萬戶。電子萬年歷的出現(xiàn)給人們的生活帶來了諸多方便。隨著微電子技術(shù)的高速開展,單片機(jī)在國民經(jīng)濟(jì)的個人領(lǐng)域得到了廣泛的運(yùn)用。單片機(jī)以體積小、功能全、性價比高等諸多優(yōu)點,在工業(yè)控制、家用電器、通信設(shè)備、信息處理、尖端武器等各種測控領(lǐng)域的應(yīng)用中獨(dú)占鰲頭,單片機(jī)開發(fā)技術(shù)已成為電子信息、電氣、通信、自動化、機(jī)電一體化等專業(yè)技術(shù)人員必須掌握的技術(shù)。單片機(jī)單芯片的微小體積和低的本錢,可廣泛地嵌入到如玩具、家用電器、機(jī)器人、儀器儀表、汽車電子系統(tǒng)、工業(yè)控制單元、辦公自動化設(shè)備、金融電子系統(tǒng)、艦船、個人信息終端及通訊產(chǎn)品中,成為現(xiàn)代電子系統(tǒng)中最重要的智能化工具,于是基于單片機(jī)的醒目而時尚的電子版萬年歷順應(yīng)而生?;趩纹瑱C(jī)的電子萬年歷結(jié)合了時鐘和日歷的功能,將其二者融為一體,在顯示時間的同時還能顯示日期和年、月,它主要是通過單片機(jī)來讀取時鐘芯片的時間、日期,然后送給顯示設(shè)備顯示出來。而電子萬年歷作為電子類小設(shè)計不僅是市場上的寵兒,也是是單片機(jī)實驗中一個很常用的題目。因為它的有很好的開放性和可發(fā)揮性,因此對作者的要求比擬高,不僅考察了對單片機(jī)的掌握能力更加強(qiáng)調(diào)了對單片機(jī)擴(kuò)展的應(yīng)用。而且在操作的設(shè)計上要力求簡潔,功能上盡量齊全,顯示界面也要出色。數(shù)字顯示的日歷鐘已經(jīng)越來越流行,特別是適合在家庭居室、辦公室、大廳、會議室、車站和廣場等使用,壁掛式LED數(shù)碼管顯示的日歷鐘逐漸受到人們的歡送。LED數(shù)字顯示的日歷鐘顯示清晰直觀、走時準(zhǔn)確、可以進(jìn)行夜視,并且還可以擴(kuò)展出多種功能。1緒論1.1課題研究的背景隨著科技的快速開展,時間的流逝,從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀(jì)錄。它可以對年、月、日、時、分、秒進(jìn)行計時,還具有閏年補(bǔ)償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、時、分、秒和溫度等信息,還具有時間校準(zhǔn)等功能。該電路采用STC89C52單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。

此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、本錢低廉等諸多優(yōu)點,符合電子儀器儀表的開展趨勢,具有廣闊的市場前景。1.2課題的研究目的與意義二十一世紀(jì)是數(shù)字化技術(shù)高速開展的時代,而單片機(jī)在數(shù)字化高速開展的時代扮演著極為重要的角色。電子萬年歷的開發(fā)與研究在信息化時代的今天亦是當(dāng)務(wù)之急,因為它應(yīng)用在學(xué)校、機(jī)關(guān)、企業(yè)、部隊等單位禮堂、訓(xùn)練場地、教學(xué)室、公共場地等場合,可以說普及人們生活的每一個角落。所以說電子萬年歷的開發(fā)是國家之所需,社會之所需,人民之所需。由于社會對信息交換不斷提高的要求及高新技術(shù)的逐步開展,促使電子萬年歷開展并且投入市場得到廣泛應(yīng)用。1.3課題解決的主要內(nèi)容本課題所研究的電子萬年歷是單片機(jī)控制技術(shù)的一個具體應(yīng)用,主要研究內(nèi)容包括以下幾個方面:〔1〕選用電子萬年歷芯片時,應(yīng)重點考慮功能實在、使用方便、單片存儲、低功耗、抗斷電的器件。〔2〕根據(jù)選用的電子萬年歷芯片設(shè)計外圍電路和單片機(jī)的接口電路。〔3〕在硬件設(shè)計時,結(jié)構(gòu)要盡量簡單實用、易于實現(xiàn),使系統(tǒng)電路盡量簡單。〔4〕根據(jù)硬件電路圖,在開發(fā)板上完成器件的焊接。〔5〕根據(jù)設(shè)計的硬件電路,編寫控制STC89C52芯片的單片機(jī)程序。〔6〕通過編程、編譯、調(diào)試,把程序下載到單片機(jī)上運(yùn)行,并實現(xiàn)本設(shè)計的功能?!?〕在硬件電路和軟件程序設(shè)計時,主要考慮提高人機(jī)界面的友好性,方便用戶操作等因素。2系統(tǒng)的方案設(shè)計與論證單片機(jī)電子萬年歷的制作有多種方法,可供選擇的器件和運(yùn)用的技術(shù)也有很多種。所以,系統(tǒng)的總體設(shè)計方案應(yīng)在滿足系統(tǒng)功能的前提下,充分考慮系統(tǒng)使用的環(huán)境,所選的結(jié)構(gòu)要簡單使用、易于實現(xiàn),器件的選用著眼于適宜的參數(shù)、穩(wěn)定的性能、較低的功耗以及低廉的本錢。系統(tǒng)的功能往往決定了系統(tǒng)采用的結(jié)構(gòu),經(jīng)過本錢,性能,功耗等多方面的考慮決定用三個8位74LS164串行接口外接LED顯示器,RESPACK-8對單片機(jī)STC89C52進(jìn)行供電,時間芯片DS1302連接單片機(jī)STC89C52。從而實現(xiàn)電子萬年歷的功能。按照系統(tǒng)設(shè)計的要求,初步確定系統(tǒng)由電源模塊、時鐘模塊、顯示模塊、鍵盤接口模塊、溫度測量模塊和鬧鐘模塊共六個模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1所示。圖1硬件電路框圖2.1單片機(jī)芯片設(shè)計與論證方案一:采用AT89C51芯片作為硬件核心,采用FlashROM,內(nèi)部具有4KBROM存儲空間,能用于3V的超低電壓工作,而且與MCS-51系列單片機(jī)完全兼容,但是運(yùn)用于電路設(shè)計中時由于不具備ISP在線編程技術(shù),當(dāng)在對電路進(jìn)行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,對芯片的屢次拔插會對芯片造成一定的損壞。方案二:采用STC89C52芯片作為硬件核心,采用FlashROM,能以3V的超低電壓工作,而且與MCS-51系列單片機(jī)完全兼容,該芯片內(nèi)部存儲器為8KBROM存儲空間。同樣具有STC89C52的功能,且具有在線編程可擦除技術(shù),當(dāng)在對電路進(jìn)行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,不需要對芯片屢次拔插,所以不會對芯片造成損壞。由于STC89C52內(nèi)部具有8KBROM存儲芯片并且支持ISP在線編程,因此采用STC89C52作為主控芯片。2.2按鍵控制模塊設(shè)計與論證方案一:采用矩陣鍵盤,由于按鍵多可實現(xiàn)數(shù)值的直接鍵入,但在系統(tǒng)中需要CPU不間斷的對其端口掃描。方案二:采用獨(dú)立按鍵,查詢簡單,程序處理簡單,可節(jié)省CPU資源。因系統(tǒng)中所需按鍵不多,為了釋放更多的CPU占有時間,操作方便,故采用方案二。2.3時鐘模塊設(shè)計與論證方案一:直接采用單片機(jī)定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約本錢,但是,實現(xiàn)的時間誤差較大。方案二:采用DS1302時鐘芯片實現(xiàn)時鐘,DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年以及閏年補(bǔ)償?shù)哪赀M(jìn)行計數(shù),而且精度高,位的RAM作為數(shù)據(jù)暫存區(qū),工作電壓2.5V~5.5V范圍內(nèi),2.5V時耗電小于300nA.由于DS1302時鐘芯片計數(shù)時間精度高,而且具有閏年補(bǔ)償功能等優(yōu)點,故采用方案二。2.4溫度采集模塊設(shè)計與論證方案一:采用溫度傳感器〔如熱敏電阻或AD590〕,再經(jīng)AD轉(zhuǎn)換得到數(shù)字信號,精度較準(zhǔn),但價格昂貴,電路較復(fù)雜。方案二:采用數(shù)字式溫度傳感器DS18B20,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9-12位的數(shù)字值讀數(shù)方式,但準(zhǔn)確度不高,誤差最大達(dá)2度。因為用DS18B20溫度芯片,采用單總線訪問,降低本錢、降低制作難度且可節(jié)省單片機(jī)資源,故采用方案二。2.5顯示模塊模塊設(shè)計與論證方案一:采用靜態(tài)顯示方法,靜態(tài)顯示模塊的硬件制作較復(fù)雜及功耗大,要用到多個移位存放器,但不占用端口,只需兩根串口線輸出。方案二:采用動態(tài)顯示方法,動態(tài)顯示模塊的硬件制作簡單,段掃描和位掃描各占用一個端口,總需占用單片機(jī)14個端口,采用間斷掃描法功耗小、硬件本錢低及整個硬件系統(tǒng)體積相對減小。方案三:采用LCD的方法,具有硬件制作簡單可直接與單片機(jī)接口,顯示內(nèi)容多,功耗小,本錢低等優(yōu)點,LCM1602可顯示32個字符,采用LCD的缺點是亮度不夠。比擬以上三種方案:方案一硬件復(fù)雜體積大、功耗大;方案二硬件簡單、功耗小;方案三硬件簡單,顯示內(nèi)容多,功耗小,本錢低等。本系統(tǒng)設(shè)計要求到達(dá)功耗小、體積小、本錢低,顯示信息多等要求,權(quán)衡三種方案,選擇方案三。3系統(tǒng)硬件的設(shè)計根據(jù)上述所確定的系統(tǒng)方案設(shè)想,下面進(jìn)行系統(tǒng)硬件電路的具體設(shè)計,系統(tǒng)的具體設(shè)計在下面會詳細(xì)介紹。3.1STC89C52單片機(jī)本系統(tǒng)采用的是美國ATMEL公司生產(chǎn)的STC89C52單片機(jī),首先我們來熟悉一下STC89C52單片機(jī)的外部引腳和內(nèi)部結(jié)構(gòu)。1.單片機(jī)的引腳功能STC89C52單片機(jī)有40個引腳。Vcc:電源電壓+5VGND:接地P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能驅(qū)動8個TTL邏輯門電路,對端口寫“1〞可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址〔低8位〕和數(shù)據(jù)總線服用,在訪問期間激活內(nèi)部上拉電阻。在Flash編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時要求外接上拉電阻。P1口:P1口是一個帶內(nèi)部上拉電阻的8位雙向I/O,P1的輸出緩沖級可驅(qū)動〔吸收或輸出電流〕4個TTL邏輯門電路。對端口寫“1〞,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。Flash編程和程序校驗期間,P1接收低8位地址。P2口:P2口是一個帶內(nèi)部上拉電阻的8位雙向I/O,P2的輸出緩沖級可驅(qū)動〔吸收或輸出電流〕4個TTL邏輯門電路。對端口寫“1〞,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器〔例如執(zhí)行MOVX@DPTR指令〕時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器〔MOVX@Ri指令〕時,P2口線上的內(nèi)容〔也即特殊功能存放器〔SFR〕區(qū)中P2存放器的內(nèi)容〕,在整個訪問期間不改變。Flash編程和程序校驗期間,P2亦接收低高位地址和其他控制信號。P3口:P3口是一組帶內(nèi)部上拉電阻的8位雙向I/O,P3的輸出緩沖級可驅(qū)動〔吸收或輸出電流〕4個TTL邏輯門電路。對P3口寫入“1〞時,它們被內(nèi)部的上拉電阻拉高并可作為輸入端口。作輸入端時,被外部拉低的P3口將用上拉電阻輸出電流。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,見表1所示:P3口還接收一些用于Flash閃速存儲器編程和程序校驗的控制信號。表1P3口的第二功能圖端口引腳第二功能P3.0RXD〔串行輸入口〕P3.1TXD〔串行輸出口〕P3.2INT0〔外中斷0〕P3.3INT1〔外中斷1〕P3.4T0〔定時/計時器0外部輸入〕P3.5T1〔定時/計時器1外部輸入〕P3.6WR〔外部數(shù)據(jù)存儲器寫選通〕P3.7RD〔外部數(shù)據(jù)存儲器讀選通〕RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機(jī)器周期以上高電平將使單片機(jī)復(fù)位。WDT溢出將使引腳輸出高電平,設(shè)置SFRAUXR的DISRT0〔地址8EH〕可翻開或關(guān)閉該功能。DISRT0位缺省為RESET輸出高電平翻開狀態(tài)。ALE/PROG:當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE〔地址鎖存器允許〕輸出脈沖用于鎖存地址的低8位字節(jié)。即使不訪問外部存儲器,ALE仍以時鐘振蕩頻率的1/6輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個ALE脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖〔PROG〕。如有必要,可通過多特殊功能存放器〔SFR〕區(qū)中的8EH單元的D0位置,可禁止ALE操作。該位置后,只有一條MOVX和MOVC指令A(yù)LE才會被激活。另外,該引腳會被微弱拉高,單片機(jī)執(zhí)行外部程序時,應(yīng)設(shè)置ALE無效。PSEN:程序存儲允許〔PSEN〕輸出是外部程序存儲器的讀選通信號,當(dāng)STC89C52由外部程序存儲器取指令〔或數(shù)據(jù)〕時,每個機(jī)器周期兩次PSEN有效,即輸出兩個脈沖。當(dāng)訪問外部數(shù)據(jù)存儲器,沒有兩次有效的PSEN信號。EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器〔地址為0000H—FFFFH〕,EA端必須保持低電平〔接地〕。需要注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖存EA端狀態(tài)。如EA端為高電平〔接Vcc端〕,CPU那么執(zhí)行內(nèi)部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的變成電壓Vpp.XTAL1:振蕩器反相放大器及內(nèi)部時鐘發(fā)生器的輸入端。XTAL2:振蕩器反相放大器的輸出端。STC89C52單片機(jī)內(nèi)部結(jié)構(gòu)2.STC89C52單片機(jī)與MCS-51完全兼容看門狗〔WDT〕:WDT是一種需要軟件控制的復(fù)位方式。WDT由13位計數(shù)器和特殊功能存放器中的看門狗定時器復(fù)位存儲器〔WDTRST〕構(gòu)成。WDT在默認(rèn)情況下無法工作;為了激活WDT,用戶必須往WDTRST存放器〔地址:0A6H〕中依次寫入01EH和0E1H。當(dāng)WDT激活后,晶振工作,WDT在每個機(jī)器周期都會增加。WDT計時周期依賴于外部時鐘頻率。除了復(fù)位〔硬件復(fù)位或WDT溢出復(fù)位〕,沒有方法停止WDT工作。當(dāng)WDT溢出,它將驅(qū)動RSR引腳輸出一個高電平。可編程串口〔UART〕在STC89C52中,UART的操作與STC89C52和AT89C52一樣。STC89C52系列單片機(jī)的串行通信口可以工作于同步和異步通信方式。當(dāng)工作于異步方式時,它具有全雙工的操作功能,也就是說,它可以同時進(jìn)行數(shù)據(jù)的發(fā)送和接收。串行口內(nèi)的接收器采用的是雙緩沖結(jié)構(gòu),能夠在接收到的第一個字節(jié)從接收存放器讀走之前就開始接收第二個字節(jié)〔當(dāng)然,如果第二個字節(jié)接收完畢,而第一個字節(jié)仍然沒有被讀走,那將會丟掉一個字節(jié)〕。串行口的發(fā)送和接收操作都是通過特殊功能存放器中的數(shù)據(jù)緩沖存放器SBUF進(jìn)行的,但在SBUF的內(nèi)部,接收存放器和發(fā)送存放器在物理結(jié)構(gòu)上是完全獨(dú)立的。如果將數(shù)據(jù)寫入SBUF,數(shù)據(jù)會被送入發(fā)送存放器準(zhǔn)備發(fā)送。如果執(zhí)行SBUF指令,那么讀出的數(shù)據(jù)一定來自接收緩存器。因此,CPU對SBUF的讀寫,實際上是分別訪問2個不同的存放器。這2個存放器的功能決不能混淆。振蕩電路:STC89C52系列單片機(jī)的內(nèi)部振蕩器,由一個單極反相器組成。XTAL1反相器的輸入,XTAL2為反相器的輸出??梢岳盟鼉?nèi)部的振蕩器產(chǎn)生時鐘,只要XTAL1和XTAL2引腳上一個晶體及電容組成的并聯(lián)諧振電路,便構(gòu)成一個完整的振蕩信號發(fā)生器,此方式稱為內(nèi)部方式。另一種方式由外部時鐘源提供一個時鐘信號到XTAL1端輸入,而XTAL2端浮空。在組成一個單片機(jī)應(yīng)用系統(tǒng)時,多數(shù)采用這種方式,這種方式結(jié)構(gòu)緊湊,本錢低廉,可靠性高。在電路中,對電容C1和C2的值要求不是很嚴(yán)格,如果使用高質(zhì)的晶振,那么不管頻率為多少,C1、C2通常都選擇30pF。定時/計數(shù)器:STC89C52單片機(jī)內(nèi)含有2個16位的定時器/計數(shù)器。當(dāng)用于定時器方式時,定時器的輸入來自內(nèi)部時鐘發(fā)生電路,每過一個機(jī)器周期,定時器加1,而一個機(jī)器周期包含有12個振蕩周期,所以,定時器的技術(shù)頻率為晶振頻率的1/12,而計數(shù)頻率最高為晶振頻率的1/24。為了實現(xiàn)定時和計數(shù)功能,定時器中含有3種根本的存放器:控制存放器、方式存放器和定時器/計數(shù)器。控制存放器是一個8位的存放器,用于控制定時器的工作狀態(tài),方式存放器是一個8位的存放器,用于確定定時器的工作方式,定時器/計數(shù)器是16位的計數(shù)器,分為高字節(jié)和低字節(jié)兩局部。RAM:高于7FH內(nèi)部數(shù)據(jù)存儲器的地址是8位的,也就是說其地址空間只有256字節(jié),但內(nèi)部RAM的尋址方式實際上可提供384字節(jié)。的直接地址訪問同一個存儲空間,高于7FH的間接地址訪問另一個存儲空間。這樣,雖然高128字節(jié)區(qū)分與專用寄器,即特殊功能存放器區(qū)的地址是重合的,但實際上它們是分開的。究竟訪問哪一區(qū),存是通過不同的尋址方式加以區(qū)分的。SFR:SFR是具有特殊功能的所有存放器的集合,共含有22個不同存放器,它們的地址分配在80H~FFH中。雖然如此,不是所有的單元都被特殊功能存放器占用,未被占用的單元,其內(nèi)容是不確定的。如對這些單元進(jìn)行讀操作,得到的是一些隨機(jī)數(shù),而寫入那么無效,所以在編程時不應(yīng)該將數(shù)據(jù)寫入這些未確定的地址單元中,特殊功能存放器主要有累加器ACC、B存放器、程序狀態(tài)字存放器PSW、堆棧指針SP、數(shù)據(jù)指針DPTR、I/O端口、串行口數(shù)據(jù)緩沖器SBUF、定時器存放器、捕捉存放器、控制存放器。中斷系統(tǒng):STC89C52單片機(jī)有6個中斷源,中斷系統(tǒng)主要由中斷允許存放器IE、中斷優(yōu)先級存放器IP、優(yōu)先級結(jié)構(gòu)和一些邏輯門組成。IE存放器用于允許或禁止中斷;IP存放器用于確定中斷源的優(yōu)先級別;優(yōu)先級結(jié)構(gòu)用于執(zhí)行中斷源的優(yōu)先排序;有關(guān)邏輯門用于輸入中斷請求信號。在整個中斷響應(yīng)過程中CPU所執(zhí)行的操作步驟如下:〔1〕完成當(dāng)前指令的操作〔2〕將PC內(nèi)容壓入堆?!?〕保存當(dāng)前的中斷狀態(tài)〔4〕阻止同級的中斷請求〔5〕將中斷程序入口地址送PC存放器〔6〕執(zhí)行中斷效勞程序〔7〕返回3.2時鐘芯片DS1302接口設(shè)計與性能分析3.2.1DS1302性能簡介DS1302是Dallas公司生產(chǎn)的一種實時時鐘芯片。它通過串行方式與單片機(jī)進(jìn)行數(shù)據(jù)傳送,能夠向單片機(jī)提供包括秒、分、時、日、月、年等在內(nèi)的實時時間信息,并可對月末日期、閏年天數(shù)自動進(jìn)行調(diào)整;它還擁有用于主電源和備份電源的雙電源引腳,在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運(yùn)行。另外,它還能提供31字節(jié)的用于高速數(shù)據(jù)暫存的RAM。DS1302時鐘芯片內(nèi)主要包括移位存放器、控制邏輯電路、振蕩器。DS1302與單片機(jī)系統(tǒng)的數(shù)據(jù)傳送依靠RST,I/O,SCLK三根端線即可完成。其工作過程可概括為:首先系統(tǒng)RST引腳驅(qū)動至高電平,然后在SCLK時鐘脈沖的作用下,通過I/O引腳向DS1302輸入地址/命令字節(jié),隨后再在SCLK時鐘脈沖的配合下,從I/O引腳寫入或讀出相應(yīng)的數(shù)據(jù)字節(jié)。因此,其與單片機(jī)之間的數(shù)據(jù)傳送是十分容易實現(xiàn)的,DS1302的引腳排列及內(nèi)部結(jié)構(gòu)圖如圖2:DS1302引腳說明:X1,X232.768kHz晶振引腳GND地線RST復(fù)位端I/O數(shù)據(jù)輸入/輸出端口SCLK串行時鐘端口VCC1慢速充電引腳VCC2電源引腳圖2DS1302管腳圖2DS1302的引腳3.2.2DS1302接口電路設(shè)計1時鐘芯片DS1302的接口電路及工作原理:圖3DS1302與MCU接口電路圖3為DS1302的接口電路,其中Vcc1為后備電源,Vcc2為主電源。VCC1在單電源與電池供電的系統(tǒng)中提供低電源并提供低功率的電池備份。VCC2在雙電源系統(tǒng)中提供主電源,在這種運(yùn)用方式中VCC1連接到備份電源,以便在沒有主電源的情況下能保存時間信息以及數(shù)據(jù)。DS1302由VCC1或VCC2兩者中較大者供電。當(dāng)VCC2大于VCC1+0.2V時,VCC2給DS1302供電。當(dāng)VCC2小于VCC1時,DS1302由VCC1供電。DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置“0〞,接著把RST端置“1〞,最后才給予SCLK脈沖;讀/寫時序如下列圖5所示。表-1為DS1302的控制字,此控制字的位7必須置1,假設(shè)為0那么不能對DS1302進(jìn)行讀寫數(shù)據(jù)。對于位6,假設(shè)對時間進(jìn)行讀/寫時,CK=0,對程序進(jìn)行讀/寫時RAM=1。位1至位5指操作單元的地址。位0是讀/寫操作位,進(jìn)行讀操作時,該位為1;進(jìn)行寫操作時,該位為0??刂谱止?jié)總是從最低位開始輸入/輸出的。表-2為DS1302的日歷、時間存放器內(nèi)容:“CH〞是時鐘暫停標(biāo)志位,當(dāng)該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時,時鐘開始運(yùn)行?!癢P〞是寫保護(hù)位,在任何的對時鐘和RAM的寫操作之前,“WP〞必須為0。當(dāng)“WP〞為1時,寫保護(hù)位防止對任一存放器的寫操作。2、DS1302的控制字DS1302的控制字如表2所示。控制字節(jié)的高有效位〔位7〕必須是邏輯1,如果它為0,那么不能把數(shù)據(jù)寫入DS1302中,位6如果0,那么表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位〔位0〕如為1表示進(jìn)行讀操作,為0表示進(jìn)行寫操作??刂谱止?jié)總是從最低位開始輸出。表2DS1302的控制字格式1RAM/CKA4A3A2A1A0RD/WR3、數(shù)據(jù)輸入輸出〔I/O〕在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。如下列圖4所示。圖4DS1302讀/寫時序圖4、DS1302的存放器EQ\*jc0\*"Font:TimesNewRoman"\*hps12\o\ad(\s\up11(———),AM)DS1302有12個存放器,其中有7個存放器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間存放器及其控制字見表3。表3DS1302的日歷、時間存放器寫存放器讀存放器Bit7Bit6Bit5Bit7Bit3Bit2Bit1Bit080H81HCH10秒秒82H83H10分分84H85H12/EQ\*jc0\*"Font:宋體"\*hps8\o\ad(\s\up9(——),24)010時時EQ\*jc0\*"Font:TimesNewRoman"\*hps12\o\ad(\s\up11(——),AM)/PM86H87H0010日日88H89H00010月月8AH8BH00000星期8CH8DH10年年8EH8FHWP0000000此外,DS1302還有年份存放器、控制存放器、充電存放器、時鐘突發(fā)存放器及與RAM相關(guān)的存放器等。時鐘突發(fā)存放器可一次性順序讀寫除充電存放器外的所有存放器內(nèi)容。DS1302與RAM相關(guān)的存放器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM存放器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。3.3溫度芯片DS18B20接口設(shè)計與性能分析3.3.1DS18B20性能簡介1.DS18B20的主要特性DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改良型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9-12位的數(shù)字值讀數(shù)方式?,F(xiàn)場溫度直接以"一線總線"的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。適合于惡劣環(huán)境的現(xiàn)場溫度測量,如:環(huán)境控制、設(shè)備或過程控制、測溫類消費(fèi)電子產(chǎn)品等。與前一代產(chǎn)品不同,新的產(chǎn)品支持3V~5.5V的電壓范圍,使系統(tǒng)設(shè)計更靈活、方便。其性能特點可歸納如下:1獨(dú)特的單線接口僅需要一個端口引腳進(jìn)行通信;2測溫范圍在-55℃到125℃,分辨率最大可達(dá)0.0625℃;3采用了3線制與單片機(jī)相連,減少了外部硬件電路;4零待機(jī)功耗;5可通過數(shù)據(jù)線供電,電壓范圍在3.0V-5.5V;6用戶可定義的非易失性溫度報警設(shè)置;7報警搜索命令識別并標(biāo)志超過程序限定溫度〔溫度報警條件〕的器件;8負(fù)電壓特性,電源極性接反時,溫度計不會因發(fā)熱燒毀,只是不能正常工作。2.DS18B20工作原理DS18B20的讀寫時序和測溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同,且溫度轉(zhuǎn)換時的延時時間由2s減為750ms。DS18B20測溫原理如圖5所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很小,用于產(chǎn)生固定頻率的脈沖信號送給計數(shù)器1。高溫度系數(shù)晶振隨溫度變化其振蕩率明顯改變,所產(chǎn)生的信號作為計數(shù)器2的脈沖輸入。計數(shù)器1和溫度存放器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值。計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計數(shù),當(dāng)計數(shù)器1的預(yù)置值減到0時,溫度存放器的值將加1,計數(shù)器1的預(yù)置將重新被裝入,計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計數(shù),如此循環(huán)直到計數(shù)器2計數(shù)到0時,停止溫度存放器值的累加,此時溫度存放器中的數(shù)值即為所測溫度。圖5中的斜率累加器用于補(bǔ)償和修正測溫過程中的非線性,其輸出用于修正計數(shù)器1的預(yù)置值。LSBLSB位置/去除增加計數(shù)器1斜率累加器計數(shù)比擬器溫度存放器減到0預(yù)置計數(shù)器2減到0停止預(yù)置低溫度系數(shù)晶振高溫度系數(shù)晶振圖5DS18B20測溫原理DS18B20接口電路設(shè)計如6圖所示,該系統(tǒng)中采用數(shù)字式溫度傳感器DS18B20,具有測量精度高,電路連接簡單特點,此類傳感器僅需要一條數(shù)據(jù)線進(jìn)行數(shù)據(jù)傳輸,用P3.7與DS18B20的DQ口連接,Vcc接電源,GND接地。圖6溫度傳感器DS18B20接口電路DS18B20的工作時序1、復(fù)位時序圖圖7復(fù)位時序圖讀時序圖圖8讀時序圖3、寫時序圖圖9寫時序圖3、工作時序1〕總線時序圖10總線時序2〕寫周期時序圖11寫周期時序3〕起始/停止時序圖12起始/停止時序4〕應(yīng)答時序圖13應(yīng)答時序5〕立即地址讀時序圖14立即地址讀時序3.4LCD顯示模塊3.4.1LCM1602的特性及使用說明LCM1602的接口信號說明如表4:表4LCM1602的接口信號編號引腳符號功能說明編號引腳符號功能說明1VSS電源地9D2DATAI/O2VDD電源正極10D3DATAI/O3VL液晶顯示偏壓信號11D4DATAI/O4RS數(shù)據(jù)/命令選擇端〔H/L〕12D5DATAI/O5R/W讀/寫選擇端〔H/L〕13D6DATAI/O6E使能信號14D7DATAI/O7D0DATAI/O15BLA背光正極8D1DATAI/O16BLK背光負(fù)極2、根本操作時序如下:1〕讀狀態(tài):RS=L,RW=H,E=H2〕寫指令:RS=L,RW=L,D0~D7=指令碼,E=高脈沖3〕讀數(shù)據(jù):RS=H,RW=H,E=H4〕寫數(shù)據(jù):RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖3、初始化設(shè)置1〕顯示模式設(shè)置如表5:表5顯示模式設(shè)置指令碼功能00111000設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口顯示開/關(guān)及光標(biāo)設(shè)置如表6:表6顯示開/關(guān)及光標(biāo)設(shè)置指令碼功能00001DCBD=1開顯示;D=0關(guān)顯示C=1顯示光標(biāo);C=0不顯示光標(biāo)B=1光標(biāo)閃爍;B=0光標(biāo)不顯示000001NSN=1當(dāng)讀或?qū)懸粋€字符后地址指針加一,且光標(biāo)加一N=0當(dāng)讀或?qū)懸粋€字符后地址指針減一,且光標(biāo)減一S=1當(dāng)寫一個字符,整屏顯示左移〔N=1〕3.4.2LCM1602與MCU的接口電路LCD的D0~D7分別接單片機(jī)的的P2口,作為數(shù)據(jù)線,因為P0口內(nèi)部沒有上拉電阻,所以外部另外加上10K的上拉電阻;P1.0—P1.2分別接LCD的RS、RW、E三個控制管腳;RV1用來調(diào)節(jié)LCD的顯示灰度;BLK、BLA為背光的陰極和陽極,接上相應(yīng)電平即點亮背光燈。3.5按鍵模塊設(shè)計本系統(tǒng)用到了5個按鍵,其中一個用作系統(tǒng)手動復(fù)位,另外4個采用獨(dú)立按鍵,該種接法查詢簡單,程序處理簡單,可節(jié)省CPU資源,按鍵電路如圖15所示,4個獨(dú)立按鍵分別與STC89C52的P3.4、P3.5、P3.6、P3.7接口相連。圖15按鍵電路對以上4個按鍵作簡要說明:S4——SET鍵,S3——UP鍵,S2——DOWN鍵,S5——OUT/STOP鍵。SET鍵:按下SET鍵進(jìn)入時間校準(zhǔn)狀態(tài),按一下進(jìn)入秒調(diào)整,兩下分調(diào)整,依此類推可進(jìn)行各年月日,時分秒以及星期的校準(zhǔn);UP鍵:當(dāng)SET鍵按下時,UP進(jìn)行SET選定項〔如:小時〕的加操作;DOWN鍵:當(dāng)SET鍵按下時,DOWN進(jìn)行SET選定項〔如:小時〕的減操作;OUT鍵:當(dāng)OUT鍵按下時,此鍵功能為退出校準(zhǔn)功能,進(jìn)入下一模式,顯示溫度值和上下限的溫度值。3.6復(fù)位電路的設(shè)計當(dāng)STC89C52單片機(jī)的復(fù)位引腳RST〔全稱RESET〕出現(xiàn)2個機(jī)器周期以上的高電平時,單片機(jī)就完成了復(fù)位操作。如果RST持續(xù)為高電平,單片機(jī)就處于循環(huán)復(fù)位狀態(tài),而無法執(zhí)行程序。因此要求單片機(jī)復(fù)位后能脫離復(fù)位狀態(tài)。而本系統(tǒng)選用的是12MHz的晶振,因此一個機(jī)器周期為1μs,那么復(fù)位脈沖寬度最小應(yīng)為2μs。在實際應(yīng)用系統(tǒng)中,考慮到電源的穩(wěn)定時間,參數(shù)漂移,晶振穩(wěn)定時間以及復(fù)位的可靠性等因素,必須有足夠的余量。根據(jù)應(yīng)用的要求,復(fù)位操作通常有兩種根本形式:上電復(fù)位、手動復(fù)位。上電復(fù)位要求接通電源后,自動實現(xiàn)復(fù)位操作。STC89C52單片機(jī)的上電復(fù)位POR〔PowerOnReset〕實質(zhì)上就是上電延時復(fù)位,也就是在上電延時期間把單片機(jī)鎖定在復(fù)位狀態(tài)上。在單片機(jī)每次初始加電時,首先投入工作的功能部件是復(fù)位電路。復(fù)位電路把單片機(jī)鎖定在復(fù)位狀態(tài)上并且維持一個延時〔記作TRST〕,以便給予電源電壓從上升到穩(wěn)定的一個等待時間;在電源電壓穩(wěn)定之后,再插入一個延時,給予時鐘振蕩器從起振到穩(wěn)定的一個等待時間;在單片機(jī)開始進(jìn)入運(yùn)行狀態(tài)之前,還要至少推遲2個機(jī)器周期的延時。本設(shè)計采用上電且開關(guān)復(fù)位電路,如圖16所示上電后,由于電容充電,使RST持續(xù)一段高電平時間。當(dāng)單片機(jī)已在運(yùn)行之中時,按下復(fù)位鍵也能使RST持續(xù)一段時間的高電平,從而實現(xiàn)上電且開關(guān)復(fù)位的操作。通常選擇C=10~30μF,本設(shè)計采用的電容值為10μF的電容和電阻為4.7K的電阻。圖16復(fù)位電路4系統(tǒng)的軟件設(shè)計電子萬年歷的功能是在程序控制下實現(xiàn)的。該系統(tǒng)的軟件設(shè)計方法與硬件設(shè)計相對應(yīng),按整體功能分成多個不同的程序模塊,分別進(jìn)行設(shè)計、編程和調(diào)試,最后通過主程序?qū)⒏鞒绦蚰K連接起來。這樣有利于程序修改和調(diào)試,增強(qiáng)了程序的可移植性。本系統(tǒng)的軟件局部主要要進(jìn)行公歷計算程序設(shè)計,溫度測量程序設(shè)計,按鍵的掃描輸入等。程序開始運(yùn)行后首先要進(jìn)行初始化,把單片機(jī)的各引腳的狀態(tài)按程序里面的初始化命令進(jìn)行初始化,初始化完成后運(yùn)行溫度測量程序,讀取出溫度傳感器測量出來的溫度,然后運(yùn)行公歷計算程序,得到公歷的時間、日期信息,再運(yùn)行按鍵掃描程序,檢測有無按鍵按下,如果沒有按鍵按下那么直接調(diào)用節(jié)日計算程序,根據(jù)得到的公歷日期信息計算出節(jié)日,如果有按鍵按下那么更新按鍵修改后的變量后送給節(jié)日計算程序,由節(jié)日計算程序根據(jù)修改后的變量計算出對應(yīng)的節(jié)假日,計算完成后運(yùn)行顯示程序,顯示程序?qū)⒌玫降臏囟葦?shù)據(jù)、公歷信息、節(jié)假日信息送給對應(yīng)的數(shù)碼管讓其顯示。4.1主程序流程圖的設(shè)計主程序流程圖如圖17:開始開始DS1302初始化設(shè)置DS1302讀年月日星期時分秒將讀取的數(shù)據(jù)處理后送液晶屏顯示返回圖17主程序流程圖4.2程序設(shè)計4.2.1DS1302讀寫程序設(shè)計本系統(tǒng)的時間讀取主要來源于單片機(jī)對DS1302的操作,在硬件上時鐘芯片DS1302與單片機(jī)的連接需要三條線,即SCLK(7)、I/O(6)、RST(5),具體連接圖見系統(tǒng)硬件設(shè)計原理圖。讀取寫程序設(shè)計如下:sbitclk=P1^3; //ds1302時鐘線定義sbitio=P1^4; //數(shù)據(jù)線sbitrst=P1^5; //復(fù)位線 //秒分時日月年星期 ucharcodewrite_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//寫地址ucharcoderead_add[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};//讀地址ucharcodeinit_ds[]={0x58,0x00,0x00,0x01,0x01,0x13,0x1};ucharmiao,fen,shi,ri,yue,week,nian;uchari;ucharfen1=0x11,shi1=0; //兩個鬧鐘變量的定義bitopen1;/*************寫一個數(shù)據(jù)到對應(yīng)的地址里***************/voidwrite_ds1302(ucharadd,uchardat){ rst=1; //把復(fù)位線拿高 for(i=0;i<8;i++) { //低位在前 clk=0; //時鐘線拿低開始寫數(shù)據(jù) io=add&0x01; add>>=1; //把地址右移一位 clk=1; //時鐘線拿高 } for(i=0;i<8;i++) { clk=0; //時鐘線拿低開始寫數(shù)據(jù) io=dat&0x01; dat>>=1; //把數(shù)據(jù)右移一位 clk=1; //時鐘線拿高 } rst=0; //復(fù)位線合低 clk=0; io=0;}/*************從對應(yīng)的地址讀一個數(shù)據(jù)出來***************/ucharread_ds1302(ucharadd){ ucharvalue,i; rst=1; //把復(fù)位線拿高 for(i=0;i<8;i++) { //低位在前 clk=0; //時鐘線拿低開始寫數(shù)據(jù) io=add&0x01; add>>=1; //把地址右移一位 clk=1; //時鐘線拿高 } for(i=0;i<8;i++) { clk=0; //時鐘線拿低開始讀數(shù)據(jù) value>>=1; if(io==1) value|=0x80; clk=1; //時鐘線拿高 } rst=0; //復(fù)位線合低 clk=0; io=0; returnvalue; //返回讀出來的數(shù)據(jù)}/*************把要的時間年月日都讀出來***************/voidread_time(){ miao=read_ds1302(read_add[0]); //讀秒 fen=read_ds1302(read_add[1]); //讀分 shi=read_ds1302(read_add[2]); //讀時 ri=read_ds1302(read_add[3]); //讀日 yue=read_ds1302(read_add[4]); //讀月 nian=read_ds1302(read_add[5]); //讀年 week=read_ds1302(read_add[6]); //讀星期 Conversion(0,nian,yue,ri); //農(nóng)歷轉(zhuǎn)換 n_nian=year_moon; n_yue=month_moon; n_ri=day_moon;}/*************把要寫的時間年月日都寫入ds1302里***************/voidwrite_time(){ write_ds1302(0x8e,0x00); //翻開寫保護(hù) write_ds1302(write_add[0],miao); //寫秒 write_ds1302(write_add[1],fen); //寫分 write_ds1302(write_add[2],shi); //寫時 write_ds1302(write_add[3],ri); //寫日 write_ds1302(write_add[4],yue); //寫月 write_ds1302(write_add[5],nian); //寫星期 write_ds1302(write_add[6],week); //寫年 write_ds1302(0x8e,0x80); //關(guān)閉寫保護(hù)}/*************把數(shù)據(jù)保存到ds1302RAM中**0-31*************/voidwrite_ds1302ram(ucharadd,uchardat){ add<<=1;//地址是從第二位開始的 add&=0xfe;//把最低位清零是寫的命令 add|=0xc0;//地址最高兩位為1 write_ds1302(0x8e,0x00); write_ds1302(add,dat); write_ds1302(0x8e,0x80);}/*************把數(shù)據(jù)從ds1302RAM讀出來**0-31*************/ucharread_ds1302ram(ucharadd){ add<<=1;//地址是從第二位開始的 add|=0x01;//把最高位置1是讀命令 add|=0xc0;//地址最高兩位為1 return(read_ds1302(add)); }/*************初始化ds1302時間***************/voidinit_ds1302(){ uchari; rst=0; //第一次讀寫數(shù)據(jù)時要把IO品拿低 clk=0; io=0; i=read_ds1302ram(30); if(i!=3) { i=3; write_ds1302ram(30,i); //40504100 3080 write_ds1302(0x8e,0x00); //翻開寫保護(hù) for(i=0;i<7;i++) write_ds1302(write_add[i],init_ds[i]); //把最高位值0允許ds1302工作 write_ds1302(0x8e,0x80); //關(guān)寫保護(hù) }}DS1302與微處理器進(jìn)行數(shù)據(jù)交換時,首先由微處理器向電路發(fā)送命令字節(jié),命令字節(jié)最高位MSB(D7)必須為邏輯1,如果D7=0,那么禁止寫DS1302,即寫保護(hù);D6=0,指定時鐘數(shù)據(jù),D6=1,指定RAM數(shù)據(jù);D5~D1指定輸入或輸出的特定存放器;最低位LSB(D0)為邏輯0,指定寫操作(輸入),D0=1,指定讀操作(輸出)。4.2.2溫度程序設(shè)計單總線上最根本的操作有初始化、寫和讀3種,所有其它的操作都由這3種根本操作組合而成,初始化用于對總線上的器件進(jìn)行狀態(tài)復(fù)位,寫用于主節(jié)點向總線上寫入一位數(shù)據(jù),讀用于主節(jié)點從總線上讀取一位數(shù)據(jù)。在這3種操作中,只有寫操作是單向的,初始化操作和讀操作都是雙向的。具體程序設(shè)計如下:byteow_reset(void){bytepresence;DQ=0;//拉低總線delay(29);//保持480usDQ=1;//釋放總線delay(3);//等待回復(fù)presence=DQ;//讀取信號delay(25);//等待結(jié)束信號return(presence);//返回0:正常1:不存在}//從1-wire總線上讀取一個字節(jié)byteread_byte(void){bytei;bytevalue=0;for(i=8;i>0;i--){value>>=1;DQ=0;DQ=1;delay(1);if(DQ)value|=0x80;delay(6);}return(value);}//向1-WIRE總線上寫一個字節(jié)voidwrite_byte(charval){bytei;for(i=8;i>0;i--)//一次寫一位{DQ=0;//DQ=val&0x01;delay(5);//DQ=1;val=val/2;}delay(5);}5系統(tǒng)的機(jī)體設(shè)計5.1系統(tǒng)的模塊組成本設(shè)計由數(shù)據(jù)顯示模塊、溫度采集模塊、時間處理模塊和調(diào)整設(shè)置模塊四個模塊組成。系統(tǒng)的核心采用的是STC89C52單片機(jī);數(shù)據(jù)顯示模塊采用的是LCD液晶顯示;溫度采集模塊用的是DS18b20溫度傳感器,該傳感器所采用的是單總線傳輸,內(nèi)部帶有A/D轉(zhuǎn)換,用起來非常方便;時間處理模塊用的是DS1302時鐘芯片,可以對年、月、日、時、分、秒進(jìn)行計時,還具有閏年補(bǔ)償?shù)榷喾N功能;調(diào)整設(shè)置模塊共包括四個按鍵:模式選擇鍵、功能選擇鍵、調(diào)整加按鍵、調(diào)整減按鍵。5.2功能實現(xiàn)系統(tǒng)在正常工作時,LCD液晶上第一行顯示時分秒和溫度,第二行顯示年月日和星期,如果想要對時間進(jìn)行調(diào)整,可以通過調(diào)整設(shè)置模塊來實現(xiàn)。當(dāng)按下P3.3鍵時,系統(tǒng)進(jìn)入另一模式,此時液晶顯示當(dāng)前溫度以及溫度上限和下限,可以通過按鍵來設(shè)置溫度上下限,當(dāng)溫度超過溫度上限或低于溫度下限,此時液晶會顯示越限標(biāo)志,如果想要退出該模式就在按一下P3.3即可。系統(tǒng)原理圖如圖18:圖18系統(tǒng)原理圖結(jié)論在整個設(shè)計過程中,硬件方面主要設(shè)計了STC89C52單片機(jī)的最小系統(tǒng)、DS1302接口電路、DS18B20接口電路、鬧鐘及LCD顯示;軟件方面借助各個渠道的資料,主要設(shè)計了陽歷數(shù)據(jù)讀取程序、陽歷轉(zhuǎn)陰歷程序、溫度采集程序、鬧鈴程序以及LCD顯示程序;系統(tǒng)的調(diào)試主要是通過一塊STC89C52開發(fā)板,再借助于Keil、STC以及少許自己搭建的外圍電路實現(xiàn)的;再此過程中,分步調(diào)試時顯示出了陽歷的日期及時間,還有實時溫度,集中調(diào)試時沒有到達(dá)預(yù)期效果。此萬年歷具有讀顯示直觀、功能多樣、電路簡潔、本錢低廉等諸多優(yōu)點,符合電子儀器儀表的開展趨勢,具有廣闊的市場前景。在整個設(shè)計過程中學(xué)到了許多沒學(xué)到的知識,在電路焊接時雖然沒什么大問題,但從中也知道了焊接在整個作品中的重要性,電路工程量大,不能心急,一個個慢慢來不能急于求成。反而到達(dá)事半功倍的效果。對電路的設(shè)計、布局要先有一個好的構(gòu)思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經(jīng)過靜下心來思考,理清了思路,反而得心應(yīng)手。在此次設(shè)計中,知道了做事要有一顆平常的心,不要想著走捷徑,一步一腳印。也練就了我的耐心,做什么事都要有耐心。在本次設(shè)計中學(xué)到了很多很多東西,這是最重要的。總之,此次畢業(yè)設(shè)計使我的能力得到了全方位的提高,次設(shè)計的電子萬年歷也存在的缺乏的地方,有待于以后的改良。參考文獻(xiàn)[1]陳明熒.8051單片機(jī)課程設(shè)計實訓(xùn)教程[M].北京:清華大學(xué)出版社[2]蘇平.單片機(jī)的原理與接口技術(shù)[M].北京:電子工業(yè)出版社,2006:1-113.[3]王忠民.微型計算機(jī)原理[M].西安:西安科技大學(xué)出版社,2003:15-55.[4]何立民.單片機(jī)高級教程[M].北京:北京航空航天大學(xué)出版社,2003年[5]紀(jì)宗南.單片機(jī)外圍器件使用手冊[M].北京:北京航空航天大學(xué)出版社,622-655.[6]周雪.模擬電子技術(shù)[M]西安:西安電子科技大學(xué)出版社,2005:81-95.[7]左金生.電子與模擬電子技術(shù)[M].北京:電子工業(yè)出版社,2004:105-131.[8]尹勇.單片機(jī)開發(fā)環(huán)境μVision2的開發(fā)指南[M].北京:北京航空航天大學(xué)出版社,2004:173-199.[9]馬忠梅,籍順心等.單片機(jī)的C語言應(yīng)用程序設(shè)計[M].北京航空航天大學(xué)出版社,2001年[10]新編單片機(jī)原理與應(yīng)用〔第二版〕.西安電子科技大學(xué)出版社,2007.2[11]張萌.單片機(jī)應(yīng)用系統(tǒng)開發(fā)綜合實例[M].北京:清華大學(xué)出版社,2007.7[12]樓然苗.單片機(jī)課程設(shè)計指導(dǎo)[M].北京:北京航空航天大學(xué)出版社,2007.7[13]朱思榮.51單片機(jī)實現(xiàn)公歷與農(nóng)歷、星期的轉(zhuǎn)換[Z].當(dāng)當(dāng)電子網(wǎng)[14]李廣弟.單片機(jī)原理及應(yīng)用[M]北京航空航天大學(xué)出版社,2004年[15]王越明.電子萬年歷的設(shè)計[J].黑龍江科技信息,2004年[16]

VergheseGC,LangH,CaseyLF.Analysisofinstabilityinelectricalmachines.IEEETransonIA,1986,22:853-864.[17]

RichardBlanchard,JamesHarden.Mosfetscontrolmorepowerinthesame-sizedpackage.ElectronicDesign,1982,12:107~114[18]TiinaHavana.2003April.CommunicationintheSoftwareVulnerabilityReportingProcess.M.A.thesis,UniversityofJyvaskyla.[19]DanielE.Geer,Jr.(Editor),MaryAnnDavidson,MarcDonner,LyndaMcGhie,andAdamShostack.致謝經(jīng)過三個多月的時間,畢業(yè)設(shè)計按照預(yù)期完成了,由于本人的知識水平有限,論文和設(shè)計中有遺漏和缺陷的地方懇請指正。感謝我的導(dǎo)師,**老師給了我莫大的幫助,在她悉心的指導(dǎo)和嚴(yán)格的要求下,作品和論文順利完成了。論文從選題和最終完成,凝結(jié)著導(dǎo)師的辛勤的汗水,她不辭勞苦的教導(dǎo)、嚴(yán)謹(jǐn)?shù)淖黠L(fēng)使我終生受益。在此畢業(yè)設(shè)計完成之際,謹(jǐn)向?qū)熀退袔椭^我的老師致以崇高的敬意和衷心的感謝。還有感謝家人、朋友還有宿舍里所有的室友,是他們給我創(chuàng)造了良好的學(xué)習(xí)氣氛,在學(xué)習(xí)和生活中給了我支持和幫助。在以后的學(xué)習(xí)生活中我會時時敦促自己更加努力,不辜負(fù)師長、親人、朋友對我的期望。在論文完成之際,我的心情萬分沖動。從論文的選題、資料的收集到論文的撰寫編排整個過程中,我得到了許多的熱情幫助。其中無不凝聚著導(dǎo)師的心血和汗水,在此本人深表感謝!首先特別感謝我的畢業(yè)設(shè)計指導(dǎo)老師**老師,從論文的修改到最后的定稿,都凝注了指導(dǎo)老師的心血。導(dǎo)師嚴(yán)謹(jǐn)求實和一絲不茍的學(xué)風(fēng)、扎實勤勉和孜孜不倦的工作態(tài)度時刻鼓勵著我努力學(xué)習(xí),并將鞭策我在未來的工作中銳意進(jìn)取、發(fā)奮努力。導(dǎo)師的指導(dǎo)將使我終生受益。還要對所有授課老師表示深深的謝意!正是他們的教導(dǎo),才能使我的知識得以豐富,使我的視野得以拓寬,使我的自身修養(yǎng)得以提高!感謝各位到場老師,是你們在百忙之中抽出時間來對我的論文進(jìn)行指導(dǎo),你們的意見和建議將是我一生的財富!感謝所有幫助過我的人們!感謝我的同學(xué)和朋友,在我的論文撰寫期間給予我工作和生活上的大力支持和幫助。附錄#include<reg52.h> //調(diào)用單片機(jī)頭文件#defineucharunsignedchar//無符號字符型宏定義 變量范圍0~255#defineuintunsignedint //無符號整型宏定義 變量范圍0~65535#include"eeprom52.h"#include"nongli.h"bitflag_200ms;bitflag_100ms;sbitbeep=P3^7; //蜂鳴器定義bitflag_beep_en;uintclock_value;//用作鬧鐘用的sbitdq=P3^2; //18b20IO口的定義uinttemperature;//溫度變量ucharflag_nl;//農(nóng)歷陽歷顯示標(biāo)志位ucharmenu_1,menu_2;ucharkey_time,flag_value;//用做連加的中間變量bitkey_500ms;ucharn_nian,n_yue,n_ri; //農(nóng)歷顯示的函數(shù)#include"ds1302.h"#include"lcd1602.h"/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/voidwrite_eeprom(){ SectorErase(0x2000); byte_write(0x2000,fen1); byte_write(0x2001,shi1); byte_write(0x2002,open1); byte_write(0x2058,a_a); }/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/voidread_eeprom(){ fen1=byte_read(0x2000); shi1=byte_read(0x2001); open1=byte_read(0x2002); a_a=byte_read(0x2058);}/**************開機(jī)自檢eeprom初始化*****************/voidinit_eeprom(){ read_eeprom(); //先讀 if(a_a!=1) //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom { fen1=3; shi1=8; open1=1; a_a=1; write_eeprom(); //保存數(shù)據(jù) } }/***********************18b20初始化函數(shù)*****************************/voidinit_18b20(){ bitq; dq=1; //把總線拿高 delay_uint(1); //15us dq=0; //給復(fù)位脈沖 delay_uint(80); //750us dq=1; //把總線拿高等待 delay_uint(10); //110us q=dq; //讀取18b20初始化信號 delay_uint(20); //200us dq=1; //把總線拿高釋放總線}/*************寫18b20內(nèi)的數(shù)據(jù)***************/voidwrite_18b20(uchardat){ uchari; for(i=0;i<8;i++) { //寫數(shù)據(jù)是低位開始 dq=0; //把總線拿低寫時間隙開始 dq=dat&0x01;//向18b20總線寫數(shù)據(jù)了 delay_uint(5); //60us dq=1; //釋放總線 dat>>=1; } }/*************讀取18b20內(nèi)的數(shù)據(jù)***************/ucharread_18b20(){ uchari,value; for(i=0;i<8;i++) { dq=0; //把總線拿低讀時間隙開始 value>>=1; //讀數(shù)據(jù)是低位開始 dq=1; //釋放總線 if(dq==1) //開始讀寫數(shù)據(jù) value|=0x80; delay_uint(5); //60us 讀一個時間隙最少要保持60us的時間 } returnvalue; //返回數(shù)據(jù)}/*************讀取溫度的值讀出來的是小數(shù)***************/uintread_temp(){ uintvalue; ucharlow; //在讀取溫度的時候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否那么會影響到18b20的時序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0x44); //啟動一次溫度轉(zhuǎn)換命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0xbe); //發(fā)出讀取暫存器命令 EA=0; low=read_18b20(); //讀溫度低字節(jié) value=read_18b20();//讀溫度高字節(jié) EA=1; value<<=8; //把溫度的高位左移8位 value|=low; //把讀出的溫度低位放到value的低八位中 value*=0.625; //轉(zhuǎn)換到溫度值小數(shù) returnvalue; //返回讀出的溫度帶小數(shù)}/******************1ms延時函數(shù)*******************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/******************寫星期函數(shù)*******************/voidwrite_week(ucharhang,ucharadd,ucharweek)//寫星期函數(shù){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); switch(week) { case1:write_data('M');//星期數(shù)為1時,顯示 write_data('O'); write_data('N'); break; case2:write_data('T');//星期數(shù)據(jù)為2時顯示 write_data('U'); write_data('E'); break; case3:write_data('W');//星期數(shù)據(jù)為3時顯示 write_data('E'); write_data('D'); break; case4:write_data('T');//星期數(shù)據(jù)為4是顯示 write_data('H'); write_data('U'); break; case5:write_data('F');//星期數(shù)據(jù)為5時顯示 write_data('R'); write_data('I'); break; case6:write_data('S');//星期數(shù)據(jù)為6時顯示 write_data('T'); write_data('A'); break; case0:write_data('S');//星期數(shù)據(jù)為7時顯示 write_data('U'); write_data('N'); break; }}/*************時鐘顯示***************/voidinit_1602_ds1302(){ write_sfm2_ds1302(1,1,shi); //顯示時 write_sfm2_ds1302(1,4,fen); //顯示分 write_sfm2_ds1302(1,7,miao); //顯示秒 write_week(2,12,week);// write_sfm1(1,14,week); //顯示星期 write_sfm3_18B20(1,11,temperature); //顯示溫度 if(flag_nl==0)//顯示陽歷 { write_sfm2_ds1302(2,2,nian);//顯示年 write_sfm2_ds1302(2,5,yue); //顯示月 write_sfm2_ds1302(2,8,ri); //顯示日 } else //顯示農(nóng)歷 { write_sfm2_ds1302(2,2,n_nian); //顯示年 write_sfm2_ds1302(2,5,n_yue); //顯示月 write_sfm2_ds1302(2,8,n_ri); //顯示日 }} /*************定時器0初始化程序***************/voidinit_time0() { EA=1; //開總中斷 TMOD=0X01; //定時器0、工作方式1 ET0=1; //開定時器0中斷 TR0=1; //允許定時器0定時}/*************鬧鐘報警函數(shù)***************/voidmenu_dis(){ staticucharmm,value; if(flag_100ms==1) //100ms執(zhí)行一次 { flag_100ms=0; if(open1==1) //如果鬧鐘翻開 { if((miao==0)&&(fen==fen1)&&(shi==shi1)) { flag_beep_en=1; //有報警翻開蜂鳴器響的標(biāo)志位 } if(flag_beep_en==1) //鬧鐘以被翻開 { clock_value++; if(clock_value<=30) beep=~beep; //蜂鳴器叫3秒 elseif(clock_value>30) { beep=1; //蜂鳴器停1秒 if(clock_value>40) { clock_value=0; } } //1分鐘后自動關(guān)閉鬧鐘 value++; if(value>=10) { value=0; mm++; if(mm>=60) { mm=0; flag_beep_en=0; beep=1; } } } } }}/********************獨(dú)立按鍵程序*****************/ucharkey_can; //按鍵值voidkey() //獨(dú)立按鍵程序{ staticucharkey_new; key_can=20;//按鍵值復(fù)原 P3|=0x78;//對應(yīng)的按鍵IO口輸出為1 if((P3&0x78)!=0x78) //按鍵按下 { delay_1ms(1); //按鍵消抖動 if(((P3&0x78)!=0x78)&&(key_new==1)) { //確認(rèn)是按鍵按下 key_new=0; switch(P3&0x78) { case0x70:key_can=4;break; //得到按鍵值 case0x68:key_can=3;break; //得到按鍵值 case0x58:key_can=2;break; //得到按鍵值 case0x38:key_can=1;break; //得到按鍵值 }// write_sfm2(1,0,key_can); //顯示按鍵值 } } else key_new=1; }/**********************設(shè)置函數(shù)************************/voidkey_with(){ if(key_can==1) //設(shè)置鍵 { menu_1++; if(menu_1==1) //設(shè)置時間 { menu_2=1; write_string(1,0,"--W:"); write_string(2,0,"20--"); } if(menu_1==2) //設(shè)置鬧鐘 { menu_2=1; write_string(1,0,"setclock"); write_string(2,0,"Y00:00"); } if(menu_1>2)

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論