電子萬年歷設(shè)計畢業(yè)設(shè)計
《電子萬年歷設(shè)計畢業(yè)設(shè)計》由會員分享,可在線閱讀,更多相關(guān)《電子萬年歷設(shè)計畢業(yè)設(shè)計(32頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 河南理工大學(xué)成人教育學(xué)院鄭煤機函授站 畢業(yè)設(shè)計(論文) 題 目 電子萬年歷設(shè)計 學(xué)生姓名: 學(xué) 號:411119302006 系 (部):鄭煤機函授站 專 業(yè):機電一體化 指導(dǎo)教師: 2013年11月14日 摘要 隨著科技的快速發(fā)展,時間的流逝,至從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀(jì)錄。美國DALLAS公司推出的具有涓細(xì)電流充電能的低功耗實時時鐘電路D
2、S1302。它可以對年、月、日、周日、時、分、秒進(jìn)行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小。對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準(zhǔn)等功能。該電路采用AT89S52單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。 綜上所述此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。 本設(shè)計是基于51系列的單片機進(jìn)行的電子萬年歷設(shè)計,可以顯示年月日時分秒及周信息,具有可調(diào)整日期和時間功能。在設(shè)計的同時對單片機的
3、理論基礎(chǔ)和外圍擴展知識進(jìn)行了比較全面準(zhǔn)備。在硬件與軟件設(shè)計時,沒有良好的基礎(chǔ)知識和實踐經(jīng)驗會受到很大限制,每項功能實現(xiàn)時需要那種硬件,程序該如何編寫,算法如何實現(xiàn)等,沒有一定的基礎(chǔ)就不可能很好的實現(xiàn)。 具體實現(xiàn)功能: (1) 顯示年月日時分秒及星期信息 (2) 具有可調(diào)整日期和時間功能 (3) 與即時時間同步 目 錄 1方案論證..........................................................3 1.1單片機芯片的選擇方案和論證.................
4、..................3 1.2顯示模塊選擇方案和論證.......................................3 1.3時鐘芯片的選擇方案和論證.....................................3 1.4電路設(shè)計最終方案決定.........................................4 2系統(tǒng)的硬件設(shè)計與實現(xiàn)..............................................5 2.1電路設(shè)計框圖..........................................
5、.......5 2.2系統(tǒng)硬件概述.................................................5 2.3主要單元電路的設(shè)計...........................................5 2.3.1單片機主控制模塊的設(shè)計.....................................5 2.3.2時鐘電路模塊的設(shè)計........................................ 6 2.3.3電路原理及說明.............................................
6、7 2.3.4顯示模塊的設(shè)計.............................................8 3系統(tǒng)的軟件設(shè)計....................................................9 3.1程序流程框圖.................................................9 4測試與結(jié)果分析...................................................11 4.1硬件測試...........................................
7、.........11 4.2軟件測試....................................................11 4.3測試結(jié)果分析與結(jié)論..........................................11 4.3.1 測試結(jié)果分析..............................................11 4.3.2 測試結(jié)論..................................................11 5 proteus軟件仿真...........................
8、.......................12 5.1Proteus ISIS簡介.............................................12 5.2Proteus運行流程..............................................13 5.3Proteus功能仿真..............................................13 6課程設(shè)計總結(jié)與致謝...............................................16 參考文獻(xiàn)..............
9、.............................................17 附錄一:系統(tǒng)電路圖.................................................18 附錄二:系統(tǒng)程序...................................................19 1 方案論證 1.1 單片機芯片的選擇方案和論證 方案一: 采用89C51芯片作為硬件核心,采用Flash ROM,內(nèi)部具有4KB ROM 存儲空間,能于3V的超低壓工作,而且與MCS-51系列單片機完全兼容
10、,但是運用于電路設(shè)計中時由于不具備ISP在線編程技術(shù), 當(dāng)在對電路進(jìn)行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,對芯片的多次拔插會對芯片造成一定的損壞。 方案二: 采用AT89S52,片內(nèi)ROM全都采用Flash ROM;能以3V的超底壓工作;同時也與MCS-51系列單片機完全該芯片內(nèi)部存儲器為8KB ROM 存儲空間,同樣具有89C51的功能,且具有在線編程可擦除技術(shù),當(dāng)在對電路進(jìn)行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,不需要對芯片多次拔插,所以不會對芯片造成損壞,所以選擇采用AT89S52作為主控制系統(tǒng)。 1.2 顯示模塊選擇方案和論證
11、 方案一: 采用LED數(shù)碼管動態(tài)掃描,LED數(shù)碼管價格適中,對于顯示數(shù)字合適,采用動態(tài)掃描法與單片機連接時,雖然占用的單片機口線少,但連線還需要花費一點時間,所以也不用此種作為顯示。 方案二: 采用點陣式數(shù)碼管顯示,點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費,且價格也相對較高,所以也不用此種作為顯示。 方案三: 采用LCD液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字,圖形,顯示多樣,清晰可見,并且我做的最小系統(tǒng)上帶一個TS1620-1,和AT89S52已經(jīng)接好,省了很多麻煩,所以在此設(shè)計中采用LCD液晶
12、顯示屏。 1.3 時鐘芯片的選擇方案和論證 方案一: 直接采用單片機定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實現(xiàn)的時間誤差較大,所以不采用此方案。 方案二: 采用DS1302時鐘芯片實現(xiàn)時鐘,DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年進(jìn)行計數(shù),而且精度高,位的RAM做為數(shù)據(jù)暫存區(qū),工作電壓2.5V~5.5V范圍內(nèi),2.5V時耗電小于300nA。 1.4 電路設(shè)計最終方案決定 綜上各方案所述,對此次作品的方案選定: 采用AT89S52作為主控制系統(tǒng); DS13
13、02提供時鐘;LCD液晶顯示屏作為顯示。 2 系統(tǒng)的硬件設(shè)計與實現(xiàn) 2.1 電路設(shè)計框圖 LCD液晶顯示屏顯示模塊 AT89S52 主控制模 塊 鍵盤模塊 DS1302時鐘模塊 圖1系統(tǒng)原理圖 2.2 系統(tǒng)硬件概述 本電路是由AT89S52單片機為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時鐘電路由DS1302提供,它是一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進(jìn)行計時,具有閏年補償功能,工作電壓為
14、2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31*8的用于臨時性存放數(shù)據(jù)的RAM寄存器??僧a(chǎn)生年、月、日、周日、時、分、秒,具有使用壽命長,精度高和低功耗等特點,同時具有掉電自動保存功能;溫度的采集由DS18B20構(gòu)成;顯示部份由LCD液晶顯示屏顯示。 2.3 主要單元電路的設(shè)計 2.3.1 單片機主控制模塊的設(shè)計 AT89S52單片機為40引腳雙列直插芯片,有四個I/O口P0,P1,P2,P3, MCS-51單片機共有4個8位的I/O口(P0、P1、P2、P3),每一條I/O線都能獨立地作輸
15、出或輸入。 單片機的最小系統(tǒng)如下圖所示,18引腳和19引腳接時鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出。第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端。 如圖2 所示: 圖2 主控制系統(tǒng) 2.3.2 時鐘電路模塊的設(shè)計 圖.3示出DS1302的引腳排列,其中Vcc1為后備電源,Vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1
16、+0.2V時,Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768KHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進(jìn)行操作。如果在傳送過程中RSTS置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電動行時,在Vcc大于等于2.5V之前,RST必須保持低電平。中有在SCLK 為低電平時,才能將R
17、ST置為高電平,I/O為串行數(shù)據(jù)輸入端(雙向)。SCLK始終是輸入端。 圖3 DS1302的引腳圖 2.3.3 電路原理及說明 (1) 時鐘芯片DS1302的工作原理: DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置 “0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時序如下圖4所示。DS1302的控制字的位7必須置1,若為0則不能把對DS1302進(jìn)行讀寫數(shù)據(jù)。對于位6,若對程序進(jìn)行讀/寫時RAM=1,對時間進(jìn)行讀/寫時,CK=0,位1至位5指操作單元的地址。位0是讀/寫操作位,進(jìn)行讀操作時,該位為1;該位為0則
18、表示進(jìn)行的是寫操作??刂谱止?jié)總是從最低位開始輸入/輸出的。表.2為DS1302的日歷、時間寄存器內(nèi)容:“CH”是時鐘暫停標(biāo)志位,當(dāng)該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時,時鐘開始運行?!癢P”是寫保護(hù)位,在任何的對時鐘和RAM的寫操作之前,WP必須為0。當(dāng)“WP”為1時,寫保護(hù)位防止對任一寄存器的寫操作。 (2) DS1302的控制字節(jié): DS1302控制字節(jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫操
19、作,為1表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出 (3) 數(shù)據(jù)輸入輸出(I/O) 在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。 (4) DS1302的寄存器 DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式。 此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS
20、1302與RAM相關(guān)的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。 2.3.4 顯示模塊的設(shè)計 如圖.4為LCD顯示模塊,和最小系統(tǒng)上的連線一樣,無需修改。 圖4 LCD液晶顯示屏顯示模塊 3 系統(tǒng)的軟件設(shè)計 3.1 程序流程框圖 開始 初始化 讀日期、時間 寫日期、時間 顯示子程序 時間修改子程
21、序 日期修改子程序 顯示結(jié)果 返回 開關(guān)控制子程序 圖5主程序流程圖 圖6 時間調(diào)整程序流程圖 4 測試與結(jié)果分析 4.1 硬件測試 電子萬年歷的電路系統(tǒng)較大,對于焊接方面更是不可輕視,龐大的電路系統(tǒng)中只要出于一處的錯誤,則會對檢測造成很大的不便,而且電路的交線較多,對于各種鋒利的引腳要注意處理,否則會刺被帶有包皮的導(dǎo)線,則會對電路造成短路現(xiàn)象。 在本成電子萬年歷的設(shè)計調(diào)試中遇到了很多的問題?;叵脒@些問題只要認(rèn)真多思考都是可以避免的,以下為主要的問題: (1)LCD液晶顯示屏顯示
22、部分已經(jīng)連在最小系統(tǒng)上,節(jié)省了不少時間和精力。 (2)對萬年歷修改時間或日期時,有時LCD液晶顯示屏被屏蔽掉,造成不亮現(xiàn)象。 解決:根據(jù)儀器的測試,發(fā)現(xiàn)電路的驅(qū)動能力不足,最后在DS1302時鐘芯片的/CS、SCLK、RET端接入5.1K的上拉電阻后,電路的驅(qū)動能力才能滿足,即可解決不亮現(xiàn)象。 4.2 軟件測試 電子成年歷是多功能的數(shù)字型,可以看當(dāng)前日期,時間。電子成年歷功能很多,所以對于它的程序也較為復(fù)雜,所以在編寫程序和調(diào)試時出現(xiàn)了相對較多的問題。最后經(jīng)過多次的模塊子程序的修改,一步一步的完成,最終解決了軟件。在軟件的調(diào)試過程中遇到的主要問題是: 燒入程序后,LCD液晶顯示屏顯
23、示亮度不好。 解決:一遍旋轉(zhuǎn)10K歐的滑動變阻器,一遍觀看LCD顯示屏,知道看到合適的亮度為止。 4.3 測試結(jié)果分析與結(jié)論 4.3.1 測試結(jié)果分析 1.在測試中遇到LCD液晶顯示屏為不顯示時,首先使用試測儀對電路進(jìn)行測試,觀察是否存在漏焊,虛焊,或者元件損壞,滑動變阻器器沒有調(diào)好:查看燒寫的程序是否正確無誤,對程序進(jìn)行認(rèn)真修改。 4.3.2 測試結(jié)論 經(jīng)過多次的反復(fù)測試與分析,可以對電路的原理及功能更加熟悉,同時提高了設(shè)計能力與及對電路的分析能力。同時在軟件的編程方面得到更到的提高,對編程能力得到加強,同時對所學(xué)的知識得到很大的提高與鞏固。
24、 5 Proteus軟件仿真 5.1Proteus ISIS簡介 Proteus ISIS是英國Labcenter公司開發(fā)的電路分析與實物仿真軟件。它運行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路。 該軟件的特點是: (1)全部滿足我們提出的單片機軟件仿真系統(tǒng)的標(biāo)準(zhǔn),并在同類產(chǎn)品中具有明顯的優(yōu)勢。 (2)具有模擬電路仿真、數(shù)字電路仿真、單片機及其外圍電路組成的系統(tǒng)的仿真、RS-232動態(tài)仿真、I2 C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發(fā)生器等。 (3)目前支持的單片機類型有:ARM7系
25、列、68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。 (4)支持大量的存儲器和外圍芯片。 總之,該軟件是一款集單片機和SPICE分析于一身的仿真軟件,功能極其強大 ,可仿真ARM、51、AVR、PIC。 Proteus啟動畫面: 圖7 Proteus啟動畫面 5.2Proteus運行流程 Proteus ISIS的工作界面是一種標(biāo)準(zhǔn)的Windows界面,如圖所示。 包括:標(biāo)題欄、主菜單、標(biāo)準(zhǔn)工具欄、繪圖工具欄、狀態(tài)欄、對象選擇按鈕、預(yù)覽對象方位控制按鈕、仿真進(jìn)程控制按鈕、預(yù)覽窗口、對象選擇器窗
26、口、圖形編輯窗口。 運行Proteus程序后,進(jìn)入軟件的主界面。通過左側(cè)工具欄中的P(從庫中選擇元件命令)命令,在Pick Devices 左側(cè)窗口中選擇所需元件的關(guān)鍵字,然后放置元件并調(diào)整方向和位置以及參數(shù)設(shè)置,最后進(jìn)行連線。 Proteus ISIS的工作界面: 圖8 Proteus ISIS的工作界面 5.3Proteus功能仿真 Proteus仿真效果 最后載入hex文件后可以進(jìn)行模擬仿真,可以全速運行也可以單步調(diào)試運行。 圖9運行按鍵 上電后后LED顯示: 圖10 調(diào)節(jié)秒鐘: 圖11 調(diào)節(jié)分鐘:
27、 圖12 調(diào)節(jié)時鐘: 圖13 調(diào)節(jié)星期: 圖14 調(diào)節(jié)日期: 圖15 調(diào)節(jié)月份: 圖16 調(diào)節(jié)年份: 圖17 點擊確定鍵顯示: 圖18 按鍵功能自上而下依次為:選擇修改項鍵、增大鍵、減小鍵、確定鍵。 圖19 6課程設(shè)計總結(jié)與致謝 制作這次課程設(shè)計一切都是從零開始,從最簡單的畫流程圖起步,這次課程設(shè)計可以圓滿完成,跟單片機課程里面的課外作業(yè)是離不開的。這次課程設(shè)計從開始到制作成功前后超過了一個星期。當(dāng)電子萬年歷可以成功實現(xiàn)時,那
28、種激動和喜悅只有自己可以體會。 在整個設(shè)計過程中,充分發(fā)揮人的主觀能動性,自主學(xué)習(xí),學(xué)到了許多沒學(xué)到的知識。較好的完成了設(shè)計,達(dá)到了預(yù)期的目的,完了最初的設(shè)想。對電路的設(shè)計、布局要先有一個好的構(gòu)思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經(jīng)過靜下心來思考,和同學(xué)討論,理清了思路,反而得心應(yīng)手。在此次設(shè)計中,知道了做凡事要有一顆平常的心,不要想著走捷徑,一步一腳印。也練就了我的耐心,做什么事都在有耐心。此次課程設(shè)計中學(xué)到了很多很多東西,這是最重要的。總之,此次課設(shè)使我的能力得到了全方位的提高,使得我的操作能力和專業(yè)技能都有了很大的提高。 在做課程設(shè)計的日子
29、里得到了翁嘉民老師的悉心指導(dǎo)和同學(xué)的幫助,在此向他們致以誠摯的謝意。感謝提供相關(guān)技術(shù)幫助的老師和同學(xué),你們的支持和鼓勵使我對這次的設(shè)計完成有了信心和動力,我在此深表謝意。
參考文獻(xiàn)
[1]劉勇 編 數(shù)字電路 電子工業(yè)出版社 2004
[2]陳正振 編 電子電路設(shè)計與制作 廣西交通職業(yè)技術(shù)學(xué)院信息工程系 2007
[3]楊子文 編 單片機原理及應(yīng)用 西安電子科技大學(xué)出版社 2006
[4]王法能 編 單片機原理及應(yīng)用 科學(xué)出版社 2004
附錄一:系統(tǒng)電路圖
附錄二:系統(tǒng)程序
#include 30、trins.h>
//#include "LCD1602.h"
//#include "DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit DS1302_CLK = P1^7; //實時時鐘時鐘線引腳
sbit DS1302_IO = P1^6; //實時時鐘數(shù)據(jù)線引腳
sbit DS1302_RST = P1^5; //實時時鐘復(fù)位線引腳
sbit ACC0 = ACC^0;
sbit ACC7 31、= ACC^7;
char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,時到日,月,年位閃的計數(shù)
sbit Set = P2^0; //模式切換鍵
sbit Up = P2^1; //加法按鈕
sbit Down = P2^2; //減法按鈕
sbit out = P2^3; //立刻跳出調(diào)整模式按鈕
char done,count,temp,flag,up_flag,down_flag;
uchar TempBuffer[5] 32、,week_value[2];
void show_time(); //液晶顯示程序
/***********1602液晶顯示部分子程序****************/
//Port Definitions**********************************************************
sbit LcdRs = P2^5;
sbit LcdRw = P2^6;
sbit LcdEn = P2^7;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口
//內(nèi)部 33、等待函數(shù)
**************************************************************************
unsigned char LCD_Wait(void)
{LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_(); LcdEn=0;return DBPort; }
//向LCD寫入命令或數(shù)據(jù)
************************************************************
#define LCD_COMMAND 0 // Command
34、#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標(biāo)返回原點
void LCD_Write(bit style, unsigned char input)
{LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意順序
LcdEn=1; _nop_();//注意順序
LcdEn=0; _nop_();LCD_Wait();
}
// 35、設(shè)置顯示模式************************************************************
#define LCD_SHOW 0x04 //顯示開
#define LCD_HIDE 0x00 //顯示關(guān)
#define LCD_CURSOR 0x02 //顯示光標(biāo)
#define LCD_NO_CURSOR 0x00 //無光標(biāo)
#define LCD_FLASH 0x01 //光標(biāo)閃動
#define LCD_NO_FLASH 0x00 //光標(biāo)不閃動
void L 36、CD_SetDisplay(unsigned char DisplayMode)
{LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }
//設(shè)置輸入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 畫面可平移
#define LCD_NO_MOVE 0x00 / 37、/default
void LCD_SetInput(unsigned char InputMode)
{LCD_Write(LCD_COMMAND, 0x04|InputMode);}
//初始化LCD************************************************************
void LCD_Initial()
{LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點陣
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDi 38、splay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動}
//液晶字符輸入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{if(y==0)LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)LCD_Write( 39、LCD_COMMAND,0x80|(x-0x40));}
//將字符輸出到液晶顯示
void Print(unsigned char *str)
{while(*str!=\0)
{LCD_Write(LCD_DATA,*str);str++;}}
/***********DS1302時鐘部分子程序******************/
typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week 40、;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[11];
unsigned char TimeString[9];
}SYSTEMTIME; //定義的時間類型
SYSTEMTIME CurrentTime;
#define AM(X) X
#define PM(X) (X+12) // 轉(zhuǎn)成24小時制
#define DS1302_SECOND 0x80 //時鐘芯片的寄存器位置,存放時間
41、
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
void DS1302InputByte(unsigned char d) //實時時鐘寫入一字節(jié)(內(nèi)部函數(shù))
{ unsigned char i;ACC = d; for(i=8; i>0; i--)
{DS1302_IO = ACC0; 42、 //相當(dāng)于匯編中的 RRC
DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }
unsigned char DS1302OutputByte(void) //實時時鐘讀取一字節(jié)(內(nèi)部函數(shù))
{ unsigned char i; for(i=8; i>0; i--)
{ ACC = ACC >>1; //相當(dāng)于匯編中的 RRC
ACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; }
return(ACC 43、); }
void Write1302(unsigned char ucAddr, unsigned char ucDa) //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;
} uns 44、igned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數(shù)據(jù)
{ unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 讀1Byte數(shù)據(jù)
DS1302_CLK = 1;
DS1302_RST = 0;
45、return(ucData);}
void DS1302_GetTime(SYSTEMTIME *Time) //獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組
{unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadVal 46、ue&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);
47、
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }
void DateToStr(SYSTEMTIME *Time) //將時間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]
{ if(hide_year<2) 48、 //這里的if,else語句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為 2007/07/22
{ Time->DateString[0] = 2;
Time->DateString[1] = 0;
Time->DateString[2] = Time->Year/10 + 0;
Time->DateString[3] = Time->Year%10 + 0;}
else{ Time->DateString[0] = ; Time->DateString[1] = ;
Ti 49、me->DateString[2] = ; Time->DateString[3] = ;}
Time->DateString[4] = /;
if(hide_month<2)
{Time->DateString[5] = Time->Month/10 + 0;
Time->DateString[6] = Time->Month%10 + 0;}
else{ Time->DateString[5] = ; Time->DateString[6] = ;}
Time->DateString[7] = /;
if(hide_day<2)
{Time- 50、>DateString[8] = Time->Day/10 + 0;
Time->DateString[9] = Time->Day%10 + 0;}
else{Time->DateString[8] = ;Time->DateString[9] = ; }
if(hide_week<2){
week_value[0] = Time->Week%10 + 0; //星期的數(shù)據(jù)另外放到 week_value[]數(shù)組里,跟年,月,日的分開存放,因為等一下要在最后顯示}
else { week_value[0] = ;}
week_valu 51、e[1] = \0;
Time->DateString[10] = \0; //字符串末尾加 \0 ,判斷結(jié)束字符}
void TimeToStr(SYSTEMTIME *Time) //將時,分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符放到數(shù)組 TimeString[];
{ if(hide_hour<2)
{ Time->TimeString[0] = Time->Hour/10 + 0;
Time->TimeString[1] = Time->Hour%10 + 0;}
else{ Time->TimeString[0] = ;Time->TimeString[ 52、1] = ;}
Time->TimeString[2] = :;
if(hide_min<2){ Time->TimeString[3] = Time->Minute/10 + 0;
Time->TimeString[4] = Time->Minute%10 + 0;}
else {Time->TimeString[3] = ;Time->TimeString[4] = ; }
Time->TimeString[5] = :;
if(hide_sec<2)
{Time->TimeString[6] = Time->Second/10 + 0; 53、
Time->TimeString[7] = Time->Second%10 + 0;}
else{Time->TimeString[6] = ;Time->TimeString[7] = ; }
Time->DateString[8] = \0;}
void Initial_DS1302(void) //時鐘芯片初始化
{ unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80) //判斷時鐘芯片是否關(guān)閉
{Write1302(0x8e,0x00); / 54、/寫入允許
Write1302(0x8c,0x07); //以下寫入初始化時間 日期:07/07/25.星期: 3. 時間: 23:59:55
Write1302(0x88,0x07);Write1302(0x86,0x25);
Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);
Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止寫入}}
void Delay1ms(unsigned int count)
{unsigned int i,j;for(i=0 55、;i 56、0,hide_month=0,hide_year=0;
Second=Read1302(DS1302_SECOND);
Write1302(0x8e,0x00); //寫入允許
Write1302(0x80,Second&0x7f);
Write1302(0x8E,0x80); //禁止寫入
done=0; while(out==0); }}
///////////////////////////////////////////////////////////////////////////////
void Upkey()/ 57、/升序按鍵
{ Up=1;if(Up==0)
{
mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_SECOND); //讀取秒數(shù)
temp=temp+1; //秒數(shù)加1
up_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志
if((temp&0x7f)>0x59) //超過59秒,清零
temp=0; break;
case 2:
temp=Read1302(DS1302_MINUTE); //讀取分?jǐn)?shù)
temp=temp+1; 58、//分?jǐn)?shù)加1
up_flag=1;
if(temp>0x59) //超過59分,清零
temp=0;break;
case 3:
temp=Read1302(DS1302_HOUR); //讀取小時數(shù)
temp=temp+1; //小時數(shù)加1
up_flag=1;
if(temp>0x23) //超過23小時,清零
temp=0; break;
case 4:
temp=Read1302(DS1302_WEEK); / 59、/讀取星期數(shù)
temp=temp+1; //星期數(shù)加1
up_flag=1;
if(temp>0x7)
temp=1;
break;
case 5:
temp=Read1302(DS1302_DAY); //讀取日數(shù)
temp=temp+1; //日數(shù)加1
60、 up_flag=1;
if(temp>0x31)
temp=1;
break;
case 6:
temp=Read1302(DS1302_MONTH); //讀取月數(shù)
temp=temp+1; //月數(shù)加1
up_flag=1;
if(temp>0x12)
temp=1; 61、
break;
case 7:
temp=Read1302(DS1302_YEAR); //讀取年數(shù)
temp=temp+1; //年數(shù)加1
up_flag=1;
if(temp>0x85)
temp=0;
break;
default:break;}
while(Up==0); }} 62、
///////////////////////////////////////////////////////////////////////////////
void Downkey()//降序按鍵
{ Down=1;if(Down==0)
{ mdelay(8);
switch(count)
{case 1:
temp=Read1302(DS1302_SECOND); //讀取秒數(shù)
temp=temp-1; 63、 //秒數(shù)減1
down_flag=1; //數(shù)據(jù)調(diào)整后更新標(biāo)志
if(temp==0x7f) //小于0秒,返回59秒
temp=0x59;
break;
case 2:
temp=Read1302(DS1302_MINUTE); //讀取分?jǐn)?shù)
temp=temp-1; //分?jǐn)?shù)減1
64、 down_flag=1;
if(temp==-1)
temp=0x59; //小于0秒,返回59秒
break;
case 3:
temp=Read1302(DS1302_HOUR); //讀取小時數(shù)
temp=temp-1; //小時數(shù)減1
down_flag=1;
65、 if(temp==-1)
temp=0x23;
break;
case 4:
temp=Read1302(DS1302_WEEK); //讀取星期數(shù)
temp=temp-1; //星期數(shù)減1
down_flag=1;
if(temp==0)
temp=0x7;;
break; 66、
case 5:
temp=Read1302(DS1302_DAY); //讀取日數(shù)
temp=temp-1; //日數(shù)減1
down_flag=1;
if(temp==0)
temp=31;
break;
case 6:
temp=Read1302(DS1302_MONTH); //讀取月數(shù)
temp=temp-1; //月數(shù)減1
down_flag=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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 談創(chuàng)造性思維公開課一等獎ppt課件
- 傳統(tǒng)節(jié)日二月二龍?zhí)ь^課件
- 有理數(shù)的乘法公開課一等獎ppt課件
- 高中物理新課標(biāo)版人教版選修1-1:3.1《電磁感應(yīng)現(xiàn)象-》課件
- 雙代號網(wǎng)絡(luò)圖案例課件
- 初三政史地大河流域文明古國課件
- 人教版五年級上冊英語Recycle1-lesson1ppt課件
- 英語人教版八年級上冊《Unit-8-How-do-you-make-a-banana-milk-s》ppt課件公開課
- 夜歸鹿門歌課件
- 《角的初步認(rèn)識》公開教學(xué)課件
- 統(tǒng)編版《鵲橋仙》完美ppt課件
- 北師大版數(shù)學(xué)八年級上冊:第五章《二元一次方程組》復(fù)習(xí)-教學(xué)ppt課件
- 嬰幼兒生理解剖特點與保育要點課件
- 最強大腦記憶原理課件
- 部編版二年級語文下冊-識字3-貝的故事-ppt課件