畢業(yè)設(shè)計---基于單片機的電子鬧鐘的設(shè)計_第1頁
已閱讀1頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于單片機的電子鬧鐘的設(shè)計</p><p>  摘要:本設(shè)計主要為實現(xiàn)一款可正常顯示時鐘/日歷、帶有定時鬧鈴功能的電子鬧鐘。當(dāng)前電子鐘開發(fā)手段采用了較多的分立元器件,不僅占用很大空間而且利用率比較低。單片機是集CPU、RAM、ROM、定時器/計數(shù)器和多種接口于一體的微控制器。 它體積小、成本低、功能強,廣泛應(yīng)用于智能產(chǎn)品和工業(yè)自動化上。本設(shè)計應(yīng)用單片機STC12C5A16AD芯片作為核心,由

2、LCD1602液晶屏顯示,使用DS1302實時時鐘日歷芯片完成時鐘/日歷的基本功能。這種實現(xiàn)方法的優(yōu)點是電路簡單,性能可靠,實時性好,時間精度高,操作簡單,編程容易。 </p><p>  關(guān)鍵詞:電子鬧鐘,單片機,C語言編程</p><p><b>  1 緒論</b></p><p>  單片機是微型機的一個主要分支,就其組成和功能而言

3、,一塊單片機芯片就是一臺計算機。</p><p>  單片機具有如下特點:</p><p>  集成度高、體積小、有很高的可靠性;有優(yōu)異的性能價格比;</p><p><b>  控制功能強;</b></p><p>  低功耗、低電壓,便于生產(chǎn)便攜式產(chǎn)品;</p><p>  外部總線增加了I2

4、C、SPI等串行總線方式,進一步縮小了體積,簡化了結(jié)構(gòu);</p><p>  單片機的系統(tǒng)擴展、系統(tǒng)配置較典型、規(guī)范,容易構(gòu)成各種規(guī)模的應(yīng)用系統(tǒng)。</p><p>  所以單片機的應(yīng)用非常廣泛,在智能儀表、機電一體化、實時控制、分布式多機系統(tǒng)以及人們的生活中均有用武之地。單片機應(yīng)用的重要意義還在于,它從根本上改變了傳統(tǒng)的控制系統(tǒng)設(shè)計思路和設(shè)計方法。從前必須由模擬電路或數(shù)字電路實現(xiàn)的大部分功

5、能,現(xiàn)在已能用單片機通過軟件方法來實現(xiàn)了。這種用軟件代替硬件的控制技術(shù),是對生產(chǎn)控制技術(shù)的一次革命。</p><p>  利用單片機的智能性,可方便地實現(xiàn)具有智能的電子鐘設(shè)計。單片機均具有時鐘振蕩系統(tǒng),利用系統(tǒng)時鐘借助微處理器的定時器/計數(shù)器可實現(xiàn)電子鐘功能。然而系統(tǒng)時鐘誤差較大,電子鐘的積累誤差也可能較大,所以可以通過誤差修正軟件加以修正,或者在設(shè)計中加入高精度時鐘日歷芯片,以精確時間。另外很多功能不同的單片機

6、是兼容的,這就更便于實現(xiàn)產(chǎn)品的多功能性。由于單片機具有貨源充足、價格低廉,可軟硬件結(jié)合使用,能夠較方便的實現(xiàn)系統(tǒng)的多功能性,性價比高等諸多優(yōu)點,故采用單片機作為本設(shè)計的硬件基礎(chǔ)。</p><p>  2 基于單片機的電子鬧鐘硬件設(shè)計</p><p>  2.1 IC芯片選擇</p><p>  2.1.1微處理器選擇</p><p>  

7、STC12 系列單片機簡要介紹:</p><p>  1. STC12系列單片機為增強型 8051 芯片,1T,單時鐘/ 機器周期,指令代碼完全兼容傳統(tǒng)8051單片機。2. 工作電壓: STC12C5410AD 系列工作電壓:5.5V - 3.8V(5V 單片機)/3.8V - 2.4V(3V 單片機)STC12C2052AD 系列工作電壓:5.5V - 3.4V(5V 單片機)/3.8V - 2

8、.4V(3V 單片機,可到2V)3. 工作頻率范圍:0 - 35 MHz,相當(dāng)于普通8051 的 0~420MHz.實際工作頻率可達48MHz4. 用戶應(yīng)用程序空間12K / 10K / 8K / 6K / 4K / 2K / 1K 字節(jié)5. 片上集成 512 字節(jié) RAM(STC12C5410AD 系列), STC12C2052AD 系列單片機為256 字節(jié)RAM6. 通用I/O 口(27/23/15 個),復(fù)位后為: 準雙向

9、口/ 弱上拉(普通8051 傳統(tǒng)I/O 口)可設(shè)置成四種模式:準雙向口/ 弱上拉,推挽/ 強上拉,僅為輸入/ 高阻,開漏每個I/O 口驅(qū)動能力均可達到20mA,但整個芯片最大不得超過55mA7. ISP</p><p>  圖2.1 STC12C5A16AD芯片PDIP封裝引腳圖</p><p>  2.1.2 常用時鐘日歷芯片比較</p><p>  在電

10、子鬧鐘設(shè)計中,常用的實時時鐘芯片有DS12887、DS1216、DS1643、DS1302。每種芯片的主要時鐘功能基本相同,只是在引腳數(shù)量、備用電池的安裝方式、計時精度和擴展功能等方面略有不同。DS12887與DS1216芯片都有內(nèi)嵌式鋰電池作為備用電池; X1203引腳少,沒有嵌入式鋰電池,跟DS1302芯片功能相似,只是相比較之下,X1203與AT89S51搭配使用時占用I/O口較多。DS1643為帶有全功能實時時鐘的8K×

11、;8非易失性SRAM,集成了非易失性SRAM、實時時鐘、晶振、電源掉電控制電路和鋰電池電源,BCD碼表示的年、月、日、星期、時、分、秒,帶閏年補償。同樣,DS1643擁有28只管腳,硬件連接起來占用微處理器I/O口較多,不方便系統(tǒng)功能拓展和維護。故而從性價比和貨源上考慮,本設(shè)計采用實時時鐘日歷芯片DS1302。</p><p>  2.1.3 DS1302簡介</p><p>  DS1

12、302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘日歷芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小于31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。有主電源和備份電源雙引

13、腳,而且備份電源可由大容量電容(>1F)來替代。此外,DS1302需要使用32.768KHz的晶振。</p><p>  2.1.4 DS1302引腳說明</p><p>  DS1302引腳圖參照圖2.2。</p><p>  圖2.2 DS1302芯片引腳圖</p><p>  其引腳功能參照表2.1。</p><p

14、>  表2.1 DS1302引腳功能說明</p><p>  2.1.5 DS1302控制字說明</p><p>  在編程過程中要注意DS1302的讀寫時序。DS1302是SPI總線驅(qū)動方式。它不僅要向寄存器寫入控制字,還需要讀取相應(yīng)寄存器的數(shù)據(jù)。要想與DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如表2.2。</p><p>  

15、表2.2 DS1302控制字(即地址及命令字節(jié))</p><p>  控制字的作用是設(shè)定DS1302的工作方式、傳送字節(jié)數(shù)等。每次數(shù)據(jù)的傳輸都是由控制字開始??刂谱指魑坏暮x和作用如下:</p><p>  BIT7:控制字的最高有效位,必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p>  BIT 6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為

16、1表示存取RAM數(shù)據(jù);</p><p>  BIT 5至BIT 1(A4~A0):用A4~A0表示,定義片內(nèi)寄存器和RAM的地址。</p><p><b>  定義如下:</b></p><p>  當(dāng)BIT 6位=0時,定義時鐘和其他寄存器的地址。A4~A0=0~6,順序為秒、分、時、日、月、星期、年的寄存器。當(dāng)A4~A0=7,為芯片寫保護寄

17、存器地址。當(dāng)A4~A0=8,為慢速充電參數(shù)選擇寄存器。當(dāng)A4~A0=31,為時鐘多字節(jié)方式選擇寄存器。</p><p>  當(dāng)BIT 6=1時,定義RAM的地址,A4~A0=0~30,對應(yīng)各子地址的RAM,地址31對應(yīng)的是RAM多字節(jié)方式選擇寄存器。</p><p>  4.BIT 0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p> 

18、 2.2 電子鬧鐘硬件電路設(shè)計</p><p>  電子鬧鐘至少要包括秒信號發(fā)生器、時間顯示電路、按鍵電路、供電電源、鬧鈴指示電路等幾部分。硬件電路框圖參照圖2.3。</p><p>  該系統(tǒng)使用STC12C5A16AD單片機作為核心,通過讀取時鐘日歷芯片DS1302的數(shù)據(jù),完成此電子鬧鐘的主要功能——時鐘/日歷。使用LCD1602液晶屏顯示。 </p><p&

19、gt;  圖2.3 電子鬧鐘硬件系統(tǒng)框圖</p><p>  鍵盤是為了完成時鐘/日歷的校對和顯示功能。由于此電子鬧鐘要求具有鬧鈴功能,所以設(shè)計有鬧鈴電路,進行聲音響鈴。</p><p>  鬧鈴電路中的鬧鈴音樂可以直接采用蜂鳴器鬧鈴,如當(dāng)前時刻與鬧鈴時間相同,單片機向蜂鳴器送出高電平,蜂鳴器發(fā)聲。采用蜂鳴器鬧鈴結(jié)構(gòu)簡單,控制方便,但是發(fā)出的鬧鈴聲音單一。也可以在編程的時候編寫一段音樂程序

20、,待鬧鈴時間到時,調(diào)用該音樂程序給揚聲器,便響起音樂。不過該方法只能做一些簡單音樂,并且音樂程序會占用很多單片機存儲資源。但鬧鈴的音樂不是本設(shè)計中的重點,故采用最簡單的方法,占用單片機一根I/O口。</p><p>  整個電路只使用了一種電源,+5V電源將為整個電路供電。DS1302沒有備用電源。當(dāng)+5V電源被切斷后, DS1302不能繼續(xù)工作。當(dāng)+5V電源恢復(fù)供電,因為斷電使系統(tǒng)復(fù)位到初始化時間,需要重新校時

21、。具體電路圖如下:</p><p>  3 基于單片機的電子鬧鐘軟件設(shè)計</p><p>  單片機可以應(yīng)用匯編語言和C語言進行編程。,匯編語言與機器指令一一對應(yīng)所以用匯編語言編寫的程序在單片機里運行起來效率較高。C語言程序可讀性高,更便于理解。本設(shè)計使用C語言編程。</p><p>  3.1 主程序設(shè)計</p><p>  第一次上電

22、,系統(tǒng)先進行初始化, LCD顯示初始時間并開始走時。單片機依次開始調(diào)用鍵盤掃描子程序、DS1302子程序、鬧鈴子程序,經(jīng)過延時,返回程序開頭循環(huán)運行。</p><p>  主程序流程圖如圖3.1。</p><p>  圖3.1 多功能電子鐘主程序流程圖</p><p><b>  3.2子程序設(shè)計</b></p><p>

23、;  3.2.1實時時鐘日歷子程序設(shè)計</p><p>  該程序主要實現(xiàn)對DS1302寫保護、充電,對年、月、日、時、分、秒等寄存器的讀寫操作。在讀寫操作子程序中都執(zhí)行了關(guān)中斷指令,因為在串行通信時對時序要求比較高,而且在此是用I/O口軟件模擬串行時鐘脈沖,所以在通信過程中最好保證傳輸?shù)倪B續(xù)性,不要允許中斷。其流程圖如圖3.2。</p><p>  圖3.2 實時時鐘日歷子程序流程圖&l

24、t;/p><p>  DS1302每次上電時自動處于暫停狀態(tài),必須把秒寄存器的位7置位0,時鐘才開始計時。如果DS1302一直沒有掉電,則不存在此問題。</p><p>  在進行寫操作時,需要先解除寫保護寄存器的“禁止”狀態(tài)。當(dāng)用多字節(jié)模式進行操作時,必須寫夠8字節(jié)。</p><p>  3.2.2顯示子程序設(shè)計</p><p>  在單片機系

25、統(tǒng)中應(yīng)用晶液顯示器作為輸出器件有以下幾個優(yōu)點:顯示質(zhì)量高;數(shù)字式接口;體積小、重量輕;功耗低。液晶顯示的原理是利用液晶的物理特性,通過電壓對其顯示區(qū)域進行控制,有電就有顯示,這樣即可以顯示出圖形。液晶顯示器具有厚度薄、適用于大規(guī)模集成電路直接驅(qū)動、易于實現(xiàn)全彩色顯示的特點,目前已經(jīng)被廣泛應(yīng)用在便攜式電腦、數(shù)字攝像機、PDA移動通信工具等眾多領(lǐng)域。</p><p>  LCD1602是一種專門用來顯示字母、數(shù)字、符

26、號等的點陣型液晶模塊,它由32個5*8點陣字符位組成,每一個點陣字符位都可以顯示一個字符,但是它不能顯示圖形。模塊內(nèi)部自帶有160個5*8點陣字型的字符發(fā)生器CHROM和8個可由用戶自定義的5*8的字符發(fā)生器CGRAM。</p><p>  圖3.4 顯示子程序流程圖</p><p>  3.2.3鍵盤掃描子程序</p><p>  單片機對鍵盤掃描的方法有隨機掃描

27、方式、定時掃描方式和中斷掃描方式。</p><p>  在隨機掃描方式中,CPU完成某特定任務(wù)后,即執(zhí)行鍵盤掃描程序,以確定鍵盤有無按鍵輸入,然后根據(jù)按鍵功能轉(zhuǎn)去執(zhí)行相應(yīng)的操作。在執(zhí)行鍵盤按鍵規(guī)定的功能中不理睬鍵盤輸入。</p><p>  定時掃描方式與隨機掃描方式基本相同,只是利用CPU內(nèi)的定時中斷,每隔一定時間掃描有無按鍵被按下,鍵盤反應(yīng)速度較快,在處理按鍵功能過程中,可以通過鍵盤命

28、令進行干預(yù),如取消、暫停等操作。</p><p>  前兩種掃描方式均會占用CPU大量時間。不管有沒有鍵入操作,CPU總要在一定的時間內(nèi)進行掃描,這對于單片機控制系統(tǒng)是很不利的。</p><p>  單片機掃描完鍵盤,得到鍵值,并根據(jù)鍵值轉(zhuǎn)入執(zhí)行對應(yīng)任務(wù),以實現(xiàn)按鍵功能。如果沒有按鍵按下,則程序掃描到Key=FFH,將鍵值Key清零,返回主程序。程序流程如圖3.5。</p>

29、<p>  圖3.5鍵盤掃描子程序</p><p>  3.2.4鬧鈴子程序設(shè)計</p><p>  鬧鈴子程序最主要的任務(wù)是不斷用時鐘分(min)與時(hour)同設(shè)定的鬧鈴分(clk_min)與鬧鈴時(clk_hour)比較,只要滿足min等于clk_min、hour等于clk_hour,響鈴啟動一段時間,并根據(jù)外部按鍵執(zhí)行相應(yīng)任務(wù)。該程序流程圖參見圖3.6。</p&g

30、t;<p>  圖3.6 鬧鈴子程序流程圖</p><p><b>  4 系統(tǒng)調(diào)試</b></p><p>  調(diào)試工作分硬件調(diào)試和軟件調(diào)試兩部分,調(diào)試方法介紹如下:</p><p>  首先,硬件調(diào)試主要是先搭建硬件平臺,然后利用萬用表等工具對電路檢查,最后應(yīng)用程序進行功能調(diào)試。硬件調(diào)試比較費時,需要細心和耐心,也需要熟練掌

31、握電路原理。</p><p>  然后,軟件調(diào)試可以直接應(yīng)用一些編輯或仿真軟件進行,比如單片機C51編輯軟件Keil。該軟件提供了一個集成開發(fā)環(huán)境uVision,它包括C編輯器、宏編輯器、連接器、庫管理和一個功能強大的仿真調(diào)試器。通過編譯、運行,可以檢查程序錯誤。但應(yīng)用此方法,仍需要十分了解所使用元器件的工作方式和管腳連接方式。在軟件調(diào)試過程中要仔細耐心,即便是多寫或少些一兩個字符,都無法編譯成功。還有一種方式,

32、即應(yīng)用仿真軟件搭建電路的軟件平臺,再導(dǎo)入程序進行仿真調(diào)試。如果電路出錯,可以在計算機上方便的修改電路,程序出錯可以重新編輯程序,這種方法節(jié)時、省力,經(jīng)濟、方便。</p><p>  總之,調(diào)試過程是一個軟硬件相結(jié)合調(diào)試的過程,硬件電路是基礎(chǔ),軟件是檢測硬件電路和實現(xiàn)其功能的關(guān)鍵。</p><p>  4.1 硬件調(diào)試計</p><p>  4.1.1單片機基礎(chǔ)電路

33、調(diào)試</p><p>  單片機基礎(chǔ)電路包括電源、單片機、外部時鐘震蕩電路、復(fù)位電路和外部接口電路。調(diào)試過程需要注意以下幾點:</p><p>  1. 檢查電源是否完好。</p><p>  2. 單片機電源要連接正確,并且保證AT89C51的31號引腳接高電平。AT89C51的31號引腳是外部程序存儲器選擇信號端,當(dāng)該引腳為高電平時,單片機會一直從片內(nèi)程序存儲器

34、內(nèi)取指令。</p><p>  3. 如果使用P0口做I/O口,要接上拉電阻。</p><p>  4. 使用萬用表排查電路中是否存在斷路或者短路情況。筆者在制作外部接口電路時使用的是排針,焊接時容易出現(xiàn)管腳之間短路,所以在上電以前必須先排查電路。</p><p>  5. 對LCD1602顯示屏的調(diào)試,旋動與芯片第三管腳相連的變阻器到顯示屏出現(xiàn)欲顯示的內(nèi)容,并將其

35、調(diào)清晰即可。</p><p>  4.1.2 DS1302電路調(diào)試</p><p>  該電路包含DS1302芯片、主電源、備用電源、晶振等部分。在與單片機連接的過程中需要注意以下幾點:</p><p>  清楚DS1302與單片機連接的管腳。本設(shè)計定義為:DS1302的SCLK連接P1.5,I/O連接P1.6,RST連接P1.7。</p><p

36、>  注意電源正負極連接。</p><p>  DS1302接32.768KHz的晶振。該晶振體型比較小,在焊接時要小心,注意不要將晶振引腳弄斷。同時也要盡量使晶振離DS1302的X1、X2引腳近距離焊接。</p><p>  編寫DS1302的時鐘/日歷程序,只要求能夠正確顯示時間。燒錄進單片機,檢查電路電源正負極連接是否正確,檢查P1.0和P1.1引腳接線是否正確。檢查無誤后可以

37、上電檢查。</p><p><b>  4.2 軟件調(diào)試</b></p><p>  在硬件調(diào)試完畢的基礎(chǔ)上,需要進一步完善程序,也就是進入軟件調(diào)試階段。在本設(shè)計中,軟件調(diào)試主要分兩大部分:實時時鐘日歷子程序調(diào)試、按鍵子程序調(diào)試。將這兩部分調(diào)試成功,那么整個設(shè)計的軟件部分也就基本完成了。關(guān)于這兩部分的調(diào)試只需要在主程序中分別調(diào)用這兩部分程序即可,此處不再贅述。<

38、;/p><p><b>  結(jié)論</b></p><p>  基于單片機實現(xiàn)電子鬧鐘,僅僅是眾多方法之一。并且市場上的實時時鐘日歷芯片品類繁多,IC化的傳感器各種各樣,顯示方式也愈趨于人性化。所以多功能電子鬧鐘有多種實現(xiàn)方案,能夠?qū)崿F(xiàn)的功能也很多,筆者已經(jīng)通過仿真和調(diào)試,實現(xiàn)了時間日歷顯示和校對、鬧鈴等功能。本文采用51單片機C語言進行編程,當(dāng)然也可以應(yīng)用匯編語言編程。由

39、于筆者能力有限,提供的程序還可以進一步優(yōu)化,并且還可以根據(jù)需求為電子鬧鐘增設(shè)新功能。</p><p><b>  致謝</b></p><p>  本課題在選題及研究過程是在XX老師的親切關(guān)懷和悉心指導(dǎo)下完成的。他嚴肅的科學(xué)態(tài)度,嚴謹?shù)闹螌W(xué)精神,精益求精的工作作風(fēng),深深地感染和激勵著我。從課題的選擇到項目的最終完成,XX老師都始終給予我細心的指導(dǎo)和不懈的支持。XX老師

40、不僅在學(xué)業(yè)上給我以精心指導(dǎo),同時還在思想、生活上給我以無微不至的關(guān)懷,在此謹向XX老師致以誠摯的謝意和崇高的敬意。還要感謝幫助過我的同學(xué)們,他們的陪伴讓這將近半載的時光充滿色彩!</p><p><b>  參考文獻</b></p><p>  王東峰等.單片機C語言應(yīng)用100例[M].電子工業(yè)出版社,2009。</p><p>  周仲. 國

41、產(chǎn)集成電路應(yīng)用500例[M]. 北京:電子工業(yè)出版社, 1992.104-108。</p><p>  夏繼強. 單片機實驗與實踐教程[M]. 北京:北京航空航天大學(xué)出版社,2001.78-83。</p><p>  Daniel J Pack and  Steven F Barrett Microcontroller Theory and Applications:

42、 HC12 and S12[M] Prentice Hall 2007.</p><p>  Dogan Ibrahim Microcontroller Based Apllied digital control[M] John Wiley and Sons Australia 2003.</p><p>  Steven F. Barrett, Daniel Pack Atmel

43、 AVR Microcontroller Primer[M] Morgan & Claypool Publishers 2007-12-15.</p><p>  Title The design of the electric clock based on single chip</p><p><b>  Abstract</b></p>

44、<p>  This design is mainly for realizing a electronic clock with regular alarm function that can display properly clock/calendar. The current digital electronic clock with a greater amount of discrete components,

45、 not only occupied large space and low utilization ratio. Microcontroller is a CPU, RAM, ROM, timer / counter and a variety of interfaces in one of the micro-controller. Its small size, low cost, powerful, widely used in

46、 smart products and industrial automation. This design apply STC12C5A16AD</p><p>  Keywords electronic clock, microcontroller, C programming language</p><p><b>  部分重要程序</b></p&

47、gt;<p>  函 數(shù) 申 明</p><p>  void delay_us(uchar x); //延時 2 * x + 5 us</p><p>  void delay_ms(uint z); //延時任意Ms</p><p>  void DS1302_writebyte(uchar

48、writebyte); //往DS1302寫一個字節(jié)</p><p>  uchar DS1302_readbyte(); //往DS1302讀一個字節(jié)</p><p>  uchar DS1302_read(uchar DS1302_add); //往DS1302指定地址讀數(shù)據(jù)</p><p>  void DS13

49、02_write(uchar DS1302_add,uchar DS1302_data); //往DS1302指定地址寫數(shù)據(jù)</p><p>  void DS1302_init(); //DS1302初始化函數(shù)</p><p>  void DS1302_set_time(); //設(shè)置時間 </p><p

50、>  void DS1302_read_time(); //讀取時間</p><p>  void LCD1602_send_byte(uchar LCD1602_data); //往LCD1602發(fā)送一個字節(jié)</p><p>  void LCD1602_write_com(uchar LCD1602_data); //往LCD

51、1602寫命令</p><p>  void LCD1602_write_data(uchar LCD1602_data); //往LCD1602寫數(shù)據(jù)</p><p>  void week(uchar week); //星期代碼</p><p>  void LCD1602_init(); //液晶

52、初始化函數(shù)</p><p>  void keyscan() ; //鍵盤掃描</p><p>  void keyscan_waibu(); //進入外部中斷的鍵盤掃描,用于設(shè)定時間</p><p>  void keyscan_nz();

53、 //進入鬧鐘掃描按鍵,用于鬧鐘設(shè)置</p><p>  void LCD1602_write_time(); //往液晶寫入時間參數(shù)</p><p>  void nz_jc(); //鬧鐘檢測函數(shù)</p><p>  外 部 中 斷 0 程 序</p><p>

54、;  //功能:按鍵觸發(fā),對時間進行調(diào)節(jié)</p><p>  void int0() interrupt 0 //外部中斷0程序</p><p>  EX0=0; //進入中斷后關(guān)外部中斷開關(guān)</p><p>  wbzd=0;

55、 //循環(huán)控制變量</p><p>  DS1302_read_time();</p><p>  DS1302_write(0x8e,0x00); //關(guān)寫保護</p><p>  DS1302_write(0x80,0x80); //關(guān)時間</p

56、><p>  DS1302_write(0x8e,0x80); //開寫保護</p><p>  LCD1602_write_com(0x01); //清除顯示</p><p>  LCD1602_write_time();//將時間參數(shù)寫入液晶</p&g

57、t;<p>  while(!wbzd)</p><p>  keyscan_waibu(); //進入外部中斷的鍵盤掃描,用于設(shè)定時間</p><p>  EX0=1;//中斷函數(shù)結(jié)束時再開外部中斷開關(guān)</p><p>  定 時 器 0 程 序</p><p>  //功能:,用于判斷按鍵被按下的時間,時間按鍵的

58、多功能</p><p>  void time0() interrupt 1 //定時器0程序</p><p>  TH0+=0xd8;</p><p>  TL0+=0xf0;//10ms溢出進入中斷</p><p><b>  t0</b></p><p><b>  定時

59、器 1 程序</b></p><p>  //功能:鬧鐘到了,蜂鳴器響一分鐘</p><p>  void time1() interrupt 3</p><p>  TH1+=0x3c;</p><p>  TL1+=0xb0;</p><p><b>  t1</b></p&

60、gt;<p>  if(t1==1200)</p><p><b>  t1=0;</b></p><p><b>  TR1=0;</b></p><p><b>  TH1=0x3c;</b></p><p><b>  TL1=0xb0;</

61、b></p><p><b>  fm=0;</b></p><p>  us 級 延 時 函 數(shù) </p><p>  //功能:延時任意微秒,理論上7~515us</p><p>  void delay_us(uchar x) //延時 2 * x + 5 us</p><p>  

62、while(--x);//實現(xiàn)精準延時,us級別</p><p>  ms 級 延 時 函 數(shù) </p><p>  //功能:延時任意毫秒,理論上1~65535ms</p><p>  void delay_ms(uint z)//延時任意Ms</p><p><b>  uint x,y;</b></

63、p><p>  for(x=z;x>0;x--)</p><p>  for(y=123;y>0;y--);</p><p>  鬧 鐘 檢 測 函 數(shù)</p><p>  //功能:檢測鬧鐘設(shè)的參數(shù)是否是此時時間參數(shù)相同的,相同的話驅(qū)動蜂鳴器響1分鐘</p><p>  void nz_jc()</p&

64、gt;<p>  if((naozhong==1)&&(nz_xingqi==xingqi)&&(nz_shi==shi)&&(nz_fen==fen)&&(nz_miao==miao))</p><p>  fm=1; TR1=1;</p><p>  DS1302 的 初

65、 始 化 </p><p>  //功能:上電時對時鐘芯片DS1302里面的數(shù)據(jù)全部清零</p><p>  void DS1302_init() //DS1302 的 初 始 化,將所有參數(shù)全清零</p><p>  DS1302_write(0x8e,0x00); //關(guān)寫保護</p><p>  DS1302_w

66、rite(0x80,0x80); //關(guān)時間</p><p>  DS1302_write(0x80,0x00);</p><p>  DS1302_write(0x82,0x00);</p><p>  DS1302_write(0x84,0x00);</p><p>  DS1302_write(0x86,0x00);</p&g

67、t;<p>  DS1302_write(0x88,0x00);</p><p>  DS1302_write(0x8a,0x00);</p><p>  DS1302_write(0x8c,0x00);</p><p>  DS1302_write(0x80,0x00); //開時間</p><p>  DS1302_w

68、rite(0x8e,0x80); //開寫保護</p><p>  LCD1602 液 晶 初 始 化 函 數(shù) </p><p>  //功能:初始化液晶</p><p>  void LCD1602_init() //LCD1602液晶初始化函數(shù)</p><p>  LCD1602_write_com(0x01);

69、 //清除顯示</p><p>  LCD1602_write_com(0x02); //地址位歸零</p><p>  LCD1602_write_com(0x0c); //開顯關(guān)游標</p><p>  LCD1602_write_com(0x06);

70、 //光標移動方向</p><p>  LCD1602_write_com(0x30); //基本功能設(shè)定</p><p>  DS1302 讀 取 時 間</p><p>  //功能:讀取時鐘芯片DS1302的時間參數(shù)</p><p>  void DS1302_read_time()

71、 //讀取時間</p><p>  miao =DS1302_read(0x81);</p><p>  fen =DS1302_read(0x83);</p><p>  shi =DS1302_read(0x85);</p><p>  ri =DS1302_read(0

72、x87);</p><p>  yue =DS1302_read(0x89);</p><p>  xingqi=DS1302_read(0x8b);</p><p>  nian =DS1302_read(0x8d);</p><p>  LCD1602 顯 示 時 間 參 數(shù) </p><p>  //功能:

73、將DS1302讀取回來的時間參數(shù)送到液晶上顯示</p><p>  void LCD1602_write_time()</p><p>  LCD1602_write_com(0x80);</p><p>  LCD1602_write_data('2');</p><p>  LCD1602_write_data('

74、0');</p><p>  LCD1602_write_data((nian>>4)+0x30);</p><p>  LCD1602_write_data((nian&0x0f)+0x30);</p><p>  LCD1602_write_data(0xc4);</p><p>  LCD1602_write

75、_data(0xea); //“年”</p><p>  LCD1602_write_data((yue>>4)+0x30);</p><p>  LCD1602_write_data((yue&0x0f)+0x30);</p><p>  LCD1602_write_data(0xd4);</p

76、><p>  LCD1602_write_data(0xc2); //“月”</p><p>  LCD1602_write_data((ri>>4)+0x30);</p><p>  LCD1602_write_data((ri&0x0f)+0x30);</p><p>  LC

77、D1602_write_data(0xc8);</p><p>  LCD1602_write_data(0xd5); //“日”</p><p>  LCD1602_write_data(' ');</p><p>  LCD1602_write_data(' ');</p&g

78、t;<p>  LCD1602_write_com(0x90);</p><p>  week(xingqi);</p><p>  if(naozhong==0)</p><p>  LCD1602_write_data(' ');</p><p>  LCD1602_write_data(' '

79、;);</p><p><b>  else</b></p><p>  LCD1602_write_data(0x06);</p><p>  LCD1602_write_data(' ');</p><p>  LCD1602_write_data((shi>>4)+0x30);</

80、p><p>  LCD1602_write_data((shi&0x0f)+0x30);</p><p>  LCD1602_write_data(0xa1);</p><p>  LCD1602_write_data(0xc3);</p><p>  LCD1602_write_data((fen>>4)+0x30);<

81、;/p><p>  LCD1602_write_data((fen&0x0f)+0x30);</p><p>  LCD1602_write_data(0xa1);</p><p>  LCD1602_write_data(0xc3);</p><p>  LCD1602_write_data((miao>>4)+0x30);

82、</p><p>  LCD1602_write_data((miao&0x0f)+0x30);</p><p>  LCD1602_write_data(' ');</p><p>  LCD1602_write_data(' ');</p><p>  進 入 鬧 鐘 設(shè) 置 后 的 鍵 盤 掃 描

83、 </p><p>  //功能:主程序的鍵盤掃描進入到鬧鐘設(shè)置選項后,對鬧鐘的參數(shù)進行調(diào)節(jié)設(shè)置</p><p>  void keyscan_nz() //進入鬧鐘掃描按鍵,用于鬧鐘設(shè)置</p><p><b>  uchar j;</b></p><p><b>  P3=0xff;</b>

84、</p><p>  if(P3!=0xff)</p><p>  delay_ms(10);</p><p><b>  EX0=0;</b></p><p>  if(KEY0==0)</p><p>  delay_ms(10);</p><p>  while(KE

85、Y0==0);</p><p>  delay_ms(10);</p><p><b>  nz=1;</b></p><p><b>  j=0;</b></p><p><b>  EX0=1;</b></p><p>  if(KEY1==0)&l

86、t;/p><p>  delay_ms(10);</p><p>  while(KEY1==0);</p><p>  delay_ms(10);</p><p><b>  switch(j)</b></p><p>  case 1:naozhong=~naozhong; </p>

87、<p>  if(naozhong==1)</p><p>  LCD1602_write_data(0xbf);</p><p>  LCD1602_write_data(0xaa); </p><p><b>  else</b></p><p>  LCD1602_write_data(0xb9);&l

88、t;/p><p>  LCD1602_write_data(0xd8);</p><p>  LCD1602_write_com(0x85);break; case 2:nz_xingqi--;</p><p>  if(nz_xingqi<0) </p><p>  nz_xingqi=6;</p>

89、<p>  if(nz_xingqi>6) </p><p>  nz_xingqi=0;</p><p>  week(nz_xingqi);</p><p>  LCD1602_write_com(0x90);</p><p><b>  break;</b></p><p>

90、  case 3:nz_shi--;</p><p>  if(nz_shi<0) </p><p>  nz_shi=23;</p><p>  if(nz_shi>23) </p><p><b>  nz_shi=0;</b></p><p>  LCD1602_write_da

91、ta(nz_shi/10+0x30);</p><p>  LCD1602_write_data(nz_shi%10+0x30);</p><p>  LCD1602_write_com(0x92);</p><p><b>  break;</b></p><p>  case 4:nz_fen--;</p>

92、;<p>  if(nz_fen<0) </p><p>  nz_fen=59;</p><p>  if(nz_fen>59) </p><p><b>  nz_fen=0;</b></p><p>  LCD1602_write_data(nz_fen/10+0x30);</p&g

93、t;<p>  LCD1602_write_data(nz_fen%10+0x30);</p><p>  LCD1602_write_com(0x94);</p><p><b>  break;</b></p><p>  case 5:nz_miao--;</p><p>  if(nz_miao&l

94、t;0) </p><p>  nz_miao=59;</p><p>  if(nz_miao>59) </p><p>  nz_miao=0;</p><p>  LCD1602_write_data(nz_miao/10+0x30);</p><p>  LCD1602_write_data(nz_mia

95、o%10+0x30);</p><p>  LCD1602_write_com(0x96);</p><p><b>  break;</b></p><p>  default :break;</p><p><b>  return ;</b></p><p>  if(

96、KEY2==0)</p><p>  delay_ms(10);</p><p>  while(KEY2==0);</p><p>  delay_ms(10);</p><p><b>  j</b></p><p>  if(j==8) j=1;</p><p> 

97、 switch(j) //開光標并跳到那一位,等待用戶設(shè)定參數(shù)</p><p>  case 1:LCD1602_write_com(0x85);</p><p>  LCD1602_write_com(0x0f);</p><p><b>  break;</b></p><p>  case 2:LCD

98、1602_write_com(0x90);</p><p>  LCD1602_write_com(0x0f);</p><p><b>  break;</b></p><p>  case 3:LCD1602_write_com(0x92);</p><p>  LCD1602_write_com(0x0f);<

99、;/p><p><b>  break;</b></p><p>  case 4:LCD1602_write_com(0x94);</p><p>  LCD1602_write_com(0x0f);</p><p><b>  break;</b></p><p>  cas

100、e 5:LCD1602_write_com(0x96);</p><p>  LCD1602_write_com(0x0f);</p><p><b>  break;</b></p><p>  default :break;</p><p><b>  return ;</b></p>

101、;<p>  if(KEY3==0)</p><p>  delay_ms(10);</p><p>  while(KEY3==0);</p><p>  delay_ms(10);</p><p><b>  switch(j)</b></p><p>  case 1:naoz

102、hong=~naozhong; </p><p>  if(naozhong==1)</p><p>  LCD1602_write_data(0xbf);</p><p>  LCD1602_write_data(0xaa); </p><p><b>  else</b></p><p>  

103、LCD1602_write_data(0xb9);</p><p>  LCD1602_write_data(0xd8);</p><p>  LCD1602_write_com(0x85);</p><p><b>  break;</b></p><p>  case 2:nz_xingqi++;</p>

104、<p>  if(nz_xingqi<0) </p><p>  nz_xingqi=6;</p><p>  if(nz_xingqi>6) </p><p>  nz_xingqi=0;</p><p>  week(nz_xingqi);</p><p>  LCD1602_write_

105、com(0x90);</p><p><b>  break;</b></p><p>  case 3:nz_shi++;</p><p>  if(nz_shi<0) </p><p>  nz_shi=23;</p><p>  if(nz_shi>23) </p>

106、<p><b>  nz_shi=0;</b></p><p>  LCD1602_write_data(nz_shi/10+0x30);</p><p>  LCD1602_write_data(nz_shi%10+0x30);</p><p>  LCD1602_write_com(0x92);</p><p

107、><b>  break;</b></p><p>  case 4:nz_fen++;</p><p>  if(nz_fen<0) </p><p>  nz_fen=59;</p><p>  if(nz_fen>59) </p><p><b>  nz_fen

108、=0;</b></p><p>  LCD1602_write_data(nz_fen/10+0x30);</p><p>  LCD1602_write_data(nz_fen%10+0x30);</p><p>  LCD1602_write_com(0x94);</p><p><b>  break;</b

109、></p><p>  case 5:nz_miao++;</p><p>  if(nz_miao<0) </p><p>  nz_miao=59;</p><p>  if(nz_miao>59) </p><p>  nz_miao=0;</p><p>  LCD16

110、02_write_data(nz_miao/10+0x30);</p><p>  LCD1602_write_data(nz_miao%10+0x30);</p><p>  LCD1602_write_com(0x96);</p><p><b>  break;</b></p><p>  default :bre

溫馨提示

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

評論

0/150

提交評論