單片機課程設(shè)計報告電子萬年歷_第1頁
單片機課程設(shè)計報告電子萬年歷_第2頁
單片機課程設(shè)計報告電子萬年歷_第3頁
單片機課程設(shè)計報告電子萬年歷_第4頁
單片機課程設(shè)計報告電子萬年歷_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE單片機課程設(shè)計報告電子萬年歷姓名:劉承森學(xué)號:201125040240專業(yè)班級:機電一體化指導(dǎo)老師:宋海軍所在學(xué)院:工程技術(shù)學(xué)院

目錄摘要 I1緒論 1目的與意義 11.2方案選擇與DIY電子萬年歷的研究情況 1 1 3 41.2.4DIY萬年歷的研究情況 42主要硬件描述 52.189C52模塊 52.2顯示模塊LCM12864 5 5 52.3芯片DS1302簡介 62.4芯片DS18B20簡介 63硬件設(shè)計與實現(xiàn) 8單片機最小系統(tǒng)的設(shè)計 8時鐘電路的設(shè)計 9溫度采集模塊的設(shè)計 9人機交互模塊設(shè)計 104系統(tǒng)軟件設(shè)計與實現(xiàn) 11 114.2LCM16824子程序的實現(xiàn) 154.3DS1302子程序的實現(xiàn) 164.4DS18B20子程序的實現(xiàn) 174.5鍵盤子程序的實現(xiàn) 194.6主程序的實現(xiàn) 205測試結(jié)果分析與結(jié)果 225.1測試結(jié)果分析 225.2測試總結(jié) 22結(jié)束語 23致謝 24參考文獻 25附錄一作品實物圖 26附錄二原理圖 27附錄三部分程序 281緒論設(shè)計目的與意義隨著電子技術(shù)的高速發(fā)展,對電子方面人才的要求越來越高,不僅要求其具備相關(guān)的專業(yè)理論知識,還要求其具有較強的設(shè)計、制作等實踐動手能力.此次學(xué)校舉行的電子設(shè)計無疑是對從事電子相關(guān)專業(yè)的人的一次很好的鍛煉和考驗,是培養(yǎng)信息人才的一次良好的機會,為其提供了一個理論知識與實踐相結(jié)合的平臺。通過本次課程設(shè)計,引導(dǎo)學(xué)生結(jié)合所學(xué)的電路理論和程序設(shè)計的知識,思考設(shè)計方案,以小組合作方式,分工完成各個部分,從而掌握相關(guān)的硬件結(jié)合軟件顯示電路的設(shè)計和調(diào)試技術(shù),一方面提高了學(xué)生的實踐動手和協(xié)作能力,另一方面培養(yǎng)了學(xué)生綜合運用所學(xué)理論知識進行工程設(shè)計的能力。1.2方案選擇與DIY電子萬年歷的研究情況方案一:不使用芯片,采用單片機的定時計數(shù)器這種方法原理是利用單片機芯片的定時器來產(chǎn)生固定的時間,模擬時鐘的時,分,秒。如:利用AT80C52芯片,定時器用工作方式1,每50ms產(chǎn)生一個中斷,循環(huán)20次,即1s周期。每一個周期加1,那么1min為60個周期,1h就是60*60=3600個周期,一天就是3600*24=86400個周期。此方法優(yōu)點是可以省去一些外圍的芯片,但這種方法只能適用于一些要求不是十分精確,不做長期保留的場合。方案二:并行接口時鐘芯片DS12887特點:采用單片機應(yīng)用系統(tǒng)并行總線(三總線)擴展的接口電路,采用這種接口電路具有操作速度快,編程方便的優(yōu)點。但是對于80C52單片機來說,低位地址線要通過鎖存器輸出,還要地址譯碼器,而且并行口芯片的體積相對較大,DS12887管腳圖如圖1所示。圖1DS12887管腳圖方案三:串行接口時鐘芯片DS1302芯片主特性:(1)實時時鐘具有能計算2100年之前的秒分時日日期星期月年的能力,還有閏年調(diào)整的能力?(2)318位暫存數(shù)據(jù)存儲RAM?(3)串行I/O口方式使得管腳數(shù)量最少?(4)寬范圍工作電壓?(5)工作電流2.0V時,小于300nA?(5)讀/寫時鐘或RAM數(shù)據(jù)時有兩種傳送方式單字節(jié)傳送和多字節(jié)傳送字符組方式?(6)8腳DIP封裝或可選的8腳SOIC封裝根據(jù)表面裝配?(7)簡單3線接口?(8)與TTL兼容Vcc=5V?(9)可選工業(yè)級溫度范圍-40+85優(yōu)點:串行接口的日歷時鐘芯片,使用簡單,接口容易,與微型計算機連線較少等特點,在單片機系統(tǒng)尤其是手持式信息設(shè)備中己得到了廣泛的應(yīng)用。所以,最終選擇串行時鐘芯片DS1302,DS1302的管腳圖如圖2所示。圖2DS1302管腳圖方案一:矩陣式鍵盤矩陣式鍵盤電路圖如圖3所示。圖3矩陣式鍵盤行列式鍵盤的原理就是每一行線與每一列線的交叉地方不相通,而是接上一個按鍵,通過按鍵來接通。特點:以省出不少的I/O口資源,程序編寫相對復(fù)雜點,適用于鍵數(shù)比較多的情況。方案二:獨立式鍵盤獨立式鍵盤電路圖如圖4所示。圖4獨立式鍵盤獨立式鍵盤是指各個按鍵相互獨立地連接到各自的單片機的I/O口,I/O口只需要做輸入口就能讀到所有的按鍵。特點:電路簡單,程序容易寫,適用于按鍵數(shù)較少的情況。所以我們選擇獨立式鍵盤。方案一:LED數(shù)碼管顯示數(shù)碼管顯示比較常用的是采用CD4511和74LS138實現(xiàn)數(shù)碼轉(zhuǎn)換,數(shù)碼顯示分動態(tài)顯示和靜態(tài)顯示,靜態(tài)顯示具有鎖存功能,可以使數(shù)據(jù)顯示得很清楚,但浪費了一些資源。目前單片機數(shù)碼管普通采用動態(tài)顯示。編程簡單,但只能顯示數(shù)字,不能顯示中文。方案二:LCD1602能夠顯示英文和數(shù)字。1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號。方案三:LCD12864作為一種輸出方式,液晶顯示最大的特點就是能夠?qū)崿F(xiàn)友好的人機界面,它己經(jīng)廣泛應(yīng)用于現(xiàn)代工業(yè)控制和智能化儀器儀表等領(lǐng)域,它己經(jīng)成為單片機就用開發(fā)領(lǐng)域典型模塊之一。能夠方便的顯示文字和數(shù)字。所以最終選擇LCD12864。1.2.4DIY萬年歷的研究情況目前電子愛好者,所設(shè)計的萬年歷大部分都采用LCD1602或數(shù)碼管顯示,只能顯示陽歷,不能帶顯示陰歷,而且沒有陰歷相對應(yīng)的的天干地支,和生肖年,沒有達到多功能的效果。我們采用LCD12864顯示,通過算法實現(xiàn),能正確顯示陰歷,具有友好的界面,為了追求時間的準(zhǔn)確,我們采用芯片DS1302,通過單片機控制,讀出時間顯示在LCD上。我們除了用芯片DS18B20,通過程序控制,把溫度也顯示出來外還通過算法控制,把陰歷相對應(yīng)的天干地支,和生肖年也顯示出來,達到多功能效果。2主要硬件描述2.189C52模塊Mcs-51單片機管腳圖圖如圖5所示。圖5單片機管腳圖(1)一個8位的微處理器(CPU)(2)片內(nèi)數(shù)據(jù)存儲器RAM(128B/256B)(3)片內(nèi)程序存儲器ROM/EPROM(4kB/8kB)(4)4個8位并行I/O拉口P0-P3,每個口既可以作輸入,也可以作輸出(5)2個16位定時器/計數(shù)器(6)5個中斷源的中斷控制系統(tǒng)(7)1個全雙工的串行I/O接口(8)片內(nèi)時鐘振蕩器2.2顯示模塊LCM12864我們采用FG12864J顯示模塊,如圖6所示,它是一種圖形點陣液晶顯示器。它主要采用動態(tài)驅(qū)動原理由行驅(qū)動—控制器和列驅(qū)動器兩部分組成了128(列)×64(行)的全點陣液晶顯示。(1)工作電壓為+5V±10%,可自帶驅(qū)動LCD所需的負(fù)電壓(2)全屏幕點陣,點陣數(shù)為128(列)×64(行),可顯示8(/行)×4(行)個(16×16點陣)漢字,也可完成圖形,字符的顯示(3)與CPU接口采用5條位控制總線和8位并行數(shù)據(jù)總線輸入輸出,適配M6800系列時序(4)內(nèi)部有顯示數(shù)據(jù)鎖存器(5)簡單的操作指令顯示開關(guān)設(shè)置,顯示起始行設(shè)置,地址指針設(shè)置和數(shù)據(jù)讀/寫等指令圖6FG12864J顯示模塊2.3芯片DS1302簡介DS1302是DALLAS公司推出的涓流充電時鐘芯片內(nèi)含有一個實時時鐘/日歷和31字節(jié)靜態(tài)RAM通過簡單的串行接口與單片機進行通信實時時鐘/日歷電路提供秒分時日日期月年的信息每月的天數(shù)和閏年的天數(shù)可自動調(diào)整時鐘操作可通過AM/PM指示決定采用24或12小時格式。DS1302與單片機之間能簡單地采用同步串行的方式進行通信僅需用到三個口線1RES復(fù)位2I/O數(shù)據(jù)線3SCLK串行時鐘時鐘/RAM的讀/寫數(shù)據(jù)以一個字節(jié)或多達31個字節(jié)的字符組方式通信DS1302工作時功耗很低保持?jǐn)?shù)據(jù)和時鐘信息時功率小于1mW。DS1302的管腳描述如表1所示。表1DS1302管腳X1X2晶振管腳GND地RST復(fù)位I/O數(shù)據(jù)輸入/輸出引腳SCLK串行時鐘Vcc1Vcc2電源供電管腳2.4芯片DS18B20簡介DS18B20溫度傳感器當(dāng)仁不讓。超小的體積,超低的硬件開消,抗干擾能力強,精度高,附加功能強。對電子愛好者來說,DS18B20是我們開發(fā)溫度相關(guān)的首選小產(chǎn)品。DS18B20引腳功能如表2所示。表2DS18B20引腳功能GND地DQ單數(shù)據(jù)總線VDD電源電壓NC空引腳3硬件設(shè)計與實現(xiàn)該萬年歷以89S52作為控制核心,外接DS18B20溫度傳感器,DS1302時鐘芯片,顯示采用LCM12864,調(diào)表采用矩陣式鍵盤,整體硬件電路的框圖如圖7所示。圖7硬件電路框圖3.1單片機最小系統(tǒng)的設(shè)計AT89S52單片機為40引腳雙列直插芯片,有四個I/O口P0,P1,P2,P3,MCS-51單片機共有4個8位的I/O口(P0、P1、P2、P3),每一條I/O線都能獨立地作輸出或輸入。單片機的最小系統(tǒng)如圖8所示,18引腳和19引腳接時鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出。第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端。圖8單片機最小系統(tǒng)3.2時鐘電路的設(shè)計本系統(tǒng)采用有DS1302串行時鐘芯片作為主時鐘電路,該電路使用單獨的的晶振和單獨的電源供電,減小主控的負(fù)擔(dān)。電路圖如圖9所示。圖9時鐘電路溫度采集模塊的設(shè)計采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測量精度高,電路連接簡單特點,此類傳感器僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,使用P0.7與DS18B20的I/O口連接加一個上拉電阻,Vcc接電源,Vss接地。電路圖如圖10所示。圖10溫度采集電路3.4人機交互模塊設(shè)計該系統(tǒng)輸入模塊采用獨立式式鍵盤輸入,顯示模塊采用LCM12864,很好的實現(xiàn)了人機交互,液晶與主控制器的接口如圖11所示。圖11液晶接口電路4系統(tǒng)軟件設(shè)計與實現(xiàn)4.1主要算法流程圖描述以80C52為核心,處理外轉(zhuǎn)電路傳進來的信號,實現(xiàn)時鐘數(shù)據(jù)的讀取,保存,顯示其及鍵盤操作。流程圖如圖12所示。圖12主程序流程圖陽歷和時分秒都是通過DS1302讀出來的,經(jīng)過主控的轉(zhuǎn)換和處理最終顯示在LCM12864上,該程序流程圖如圖13所示。圖13計算陽歷和時分秒流程圖陰歷是通過一種算法轉(zhuǎn)換過來,首先得到陽歷值,然后根據(jù)這種算法把陽歷轉(zhuǎn)換成陰歷,最終顯示在LCM12864模塊上,該程序流程圖如圖14所示。圖14計算陰歷程序流程圖時間調(diào)整是通過四個獨立按鍵來調(diào)整時間值,時間調(diào)整流程圖如圖15所示。圖15時間調(diào)整程序流程圖星期的計算方法如下:星期=(日期年份+所過閏年數(shù)+月校正數(shù))%7,如果是在閏年又不到3月份上述之和要減一天再除7,其1到12月的校正數(shù)據(jù)為[622503514624],該程序中采用1個字節(jié)表示年份閏年數(shù)也只計算1900年以后的閏年數(shù)。該程序的流程圖如圖16所示。圖16計算星期算法4.2LCM16824子程序的實現(xiàn)LCM12864的讀寫時序如圖17所示。圖17LCM12864讀寫時序主要函數(shù)模塊:函數(shù):voidlcd_init(void)顯示初始化程序函數(shù):VoidGUI_init()該函數(shù)用于初始化顯示界面,把一些固定不需要刷新的文字固定下來函數(shù):voidlw(ucharx,uchary,uchardd)用來寫數(shù)據(jù)的子程序函數(shù):voiddisplay(ucharxx,ucharyy,ucharn,ucharfb,ucharhz[])用于顯示漢字,每個漢字為16*16的點陣函數(shù):voidshownum(ucharxx,ucharyy,ucharn,ucharfb,ucharnum[])用于顯示數(shù)字,每個數(shù)字為8*16的點陣4.3DS1302子程序的實現(xiàn)DS1302的讀寫時序如圖18所示。圖18DS1302讀寫時序定義結(jié)構(gòu)體數(shù)組SYSTEMTIME的時間類型,結(jié)構(gòu)體數(shù)組如下:typedefstruct__SYSTEMTIME__{ unsignedcharSecond; unsignedcharMinute; unsignedcharHour; unsignedcharWeek; unsignedcharDay; unsignedcharMonth; unsignedcharYear;}SYSTEMTIME主要函數(shù)模塊:函數(shù):voidInitial_DS1302(void)描述:時鐘芯片初始化函數(shù):voidWrite1302(unsignedcharucAddr,unsignedcharucDa)描述:把某個數(shù)據(jù)寫進某個地址函數(shù):unsignedcharRead1302(unsignedcharucAddr)描述:從芯片內(nèi)某地址讀取數(shù)據(jù)函數(shù):voidDS1302_GetTime(SYSTEMTIME*Time)描述:獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組函數(shù):voidDS1302InputByte(unsignedchard)描述:往時鐘寫入一字節(jié)函數(shù):unsignedcharDS1302OutputByte(void)描述:從時間內(nèi)讀取一個字節(jié)4.4DS18B20子程序的實現(xiàn)DS18B20的讀寫時序如圖19所示。圖19DS18B20讀寫時序簡易的程序流程圖如圖20所示。圖20DS18B20讀寫程序流程圖主要函數(shù)描述:函數(shù):voidInit_DS18B20(void)描述:單總線傳輸初始化函數(shù).函數(shù):voidWriteOneChar(uchardat)描述:往芯片內(nèi)部地址寫入一個字節(jié),有寫數(shù)據(jù)和寫指令之分.函數(shù):voidReadTemp(void)描述:讀取芯片的溫度.函數(shù):voiddelay_18B20(unsignedinti)描述:延時函數(shù)4.5鍵盤子程序的實現(xiàn)鍵盤示意圖如圖21所示。圖21按鍵示意圖主要函數(shù)模塊:函數(shù)名:voidkey_count()功能描述:設(shè)置狀態(tài)轉(zhuǎn)換函數(shù),根據(jù)變量count的不同值,對應(yīng)不同的設(shè)置狀態(tài)按下設(shè)置鍵,自動切換設(shè)置位函數(shù)名:voidkey_out()功能描述:跳出設(shè)置模式函數(shù)名:ucharkey_up(inttemp,intmax,intmin)功能描述:按鍵加函數(shù),在最大值與最小值之間變化函數(shù)名:ucharkey_down(inttemp,intmax,intmin)功能描述:按鍵減函數(shù),在最大值與最小值之間變化函數(shù)名:voidset_year();voidset_month();voidset_day();voidset_hour();voidset_minute();功能描述:分別是用來設(shè)置年月日時分秒函數(shù)名:voidkey_al01() 功能描述:設(shè)置定時報警功能4.6主程序的實現(xiàn)主要函數(shù)模塊:函數(shù)名:Init_GUI()功能描述:進行界面初始化,例如固定的年、星期、農(nóng)歷函數(shù)名:voidShow_NL() 功能描述:根據(jù)算法,得出陰歷,包括天干地支月日函數(shù)名:voidShow_YL()功能描述:根據(jù)算法,從時鐘芯片讀出陽歷數(shù)據(jù),顯示出來函數(shù)名:LCD_ShowWNL()功能描述:根據(jù)算法,顯示電子萬年歷,其中時鐘的”秒”位為每次循環(huán)刷新一次,”分”為在普通模式時每分鐘刷新一次,在設(shè)置模式時每次循環(huán)刷新一次,”時”為在普通模式時每小時刷新一次,在設(shè)置模式時每次循環(huán)刷新一次,公歷農(nóng)歷的年、月、日、星期、溫度,設(shè)置模式每次循環(huán)刷新一次函數(shù)名:voidLCD_showalarm()功能描述:顯示定時報警的時間函數(shù)名:voidmian()功能描述:.顯示萬年歷,循環(huán)讀取時間,并通過程序進行鍵盤檢測5測試結(jié)果分析與結(jié)果5.1測試結(jié)果分析(1)在測試中遇到LEDLCD16824不顯示分析:首先使用試測儀對電路進行測試,觀察是否存在漏焊,虛焊,或者元件損壞。再接著研究程序的時序圖是否正確。最后發(fā)現(xiàn)程序時序方面出了點小錯。修改后就把問題解決了(2)測試中遇到調(diào)時間調(diào)到2079年后跳到2000年分析:認(rèn)真研究時鐘芯片的Datasheet發(fā)現(xiàn),對年的讀取,讀出后是BCD碼轉(zhuǎn)換成十制顯示時算法不正確(3)按鍵調(diào)整時,不是按單位遞增和遞減分析:在鍵盤程序中,按鍵一次,向芯片寫入一個新的數(shù)字,在寫入數(shù)字后必須有一定延時才再寫入另一個數(shù)字(4)燒寫程序進單片機里面時,有時會在顯示屏上顯示爛碼.分析:用電壓表檢查.最后檢測出USB下載線的端口電壓不夠換條新線就可以把問題解決5.2測試總結(jié)經(jīng)過多次的反復(fù)測試與分析,掌握了硬件的設(shè)計與分析的能力,學(xué)會看英文版的Datasheet,同時在軟件的編程方面得到更到的提高,對編程能力得到加強。對所學(xué)的知識得到很大的提高與鞏固。最終實現(xiàn)功能:(1)能顯示陽歷年、月、日、星期、小時、分、秒(2)顯示模塊采用LCD液晶顯示,要求能用按鍵調(diào)整時間。(3)能顯示陰歷月、日,在顯示陰歷時間時能標(biāo)明是否為閏年。(4)具有定時報警功能,能夠進行整點和半點語音報時。(5)能夠準(zhǔn)確在LCD上顯示室。(6)在顯示農(nóng)歷時通過算法能夠把天干地去也顯示出來。結(jié)束語通過對基于單片機的萬年歷的研究和設(shè)計,完成了一種能夠顯示陽歷、陰歷、星期、時間、實時溫度、天干地支的多功能萬年歷,該萬年歷還可以定時報警和進行進行整點和半點報時。本系統(tǒng)設(shè)計從開始到完成包括文檔的編寫總共花了一個月左右的時間,設(shè)計的難點在于星期和天干地支的計算方法,還有單片機和各個芯片之間的通信協(xié)議,液晶的讀寫時序,按鍵的防抖。本系統(tǒng)基本完成了設(shè)計指標(biāo)的所有要求,所有的程序分塊編寫,通過main函數(shù)來調(diào)用,增加了程序的易修改性和易讀性,方便他人的使用和改進。但是由于時間的局限性以及本人能力的有限性,本系統(tǒng)還有許多需要改進和完善的地方。其中主要的問題就是功耗和電源供電的問題,該處采用5V供電,最好采用3V供電。整個電路的功耗太大,沒讓單片機工作在空閑模式,這都是作品不實用,不能夠大批量生產(chǎn),這都有待改進,希望以后有機會對該系統(tǒng)做進一步的完善。致謝在本次設(shè)計中,我想首先感謝孫老師、宋老師,從設(shè)計的開始到完成,給了我很多指導(dǎo)性的意見,不斷幫助我完善系統(tǒng)設(shè)計。從大一開始,趙老師作為我的導(dǎo)師,一直很注重我們動手能力的培養(yǎng)。她豐富的教學(xué)及實際操作經(jīng)驗、嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度,以及和藹的態(tài)度,使得我投入了大量時間在創(chuàng)新基地的實驗室中,做了許多實驗。而這,對我的幫助和影響是非常巨大的。正是因為有了這些鍛煉的機會,我才能非常順利地完成我的畢業(yè)設(shè)計。最后非常感謝鄭州鐵路職業(yè)技術(shù)學(xué)院信息工程系的老師和同學(xué),是他們讓我學(xué)會了如何學(xué)習(xí),更學(xué)會了如何做人,這將是我終身受益的寶貴財富參考文獻[1]周興華編著.手把手教你學(xué)單片機C程序設(shè)計.北京:北京航空航天大學(xué)出版社,2007[2]侯玉寶編著.基于Proteus的51系列單片機設(shè)計與仿真.北京:電子工業(yè)出版社,2008[3]張義和編著.例說51單片機(C語言).北京:人民郵電出版社.2008[4]李朝青編著.單片機原理及接口技術(shù).北京:北京航空航天大學(xué)出版社,2005[5]周慈航編著.單片機應(yīng)用程序設(shè)計基礎(chǔ).北京:北京航空航天大學(xué)出版社,1991[6]馬忠梅編著.單片機的C語言應(yīng)用程序設(shè)計.北京:北京航空航天大學(xué)出版社,2003[7]李廣弟編著.單片機基礎(chǔ).北京:北京航空航天大學(xué)出版社,1994[8]曾巧媛編著.單片機原理及應(yīng)用.北京:電子工業(yè)出版社,1997[9]邱麗芳編著.單片機原理與應(yīng)用.人民郵電出版社,2007[10]何立民編著.MCS-51系列單片機應(yīng)用系統(tǒng)設(shè)計.北京航空航天大學(xué)出版社,2003附錄二原理圖附錄三部分程序主程序#include<reg51.h>#include<DS1302.c> //更改管腳#include<DS18B20.c>#include<zimo.c>#include<lcd12864.c>#include<key.c>#include<beep.c>#include<lunar.c>#defineucharunsignedchar#defineuintunsignedintSYSTEMTIMEsys;ucharc_sun,year_sun,month_sun,day_sun;ucharyear_moon,month_moon,day_moon,week;ucharalarm=0,al_hour=0,al_min=0;Init_GUI(){ lcd_init(); Init_DS18B20(); Initial_DS1302(); delay(10); jiemian(); //顯示初始化界面,例如固定的年、星期、農(nóng)歷……放在1里 } voidShow_NL(){ DS1302_GetTime(&sys); year_sun=Read1302(DS1302_YEAR); month_sun=Read1302(DS1302_MONTH); day_sun=Read1302(DS1302_DAY); Conversion(0,year_sun,month_sun,day_sun); /* day_moon=((day_moon&0x70)>>4)*10+(day_moon&0x0F); month_moon=((month_moon&0x70)>>4)*10+(month_moon&0x0F); year_moon=((year_moon&0xF0)>>4)*10+(year_moon&0x0F); */ if(month_moon==1)display(8,4,12,0,ch1616); //顯示“正” elsedisplay(8,4,month_moon-1,0,ch1616); //顯示當(dāng)前農(nóng)歷的月 if(day_moon<11)display(12,4,13,0,ch1616); //顯示“初” if(day_moon<20&&day_moon>10)display(12,4,9,0,ch1616); //顯示“十” if(day_moon<30&&day_moon>19)display(12,4,14,0,ch1616); //顯示“廿” if(day_moon>29)display(12,4,2,0,ch1616); //顯示“三” display(14,4,(day_moon-1)%10,0,ch1616); //顯示農(nóng)歷個位 display(14,2,year_moon%12,0,shengxiao); //顯示生肖 display(9,2,year_moon%10,0,tiangan); //顯示天干 display(11,2,year_moon%12,0,dizhi); //顯示地支 Conver_week(0,year_sun,month_sun,day_sun); //星期 if(week==0)display(5,4,17,0,ch1616); //顯示星期日 elsedisplay(5,4,week-1,0,ch1616); //顯示星期1~6} voidShow_YL() //顯示陽歷{ DS1302_GetTime(&sys); shownum(6,6,sys.Second/10,0,num); //顯示秒 shownum(7,6,sys.Second%10,0,num); shownum(3,6,sys.Minute/10,0,num); //顯示分 shownum(4,6,sys.Minute%10,0,num); shownum(0,6,sys.Hour/10,0,num); //顯示時 shownum(1,6,sys.Hour%10,0,num); shownum(4,2,sys.Day/10,0,num); //顯示日 shownum(5,2,sys.Day%10,0,num); shownum(0,2,sys.Month/10,0,num); //顯示月 shownum(1,2,sys.Month%10,0,num); shownum(3,0,sys.Year/10,0,num); //顯示年 shownum(4,0,sys.Year%10,0,num); if((!(sys.Year%4)&&(sys.Year%100))||!(sys.Year%400))display(8,0,24,0,ch1616); //顯示平閏年 else display(8,0,23,0,ch1616); //平閏年計算 if(sys.Minute==30&&sys.Second==0)Beep_Half(); //報時 if(sys.Minute==0&&sys.Second==0)Beep_Hour(); }voidLCD_ShowWNL(){ DS1302_GetTime(&sys); shownum(6,6,sys.Second/10,0,num); shownum(7,6,sys.Second%10,0,num); //秒每次循環(huán)鐘刷新一次 if(!sys.Second) //分在普通模式時每分鐘刷新一次,在設(shè)置模式時每次循環(huán)刷新一次 { shownum(3,6,sys.Minute/10,0,num); shownum(4,6,sys.Minute%10,0,num); } if(!sys.Second&&!sys.Minute) //時在普通模式時每小時刷新一次,在設(shè)置模式時每次循環(huán)刷新一次 { shownum(0,6,sys.Hour/10,0,num); shownum(1,6,sys.Hour%10,0,num); } if(!sys.Second&&!sys.Minute&&!sys.Hour) //公歷農(nóng)歷的年、月、日、星期、溫度,設(shè)置模式每次循環(huán)刷新一次 { Show_YL(); //顯示農(nóng)歷 Show_NL(); //顯示新歷 diswendu(); //顯示溫度 } if(sys.Minute==30&&sys.Second==0)Beep_Half(); //報時 if(sys.Minute==0&&sys.Second==0)Beep_Hour(); } voidLCD_showalarm(){ display(8,6,21-alarm,0,ch1616); shownum(11,6,al_hour/10,0,num); //顯示鬧鈴時 shownum(12,6,al_hour%10,0,num); //顯示鬧鈴時 shownum(14,6,al_min/10,0,num); //顯示鬧鈴分 shownum(15,6,al_min%10,0,num); //顯示鬧鈴分}voidmain(){ Init_GUI(); diswendu(); Show_YL(); Show_NL(); LCD_showalarm();while(1) { LCD_ShowWNL(); if(sys.Second%9==0)diswendu(); key_count(); if(count)key_set(); //判斷set鍵按下,進入設(shè)置界面 if(alarm&&(al_hour==sys.Hour)&&(al_min==sys.Minute)&&!sys.Second) //定時報警功能 { Beep_Half(); DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); Beep_Hour(); DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); Beep_Half(); DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); Beep_Hour(); DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); Beep_Half(); DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); Beep_Hour(); DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); } }}DS1302程序#defineuintunsignedint#defineucharunsignedchar#include<intrins.h>sbitDS1302_CLK=P1^2;//實時時鐘時鐘線引腳sbitDS1302_IO=P1^1;//實時時鐘數(shù)據(jù)線引腳sbitDS1302_RST=P1^0;//實時時鐘復(fù)位線引腳sbitACC0=ACC^0;sbitACC7=ACC^7;typedefstruct__SYSTEMTIME__{ unsignedcharSecond; unsignedcharMinute; unsignedcharHour; unsignedcharWeek; unsignedcharDay; unsignedcharMonth; unsignedcharYear;}SYSTEMTIME; //定義的時間類型SYSTEMTIMEsys;#defineAM(X) X#definePM(X) (X+12) //轉(zhuǎn)成24小時制#defineDS1302_SECOND 0x80//時鐘芯片的寄存器位置,存放時間#defineDS1302_MINUTE 0x82#defineDS1302_HOUR 0x84#defineDS1302_WEEK 0x8A#defineDS1302_DAY 0x86#defineDS1302_MONTH 0x88#defineDS1302_YEAR 0x8CvoidDS1302InputByte(unsignedchard) //實時時鐘寫入一字節(jié)(內(nèi)部函數(shù)){unsignedchari;ACC=d;for(i=8;i>0;i--){DS1302_IO=ACC0; //相當(dāng)于匯編中的RRCDS1302_CLK=1;DS1302_CLK=0;ACC=ACC>>1;}}unsignedcharDS1302OutputByte(void) //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù)){unsignedchari;for(i=8;i>0;i--){ACC=ACC>>1; //相當(dāng)于匯編中的RRCACC7=DS1302_IO;DS1302_CLK=1;DS1302_CLK=0;}return(ACC);}voidWrite1302(unsignedcharucAddr,unsignedcharucDa) //ucAddr:DS1302地址,ucData:要寫的數(shù)據(jù){DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr); //地址,命令DS1302InputByte(ucDa); //寫1Byte數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;}unsignedcharRead1302(unsignedcharucAddr) //讀取DS1302某地址的數(shù)據(jù){unsignedcharucData;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=1;DS1302InputByte(ucAddr|0x01);//地址,命令ucData=DS1302OutputByte();//讀1Byte數(shù)據(jù)DS1302_CLK=1;DS1302_RST=0;return(ucData);}voidDS1302_GetTime(SYSTEMTIME*Time)//獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組{ unsignedcharReadValue; ReadValue=Read1302(DS1302_SECOND); Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_MINUTE); Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_HOUR); Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_DAY); Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_WEEK); Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_MONTH); Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); ReadValue=Read1302(DS1302_YEAR); Time->Year=((ReadValue&0xf0)>>4)*10+(ReadValue&0x0F); } voidInitial_DS1302(void)//時鐘芯片初始化{ unsignedcharSecond=Read1302(DS1302_SECOND); if(Second&0x80) //判斷時鐘芯片是否關(guān)閉 { Write1302(0x8e,0x00); //寫入允許 _nop_();_nop_();_nop_(); Write1302(0x8c,0x09); //寫入年 _nop_();_nop_();_nop_(); Write1302(0x88,0x05); //寫入月 Write1302(0x86,0x05); //寫入日 Write1302(0x8a,0x02); //星期 Write1302(0x84,0x23); //時 Write1302(0x82,0x59); //寫入分 Write1302(0x80,0x30); //寫入秒 Write1302(0x90,0xae); //開啟充電 _nop_();_nop_();_nop_(); Write1302(0x8e,0x80); //禁止寫入 }}LCD12864程序#include<REG51.H> #defineucharunsignedchar #defineuintunsignedintsbitCS1=P1^4; sbitCS2=P1^5;sbitRS=P0^5; sbitRW=P0^6; sbitEN=P0^7; sbitRST=P1^6; #defineDataPortP3voiddelay(unsignedlongv){ while(v!=0)v--; } voidlcd_busy(void){ RS=0;RW=1;DataPort=0xff; while(1) { EN=1; if(DataPort<0x80)break; EN=0; } EN=0; }voidwcode(ucharc,ucharcsl,ucharcsr){ CS1=csl; CS2=csr; lcd_busy(); RS=0; RW=0; DataPort=c; EN=1; EN=0; } voidwdata(ucharc,ucharcsl,ucharcsr){ CS1=csl; CS2=csr; lcd_busy(); RS=1; RW=0; DataPort=c; EN=1;

溫馨提示

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

最新文檔

評論

0/150

提交評論