課程設(shè)計(jì)(論文)基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)報(bào)告書(shū)_第1頁(yè)
課程設(shè)計(jì)(論文)基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)報(bào)告書(shū)_第2頁(yè)
課程設(shè)計(jì)(論文)基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)報(bào)告書(shū)_第3頁(yè)
課程設(shè)計(jì)(論文)基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)報(bào)告書(shū)_第4頁(yè)
課程設(shè)計(jì)(論文)基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)報(bào)告書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、目 錄摘 要11 方案論證21.1 單片機(jī)芯片的選擇方案和論證21.2 顯示模塊選擇方案和論證21.3 時(shí)鐘芯片的選擇方案和論證31.4 電路設(shè)計(jì)最終方案決定32 系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)32.1 電路設(shè)計(jì)框圖32.2 系統(tǒng)硬件概述32.3 主要單元電路的設(shè)計(jì)42.3.1 單片機(jī)主控制模塊的設(shè)計(jì)42.3.2 時(shí)鐘電路模塊的設(shè)計(jì)42.3.3 電路原理及說(shuō)明52.3.4 顯示模塊的設(shè)計(jì)63 系統(tǒng)的軟件設(shè)計(jì)73.1 程序流程框圖74 測(cè)試與結(jié)果分析94.1 軟件測(cè)試94.2 測(cè)試結(jié)果分析與結(jié)論94.3.1 測(cè)試結(jié)論95 課程設(shè)計(jì)總結(jié)9參考文獻(xiàn)10附錄一:系統(tǒng)電路圖11附錄二:元器件清單12附錄三:系統(tǒng)程

2、序清單12摘 要隨著科技的快速發(fā)展,時(shí)間的流逝,至從觀太陽(yáng)、擺鐘到現(xiàn)在電子鐘,人類(lèi)不斷研究,不斷創(chuàng)新紀(jì)錄。美國(guó)dallas公司推出的具有涓細(xì)電流充電能的低功耗實(shí)時(shí)時(shí)鐘電路ds1302,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償?shù)榷喾N功能,而且ds1302的使用壽命長(zhǎng),誤差小。對(duì)于數(shù)字電子時(shí)鐘采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、周日、時(shí)、分、秒和溫度等信息,還具有時(shí)間校準(zhǔn)等功能。該電路采用at89s52單片機(jī)作為核心,功耗小,能在3v的低壓工作,電壓可選用35v電壓供電。綜上所述此電子時(shí)鐘具有讀取方便、顯示直觀、功能多樣、電路簡(jiǎn)潔、成本低廉等諸多優(yōu)點(diǎn),符合電子儀器儀表的

3、發(fā)展趨勢(shì),具有廣闊的市場(chǎng)前景。關(guān)鍵詞:電子時(shí)鐘 ds1302 動(dòng)態(tài)掃描 單片機(jī) 1 方案論證1.1 單片機(jī)芯片的選擇方案和論證方案一: 采用89c51芯片作為硬件核心,采用flash rom,內(nèi)部具有4kb rom 存儲(chǔ)空間,能于3v的超低壓工作,而且與mcs-51系列單片機(jī)完全兼容,但是運(yùn)用于電路設(shè)計(jì)中時(shí)由于不具備isp在線(xiàn)編程技術(shù), 當(dāng)在對(duì)電路進(jìn)行調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r(shí),對(duì)芯片的多次拔插會(huì)對(duì)芯片造成一定的損壞。方案二: 采用at89s52,片內(nèi)rom全都采用flash rom;能以3v的超底壓工作;同時(shí)也與mcs-51系列單片機(jī)完全該芯片內(nèi)部存儲(chǔ)器為8k

4、b rom 存儲(chǔ)空間,同樣具有89c51的功能,且具有在線(xiàn)編程可擦除技術(shù),當(dāng)在對(duì)電路進(jìn)行調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r(shí),不需要對(duì)芯片多次拔插,所以不會(huì)對(duì)芯片造成損壞,所以選擇采用at89s52作為主控制系統(tǒng)。1.2 顯示模塊選擇方案和論證方案一: 采用led數(shù)碼管動(dòng)態(tài)掃描,led數(shù)碼管價(jià)格適中,對(duì)于顯示數(shù)字合適,采用動(dòng)態(tài)掃描法與單片機(jī)連接時(shí),雖然占用的單片機(jī)口線(xiàn)少,但連線(xiàn)還需要花費(fèi)一點(diǎn)時(shí)間,所以也不用此種作為顯示。方案二: 采用點(diǎn)陣式數(shù)碼管顯示,點(diǎn)陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對(duì)于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費(fèi),且價(jià)格也相對(duì)較高,所以也不用此

5、種作為顯示。方案三: 采用lcd液晶顯示屏,液晶顯示屏的顯示功能強(qiáng)大,可顯示大量文字,圖形,顯示多樣,清晰可見(jiàn),并且我做的最小系統(tǒng)上帶一個(gè)ts1620-1,和at89s52已經(jīng)接好,省了很多麻煩,所以在此設(shè)計(jì)中采用lcd液晶顯示屏。1.3 時(shí)鐘芯片的選擇方案和論證方案一: 直接采用單片機(jī)定時(shí)計(jì)數(shù)器提供秒信號(hào),使用程序?qū)崿F(xiàn)年、月、日、星期、時(shí)、分、秒計(jì)數(shù)。采用此種方案雖然減少芯片的使用,節(jié)約成本,但是,實(shí)現(xiàn)的時(shí)間誤差較大,所以不采用此方案。方案二: 采用ds1302時(shí)鐘芯片實(shí)現(xiàn)時(shí)鐘,ds1302芯片是一種高性能的時(shí)鐘芯片,可自動(dòng)對(duì)秒、分、時(shí)、日、周、月、年進(jìn)行計(jì)數(shù),而且精度高,位的ram做為數(shù)據(jù)

6、暫存區(qū),工作電壓2.5v5.5v范圍內(nèi),2.5v時(shí)耗電小于300na。1.4 電路設(shè)計(jì)最終方案決定綜上各方案所述,對(duì)此次作品的方案選定:采用at89s52作為主控制系統(tǒng);ds1302提供時(shí)鐘;lcd液晶顯示屏作為顯示。2 系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)2.1 電路設(shè)計(jì)框圖lcd液晶顯示屏顯示模塊d7d0p2.0 p0.7p2.3 p0.0at89s52單片機(jī)p1.5p1.7鍵盤(pán)模塊 ds1302 時(shí)鐘模塊復(fù)位電路rstrstsclki/o圖2-1 系統(tǒng)原理圖2.2 系統(tǒng)硬件概述本電路是由at89s52單片機(jī)為控制核心,具有在線(xiàn)編程功能,低功耗,能在3v超低壓工作;時(shí)鐘電路由ds1302提供,它是一種高性

7、能、低功耗、帶ram的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5v5.5v。采用三線(xiàn)接口與cpu進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或ram數(shù)據(jù)。ds1302內(nèi)部有一個(gè)31*8的用于臨時(shí)性存放數(shù)據(jù)的ram寄存器。可產(chǎn)生年、月、日、周日、時(shí)、分、秒,具有使用壽命長(zhǎng),精度高和低功耗等特點(diǎn),同時(shí)具有掉電自動(dòng)保存功能;顯示部份由lcd液晶顯示屏顯示。2.3 主要單元電路的設(shè)計(jì)2.3.1 單片機(jī)主控制模塊的設(shè)計(jì) at89s52單片機(jī)為40引腳雙列直插芯片,有四個(gè)i/o口p0,p1,p2,p3, mcs-51單片機(jī)共有4個(gè)8位的i/o

8、口(p0、p1、p2、p3),每一條i/o線(xiàn)都能獨(dú)立地作輸出或輸入。單片機(jī)的最小系統(tǒng)如下圖所示,18引腳和19引腳接時(shí)鐘電路,xtal1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,xtal2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出。第9引腳為復(fù)位輸入端,接上電容,電阻及開(kāi)關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端。如圖2-2所示:圖2-2 主控制系統(tǒng)2.3.2 時(shí)鐘電路模塊的設(shè)計(jì)圖2-3顯示出ds1302的引腳排列,其中vcc1為后備電源,vcc2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。ds1302由vcc1或vcc2兩者中的

9、較大者供電。當(dāng)vcc2大于vcc1+0.2v時(shí),vcc2給ds1302供電。當(dāng)vcc2小于vcc1時(shí),ds1302由vcc1供電。x1和x2是振蕩源,外接32.768khz晶振。rst是復(fù)位/片選線(xiàn),通過(guò)把rst輸入驅(qū)動(dòng)置高電平來(lái)啟動(dòng)所有的數(shù)據(jù)傳送。rst輸入有兩種功能:首先,rst接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,rst提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)rst為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)ds1302進(jìn)行操作。如果在傳送過(guò)程中rsts置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,i/o引腳變?yōu)楦咦钁B(tài)。上電動(dòng)行時(shí),在vcc大于等于2.5v之前,rst必須保持低電平。中

10、有在sclk 為低電平時(shí),才能將rst置為高電平,i/o為串行數(shù)據(jù)輸入端(雙向)。sclk始終是輸入端。圖2-3 ds1302的引腳圖2.3.3 電路原理及說(shuō)明(1) 時(shí)鐘芯片ds1302的工作原理: ds1302在每次進(jìn)行讀、寫(xiě)程序前都必須初始化,先把sclk端置 “0”,接著把rst端置“1”,最后才給予sclk脈沖。ds1302的控制字的位7必須置1,若為0則不能把對(duì)ds1302進(jìn)行讀寫(xiě)數(shù)據(jù)。對(duì)于位6,若對(duì)程序進(jìn)行讀/寫(xiě)時(shí)ram=1,對(duì)時(shí)間進(jìn)行讀/寫(xiě)時(shí),ck=0,位1至位5指操作單元的地址。位0是讀/寫(xiě)操作位,進(jìn)行讀操作時(shí),該位為1;該位為0則表示進(jìn)行的是寫(xiě)操作。控制字節(jié)總是從最低位開(kāi)始

11、輸入/輸出的。表.2為ds1302的日歷、時(shí)間寄存器內(nèi)容:“ch”是時(shí)鐘暫停標(biāo)志位,當(dāng)該位為1時(shí),時(shí)鐘振蕩器停止,ds1302處于低功耗狀態(tài);當(dāng)該位為0時(shí),時(shí)鐘開(kāi)始運(yùn)行。“wp”是寫(xiě)保護(hù)位,在任何的對(duì)時(shí)鐘和ram的寫(xiě)操作之前,wp必須為0。當(dāng)“wp”為1時(shí),寫(xiě)保護(hù)位防止對(duì)任一寄存器的寫(xiě)操作。(2) ds1302的控制字節(jié):ds1302控制字節(jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫(xiě)入ds1302中,位6如果0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取ram數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫(xiě)操作,為1表示進(jìn)行讀操作,控制字節(jié)總是從最低位開(kāi)始輸出

12、(3) 數(shù)據(jù)輸入輸出(i/o)在控制指令字輸入后的下一個(gè)sclk時(shí)鐘的上升沿時(shí),數(shù)據(jù)被寫(xiě)入ds1302,數(shù)據(jù)輸入從低位即位0開(kāi)始。同樣,在緊跟8位的控制指令字后的下一個(gè)sclk脈沖的下降沿讀出ds1302的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0位到高位7。(4) ds1302的寄存器ds1302有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為bcd碼形式。此外,ds1302 還有年份寄存器、控制寄存器、充電寄存器、時(shí)鐘突發(fā)寄存器及與ram相關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫(xiě)除充電寄存器外的所有寄存器內(nèi)容。 ds1302與ram相關(guān)的寄存器分為兩類(lèi):一類(lèi)是單個(gè)ram單元,共31個(gè),每

13、個(gè)單元組態(tài)為一個(gè)8位的字節(jié),其命令控制字為c0hfdh,其中奇數(shù)為讀操作,偶數(shù)為寫(xiě)操作;另一類(lèi)為突發(fā)方式下的ram寄存器,此方式下可一次性讀寫(xiě)所有的ram的31個(gè)字節(jié),命令控制字為feh(寫(xiě))、ffh(讀)。 2.3.4 顯示模塊的設(shè)計(jì)如圖2-4為lcd顯示模塊,和最小系統(tǒng)上的連線(xiàn)一樣,無(wú)需修改。圖2-4 lcd液晶顯示屏顯示模塊3 系統(tǒng)的軟件設(shè)計(jì)開(kāi)始初始化 讀日期、時(shí)間 寫(xiě)日期、時(shí)間顯示子程序時(shí)間修改子程序 日期修改子程序顯示結(jié)果返回 開(kāi)關(guān)控制子程序3.1 程序流程框圖 圖3-1 主程序流程圖 圖3-2 時(shí)間調(diào)整程序流程圖4 測(cè)試與結(jié)果分析4.1 仿真測(cè)試電子時(shí)鐘是多功能的數(shù)字型,可以看當(dāng)前

14、日期,時(shí)間。電子萬(wàn)年歷功能很多,所以對(duì)于它的程序也較為復(fù)雜,所以在編寫(xiě)程序和調(diào)試時(shí)出現(xiàn)了相對(duì)較多的問(wèn)題。最后經(jīng)過(guò)多次的模塊子程序的修改,一步一步的完成,最終解決了軟件。在軟件的調(diào)試過(guò)程中遇到的主要問(wèn)題是: 1.燒入程序后,lcd液晶顯示屏顯示亮度不好。 解決:一遍旋轉(zhuǎn)10k歐的滑動(dòng)變阻器,一遍觀看lcd顯示屏,知道看到合適的亮度為止。4.2 測(cè)試結(jié)果分析與結(jié)論4.3.1 測(cè)試結(jié)論經(jīng)過(guò)多次的反復(fù)測(cè)試與分析,可以對(duì)電路的原理及功能更加熟悉,同時(shí)提高了設(shè)計(jì)能力與及對(duì)電路的分析能力。同時(shí)在軟件的編程方面得到更到的提高,對(duì)編程能力得到加強(qiáng),同時(shí)對(duì)所學(xué)的知識(shí)得到很大的提高與鞏固。5 課程設(shè)計(jì)總結(jié)在整個(gè)設(shè)計(jì)

15、過(guò)程中,充分發(fā)揮人的主觀能動(dòng)性,自主學(xué)習(xí),學(xué)到了許多沒(méi)學(xué)到的知識(shí)。較好的完成了作品,達(dá)到了預(yù)期的目的,完了最初的設(shè)想。對(duì)電路的設(shè)計(jì)、布局要先有一個(gè)好的構(gòu)思,才顯得電路板美觀、大方。程序編寫(xiě)中,由于思路不清晰,開(kāi)始時(shí)遇到了很多的問(wèn)題,經(jīng)過(guò)靜下心來(lái)思考,和同組員的討論,理清了思路,反而得心應(yīng)手。在此次設(shè)計(jì)中,知道了做凡事要有一顆平常的心,不要想著走捷徑,一步一腳印。也練就了我們的耐心,做什么事都在有耐心。此次課程設(shè)計(jì)學(xué)到了很多很多東西,這是最重要的。總之,此次課設(shè)使我的能力得到了全方位的提高。參考文獻(xiàn)1電氣與電子信息工程學(xué)院.單片機(jī)實(shí)驗(yàn)指導(dǎo)書(shū) 2彭為等.單片機(jī)典型系統(tǒng)設(shè)計(jì)實(shí)例精講.北京:電子工業(yè)出

16、版社,20073王慶利等.單片機(jī)設(shè)計(jì)案例實(shí)踐教程.北京:北京郵電大學(xué)出版社,20084皮大能等.單片機(jī)課程設(shè)計(jì)指導(dǎo)書(shū).北京:北京理工大學(xué)出版社,20105張毅剛等.單片機(jī)原理及應(yīng)用.北京:高等教育出版社,2010附錄一:系統(tǒng)電路圖附錄二:元器件清單附表1 電子時(shí)鐘主要元器件清單元件名稱(chēng)規(guī)格型號(hào)數(shù)量(個(gè))單片機(jī)at89s511lcd液晶顯示屏lm016l1晶振12mhz2電容22pf2電容20uf1按鍵button5電阻1k1上拉電阻10k1排阻respack-8/10k1電源變壓器9v1附錄二:系統(tǒng)程序清單#include #include /#include lcd1602.h/#inclu

17、de ds1302.h#define uint unsigned int#define uchar unsigned charsbit ds1302_clk = p17; /實(shí)時(shí)時(shí)鐘時(shí)鐘線(xiàn)引腳 sbit ds1302_io = p16; /實(shí)時(shí)時(shí)鐘數(shù)據(jù)線(xiàn)引腳 sbit ds1302_rst = p15; /實(shí)時(shí)時(shí)鐘復(fù)位線(xiàn)引腳sbit acc0 = acc0;sbit acc7 = acc7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)sbit set = p

18、20; /模式切換鍵sbit up = p21; /加法按鈕sbit down = p22; /減法按鈕sbit out = p23; /立刻跳出調(diào)整模式按鈕char done,count,temp,flag,up_flag,down_flag;uchar tempbuffer5,week_value2;void show_time(); /液晶顯示程序/*1602液晶顯示部分子程序*/port definitions*sbit lcdrs= p25;sbit lcdrw= p26;sbit lcden = p27;sfr dbport = 0x80;/p0=0x80,p1=0x90,p2=0

19、xa0,p3=0xb0.數(shù)據(jù)端口/內(nèi)部等待函數(shù)*unsigned char lcd_wait(void)lcdrs=0;lcdrw=1;_nop_();lcden=1;_nop_();lcden=0;return dbport;/向lcd寫(xiě)入命令或數(shù)據(jù)*#define lcd_command0 / command#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光標(biāo)返回原點(diǎn)void lcd_write(bit style, unsigned char input)lcden=0;

20、lcdrs=style;lcdrw=0;_nop_();dbport=input;_nop_();/注意順序lcden=1;_nop_();/注意順序lcden=0;_nop_();lcd_wait();/設(shè)置顯示模式*#define lcd_show0x04 /顯示開(kāi)#define lcd_hide0x00 /顯示關(guān) #define lcd_cursor0x02 /顯示光標(biāo)#define lcd_no_cursor0x00 /無(wú)光標(biāo) #define lcd_flash0x01 /光標(biāo)閃動(dòng)#define lcd_no_flash0x00 /光標(biāo)不閃動(dòng)void lcd_setdisplay(un

21、signed char displaymode)lcd_write(lcd_command, 0x08|displaymode);/設(shè)置輸入模式*#define lcd_ac_up0x02#define lcd_ac_down0x00 / default#define lcd_move0x01 / 畫(huà)面可平移#define lcd_no_move0x00 /defaultvoid lcd_setinput(unsigned char inputmode)lcd_write(lcd_command, 0x04|inputmode);/初始化lcd*void lcd_initial()lcden=

22、0;lcd_write(lcd_command,0x38); /8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣lcd_write(lcd_command,0x38);lcd_setdisplay(lcd_show|lcd_no_cursor); /開(kāi)啟顯示, 無(wú)光標(biāo)lcd_write(lcd_command,lcd_clear_screen); /清屏lcd_setinput(lcd_ac_up|lcd_no_move); /ac遞增, 畫(huà)面不動(dòng)/液晶字符輸入的位置*void gotoxy(unsigned char x, unsigned char y)if(y=0)lcd_write(lcd_comm

23、and,0x80|x);if(y=1)lcd_write(lcd_command,0x80|(x-0x40);/將字符輸出到液晶顯示void print(unsigned char *str)while(*str!=0)lcd_write(lcd_data,*str);str+;/*ds1302時(shí)鐘部分子程序*/typedef struct _systemtime_unsigned char second;unsigned char minute;unsigned char hour;unsigned char week;unsigned char day;unsigned char mont

24、h;unsigned char year;unsigned char datestring11;unsigned char timestring9;systemtime;/定義的時(shí)間類(lèi)型systemtime currenttime;#define am(x)x#define pm(x)(x+12) / 轉(zhuǎn)成24小時(shí)制#define ds1302_second0x80 /時(shí)鐘芯片的寄存器位置,存放時(shí)間#define ds1302_minute0x82#define ds1302_hour0x84 #define ds1302_week0x8a#define ds1302_day0x86#defi

25、ne ds1302_month0x88#define ds1302_year0x8c void ds1302inputbyte(unsigned char d) /實(shí)時(shí)時(shí)鐘寫(xiě)入一字節(jié)(內(nèi)部函數(shù)) unsigned char i;acc = d; for(i=8; i0; i-) ds1302_io = acc0; /相當(dāng)于匯編中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc 1; unsigned char ds1302outputbyte(void) /實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù)) unsigned char i; for(i=8; i0;

26、i-) acc = acc 1; /相當(dāng)于匯編中的 rrc acc7 = ds1302_io; ds1302_clk = 1;ds1302_clk = 0; return(acc); void write1302(unsigned char ucaddr, unsigned char ucda)/ucaddr: ds1302地址, ucdata: 要寫(xiě)的數(shù)據(jù) ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr); / 地址,命令 ds1302inputbyte(ucda); / 寫(xiě)1byte數(shù)據(jù) ds13

27、02_clk = 1; ds1302_rst = 0; unsigned 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; return(ucdata);void ds1302_getti

28、me(systemtime *time) /獲取時(shí)鐘芯片的時(shí)鐘數(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 + (readvalue&0x0f);readvalue = read1302(ds1302_hour);time-hour = (read

29、value&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);rea

30、dvalue = read1302(ds1302_year);time-year = (readvalue&0x70)4)*10 + (readvalue&0x0f);void datetostr(systemtime *time) /將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里datestring if(hide_year2) /這里的if,else語(yǔ)句都是判斷位閃爍,2就不顯示,輸出字符串為 2007/07/22 time-datestring0 = 2; time-datestring1 = 0; time-datestring2 = time-year/10 + 0; t

31、ime-datestring3 = time-year%10 + 0; else time-datestring0 = ; time-datestring1 = ; time-datestring2 = ; time-datestring3 = ;time-datestring4 = /;if(hide_monthdatestring5 = time-month/10 + 0; time-datestring6 = time-month%10 + 0; else time-datestring5 = ; time-datestring6 = ;time-datestring7 = /;if(h

32、ide_daydatestring8 = time-day/10 + 0; time-datestring9 = time-day%10 + 0; elsetime-datestring8 = ;time-datestring9 = ; if(hide_weekweek%10 + 0; /星期的數(shù)據(jù)另外放到 week_value數(shù)組里,跟年,月,日的分開(kāi)存放,因?yàn)榈纫幌乱谧詈箫@示 else week_value0 = ; week_value1 = 0;time-datestring10 = 0; /字符串末尾加 0 ,判斷結(jié)束字符void timetostr(systemtime *tim

33、e) /將時(shí),分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符放到數(shù)組 timestring; if(hide_hourtimestring0 = time-hour/10 + 0; time-timestring1 = time-hour%10 + 0; else time-timestring0 = ;time-timestring1 = ;time-timestring2 = :;if(hide_mintimestring3 = time-minute/10 + 0; time-timestring4 = time-minute%10 + 0; else time-timestring3 = ;time-t

34、imestring4 = ; time-timestring5 = :; if(hide_sectimestring6 = time-second/10 + 0; time-timestring7 = time-second%10 + 0; elsetime-timestring6 = ;time-timestring7 = ; time-datestring8 = 0;void initial_ds1302(void) /時(shí)鐘芯片初始化 unsigned char second=read1302(ds1302_second);if(second&0x80) /判斷時(shí)鐘芯片是否關(guān)閉 write

35、1302(0x8e,0x00); /寫(xiě)入允許write1302(0x8c,0x07); /以下寫(xiě)入初始化時(shí)間 日期:07/07/25.星期: 3. 時(shí)間: 23:59:55write1302(0x88,0x07);write1302(0x86,0x25);write1302(0x8a,0x07);write1302(0x84,0x23);write1302(0x82,0x59);write1302(0x80,0x55);write1302(0x8e,0x80); /禁止寫(xiě)入void delay1ms(unsigned int count)unsigned int i,j;for(i=0;ico

36、unt;i+)for(j=0;j0;delay-)for(i=0;i0x59) /超過(guò)59秒,清零 temp=0; break; case 2:temp=read1302(ds1302_minute); /讀取分?jǐn)?shù) temp=temp+1; /分?jǐn)?shù)加1up_flag=1;if(temp0x59) /超過(guò)59分,清零temp=0;break;case 3: temp=read1302(ds1302_hour); /讀取小時(shí)數(shù)temp=temp+1; /小時(shí)數(shù)加1up_flag=1;if(temp0x23) /超過(guò)23小時(shí),清零 temp=0; break; case 4: temp=read13

37、02(ds1302_week); /讀取星期數(shù) temp=temp+1; /星期數(shù)加1 up_flag=1; if(temp0x7) temp=1; break; case 5: temp=read1302(ds1302_day); /讀取日數(shù) temp=temp+1; /日數(shù)加1 up_flag=1; if(temp0x31) temp=1; break; case 6: temp=read1302(ds1302_month); /讀取月數(shù) temp=temp+1; /月數(shù)加1 up_flag=1; if(temp0x12) temp=1; break; case 7: temp=read1

38、302(ds1302_year); /讀取年數(shù) temp=temp+1; /年數(shù)加1 up_flag=1; if(temp0x85) temp=0; break; default:break;while(up=0); /void downkey()/降序按鍵 down=1;if(down=0) mdelay(8); switch(count) case 1: temp=read1302(ds1302_second); /讀取秒數(shù) temp=temp-1; /秒數(shù)減1 down_flag=1; /數(shù)據(jù)調(diào)整后更新標(biāo)志 if(temp=0x7f) /小于0秒,返回59秒 temp=0x59; bre

39、ak; case 2: temp=read1302(ds1302_minute); /讀取分?jǐn)?shù) temp=temp-1; /分?jǐn)?shù)減1 down_flag=1; if(temp=-1) temp=0x59; /小于0秒,返回59秒 break; case 3: temp=read1302(ds1302_hour); /讀取小時(shí)數(shù) temp=temp-1; /小時(shí)數(shù)減1 down_flag=1; 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; 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_fl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論