基于at89s52的電子萬年歷設(shè)計報告畢業(yè)論文_第1頁
已閱讀1頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目 錄</b></p><p>  摘 要………………………………………………………………………………3</p><p>  關(guān)鍵詞………………………………………………………………………………3</p><p>  一、設(shè)計任務(wù)與要求………………………………………………………………3</p>&l

2、t;p>  二、方案設(shè)計與論證………………………………………………………………3</p><p>  方案一…………………………………………………………………………3</p><p>  方案二…………………………………………………………………………4</p><p>  方案三…………………………………………………………………………4</p>

3、<p>  硬件單元電路設(shè)計與參數(shù)計算………………………………………………5</p><p>  1. 主控制系統(tǒng)…………………………………………………………………5</p><p>  2. 時鐘振蕩電路………………………………………………………………5</p><p>  3. 復位電路……………………………………………………………………6</p

4、><p>  4. DS1302時鐘電路 …………………………………………………………7</p><p>  5. 按鍵電路……………………………………………………………………8</p><p>  6. 顯示電路……………………………………………………………………8</p><p>  7. 蜂鳴器電路……………………………………………………

5、……………9</p><p>  軟件設(shè)計與流程圖……………………………………………………………9</p><p>  五、 總原電路及元器件清單……………………………………………………13</p><p>  1. 總原理圖……………………………………………………………………13</p><p>  2. PCB制板圖……………………………

6、……………………………………13</p><p>  3. 整體電路仿真圖以及仿真結(jié)果分析 ……………………………………14</p><p>  4.元件清單……………………………………………………………………14</p><p>  六、安裝與調(diào)試 …………………………………………………………………15</p><p>  1. 電路安裝…

7、…………………………………………………………………15</p><p>  2. 電路調(diào)試……………………………………………………………………15</p><p>  3. 軟件調(diào)試……………………………………………………………………16</p><p>  七、性能測試與分析 ……………………………………………………………16</p><p&g

8、t;  八、結(jié)論與心得 …………………………………………………………………16</p><p>  九、參考文獻 ……………………………………………………………………16</p><p>  十、致謝 …………………………………………………………………………16</p><p>  十一、程序清單 …………………………………………………………………17</p&

9、gt;<p>  基于AT89S52的電子萬年歷設(shè)計</p><p>  摘要: 隨著社會的快速發(fā)展,時間的流逝,從觀察太陽、擺鐘到現(xiàn)在的單片機電子鐘,人類不斷研究,不斷創(chuàng)造新紀錄,單片機電子萬年歷已成為當今人類準確、快速獲取時間信息的重要工具之一。本設(shè)計的電子萬年歷以AT89S52單片機為控制核心,采用Dallas公司的DS1302實時時鐘構(gòu)成時鐘電路,能夠?qū)崿F(xiàn)時間和日期的顯示,還增加了鬧鐘報時的

10、功能。設(shè)計詳細地分析設(shè)計原理和制作的全過程。</p><p>  關(guān)鍵詞:單片機;實時時鐘;DS1302 </p><p>  一、設(shè)計任務(wù)與要求:</p><p><b>  基本要求:</b></p><p>  能夠顯示年、月、日、時、分。</p><p>  可以人為校正年、月、日、時、

11、分。</p><p>  第一次開機顯示:2000 01 01 12.00。</p><p><b>  掉電信息不丟失。</b></p><p><b>  創(chuàng)新擴展:</b></p><p><b>  具有鬧鐘功能。</b></p><p><

12、;b>  二、方案設(shè)計與論證</b></p><p><b>  方案一:</b></p><p>  按照系統(tǒng)設(shè)計的功能的要求,初步確定系統(tǒng)由主控模塊、時鐘模塊、顯示模塊各鍵盤接口模塊共4個模塊組成,電路系統(tǒng)構(gòu)成框圖如圖1所示。主控芯片使用52系列AT89S52單片機,時鐘芯片使用美國DALLAS公司推出的一款高性能、低功耗、帶RAM的實時時鐘DS

13、1302。采用DS1302作為計時芯片,可以做到計時準確。更重要的是,DS1302可以在很小電流的后備電源(2.5V--5.5V電源,在2。5V時耗電小于300nA)下繼續(xù)計時,而且DS1302可以編程選擇多種充電電流來對后備電源進行慢速充電,可以 保證后備電源基本功不耗電。顯示模塊采用普通的共陽LED數(shù)碼管,鍵輸入采用查詢法實現(xiàn)功能調(diào)整。</p><p>  圖1 電子萬年歷電路系統(tǒng)構(gòu)成框圖</p>

14、;<p><b>  方案二:</b></p><p>  按照系統(tǒng)設(shè)計的要求和功能,將系統(tǒng)分為主控模塊、時鐘電路模塊、按鍵掃描模塊,LCD顯示模塊,電源電路、復位電路、晶振電路幾個模塊,系統(tǒng)框圖如圖2所示。主控模塊采用AT89S52單片機,按鍵模塊用四個按鍵,用于調(diào)整時間和設(shè)定鬧鐘,顯示模塊采用LCD1602,時鐘電路模塊采用DS1302實時時鐘實現(xiàn)對時間,日期的操作。<

15、;/p><p>  圖2 基于AT89S52單片機的電子萬年歷系統(tǒng)框圖</p><p><b>  方案三:</b></p><p>  按照系統(tǒng)設(shè)計的要求和功能,將系統(tǒng)分為主控制器模塊、顯示模塊、按鍵開關(guān)模塊、蜂鳴器電路模塊。系統(tǒng)框圖如圖3所示,主控制模塊采用AT89S52單片機為控制中心,顯示模塊采用液晶LCD1602顯示,計時使用AT89S5

16、2單片機自帶的定時器功能,實現(xiàn)對時間、日期的操作,通過按鍵盤開關(guān)實現(xiàn)對時間、日期的調(diào)整。</p><p>  圖3 基于AT89S52單片機的電子萬年歷總體設(shè)計框圖</p><p>  方案論證:上面提到的三個方案中,在電路原理方面大致相同,都能夠達到設(shè)計任務(wù)與要求,在方案一款方案二中使用外部的時鐘芯片DS1302來實現(xiàn)日期和時間的操作,方案三中則利用了單片機自身的定時器功能;在方案二和方

17、案三在顯示模塊上都使用液晶顯示屏LCD1602作為顯示,方案一則使用LED數(shù)碼管作為顯示,采用LED數(shù)碼管動態(tài)掃描,數(shù)碼管的價格適中,對于顯示數(shù)字較好,而且使用單片機的端口也較少;采用LCD1602液晶顯示屏,液晶顯示屏的顯示功能強大,可以顯示大量文字、圖形,顯示多樣性,清晰可見,價格相對LED數(shù)碼管來說要昂貴些,但是基于本設(shè)計顯示的東西較多,若采用LED數(shù)碼管的話,所需數(shù)碼管較多,價格也相應(yīng)的會提高,而且不利于控制,對于LCD1602

18、,隨著現(xiàn)在制造的發(fā)展,價格也在下降,同時它所使用的端口也不很多,能夠清晰的顯示,比較適合顯示大量的數(shù)字,因此選擇LCD1602作為顯示模塊。DS1302是一款高性能的實時時鐘芯片,以計時準確、接口簡單、使用方便、工作電壓范圍寬和低功耗等優(yōu)點,得到廣泛的應(yīng)用,同時可以對秒、時、分、日、月、年以及潤年補償?shù)哪赀M行計數(shù),而且在掉電時能夠在外部紐扣電池的供電下</p><p>  通過對上述方案的論證分析,本次設(shè)計選擇方

19、案二,采用AT89S52作為主控制系統(tǒng),DS1302提供時鐘,LCD1602液晶作為顯示模塊</p><p>  三、硬件單元電路設(shè)計與參數(shù)計算</p><p><b>  主控制系統(tǒng)</b></p><p>  單片機中央處理系統(tǒng)的方案設(shè)計,我們選用具有ATMEL公司的AT89C52單片機作為中央處理器,如圖4所示。該單片機除了擁有MCS-5

20、1系列單片機的所有優(yōu)點外,內(nèi)部還具有8K的在系統(tǒng)可編程FLASH存儲器,低功耗的空閑和掉電模式,極大的降低了電路的功耗,還包含了定時器、程序存儲器、數(shù)據(jù)存儲器等硬件,其硬件能符合整個控制系統(tǒng)的要求,不需要外接其他存儲器芯片和定時器件,方便地構(gòu)成一個最小系統(tǒng)。整個系統(tǒng)結(jié)構(gòu)緊湊,抗干擾能力強,性價比高。是比較合適的方案。</p><p>  圖4 AT89S52主控制系統(tǒng)</p><p>&l

21、t;b>  2、時鐘振蕩電路</b></p><p>  時鐘振蕩電路圖5所示,時鐘振蕩電路用于產(chǎn)生單片機正常工作時所需要的時鐘信號,電路由兩個30pF的瓷片電容和一個12MHz的晶振組成,并接入到單片機的XTAL1和XTAL2引腳處,使單片機工作于內(nèi)部振蕩模式。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產(chǎn)生幅度為3V左右的正弦波時鐘信號,其振蕩頻率主要由石英晶振的頻率決定。電路

22、中兩個電容C1、C2的作用使電路快速起振,提高電路的運行速度,對于AT89S52其工作頻率為0至33MHz,在這個范圍內(nèi)單片機能夠正常的工作。</p><p>  圖5 AT89S52時鐘振蕩電路</p><p><b>  3、復位電路</b></p><p>  復位電路由電阻和極性電容組成,如圖6所示,通過高電平使單片機復位,在時鐘電路開

23、始工作后,當高電平的時間超過大約2us時,即可實現(xiàn)復位。此復位電路同時具備了上電復位和手動復位的功能,上電復位發(fā)生在開機加電時,由系統(tǒng)自動完成,手動復位通過一個按鍵來實現(xiàn),在程序運行時,若遇到死機,死循環(huán)或程序“跑飛”等情況,通過手動復位就可以實現(xiàn)重新啟動的操作。手動按鈕復位需要人為在復位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕和一個電阻,如圖所示,當人為按下按鈕時,則Vcc 的+5V電平就會直接

24、加到RST端,由于人的動作再快也會使按鈕保持接通達數(shù)十毫秒,所以,完全能夠滿足復位的時間要求。上電復位的工作過程是在加電時,復位電路通過電容加給RST端一個短暫的高電平信號,此高電平信號隨著Vcc對電容的充電過程而逐漸回落,即RST端的高電平持續(xù)時間取決于電容的充電時間,由圖可知充電時間為:T=2.3RC=2.3*10*10-6*5.1*103=0.1173s ,保證系統(tǒng)能夠可靠地復位。</p><p>  圖6

25、 AT89S52復位電路</p><p>  4、DS1302時鐘電路</p><p>  時鐘電路主要由時鐘芯片DS1302、備用電池、晶振等幾部分組成,如圖7所示。DS1302采用3線串行接口,占用引腳少,內(nèi)部集成了可編程日歷時鐘,用戶可以根據(jù)需要通過單片機的控制來自行設(shè)置,支持雙電源供電,可以使用外部主電源和備用電源,備份電源能夠使時鐘芯片繼續(xù)工作。</p><p

26、>  圖7 DS1302時鐘電路</p><p><b>  5、按鍵電路</b></p><p>  按鍵電路由四個輕觸開關(guān)組成,如圖8所示。按鍵用來調(diào)整時間和設(shè)定鬧鐘,其一端直接接到單片機的端口,另一端接地,當按下按鍵時,相應(yīng)的端口變?yōu)榈碗娖剑ㄟ^檢測這一低電平就可以判斷是哪個鍵按下,從而作相應(yīng)的操作。</p><p><b&g

27、t;  圖8 按鍵電路</b></p><p><b>  6、顯示電路</b></p><p>  顯示電路采用LCD1602液晶顯示,圖中只畫出了其相應(yīng)的接口,如圖9所示。3腳用于調(diào)節(jié)LCD1602的背光,4、5、6為LCD1602的控制口,用于控制其寫入或是讀出指令,7至14腳為LCD1602的數(shù)據(jù)口,將數(shù)傳送到LCD1602中。</p>

28、<p>  圖9 LCD1602接口電路</p><p><b>  7、蜂鳴器電路</b></p><p>  蜂鳴器電路由一個220歐的電阻,三極管8550,及蜂鳴器組成,如圖10所示。通過控制三極管的導通和截止來實現(xiàn)蜂鳴器的響與不響。</p><p><b>  圖10 蜂鳴器電路</b></p&

29、gt;<p>  四、軟件設(shè)計與流程圖</p><p><b>  1、程序流程圖</b></p><p>  主程序首先初始化定時器、LCD1602及DS1302,然后就開始查詢按鍵,有鍵按下則開始調(diào)整時間和設(shè)置鬧鐘,若沒有按下,則執(zhí)行下面的時間、日期及鬧鐘時間的顯示,最后依次循環(huán)這些相同的操作,相應(yīng)流程圖如圖11所示:</p><

30、p>  圖11 程序主流程圖</p><p>  按鍵的檢測主要是通過查詢的辦法來實現(xiàn),利用按鍵進行間調(diào)整及鬧鐘設(shè)置,首先檢測K1鍵是否按下,當K1鍵按下時,并且K2鍵按下時,則設(shè)置初始的默認時間;當K1按下,并且K4按下時,則是開啟鬧鐘功能;若只是K3按下則開始設(shè)置時間及日期,同時被選擇的時間和日期開始閃爍,第一次按下K3時,設(shè)置年份,若按下K1,則是減1操作,按下K2是加1操作,設(shè)置好年后,第二次按下K

31、3時,則是設(shè)置月份,按K1減,按K2則加1,依次循環(huán)下去,則可以將時間和日期設(shè)置完畢;而當按下K4時,則是設(shè)置鬧鐘時間,第一次按下K4,設(shè)置時,按K1時減1,按K2時加1,第二次按下時,設(shè)置分,同樣的操作,按K1分減1,按K2分加1,程序流程圖12所示:</p><p>  圖12 時間調(diào)整及鬧鐘設(shè)置程序流程圖</p><p><b>  2、軟件設(shè)計</b><

32、/p><p><b>  2.1軟件總設(shè)計</b></p><p>  主程序首先對系統(tǒng)環(huán)境初始化,設(shè)置定時器T0工作模式為16位定時/計數(shù)器模式,置位總中斷允許位EA,并對鍵盤端口置位,再對LCD1602初始化,DS1302初始化。接著掃描鍵盤,在鍵盤程序里面是對時間、日期及鬧鐘的調(diào)整,最下面是時間的顯示及鬧鐘比較時間。</p><p><

33、b>  2.2子程序設(shè)計</b></p><p>  讀寫DS1302子程序:</p><p>  讀寫LCD1602子程序:</p><p>  五、總原電路及元器件清單</p><p><b>  1、總原理圖</b></p><p>  基于AT89S52單片機的電子萬年歷

34、硬件電路圖如圖13所示,系統(tǒng)由AT89S52單片機,按鍵掃描電路、顯示電路、時鐘電路、晶振電路、復位電路、電源指示電路及蜂鳴器輸出電路。</p><p>  圖13 基于AT89S52的電子萬年歷電路原理圖</p><p><b>  2、PCB制板圖</b></p><p>  基于AT89S52單片機的電子萬年歷制板如圖14所示:<

35、/p><p>  圖14 基于AT89S52的電子萬年歷PCB制板圖</p><p>  3、整體電路仿真圖以及仿真結(jié)果分析 </p><p>  3.1整體電路仿真圖</p><p><b>  如圖15所示所示。</b></p><p>  圖15 電子萬年歷仿真圖</p>&l

36、t;p><b>  3.2仿真結(jié)果分析</b></p><p>  仿真正確顯示了時間,在LCD1602中正確顯示了當前日期、時間并可以顯示鬧鐘時間,通過按按鍵K3,就可以開始設(shè)置時間,依次按K3依次在年、月、日、時、分之間切換,并且相應(yīng)的調(diào)整的位會閃爍,按K2鍵用于加1操作,K1鍵用于減1操作。按K4鍵則可以設(shè)置鬧鐘時間,依次按K4可以在時和分之間切換,按K2鍵,可以增加值,按K1鍵

37、,可以減小值。鬧鐘開啟設(shè)置:先按住K1,然后再按K4就可以開啟鬧鐘功能,當設(shè)置好鬧鐘后并開啟鬧鐘功能后,就可以有鬧鐘功能,鬧鐘時間為1分鐘。仿真正確顯示了我們需要達到的要求,符合了我們設(shè)計的要求。</p><p><b>  4、元件清單</b></p><p>  基于AT89S52單片機的電子萬年歷元件清單如表1所示。</p><p>  

38、表1 基于AT89S52單片機的電子萬年歷元件清單</p><p><b>  六、安裝與調(diào)試</b></p><p><b>  1、電路安裝</b></p><p>  用Protel99se 畫好PCB后,并做出相應(yīng)的電路板,測試過電路板沒有短路和斷路后,對照Protel99se中的PCB板圖將相應(yīng)的元件插到電路板

39、上,首先將矮的電子元件先插上,然后將其焊在電路板上,依照高矮,將剩余的元件安裝在電路板上,并依次焊接好.當焊接完成后.剪去引腳,并測試電路焊接后是否有短路.</p><p><b>  2、電路調(diào)試</b></p><p>  在測試中遇到LCD1602不能夠顯示出時間和日期,經(jīng)過檢查才發(fā)現(xiàn)是LCD1602的背光沒有調(diào)好,通過調(diào)節(jié)接在LCD1602上3腳上的滑動變阻器

40、,改變所給的電壓,可以清晰地看見了LCD能夠顯示。</p><p>  對于DS1302在測試過程中發(fā)其上電不久就發(fā)熱,在檢查電路過程中,不是因為發(fā)現(xiàn)芯片短路,最終檢查發(fā)現(xiàn)原來是DS1302的引腳接法不正確,給+5V的應(yīng)該是芯片的腳,給后備電池的是1腳,當換過來之后,芯片就不發(fā)熱了,而且可以正常顯示出我們要顯示的時間和日期。</p><p><b>  3、軟件調(diào)試</b&

41、gt;</p><p>  在軟件調(diào)試過程中,當按下按鍵調(diào)節(jié)時間和日期后,時間不能繼續(xù)在加,后來分析了程序才發(fā)現(xiàn),是在設(shè)置好時間和日期時我們暫停了時鐘,在設(shè)置完后沒有啟動時鐘,所以時間和日期就不能夠繼續(xù)走,在那里停止了,發(fā)現(xiàn)這個原因后,我在設(shè)置完時間后就開啟時鐘,時間和日期就能夠正確顯示了。</p><p><b>  七、性能測試與分析</b></p>

42、<p>  上電測試,LCD1602能夠正確顯示時間和日期,第一次K3按鈕,開始設(shè)置年,再按K1,年減1,按K2,年加1,按二次K3,設(shè)置月,按K1,月減1,按K2,月加1,按三次K3,設(shè)置日,按K1,日減1,按K2,日加1,按四次K3,設(shè)置時,按K1,時減1,按K2,時加1,按五次K3,設(shè)置分,按K1,分減1,按K2,分加1,按第五次,設(shè)置時間完成。鬧鐘設(shè)置,按下K4,開始設(shè)置鬧鐘,按第一次,設(shè)置分,按K1,時減1,按K2

43、,時加1,按第二次設(shè)置分,按K1,分減1,按K2,分加1,設(shè)置好鬧鐘后,按組合鍵K1+K4開啟鬧鐘功能,當?shù)紧[鐘時間后,蜂鳴器響,鬧鐘時間為1分鐘,</p><p>  在對電路測試后,電路達到了所需的功能。</p><p>  通過對電路的多次的反復測試與分析,可以對電路的原理及功能更加熟悉,同時提高了設(shè)計能力及對電路的分析能力,同時在軟件的編程方面得到了更高的提高,對編程能力得到加強,

44、同時對所學的知識得到了大的提高與鞏固。</p><p><b>  八、結(jié)論與心得</b></p><p>  在這學期的課程序設(shè)計中,在收獲知識的同時,還收獲了閱歷,收獲了成熟,在此過程中,我們通過查找大量資料,請教老師,以及不懈的努力,不僅培養(yǎng)了獨立思考、 動手制作的能力,在各種其它能力上也都有了提高。更重要的是,在課程序設(shè)計里,我們學會了很多學習的方法。而這是以

45、后最實用的,真的是受益匪淺。要面 對社會的挑戰(zhàn),只有不斷的學習、實踐,再學習、再實踐。同時在與老師和同學的交流過程中,互動學習,將知識融會貫通,提高自己與人交流的能力,提高自己的團隊意思。老師給我們提出了許多革新非常的好,讓我們能夠有更多的發(fā)揮空間,提高了自己開發(fā)創(chuàng)新的能力。</p><p><b>  九、參考文獻</b></p><p>  [1] 李廣弟兄 朱月

46、秀 冷祖祁,單片機基礎(chǔ)(第3版):北京航航天大學出版社</p><p>  [2] 華成英 童詩白, 模擬電子技術(shù)基礎(chǔ)(第四版):高等教育出版社</p><p>  [3] 康華光,電子技術(shù)基礎(chǔ) 數(shù)字部分(第五版):高等教育出版社</p><p>  [4] 趙建領(lǐng) 薛園園 ,零基礎(chǔ)學單片機C語言程序設(shè)計:機械工業(yè)出版社</p><p>  

47、[5] 樓然苗 李光飛. 單片機課程設(shè)計指導:北京航航天大學出版社</p><p>  [6] 李鳳霞. C語言程序設(shè)計教程(第二版):北京理工大學出版社</p><p>  [7] 趙亮 侯國銳. 單片機C語言編程與實例:人民郵電出版社</p><p>  [8] 張義和 王敏男 許宏昌 余春長 . 例說5單片機(C語言版):人民郵電出版社</p>

48、<p><b>  十、致謝</b></p><p>  感謝學院給我們提供了一個展現(xiàn)自己的舞臺,給我們一次難得煅煉的機會,使得我們的動手能力和專業(yè)技能都有了很大的提高,對本專業(yè)的東西有了更進一步的了解。同時,在做作品的日子里得了彭老師的悉心指導,在此向我們的指導教師致以誠摯的謝意,感謝提供相關(guān)技術(shù)幫助的老師和同學,你們的支持和鼓勵使我們對這次的作品完全有了信心和動力,也給了我們很

49、多無私的幫助和支持,我們在此深表謝意。</p><p><b>  十一、程序清單</b></p><p><b>  程序清單如下:</b></p><p>  #include<reg51.h></p><p>  #include<intrins.h></p>

50、;<p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  sbit LCD_RS = P2^5; //LCD1602指令,數(shù)據(jù)控制端口 </p><p>  sbit LCD_RW = P2^6;//LCD1602讀、寫控制端口

51、</p><p>  sbit LCD_EN = P2^7;//LCD1602使能</p><p>  sbit K1 = P1^0;//K1鍵</p><p>  sbit K2 = P1^1;//K2鍵</p><p>  sbit K3 = P1^2;//K3鍵</p><p>  sbit K4 = P

52、1^3;//K4鍵</p><p>  sbit reset = P2^2;//5腳復位</p><p>  sbit io = P2^1;//6腳IO</p><p>  sbit sclk = P2^0;//7腳時鐘</p><p>  sbit BEEP = P3^7;//蜂鳴器端口</p><p> 

53、 bit flag=1,hour=0,min=0;</p><p>  bit year=0,month=0,day=0;</p><p>  bit bj_flag=0;//報警標志位</p><p>  uchar timecount=0,count=0; </p><p>  uchar str[]="Alarm:"

54、;;</p><p>  uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; </p><p>  uchar init1[] ={0x00,0x00};</p><p>  uchar init2[] ={0x00,0x00,0x12,0x01,0x01,0x01,0x00}; </p><

55、;p>  //秒,分, 時, 日, 月,星期,年,默認時間設(shè)置</p><p>  uchar bj_time[] ={0x00,0x00,0x00}; </p><p><b>  //秒, 分, 時</b></p><p>  uchar code mytab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,

56、0x01,0x00};//小喇叭形狀定義</p><p>  #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};</p><p>  void Set_W1302(uchar addr);</p><p>  void Set_Flash(uchar row,uchar col);</p>

57、<p>  void Set_place(uchar row,uchar col);</p><p>  void Play_nowtime();</p><p>  void key_set(uchar num,uchar row,uchar col );</p><p>  void alarm_time();</p><

58、p>  void Play_alarmtime();</p><p>  void Time_compare();</p><p>  /******************************************************************/</p><p>  /*******************************

59、***********************************/</p><p>  void delay1(int ms)</p><p><b>  {</b></p><p>  unsigned char y;</p><p>  while(ms--)</p><p><b

60、>  {</b></p><p>  for(y = 0; y<250; y++)</p><p><b>  {</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p>

61、<p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b><

62、;/p><p>  /******************************************************************/</p><p>  /* </p><p>  /*檢查LCD忙狀態(tài)

63、 </p><p>  /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。 </p><p>  /* </p><p>

64、  /******************************************************************/</p><p>  bit lcd_busy()</p><p>  { </p><p>  bit result;</p><p>  LCD_RS

65、 = 0;</p><p>  LCD_RW = 1;</p><p>  LCD_EN = 1;</p><p>  delayNOP();</p><p>  result = (bit)(P0&0x80);</p><p>  LCD_EN = 0;</p><p>  retur

66、n(result); </p><p><b>  }</b></p><p>  /*********************************************************/</p><p>  /* </

67、p><p>  /*寫指令數(shù)據(jù)到LCD </p><p>  /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 </p><p>  /* <

68、/p><p>  /*********************************************************/</p><p>  void lcd_wcmd(uchar cmd)</p><p>  { </p><p>  while(lcd_busy());<

69、/p><p>  LCD_RS = 0;</p><p>  LCD_RW = 0;</p><p>  LCD_EN = 0;</p><p><b>  _nop_();</b></p><p><b>  _nop_(); </b></p><p>

70、<b>  P0 = cmd;</b></p><p>  delayNOP();</p><p>  LCD_EN = 1;</p><p>  delayNOP();</p><p>  LCD_EN = 0; </p><p><b>  }</b></p>

71、;<p>  /********************************************************/</p><p>  /* </p><p>  /*寫顯示數(shù)據(jù)到LCD

72、 </p><p>  /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 </p><p>  /* </p><p>  /***************************************

73、*****************/</p><p>  void lcd_wdat(uchar dat)</p><p>  { </p><p>  while(lcd_busy());</p><p>  LCD_RS = 1;</p><p>  LCD_RW

74、= 0;</p><p>  LCD_EN = 0;</p><p><b>  P0 = dat;</b></p><p>  delayNOP();</p><p>  LCD_EN = 1;</p><p>  delayNOP();</p><p>  LCD_EN

75、 = 0; </p><p><b>  }</b></p><p>  /********************************************************/ </p><p>  /* LCD初始化設(shè)定

76、 </p><p>  /********************************************************/</p><p>  void init_lcd()</p>

77、<p><b>  { </b></p><p>  delay1(15); </p><p>  lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容</p><p>  lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)</p><p>  delay1(5

78、);</p><p>  lcd_wcmd(0x38); </p><p>  delay1(5);</p><p>  lcd_wcmd(0x38); </p><p>  delay1(5);</p><p>  lcd_wcmd(0x0c); //顯示開,關(guān)光標</

79、p><p>  delay1(5);</p><p>  lcd_wcmd(0x06); //移動光標</p><p>  delay1(5);</p><p>  lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容</p><p>  delay1(5);</p><p>

80、;<b>  }</b></p><p>  /********************************************************/</p><p><b>  // </b></p><p>  /***********************************************

81、*********/</p><p>  void delay()</p><p><b>  {</b></p><p><b>  uchar j;</b></p><p>  for(j=250;j>0;j--);</p><p><b>  }<

82、/b></p><p>  /*******************************************************/</p><p>  /* </p><p>  /* 寫字符串函數(shù)

83、 </p><p>  /* </p><p>  /*******************************************************/</p><p>  void write_str(uchar

84、 addr,uchar *p)</p><p><b>  {</b></p><p>  uchar i=0; </p><p>  lcd_wcmd(addr);</p><p>  while(p[i]!='\0')</p><p><b>  {</b>

85、;</p><p>  lcd_wdat(p[i]);</p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*************************

86、******************************/</p><p>  /* </p><p>  /* 設(shè)定顯示位置 </p><p>  /*

87、 </p><p>  /*******************************************************/</p><p>  void write_position(uchar row,uchar col)</p><p><b>  {&l

88、t;/b></p><p>  uchar place;</p><p>  if(row==1)</p><p><b>  {</b></p><p>  place=0x80+col-1;</p><p>  lcd_wcmd(place);</p><p>&

89、lt;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  place=0xc0+col-1;</p><p>  lcd_wcmd(place);</p><p><b> 

90、 }</b></p><p><b>  }</b></p><p>  /*******************************************************/</p><p>  /* </p

91、><p>  /*自定義字符寫入CGRAM </p><p>  /* </p><p>  /***************************************************

92、****/</p><p>  void writetab() </p><p><b>  { </b></p><p>  unsigned char i;</p><p>  lcd_wcmd(0x40); //寫CGRAM</p><p>  for (i =

93、0; i< 8; i++) </p><p>  lcd_wdat(mytab[i]); </p><p><b>  }</b></p><p>  /*******************************************************/</p><p><

94、;b>  //</b></p><p>  /*******************************************************/</p><p>  void write_byte(uchar inbyte)</p><p><b>  {</b></p><p><

95、b>  uchar i;</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  sclk=0; //寫的時候低電平改變數(shù)據(jù)</p><p>  if(inbyte&0x01)</p>

96、<p><b>  io=1;</b></p><p><b>  else</b></p><p><b>  io=0; </b></p><p>  sclk=1; //寫的時候高電平,把數(shù)據(jù)寫入ds1302</p><p><b&g

97、t;  _nop_();</b></p><p>  inbyte=inbyte>>1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************************************

98、**************/</p><p>  /********************************************************/</p><p>  uchar read_byte() //sclk的下跳沿讀數(shù)據(jù) </p><p><b>  {</b></p><p&g

99、t;  uchar i,temp=0; </p><p>  io=1; //設(shè)置為輸入口</p><p>  for(i=0;i<7;i++)</p><p><b>  {</b></p><p><b>  sclk=0;</b></p>&l

100、t;p><b>  if(io==1)</b></p><p>  temp=temp|0x80;</p><p><b>  else</b></p><p>  temp=temp&0x7f;</p><p>  sclk=1; //產(chǎn)生下跳沿</p&

101、gt;<p>  temp=temp>>1;</p><p><b>  }</b></p><p>  return (temp);</p><p><b>  }</b></p><p>  /**************************************

102、******************/</p><p>  // 往ds1302的某個地址寫入數(shù)據(jù) </p><p>  /********************************************************/</p><p>  void write_ds1302(uchar cmd,uchar indata)</p>&

103、lt;p><b>  {</b></p><p><b>  sclk=0;</b></p><p><b>  reset=1;</b></p><p>  write_byte(cmd); </p><p>  write_byte(indata);&l

104、t;/p><p><b>  sclk=0;</b></p><p><b>  reset=0;</b></p><p><b>  }</b></p><p>  /********************************************************

105、/</p><p>  // 讀ds1302某地址的的數(shù)據(jù) </p><p>  /********************************************************/</p><p>  uchar read_ds1302(uchar addr)</p><p><b>  {</b>&l

106、t;/p><p>  uchar backdata;</p><p><b>  sclk=0;</b></p><p><b>  reset=1;</b></p><p>  write_byte(addr); //先寫地址</p><p>  backdata=r

107、ead_byte(); //然后讀數(shù)據(jù)</p><p><b>  sclk=0;</b></p><p><b>  reset=0;</b></p><p>  return (backdata);</p><p><b>  }</b></p><p

108、>  /*********************************************************/</p><p><b>  // 設(shè)置初始時間</b></p><p>  /*********************************************************/</p><p> 

109、 void set_ds1302(uchar addr,uchar *p,uchar n) //寫入n個數(shù)據(jù)</p><p><b>  {</b></p><p>  write_ds1302(0x8e,0x00); //寫控制字,允許寫操作</p><p>  for(;n>0;n--)</p><

110、;p><b>  {</b></p><p>  write_ds1302(addr,*p);</p><p><b>  p++;</b></p><p>  addr=addr+2;</p><p><b>  }</b></p><p>  

111、write_ds1302(0x8e,0x80); //寫保護,不允許寫</p><p><b>  }</b></p><p>  /*******************************************************/</p><p>  // 讀取當前時間 </p><p>

112、;  /*******************************************************/</p><p>  void read_nowtime(uchar addr,uchar *p,uchar n)</p><p><b>  {</b></p><p>  for(;n>0;n--)</p>

113、;<p><b>  {</b></p><p>  *p=read_ds1302(addr);</p><p><b>  p++;</b></p><p>  addr=addr+2;</p><p><b>  } </b></p><p

114、><b>  }</b></p><p>  /*******************************************************/</p><p>  // 初始化DS1302</p><p>  /*******************************************************

115、/</p><p>  void init_ds1302()</p><p><b>  {</b></p><p><b>  reset=0;</b></p><p><b>  sclk=0;</b></p><p>  write_ds1302(

116、0x80,0x00); </p><p>  write_ds1302(0x90,0xa6); //一個二極管+4K電阻充電</p><p>  write_ds1302(0x8e,0x80); //寫保護控制字,禁止寫</p><p><b>  }</b></p><p>  /*******************

117、***********************************/ </p><p>  /* 蜂鳴器響一聲 </p&g

118、t;<p>  /******************************************************/</p><p>  void beep()</p><p><b>  {</b></p><p>  unsigned char y;</p><p>  for (y=0;y

119、<100;y++)</p><p><b>  {</b></p><p><b>  delay();</b></p><p>  BEEP=!BEEP; //BEEP取反</p><p><b>  } </b></p>&

120、lt;p>  BEEP=1; //關(guān)閉蜂鳴器</p><p>  delay1(50);</p><p><b>  }</b></p><p>  /**********************************************************/

121、 </p><p>  /* 閃爍函數(shù) </p><p>  /*****************************************

122、*****************/</p><p>  void flash()</p><p><b>  {</b></p><p><b>  if(flag)</b></p><p><b>  {</b></p><p>  write_p

123、osition(1,14);</p><p>  lcd_wdat(':');</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  write_

124、position(1,14);</p><p>  lcd_wdat(0x20);</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*********************************************************

125、*/</p><p><b>  // 主函數(shù)</b></p><p>  /**********************************************************/</p><p>  void main()</p><p><b>  {</b></p>

溫馨提示

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

評論

0/150

提交評論