數(shù)字指針式萬年歷設(shè)計(jì)_第1頁
數(shù)字指針式萬年歷設(shè)計(jì)_第2頁
數(shù)字指針式萬年歷設(shè)計(jì)_第3頁
數(shù)字指針式萬年歷設(shè)計(jì)_第4頁
數(shù)字指針式萬年歷設(shè)計(jì)_第5頁
已閱讀5頁,還剩52頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

數(shù)字指針式萬年歷設(shè)計(jì)摘要隨著科技的進(jìn)步和人們對便捷生活的需求,傳統(tǒng)的紙質(zhì)萬年歷已經(jīng)無法滿足人們的需求。數(shù)字指針萬年歷的設(shè)計(jì)應(yīng)運(yùn)而生,結(jié)合了數(shù)字顯示和指針指示的形式,使得時(shí)間和日期的讀取更加直觀和方便。本文使用液晶模塊溫度傳感器、鬧鐘模塊、輸入模塊、紐扣電池、STC單片機(jī)、蜂鳴器為系統(tǒng)組成部分,設(shè)計(jì)了一款電子萬年歷。在設(shè)計(jì)過程中結(jié)合萬年歷的特點(diǎn)選擇合適的硬件,實(shí)現(xiàn)了集年、月、日、時(shí)、分、秒、農(nóng)歷、星期、溫度、鬧鐘功能于一體的電子萬年歷。這種設(shè)計(jì)背后的研究目的在于提供一種簡單、易用且美觀的萬年歷解決方案,為人們的日常生活提供便利,并且適應(yīng)現(xiàn)代化的數(shù)字化環(huán)境。通過數(shù)字指針萬年歷的研究,可以改善人們對時(shí)間和日期的感知,提高生活效率和時(shí)間管理能力。關(guān)鍵詞:物聯(lián)網(wǎng);傳感器;單片機(jī)

ABSTRACTWiththeprogressofscienceandtechnologyandpeople'sdemandforconvenientlife,thetraditionalpaperperpetualcalendarcannolongermeetpeople'sneeds.Thedesignofdigitalpointerperpetualcalendarcameintobeing,combiningtheformofdigitaldisplayandpointerindication,makingthereadingoftimeanddatemoreintuitiveandconvenient.Thispaperusesliquidcrystalmoduletemperaturesensor,alarmclockmodule,inputmodule,buttonbattery,STCmicrocontroller,buzzeraspartofthesystem,designedanelectronicperpetualcalendar.Inthedesignprocesscombinedwiththecharacteristicsofthecalendartochoosetheappropriatehardware,toachievetheyear,month,day,hour,minute,second,lunarcalendar,week,temperature,alarmclockfunctionsinoneelectroniccalendar.Theresearchbehindthisdesignaimstoprovideasimple,easy-to-useandaestheticallypleasingperpetualcalendarsolutionthatfacilitatesPeople'sDailylivesandADAPTStoamoderndigitalenvironment.Throughtheresearchofdigitalpointerperpetualcalendar,itcanimprovepeople'sperceptionoftimeanddate,improvelifeefficiencyandtimemanagementability.Keywords:InternetofThings;Sensor;Singlechipmicrocomputer目錄第1章緒論 第1章緒論1.1研究目的及意義該題目要求綜合運(yùn)用單片機(jī)原理、低頻電子線路、數(shù)字電路與邏輯設(shè)計(jì)等相關(guān)知識,設(shè)計(jì)完成多功能電子萬年歷系統(tǒng)[1]。通過完成任務(wù),掌握單片機(jī)設(shè)計(jì)開發(fā)的基本流程,增強(qiáng)動(dòng)手實(shí)踐能力,培養(yǎng)分析和解決實(shí)際問題的能力,為后續(xù)的學(xué)習(xí)和工作打下良好基礎(chǔ)[2]。此題目可以良好的綜合應(yīng)用所學(xué)知識,設(shè)計(jì)單片機(jī)系統(tǒng)能力,鍛煉軟件和硬件的設(shè)計(jì)能力,培養(yǎng)工程意識,團(tuán)隊(duì)意識,開發(fā)創(chuàng)新思維。年來微電子技術(shù)發(fā)展迅速,以單片機(jī)為核心的智能電子產(chǎn)品層出不窮。人們在日常生活中對智能家居要求越來越高,而電子萬年歷恰是一種適用于各種場合的小型智能家居電子產(chǎn)品,為人們生活帶來便利。本文以STC單片機(jī)為總控元件設(shè)計(jì)了一款電子萬年歷,該電子萬年歷能夠顯示年、月、日、時(shí)、分、秒、農(nóng)歷、星期、溫度和濕度,并具有鬧鐘功能,時(shí)間讀取方便、日期顯示直觀、溫濕度測量準(zhǔn)確、功能多、成本低、市場前景廣闊[3]。隨著人類科技文明的發(fā)展,人們對于時(shí)鐘的要求在不斷地提高。時(shí)鐘已不僅僅被看成一種用來顯示時(shí)間的工具,在很多實(shí)際應(yīng)用中它還需要能夠?qū)崿F(xiàn)更多其它的功能。高精度、多功能、小體積、低功耗,是現(xiàn)代時(shí)鐘發(fā)展的趨勢[4]????。在這種趨勢下,時(shí)鐘的數(shù)字化、多功能化已經(jīng)成為現(xiàn)代時(shí)鐘生產(chǎn)研究的主導(dǎo)設(shè)計(jì)方向。1.2國內(nèi)外研究現(xiàn)狀20年來,內(nèi)外很多研究機(jī)構(gòu)在這個(gè)領(lǐng)域做了諸多努力。美DALLAS公司推出的DS12C887時(shí)鐘芯片將晶體振蕩、振蕩電路、充電電路和可充電鋰電池等一起封裝在芯片上[5]。DS12C887時(shí)鐘芯片采用石英晶體的振蕩器和鋰離子電池,即使在停電狀態(tài)下,也可以保持有關(guān)信息和狀態(tài)不丟失,并利用后備的電池供電,因此它在沒電源供電的情況下仍可繼續(xù)工作10年。時(shí)標(biāo)可選擇二進(jìn)制或BCD碼表示,計(jì)時(shí)更準(zhǔn)確;采用24小時(shí)制計(jì)時(shí),有時(shí)鐘、鬧鐘和日歷(至2100年),有星期,閏年自動(dòng)補(bǔ)償功能;工作電壓4.5~5.5V,電流范圍7~15mA,溫度0~70℃;14個(gè)時(shí)鐘控制寄存器,其內(nèi)部含有專用接口電路,簡化了對外部電路的時(shí)序要求[6]。飛思卡爾公司的數(shù)字控制器芯片MC56F8013,提出了在Boost拓?fù)渲谢谄骄娏鰿CM模式下PFC功率因數(shù)校正電路的數(shù)字化設(shè)計(jì)方案,分析了其硬件結(jié)構(gòu)設(shè)計(jì)及軟件程序流程,在此基礎(chǔ)上利用Matlab進(jìn)行了系統(tǒng)仿真并搭建了實(shí)驗(yàn)樣機(jī),仿真及實(shí)驗(yàn)結(jié)果均表明該數(shù)字系統(tǒng)具有良好的功率因數(shù)校正效果[7]。美國德克薩斯儀表公司研制出一種全電子化模擬手表。該豐表平印“個(gè)液晶元件,用類似于長短針的方式來顯示時(shí)、分、秒、日期和星期。這種手表采用一種新奇的雙向多路復(fù)用法來進(jìn)行復(fù)雜的多功能顯示,結(jié)染僅需要個(gè)觸點(diǎn)來激勵(lì)所有個(gè)液晶元件。電沉是一個(gè)長效高能最的鉀二氧化錳電池,每個(gè)電池可使用二年[8]。安會(huì);蒲禹辰;李紀(jì)榕;馬紅靜;李莉在2022年的《基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)與制作》中以單片機(jī)與數(shù)字電路的相關(guān)知識為基礎(chǔ),對硬件的功能和軟件的編寫流程以及時(shí)鐘的制作進(jìn)行詳細(xì)的介紹,并且提出了制作過程中出現(xiàn)的問題和解決辦法[9]。張?jiān)?曹劍俠;李景景在2022年的《基于單片機(jī)的多功能萬年歷設(shè)計(jì)》提出萬年歷一直是人們生活中記錄日期的主要工具,隨著現(xiàn)代人類社會(huì)科技水平的發(fā)展,萬年歷也從原來的紙質(zhì)化轉(zhuǎn)變?yōu)楝F(xiàn)在的數(shù)字化,且廣泛應(yīng)用于各種場所[10]????。因此,本文設(shè)計(jì)了基于單片機(jī)的多功能萬年歷,首先,以AT89C51單片機(jī)為核心控制模塊,搭配時(shí)鐘模塊和溫度感應(yīng)模塊用于記錄日期時(shí)間和測量環(huán)境的溫度變化;其次,結(jié)合顯示模塊顯示測量的數(shù)值;最后,配備一個(gè)蜂鳴器用作提醒鬧鐘。該萬年歷的數(shù)據(jù)讀取直觀方便,成本與功耗低,可以實(shí)現(xiàn)萬年歷多功能化[11]。劉秀娟;李朋龍;邵娟;王雪娜;梁莉莉在2022年的《多功能電子萬年歷設(shè)計(jì)》利用Proteus仿真軟件和Keil編譯軟件進(jìn)行仿真,實(shí)現(xiàn)了集年、月、日、時(shí)、分、秒、農(nóng)歷、星期、溫度、濕度、鬧鐘功能于一體的電子萬年歷[12]。SchalmGregor;BrunsKristina;DrachenbergNina;GeyerNathalie;FoulkesNicholasS;BertolucciCristiano;GerlachGabriele在2021年的《FindingNemo'sclockrevealsswitchfromnocturnaltodiurnalactivity》中設(shè)計(jì)了一個(gè)時(shí)間機(jī)制用來研究魚類、檸檬和它們的動(dòng)物鐘內(nèi)共生體的多層次相互作用提供了第一個(gè)基礎(chǔ)[13]。TuomasSavolainen;DanielKeithWhiter;NooraPartamies在2016年的《Automaticsegmentationandclassificationofseven-segmentdisplaydigitsonauroralimages》中述了一種新的和全自動(dòng)的方法來分割和分類數(shù)字在七段顯示。該方法適用于一個(gè)數(shù)據(jù)集,該數(shù)據(jù)集包括1973-1997年期間在芬蘭北部Sodankyl?observatory周圍的攝站拍攝的大約700萬張極光全天空圖像[14]。在每幅圖像中有一個(gè)時(shí)鐘顯示的日期和時(shí)間,連同反射整個(gè)夜空通過一個(gè)球面鏡。夜空的數(shù)字電影圖像包含有寶貴的科學(xué)信息,但如果沒有從顯示器中提取日期-時(shí)間的自動(dòng)方法,就不可能使用。本文詳細(xì)描述了這種方法的實(shí)現(xiàn)和結(jié)果。1.3主要研究內(nèi)容主要研究內(nèi)容包括以下幾個(gè)方面:(1)選芯片時(shí),應(yīng)重點(diǎn)考慮功能實(shí)在、使用方便、單片存儲、低功耗、抗斷電的器件。(2)根據(jù)選用芯片設(shè)計(jì)外圍電路和單片機(jī)的接口電路。(3)在硬件設(shè)計(jì)時(shí),結(jié)構(gòu)要盡量簡單實(shí)用、易于實(shí)現(xiàn),使系統(tǒng)電路盡量簡單。(4)根據(jù)硬件電路圖,在開發(fā)板上完成器件的焊接。(5)根據(jù)設(shè)計(jì)的硬件電路,編寫控制芯片的單片機(jī)程序。(6)通過編程、編譯、調(diào)試,把程序下載到單片機(jī)上運(yùn)行,并實(shí)現(xiàn)本設(shè)計(jì)的功能。(7)在硬件電路和軟件程序設(shè)計(jì)時(shí),主要考慮提高人機(jī)界面的友好性,方便用戶操作等因素。(8)實(shí)現(xiàn)集年、月、日、時(shí)、分、秒、農(nóng)歷、星期、溫度、鬧鐘功能于一體的電子萬年歷。

第2章系統(tǒng)的總體結(jié)構(gòu)2.1設(shè)計(jì)方案使用液晶模塊溫度傳感器、鬧鐘模塊、輸入模塊、紐扣電池、STC單片機(jī)、蜂鳴器為系統(tǒng)組成部分,設(shè)計(jì)了一款電子萬年歷。在設(shè)計(jì)過程中結(jié)合萬年歷的特點(diǎn)選擇合適的硬件,實(shí)現(xiàn)了集年、月、日、時(shí)、分、秒、農(nóng)歷、星期、溫度、鬧鐘功能于一體的電子萬年歷。2.2功能需求分析2.2.1技術(shù)路線(1)硬件部分需要液晶模塊溫度傳感器、鬧鐘模塊、輸入模塊、紐扣電池、STC單片機(jī)、蜂鳴器;(2)軟件平臺程序用keil5;(3)畫原理圖用AD;(4)編程語言用C語言;2.2.2預(yù)期結(jié)果數(shù)字指針式萬年歷硬件部分需要液晶模塊、溫度傳感器、鬧鐘模塊、輸入模塊、紐扣電池、STC單片機(jī)、蜂鳴器。液晶模塊可以顯示年月日、時(shí)分秒、星期、陽歷、溫度值和鬧鐘設(shè)定。溫度傳感器能夠檢測溫度,并將信息傳遞給單片機(jī)。鬧鈴模塊:系統(tǒng)采用蜂鳴器電路產(chǎn)生時(shí)鐘鬧鈴,通過頻率的不同可發(fā)出不同的音調(diào),還可通過電位器控制蜂鳴器發(fā)出聲音的響度。常用的系統(tǒng)供電方式有電池盒供電,USB供電或電源接口供電,當(dāng)系統(tǒng)掉電后,紐扣電池供電給時(shí)鐘芯片繼續(xù)工作??赏ㄟ^輸入模塊修改年月日、時(shí)分秒、星期、陽歷、溫度值和鬧鐘設(shè)定。總體結(jié)構(gòu)框圖如下。圖2-1系統(tǒng)總體結(jié)構(gòu)框圖2.3總體方案設(shè)計(jì)第一:理論知識準(zhǔn)備??階段,??理解設(shè)??計(jì)課題??,認(rèn)真??研究課??題所涉??及到的??內(nèi)容,??能夠較??好的掌??握有關(guān)??題目的知識;第二:確定系統(tǒng)各??個(gè)模塊??,理清??各個(gè)模??塊之間??的關(guān)系??,收集??相關(guān)得??到軟硬件資料;第三:規(guī)劃課題,??確定系??統(tǒng)組成??結(jié)構(gòu),??勾畫出??大體系??統(tǒng)框架??并在結(jié)??構(gòu)框架??的基礎(chǔ)??上提出??原理框圖;第四:利用軟件完成??硬件電??路部分??設(shè)計(jì)并??畫出各??部分電??路圖,??將系統(tǒng)??部件通??過接口??電路集??合在一??起,并??畫出電路圖;第五:根據(jù)系統(tǒng)控??制過程??完成軟??件設(shè)計(jì)??部分,??繪制出??主流程圖;第六:進(jìn)行模擬??仿真,??檢查系??統(tǒng)是否??能夠按??照要求??實(shí)現(xiàn)控??制功能??,整理論文。2.4單片機(jī)型號選擇主控制芯片選擇STC89C52單片機(jī),STC89C52是STC公司生產(chǎn)的一種低功耗、高性能8位微控制器。這種單片機(jī)其內(nèi)部有8KB的FlashROM和512B的RAM,并且可以通過串口進(jìn)行ISP程序下載,不需要反復(fù)插拔芯片,非常適合用于實(shí)驗(yàn)。采用此片作為硬件核心,采用FlashROM,能以3V的超低電壓工作。且具有在線編程可擦除技術(shù),當(dāng)在對電路進(jìn)行調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r(shí),不需要對芯片多次拔插,所以不會(huì)對芯片造成損壞。最小系統(tǒng)原理圖如圖所示。圖2-2STC89C52單片機(jī)最小系統(tǒng)原理圖

第3章系統(tǒng)的硬件部分設(shè)計(jì)3.1系統(tǒng)總體設(shè)計(jì)本文使用液晶模塊溫度傳感器、鬧鐘模塊、輸入模塊、紐扣電池、STC單片機(jī)、蜂鳴器為系統(tǒng)組成部分,設(shè)計(jì)了一款電子萬年歷。在設(shè)計(jì)過程中結(jié)合萬年歷的特點(diǎn)選擇合適的硬件,實(shí)現(xiàn)了集年、月、日、時(shí)、分、秒、農(nóng)歷、星期、溫度、鬧鐘功能于一體的電子萬年歷。并且該設(shè)計(jì)能實(shí)現(xiàn)的功能如下:1.溫度傳感器能夠檢測溫度,并將信息傳遞給單片機(jī);2.當(dāng)系統(tǒng)掉電后,紐扣電池供電給時(shí)鐘芯片繼續(xù)工作;3.可通過鬧鈴模塊:系統(tǒng)采用蜂鳴器電路產(chǎn)生時(shí)鐘鬧鈴;4.液晶模塊可以顯示年月日、時(shí)分秒、星期、陽歷、溫度值和鬧鐘設(shè)定;5.輸入模塊修改年月日、時(shí)分秒、星期、陽歷、溫度值和鬧鐘設(shè)定。如下圖為總體原理圖:圖3-1系統(tǒng)的總體原理圖3.2系統(tǒng)的主要功能模塊設(shè)計(jì)3.2.1蜂鳴器報(bào)警電路模塊設(shè)計(jì)蜂鳴器是一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。結(jié)構(gòu)一般為:1、蜂鳴器:發(fā)聲元件,在其兩端施加直流電壓(有源蜂鳴器)或者方波(無源蜂鳴器)就可以發(fā)聲,其主要參數(shù)是外形尺寸、發(fā)聲方向、工作電壓、工作頻率、工作電流、驅(qū)動(dòng)方式(直流方波)等。這些都需要根據(jù)需要進(jìn)行選擇。2、續(xù)流二極管:蜂鳴器本質(zhì)上是一個(gè)感性元件,其電流不能瞬變,因此必須有一個(gè)續(xù)流二極管提供續(xù)流。否則,在蜂鳴器兩端會(huì)產(chǎn)生幾十伏的尖峰電壓,可能損壞三極管,并干擾整個(gè)電路系統(tǒng)的其他部分。3、濾波電容:作用是濾波,濾除蜂鳴器電流對其他部分的影響,也可以改善電源的交流阻抗,如果可能,最好是再并聯(lián)一個(gè)220uF的電解電容。4、三極管:起開關(guān)作用,其基極的高電平使三極管飽和導(dǎo)通,使蜂鳴器發(fā)聲;而基極低電平則使三極管關(guān)閉,蜂鳴器停止發(fā)聲。其原理圖為:圖3-2蜂鳴器報(bào)警電路原理圖3.2.2溫度傳感器模塊設(shè)計(jì)DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等元件相比,它能直接讀出被測溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(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è)計(jì)更靈活、方便。DS18B20的讀寫時(shí)序和測溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同。其原理圖如下所示。圖3-318b20溫度傳感器3.2.3液晶顯示模塊設(shè)計(jì)12864LCD液晶顯示模塊是一款4位/8位并行、2線或3線接口方式,內(nèi)部含有國際一級、二級簡體中文字庫的圖形點(diǎn)陣液晶模塊。顯示分辨率為128*64,內(nèi)置8198個(gè)16*16點(diǎn)漢字,和128個(gè)16*8點(diǎn)ASCII字符集。該型號液晶模塊具有接口方式簡單,指令操作便捷的特點(diǎn),可構(gòu)成全中文人機(jī)交互圖形界面??娠@示8*4行16*16點(diǎn)陣的行字,也可完成圖形顯示。LCD12864分為帶中文字庫和不帶中文字庫兩種,有并行傳輸和串行傳輸兩種方式通常并行速度快。從電源地開始引腳依次為:電源地、電源正。其原理圖如下所示。圖3-4LCD12864液晶顯示屏原理圖3.2.4按鍵電路模塊設(shè)計(jì)本系統(tǒng)用到了5個(gè)按鍵,其中一個(gè)用作系統(tǒng)手動(dòng)復(fù)位,另外4個(gè)采用獨(dú)立按鍵,該種接法查詢簡單,程序處理簡單,可節(jié)省CPU資源,4個(gè)獨(dú)立按鍵分別與AT89S52的P3.0、P3.1、P3.2、P3.3接口相連。原理圖如下所示。圖3-5按鍵電路原理圖3.2.5時(shí)鐘模塊設(shè)計(jì)DS1302是Dallas公司生產(chǎn)的一種實(shí)時(shí)時(shí)鐘芯片。它通過串行方式與單片機(jī)進(jìn)行數(shù)據(jù)傳送,能夠向單片機(jī)提供包括秒、分、時(shí)、日、月、年等在內(nèi)的實(shí)時(shí)時(shí)間信息,并可對月末日期、閏年天數(shù)自動(dòng)進(jìn)行調(diào)整;它還擁有用于主電源和備份電源的雙電源引腳,在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。另外,它還能提供31字節(jié)的用于高速數(shù)據(jù)暫存的RAM。DS1302時(shí)鐘芯片內(nèi)主要包括移位寄存器、控制邏輯電路、振蕩器。DS1302與單片機(jī)系統(tǒng)的數(shù)據(jù)傳送依靠RST,I/O,SCLK三根端線即可完成。其工作過程可概括為:首先系統(tǒng)RST引腳驅(qū)動(dòng)至高電平,然后在SCLK時(shí)鐘脈沖的作用下,通過I/O引腳向DS1302輸入地址/命令字節(jié),隨后再在SCLK時(shí)鐘脈沖的配合下,從I/O引腳寫入或讀出相應(yīng)的數(shù)據(jù)字節(jié)。因此,其與單片機(jī)之間的數(shù)據(jù)傳送是十分容易實(shí)現(xiàn)的。其原理圖如下。圖3-6DS1302時(shí)鐘模塊原理圖第4章系統(tǒng)的軟件設(shè)計(jì)4.1軟件的主要流程系統(tǒng)的軟件部分主要要進(jìn)行公歷計(jì)算程序設(shè)計(jì),溫度測量程序設(shè)計(jì),按鍵的掃描輸入等。程序開始運(yùn)行后首先要進(jìn)行初始化,把單片機(jī)的各引腳的狀態(tài)按程序里面的初始化命令進(jìn)行初始化,初始化完成后運(yùn)行溫度測量程序,讀取出溫度傳感器測量出來的溫度,然后運(yùn)行公歷計(jì)算程序,得到公歷的時(shí)間、日期信息,再運(yùn)行按鍵掃描程序,檢測有無按鍵按下,如果沒有按鍵按下則直接調(diào)用節(jié)日計(jì)算程序,根據(jù)得到的公歷日期信息計(jì)算出節(jié)日,如果有按鍵按下則更新按鍵修改后的變量后送給節(jié)日計(jì)算程序,由節(jié)日計(jì)算程序根據(jù)修改后的變量計(jì)算出對應(yīng)的節(jié)假日,計(jì)算完成后運(yùn)行顯示程序,顯示程序?qū)⒌玫降臏囟葦?shù)據(jù)、公歷信息、節(jié)假日信息送給對應(yīng)的數(shù)碼管讓其顯示。系統(tǒng)的主程序流程圖如下所示。圖4-1主程序流程圖4.2蜂鳴器報(bào)警電路模塊軟件設(shè)計(jì)當(dāng)系統(tǒng)運(yùn)行到上位機(jī)設(shè)置的時(shí)間后,系統(tǒng)使蜂鳴器工作起到報(bào)警作用。流程圖如下所示。圖4-2蜂鳴器工作流程圖4.3溫度傳感器模塊軟件設(shè)計(jì)當(dāng)單片機(jī)初始化完畢時(shí),溫度傳感器開始工作,將采集周圍的溫度信息并發(fā)送到顯示屏上顯示出來。工作流程圖如下所示。圖4-3溫度傳感器工作流程圖

4.4液晶顯示屏模塊軟件設(shè)計(jì)當(dāng)單片機(jī)初始化完成后,液晶顯示器將獲取來自于溫度傳感器和時(shí)鐘電路的數(shù)據(jù)并顯示出來。工作的流程圖如下所示。圖4-4液晶顯示屏工作流程圖

4.5按鍵模塊的軟件設(shè)計(jì)當(dāng)單片機(jī)初始化完成后,通過觸摸按鍵傳感器,系統(tǒng)可正常開始工作。其中4號鍵可進(jìn)行時(shí)間校準(zhǔn),3號鍵可進(jìn)行加操作,2號鍵可進(jìn)行減操作,5號鍵可退出校準(zhǔn)功能。流程圖如下。圖4-5按鍵模塊工作的流程圖

4.6時(shí)鐘模塊的軟件設(shè)計(jì)當(dāng)單片機(jī)初始化完成后,時(shí)鐘模塊開始采集年月日星期時(shí)分秒信息,并發(fā)送數(shù)據(jù)至液晶屏上顯示出來。工作流程圖如下所示。圖4-6時(shí)鐘模塊的工作流程圖

第5章系統(tǒng)測試5.1系統(tǒng)實(shí)物圖圖5-1元件擺放位置圖

5.2測試原理將元器件位置擺放好并引腳焊接完成后,導(dǎo)入程序。開始運(yùn)行后,溫度傳感器和時(shí)鐘模塊將獲取溫度數(shù)據(jù)以及時(shí)間信息并逐一顯示在液晶顯示屏上,隨后可以通過對四個(gè)按鍵的控制來改變時(shí)間進(jìn)行校準(zhǔn)。也可以在程序中設(shè)定一個(gè)時(shí)間,當(dāng)該時(shí)間到了之后蜂鳴器正常工作實(shí)現(xiàn)報(bào)警功能。實(shí)驗(yàn)成功。實(shí)物圖如下所示。

第6章總結(jié)與展望6.1總結(jié)在整個(gè)設(shè)計(jì)過程中,硬件方面主要設(shè)計(jì)了STC89C52單片機(jī)的最小系統(tǒng)、DS1302接口電路、DS18B20接口電路、鬧鐘及LCD顯示;軟件方面借助各個(gè)渠道的資料,主要設(shè)計(jì)了陽歷數(shù)據(jù)讀取程序、陽歷轉(zhuǎn)陰歷程序、溫度采集程序、鬧鈴程序以及LCD顯示程序;系統(tǒng)的調(diào)試主要是通過一塊STC89C52開發(fā)板,再借助于Keil、STC以及少許自己搭建的外圍電路實(shí)現(xiàn)的;再此過程中,分步調(diào)試時(shí)顯示出了陽歷的日期及時(shí)間,還有實(shí)時(shí)溫度,集中調(diào)試時(shí)沒有達(dá)到預(yù)期效果。此萬年歷具有讀顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點(diǎn),符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。6.2展望在整個(gè)設(shè)計(jì)過程中學(xué)到了許多沒學(xué)到的知識,在電路焊接時(shí)雖然沒什么大問題,但從中也知道了焊接在整個(gè)作品中的重要性,電路工程量大,不能心急,一個(gè)個(gè)慢慢來不能急于求成。反而達(dá)到事半功倍的效果。對電路的設(shè)計(jì)、布局要先有一個(gè)好的構(gòu)思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時(shí)遇到了很多的問題,經(jīng)過靜下心來思考,理清了思路,反而得心應(yīng)手。在此次設(shè)計(jì)中,知道了做事要有一顆平靜的心,不要想著走捷徑,一步一腳印。也練就了我的耐心,做什么事都要有耐心。在本次設(shè)計(jì)中學(xué)到了很多很多東西,這是最重要的??傊?,此次畢業(yè)設(shè)計(jì)使我的能力得到了全方位的提高。

參考文獻(xiàn)[1]張?jiān)?曹劍俠,李景景.基于單片機(jī)的多功能萬年歷設(shè)計(jì)[J].信息與電腦(理論版),2022,34(12):137-139.[2]劉秀娟,李朋龍,邵娟,王雪娜,梁莉莉,逯玉蘭.多功能電子萬年歷設(shè)計(jì)[J].計(jì)算機(jī)時(shí)代,2022(05):73-75.DOI:10.16644/33-1094/tp.2022.05.018.[3]連麗紅,蔡劍文.基于樹莓派的智能萬年歷[J].物聯(lián)網(wǎng)技術(shù),2021,11(03):97-99+103.DOI:10.16667/j.issn.2095-1302.2021.03.029.[4]劉波.基于ETM8812K4的段碼液晶屏萬年歷的設(shè)計(jì)[J].電子制作,2021(01):9-12+60.DOI:10.16589/11-3571/tn.2021.01.003.[5]李景景,陳攀攀,尹光花.基于單片機(jī)的可檢測危害氣體的電子萬年歷設(shè)計(jì)[J].電子世界,2020(14):116-117.DOI:10.19353/ki.dzsj.2020.14.063.[6]安會(huì),蒲禹辰,李紀(jì)榕,馬紅靜,李莉,張靜.基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)與制作[J].電子制作,2022,30(01):71-74+100.DOI:10.16589/11-3571/tn.2022.01.020.[7]馬瑞,高美蓉.基于Proteus和8086的電子時(shí)鐘設(shè)計(jì)與仿真[J].辦公自動(dòng)化,2021,26(19):46-47+21.[8]肖海玲.74HC595在單片機(jī)電子時(shí)鐘拓展IO口設(shè)計(jì)中的應(yīng)用[J].電子技術(shù)與軟件工程,2021(13):101-102.[9]周彥明,梁偉鄯,李旺昆.基于MAX7219顯示驅(qū)動(dòng)芯片的電子鐘的設(shè)計(jì)[J].電子世界,2021(09):110-113.DOI:10.19353/ki.dzsj.2021.09.045.[10]譚銘明,姚玲英,阮煜琴,梁俊焱,鐘楚洪.基于52單片機(jī)智能貼心時(shí)鐘的研究與設(shè)[J].電子制作,2021(09):16-19.DOI:10.16589/11-3571/tn.2021.09.005.[11]楊潔,葉晶晶.基于51單片機(jī)的多功能電子時(shí)鐘設(shè)計(jì)[J].電子測試,2021(07):20-21+31.DOI:10.16520/ki.1000-8519.2021.07.006.[12]李昊旻,王穎.基于VerilogHDL的簡易電子鐘設(shè)計(jì)[J].信息與電腦(理論版),2021,33(02):107-109.[13]郭辛.基于STM32的電子時(shí)鐘設(shè)計(jì)[J].綿陽師范學(xué)院學(xué)報(bào),2020,39(11):28-31.DOI:10.16276/51-1670/g.2020.11.005.[14]程永茂,龔靖博,李湉雨.基于Multisim10.0的電子時(shí)鐘系統(tǒng)優(yōu)化設(shè)計(jì)[J].儀表技術(shù),2020(12):28-32.DOI:10.19432/ki.issn1006-2394.2020.12.010.[15]沈康,楊俊婷,王穎.基于AT89C51單片機(jī)的電子時(shí)鐘[J].數(shù)碼世界,2020(11):65-66.[16]高偉元,楊棟,李盼亮,高晗,丁鵬.簡易數(shù)字電子時(shí)鐘的設(shè)計(jì)[J].甘肅科技,2020,36(11):13-14.[17]母應(yīng)東.基于FPGA的多功能電子時(shí)鐘設(shè)計(jì)[J].信息記錄材料,2020,21(06):132-134.DOI:10.16009/13-1295/tq.2020.06.079.[18]劉文光,張銘銘.基于Proteus的電子時(shí)鐘仿真設(shè)計(jì)調(diào)試[J].濟(jì)南職業(yè)學(xué)院學(xué)報(bào),2020(02):122-124.[19]高志偉.基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)、仿真與制作[J].電子測試,2020(05):13-15.DOI:10.16520/ki.1000-8519.2020.05.003.[20]RomanovSA,KharkovchukNA,SinelnikovMR,etal.Developmentofannon-speechaudioeventdetectionsystem[A].2020IEEEConferenceofRussianYoungResearchersinElectricalandElectronicEngineering(EIConRus)[C].IEEE,2020:1421-1423.[21]RongC,LiuG,PingZ,etal.Fusionofinfraredandvisibleimagesbasedoninfraredobj[22]AirehrourD,CherringtonM,RajagopalK.Odourdetectionsystemforallergysufferers[A].202011thIEEEAnnualInformationTechnology,ElectronicsandMobileCommunicationConference(IEMCON)[C].IEEE,2020:193-200.[23]DepnerRoniseF.R.,PontinKarineP.,OtutumiLucianaK.,WestenhofenMoisés,BorgesKarenA.,FurianThalesQ.,doNascimentoVladimirP.,LovatoMaristela.Antimicrobialactivityofpoultryhatchbasketscontainingcopperinserts[J].JournalofAppliedPoultryResearch,2021(prepublish).注釋電路圖源代碼#include<reg52.h> //調(diào)用單片機(jī)頭文件#defineucharunsignedchar//無符號字符型宏定義 變量范圍0~255#defineuintunsignedint //無符號整型宏定義 變量范圍0~65535#include"math.h"#include"stdio.h"#include"string.h"#include"stdlib.h"ucharcodeshuzi[]="0123456789ABCDEF";sbitrs=P2^5; //寄存器選擇信號H:數(shù)據(jù)寄存器 L:指令寄存器sbitrw=P2^6; //寄存器選擇信號H:數(shù)據(jù)寄存器 L:指令寄存器sbite=P2^7; //片選信號下降沿觸發(fā)sbitbeep=P3^7; //蜂鳴器IO口sbitdq=P3^2; //18b20IO口的定義uinttemperature;//溫度變量ucharidatatime_beifen[3];ucharidatatime_shijian[3]={0,10,1}; //秒分時(shí)ucharcodetime_leng[3]={23,18,12};ucharcodetable1[][2]={{"零"}, {"一"}, {"二"}, {"三"}, {"四"}, {"五"}, {"六"}, {"七"}, {"八"}, {"九"}, {"十"}, {"初"} };bitflag_200ms=1;ucharmenu_1;ucharflag_clock_en; //鬧鐘標(biāo)志位ucharopen1; //鬧鐘開標(biāo)志位ucharflag_c_en;bitflag_100ms;voidhua_zizhong();//畫指針圖/*********************************************************************名稱:delay_1ms()*功能:延時(shí)1ms函數(shù)*輸入:q*輸出:無***********************************************************************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<115;j++);}#include"ds1302.h"/*********************定時(shí)器0、定時(shí)器1初始化******************/voidtime0_init() { EA=1; //開總中斷 TMOD=0X11; //定時(shí)器0、定時(shí)器1工作方式1 ET0=1; //開定時(shí)器0中斷 TR0=1; //允許定時(shí)器0定時(shí)} /************延時(shí)函數(shù)*****************/voiddelay_uint(uintz){while(z--);}/************寫命令函數(shù)*****************/voidwrite_com(ucharcom){rw=0;rs=0;delay_uint(10);e=1;P0=com;delay_uint(20);e=0;}/************寫數(shù)據(jù)函數(shù)*****************/voidwrite_dat(uchardat){rw=0;rs=1;delay_uint(10);e=1;P0=dat;;delay_uint(20);e=0;}/***********************************************************函數(shù)名:addr_12864*功能:寫地址*說明:寫漢字時(shí)要寫個(gè)地址*輸入:無*返回:無**********************************************************/voidaddr_12864(ucharhang,ucharlie) //地址轉(zhuǎn)換{ ucharaddress; switch(hang) { case1:address=0x80+lie; break; case2:address=0x90+lie; break; case3:address=0x88+lie; break; case4:address=0x98+lie; break; default: break; } write_com(address);}/***********************************************************函數(shù)名:write_shu16*功能:在12864上顯示16進(jìn)制數(shù)據(jù)*說明:*輸入:無*返回:無**********************************************************/voidwrite_shu16(ucharhang,ucharlie,uchardat){ addr_12864(hang,lie); //地址轉(zhuǎn)換 write_dat(shuzi[dat/16]); write_dat(shuzi[dat%16]); }/***********************************************************函數(shù)名:write_string*功能:在12864上顯示字符數(shù)據(jù)*說明:*輸入:無*返回:無**********************************************************/voidwrite_string(ucharhang,ucharlie,uchar*p){ addr_12864(hang,lie); //地址轉(zhuǎn)換 while(*p!='\0') { write_dat(*p); p++; delay_uint(50); }}/*****************控制光標(biāo)函數(shù)********************/voidwrite_guanbiao(ucharhang,ucharlie,uchardate){ addr_12864(hang,lie); if(date==1) write_com(0x0f);//顯示光標(biāo)并且閃爍 else write_com(0xc0);//關(guān)閉光標(biāo)} /************12864液晶初始化函數(shù)*****************/voidinit_12864(){ delay_uint(200); write_com(0x30); delay_uint(200); write_com(0x30); delay_uint(200); write_com(0x0c); //開顯示光標(biāo)的 delay_uint(200); write_com(0x01); delay_uint(2000); write_com(0x06); delay_uint(100);delay_uint(10000);}/*清除12864*/voidclear_12864(){ write_string(1,0,""); //1行 write_string(2,0,""); //2行 write_string(3,0,""); //3行 write_string(4,0,""); //4行 }/************初始化顯示*****************/voidinit_12864_dis(){ write_string(1,4,"00/00/00"); write_string(2,4,"月初"); write_string(3,4,"星期"); write_string(4,4,"00.0℃"); write_guanbiao(1,1,0);}/************初始化設(shè)置顯示*****************/voidinit_12864_set1(){ clear_12864(); write_string(1,0,"2013年00月00日"); write_string(2,0,"00時(shí)00分00秒"); write_string(3,0,"設(shè)置星期01"); write_string(4,0,"鬧鐘開00時(shí)00分"); if(open1==1) write_string(4,2,"開"); else write_string(4,2,"關(guān)"); write_guanbiao(1,1,1);}/***********************18b20初始化函數(shù)*****************************/voidinit_18b20(){ bitq; dq=1; //把總線拿高 delay_uint(10); //15us dq=0; //給復(fù)位脈沖 delay_uint(200); //750us dq=1; //把總線拿高等待 delay_uint(10); //110us q=dq; //讀取18b20初始化信號 delay_uint(100); //200us dq=1; //把總線拿高釋放總線}/*************寫18b20內(nèi)的數(shù)據(jù)***************/voidwrite_18b20(uchardat){ uchari; for(i=0;i<8;i++) { //寫數(shù)據(jù)是低位開始 dq=0; //把總線拿低寫時(shí)間隙開始 dq=dat&0x01;//向18b20總線寫數(shù)據(jù)了 delay_uint(20); //60us dq=1; //釋放總線 dat>>=1; } }/*************讀取18b20內(nèi)的數(shù)據(jù)***************/ucharread_18b20(){ uchari,value; for(i=0;i<8;i++) { dq=0; //把總線拿低讀時(shí)間隙開始 value>>=1; //讀數(shù)據(jù)是低位開始 dq=1; //釋放總線 if(dq==1) //開始讀寫數(shù)據(jù) value|=0x80; delay_uint(20); //60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間 } returnvalue; //返回?cái)?shù)據(jù)}/*************讀取溫度的值讀出來的是小數(shù)***************/uintread_temp(){ uintvalue; ucharlow; //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳過64位ROM write_18b20(0x44); //啟動(dòng)一次溫度轉(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ù)}/******************16進(jìn)制轉(zhuǎn)10進(jìn)制函數(shù)**********************/ ucharHtoi16_10(uchardat){ ucharvalue; uchara[3]; a[2]=''; a[0]=shuzi[dat/16]; a[1]=shuzi[dat%16];//value=atoi(a); returnvalue;}/******************顯示漢字?jǐn)?shù)字函數(shù)**********************/ voidshuzi_hz(ucharhang,ucharlie,uchardat){ if(dat==1) write_string(hang,lie,"一"); if(dat==2) write_string(hang,lie,"二"); if(dat==3) write_string(hang,lie,"三"); if(dat==4) write_string(hang,lie,"四"); if(dat==5) write_string(hang,lie,"五"); if(dat==6) write_string(hang,lie,"六"); if(dat==7) write_string(hang,lie,"七"); if(dat==8) write_string(hang,lie,"八"); if(dat==9) write_string(hang,lie,"九"); if(dat==0x10) write_string(hang,lie,"十"); if(dat==0x11) write_string(hang,lie,"11"); if(dat==0x12) write_string(hang,lie,"12"); }/******************時(shí)間芯片顯示函數(shù)**********************/ voidds1302_dis(){ ucharmiao_1; if(menu_1==0) { read_time(); if(miao_1!=miao) { miao_1=miao; shuzi_hz(3,7,week); //顯示星期 addr_12864(1,4); //地址轉(zhuǎn)換 write_dat(shuzi[yue/16]); //顯示月 write_dat(shuzi[yue%16]); write_dat('/'); write_dat(shuzi[nian/16]); //顯示年 write_dat(shuzi[nian%16]); write_dat('/'); write_dat(shuzi[ri/16]); //顯示日 write_dat(shuzi[ri%16]); addr_12864(4,5); //地址轉(zhuǎn)換 write_dat(shuzi[temperature/100%10]); write_dat(shuzi[temperature/10%10]); write_dat('.'); write_dat(shuzi[temperature%10]); } }}#include"LCD12864.H"/********************獨(dú)立按鍵程序*****************/ucharkey_can; //按鍵值voidkey() //獨(dú)立按鍵程序{ staticucharkey_new; key_can=20;//按鍵值還原 P3|=0x78;//對應(yīng)的按鍵IO口輸出為1 if((P3&0x78)!=0x78) //按鍵按下 { delay_1ms(1); //按鍵消抖動(dòng) 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==4)//退出鍵 { init_12864(); init_12864_dis(); hua_zizhong();//畫指針圖 flag_200ms=1; menu_1=0; } if(key_can==1) //設(shè)置鍵 { GUI_Fill_GDRAM(0x00); menu_1++; flag_200ms=1; if(menu_1==1) init_12864_set1(); if(menu_1>10) menu_1=1; } if(menu_1!=0) { if(menu_1==1) //設(shè)置年 { if(key_can==2) //加 set_ds1302time(1,&nian,0x99); if(key_can==3) //減 set_ds1302time(0,&nian,0x99); } if(menu_1==2) //設(shè)置月 { if(key_can==2) //加 set_ds1302time(1,&yue,0x13); if(key_can==3) //減 set_ds1302time(0,&yue,0x13); } if(menu_1==3) //設(shè)置日 { if(key_can==2) //加 set_ds1302time(1,&ri,0x32); if(key_can==3) //減 set_ds1302time(0,&ri,0x32); } if(menu_1==4) //設(shè)置時(shí) { if(key_can==2) //加 set_ds1302time(1,&shi,0x24); if(key_can==3) //減 set_ds1302time(0,&shi,0x24); } if(menu_1==5) //設(shè)置分 { if(key_can==2) //加 set_ds1302time(1,&fen,0x60); if(key_can==3) //減 set_ds1302time(0,&fen,0x60); } if(menu_1==6) //設(shè)置秒 { if(key_can==2) //加 set_ds1302time(1,&miao,0x60); if(key_can==3) //減 set_ds1302time(0,&miao,0x60); } if(menu_1==7) //設(shè)置星期 { if(key_can==2) //加 set_ds1302time(1,&week,0x8); if(key_can==3) //減 set_ds1302time(0,&week,0x8); } if(menu_1==8) //設(shè)置鬧鐘時(shí) { if(key_can==2) //加 set_ds1302time(1,&shi1,0x24); if(key_can==3) //減 set_ds1302time(0,&shi1,0x24); clock1_save(); } if(menu_1==9) //設(shè)置鬧鐘分 { if(key_can==2) //加 set_ds1302time(1,&fen1,0x60); if(key_can==3) //減 set_ds1302time(0,&fen1,0x60); clock1_save(); } if(menu_1==10) //設(shè)置鬧鐘分 { if((key_can==2)||(key_can==3)) //加 open1++; if(open1>=2) open1=0; if(open1==1) write_string(4,2,"開"); else write_string(4,2,"關(guān)"); clock1_save(); } write_shu16(1,1,nian); //顯示年 write_shu16(1,3,yue); //顯示月 write_shu16(1,5,ri); //顯示日 write_shu16(2,1,shi); //顯示時(shí) write_shu16(2,3,fen); //顯示分 write_shu16(2,5,miao); //顯示秒 write_shu16(3,5,week); //顯示星期 write_shu16(4,4,shi1); //顯示時(shí)鐘 write_shu16(4,6,fen1); //顯示分鐘 switch(menu_1) //光標(biāo)顯示 { case1:write_guanbiao(1,1,1);break; case2:write_guanbiao(1,3,1);break; case3:write_guanbiao(1,5,1);break; case4:write_guanbiao(2,1,1);break; case5:write_guanbiao(4,4,1);break; case6:write_guanbiao(2,3,1);break; case7:write_guanbiao(2,5,1);break; case8:write_guanbiao(3,5,1);break; case9:write_guanbiao(4,6,1);break; case10:write_guanbiao(4,2,1);break; } write_time(); //把時(shí)間寫進(jìn)去 } }/*************鬧鐘報(bào)警函數(shù)***************/voidmenu_dis(){ if(menu_1==0) if(open1==1) //如果鬧鐘打開 { if((fen==fen1)&&(shi==shi1)&&(miao==0)) { flag_clock_en=1; //有報(bào)警打開蜂鳴器響的標(biāo)志位 } if(flag_clock_en==1) //鬧鐘以被打開 { beep=~beep; //蜂鳴器叫3秒 } } }/***************畫秒分時(shí)************************** 參數(shù)n:0,1,2,代表秒分時(shí)******************************************************/voidline_miao_fen_shi(ucharn){ floatr,m; uintx,y; m=((n==0||n==1)?60.0:12.0); //擦除上一次的時(shí)鐘 x=time_leng[n]*cos(r); y=time_leng[n]*sin(r); GUI_line(33,33,33+y,33+x,0); //畫時(shí)鐘 x=time_leng[n]*cos(r); y=time_leng[n]*sin(r); GUI_line(33,33,33+y,33+x,1); //時(shí)間備份 time_beifen[n]=time_shijian[n]; }ucharvalue=15;/************畫指針圖*************/voidhua_zizhong(){ GUI_Cycle(33,33,30,1,1); //圓 GUI_Cycle(33,33,28,1,30); //12個(gè)點(diǎn) GUI_Cycle(33,33,26,1,90); //4個(gè)點(diǎn) GUI_Cycle(33,33,25,1,90); //4個(gè)點(diǎn) Fa_Point(33,33,1); //點(diǎn) Fa_Point(33,32,1); //點(diǎn) Fa_Point(32,32,1); //點(diǎn)}/************主函數(shù)**************/voidmain(){ beep=0; //開機(jī)叫一聲 delay_1ms(150); P0=P1=P2=P3=0xff; //單片機(jī)IO口初始化為1 init_12864(); //lcd12864初始化 init_12864_dis();//lcd12864初始化顯示 time0_init(); //初始化定時(shí)器 temperature=read_temp(); //先讀出溫度的值 hua_zizhong();//畫指針圖 while(1) { key(); if(key_can<10) { if(flag_clock_en==0)//只有鬧鐘關(guān)了的時(shí)候才能進(jìn)入設(shè)置 key_with(); else { beep=1; flag_clock_en=0; //按下任意鍵可關(guān)閉鬧鐘 } } if(flag_200ms==1) { flag_200ms=0; if(menu_1==0) { ds1302_dis();//時(shí)鐘顯示函數(shù) line_miao_fen_shi(0); line_miao_fen_shi(1); line_miao_fen_shi(2); } temperature=read_temp(); //先讀出溫度的值 } if(flag_100ms==1) { menu_dis(); //鬧鐘報(bào)警函數(shù) flag_100ms=0; } delay_1ms(1); }}/*********************定時(shí)器0中斷服務(wù)程序************************/voidtime0_int()interrupt1{ staticucharvalue; //定時(shí)10ms中斷一次 TH0=0x3c; TL0=0xb0;//50ms value++; if(value%2==0) { flag_100ms=1; } if(value%20==0) { flag_200ms=1; }}#ifndef_LCD12864_H_#define_LCD12864_H_ucharxdatadat_12864[64][16]=0;//********************************************************//填充GDRAM數(shù)據(jù)://參數(shù):dat為填充的數(shù)據(jù)//********************************************************voidGUI_Fill_GDRAM(unsignedchardat) { unsignedchari; unsignedcharj; unsignedchark; unsignedcharbGDRAMAddrX=0x80;//GDRAM水平地址 unsignedcharbGDRAMAddrY=0x80;//GDRAM垂直地址 for(i=0;i<2;i++) { for(j=0;j<32;j++) { for(k=0;k<8;k++) { write_com(0x34);//設(shè)置為8位MPU接口,擴(kuò)充指令集,繪圖模式關(guān) write_com(bGDRAMAddrY+j);//垂直地址Y write_com(bGDRAMAddrX+k);//水平地址X write_dat(dat); } } bGDRAMAddrX=0x88; } write_com(0x36);//打開繪圖模式 write_com(0x30);//恢復(fù)基本指令集,關(guān)閉繪圖模式}/* 寫點(diǎn)函數(shù) y:0-63; 要聲明 ucharxdatadat_12864[64][16]; x:0-127; color:1為寫10為清除*/voidFa_Point(unsignedchary,unsignedcharx,unsignedcharcolor){ unsignedcharx_Dyte,x_byte;//定義列地址的字節(jié)位,及在字節(jié)中的哪1位 unsignedchary_Dyte,y_byte;//定義為上下兩個(gè)屏(取值為0,1),行地址(取值為0~31) /***X,Y坐標(biāo)互換,即普通的X,Y坐標(biāo)***/ x_Dyte=x/16;//計(jì)算在16個(gè)字節(jié)中的哪一個(gè) x_byte=x&0x0f;//計(jì)算在該字節(jié)中的哪一位 y_Dyte=y/32;//0為上半屏,1為下半屏 y_byte=y&0x1f;//計(jì)算在0~31當(dāng)中的哪一行 write_com(0x80+y_byte);//設(shè)定行地址(y坐標(biāo)) write_com(0x80+x_Dyte+8*y_Dyte);//設(shè)定列地址(x坐標(biāo)),并通過8*y_Dyte選定上下屏 if(x_byte<8)//判斷其在高8位,還是在低8位 { if(color==1) { dat_12864[y][x_Dyte*2]|=(0x01<<(7-x_byte)); write_dat(dat_12864[y][x_Dyte*2]);//置位GDRAM區(qū)高8位數(shù)據(jù)中相應(yīng)的點(diǎn) } else { dat_12864[y][x_Dyte*2]&=(~(0x01<<(7-x_byte))); write_dat(dat_12864[y][x_Dyte*2]);//清除GDRAM區(qū)高8位數(shù)據(jù)中相應(yīng)的點(diǎn) } write_dat(dat_12864[y][x_Dyte*2+1]);//顯示GDRAM區(qū)低8位數(shù)據(jù) } else { if(color==1) { dat_12864[y][x_Dyte*2+1]|=(0x01<<(15-x_byte)); write_dat(dat_12864[y][x_Dyte*2+1]);//置位GDRAM區(qū)高8位數(shù)據(jù)中相應(yīng)的點(diǎn) } else { dat_12864[y][x_Dyte*2+1]&=(~(0x01<<(15-x_byte))); write_dat(dat_12864[y][x_Dyte*2+1]);//清除GDRAM區(qū)高8位數(shù)據(jù)中相應(yīng)的點(diǎn) } }}/*畫直線*/ voidexchange(uchar*a,uchar*b){ uchartemp; temp=*a; *a=*b; *b=temp;} /*當(dāng)終點(diǎn)坐標(biāo)大于起點(diǎn)坐標(biāo)時(shí)不能畫*/voidGUI_line(uchary1,ucharx1,uchary2,ucharx2,ucharclock){ ucharx,y; //繪點(diǎn)坐標(biāo) floatk,b; //斜率,偏移 if(abs(y1-y2)<=abs(x1-x2)) { k=((float)y2-y1)/((float)x2-x1); //判斷斜率 b=y1-k*x1; for(x=x1;x<=x2;x++) { y=(uchar)(k*x+b); Fa_Point(y,x,clock); } } else { k=((float)x2-x1)/((float)y2-y1); b=y1-k*x1; for(y=y1;y<=y2;y++) { x=(uchar)(k*y+b); Fa_Point(y,x,clock); } } }#definePI3.1415voidGUI_Cycle(ucharxin_y0,ucharxin_x0,ucharradius,ucharclock,floatbujin){ floatsta,x,y; for(sta=0;sta<=360;sta+=bujin) { x=(uchar)(xin_x0+radius*sin(sta*3.14/180));//角度轉(zhuǎn)為弧度 y=(uchar)(xin_y0+radius*cos(sta*3.14/180));//角度轉(zhuǎn)為弧度 Fa_Point(y,x,clock); }}#endif#ifndef_DS1302_H_#define_DS1302_H_/****************** ds1302內(nèi)部RAMRAM01100000R/W1讀0寫 RAM11100001R/W RAM301111110R/W********************/sbitclk=P1^3; //ds1302時(shí)鐘線定義sbitio=P1^4; //數(shù)據(jù)線sbitrst=P1^5; //復(fù)位線 //秒分時(shí)日月年星期

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論