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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

評論

0/150

提交評論