單片機(jī)課程設(shè)計(jì)—帶有l(wèi)cd的定時(shí)鬧鐘_第1頁
已閱讀1頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  設(shè)計(jì)總說明</b></p><p>  這次課程設(shè)計(jì)的任務(wù)是是利用MCS51系列單片外加必要的輔助電路從而設(shè)計(jì)一個(gè)帶有LCD顯示的定時(shí)鬧鐘。</p><p>  該鬧鐘應(yīng)具有的功能是:當(dāng)定時(shí)鬧鐘到了人為設(shè)定好的時(shí)間后,它就發(fā)出聲音,并且在LCD顯示器上顯示出你所設(shè)定的鬧鐘時(shí)間以及當(dāng)前時(shí)間,并能夠隨時(shí)調(diào)整時(shí)間。</p><

2、;p>  本課設(shè)所用器件有:AT89C52單片機(jī)、LCD顯示器(LM016L)、上拉電阻(Respack-8)、晶振電路、復(fù)位電路(帶有復(fù)位鍵)以及四個(gè)控制鍵。</p><p>  1、在控制時(shí)分電路設(shè)計(jì)中,分別設(shè)置了四個(gè)鍵:</p><p>  K1鍵-用來設(shè)置當(dāng)前時(shí)間以及在設(shè)置中用來設(shè)置時(shí)鐘</p><p>  K2鍵-顯示鬧鐘時(shí)間以及在設(shè)置中用來設(shè)置分鐘

3、</p><p>  K3鍵-設(shè)置鬧鐘時(shí)間</p><p>  K4鍵-控制鬧鈴的開關(guān)</p><p>  2、 在控制時(shí)分秒電路的設(shè)計(jì)中,分別設(shè)置了五個(gè)鍵,即在1的基礎(chǔ)上增加了一個(gè)控制秒的按鍵。</p><p>  當(dāng)然本課程設(shè)計(jì)中所用到的元器件還可以應(yīng)用其他的一些器件。比如AT89C52完全可以用AT89C51來代替,LM016L型號的L

4、CD顯示器可以用LM017L型號的LCD顯示器來代替(其他一些顯示器也可以用),上來電阻也可以用分電阻來表示。</p><p>  初次做課程設(shè)計(jì),肯定會有許多不足之處,希望老師們指點(diǎn)!</p><p>  關(guān)鍵字: AT89C52單片機(jī) LCD顯示器 鬧鐘</p><p><b>  目錄</b></p><p>

5、  主要內(nèi)容……………………………………………………………………3</p><p>  目的和意義…………………………………………………………………3</p><p>  基本要求……………………………………………………………………3</p><p>  3.1、顯示時(shí)-分功能………………………………………………………3</p><p>  

6、3.2、 顯示時(shí)-分-秒功能…………………………………………………3</p><p><b>  系統(tǒng)設(shè)計(jì)</b></p><p>  4.1 AT89C52單片機(jī)簡介…………………………………………………4</p><p>  4.2 電路總體設(shè)計(jì)…………………………………………………………6</p><p>  

7、4.3 主程序流程圖…………………………………………………………7</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p>  5.1 設(shè)計(jì)電路圖……………………………………………………………7</p><p>  5.2 程序代碼………………………………………………………………12</p><p>  5.

8、2.1 時(shí)-分程序代碼…………………………………………………12</p><p>  5.2.2 時(shí)-分-秒程序代碼……………………………………………23</p><p><b>  結(jié)論</b></p><p>  6.1 結(jié)果分析………………………………………………………………33</p><p>  6.2

9、 心得體會………………………………………………………………33</p><p>  設(shè)計(jì)總結(jié)……………………………………………………………………34</p><p>  參考文獻(xiàn)……………………………………………………………………34</p><p><b>  主要內(nèi)容: </b></p><p>  本次課程設(shè)計(jì)的內(nèi)

10、容為設(shè)計(jì)一個(gè)以MCS51單片機(jī)為核心的帶有LCD顯示的定時(shí)鬧鐘,完成原理圖設(shè)計(jì),軟件編制及設(shè)計(jì)報(bào)告。</p><p>  設(shè)使用AT89C52單片機(jī)結(jié)合字符型LCD顯示器設(shè)計(jì)一個(gè)簡易的定時(shí)鬧鐘LCD時(shí)鐘,若LCD選擇有背光顯示的模塊,在夜晚或黑暗的場合中也可以使用。</p><p>  設(shè)計(jì)本電子定時(shí)鬧鐘的目的和意義</p><p>  本課程設(shè)計(jì)的目的和意義在于提

11、高對單片機(jī)課程的認(rèn)識以及對該課程的實(shí)踐應(yīng)用能力。</p><p>  通過本次課程設(shè)計(jì)的實(shí)踐,了解單片機(jī)工作的原理及應(yīng)用技術(shù),掌握根據(jù)硬件電路設(shè)</p><p>  計(jì)軟件的方法,了解設(shè)計(jì)過程中的各個(gè)基本環(huán)節(jié),也為今后的實(shí)際應(yīng)用奠定基礎(chǔ)</p><p><b>  3、基本要求:</b></p><p>  .字符型LC

12、D(16*2)顯示器</p><p>  .顯示格式“時(shí)時(shí):分分:秒秒”。</p><p>  .一旦時(shí)間到則發(fā)出聲響,表示程序開始執(zhí)行,LCD顯示“00 00”,按下操作鍵K1-k4動(dòng)作如下:</p><p>  3.1、顯示時(shí)-分功能:</p><p>  K1—設(shè)置現(xiàn)在的時(shí)間。</p><p>  K2—顯示鬧

13、鈴的時(shí)間</p><p>  K3—設(shè)置鬧鈴的時(shí)間。。</p><p>  K4—鬧鈴ON/OFF(即按下k4鍵可以開啟或停止聲響)的狀態(tài)設(shè)置,定時(shí)“開始”按鍵,啟動(dòng)定時(shí)。</p><p><b>  K5—復(fù)位鍵</b></p><p>  設(shè)置當(dāng)前時(shí)間或鬧鈴時(shí)間如下:</p><p><

14、b>  K1—對時(shí)的調(diào)整。</b></p><p><b>  K2—對分的調(diào)整。</b></p><p><b>  K3—設(shè)置完成。</b></p><p>  3.2、 顯示時(shí)-分-秒功能:</p><p>  K1—設(shè)置現(xiàn)在的時(shí)間。</p><p>

15、  K2—顯示鬧鈴的時(shí)間</p><p>  K3—設(shè)置鬧鈴的時(shí)間。。</p><p><b>  K4—設(shè)置完成。</b></p><p>  K5—鬧鈴ON/OFF(即按下k4鍵可以開啟或停止聲響)的狀態(tài)設(shè)置,定時(shí)“開始”按鍵,啟動(dòng)定時(shí)</p><p><b>  K6—復(fù)位鍵</b></

16、p><p>  設(shè)置當(dāng)前時(shí)間或鬧鈴時(shí)間如下:</p><p><b>  K1—對時(shí)的調(diào)整。</b></p><p><b>  K2—對分的調(diào)整。</b></p><p><b>  K3—對秒的調(diào)整。</b></p><p><b>  K4—

17、設(shè)置完成。</b></p><p><b>  4、系統(tǒng)設(shè)計(jì)</b></p><p>  4.1 AT89C52單片機(jī)簡介</p><p>  許多由關(guān)硬件設(shè)計(jì)中都使用到單片機(jī)AT89C52,其功能比以往的單片機(jī)強(qiáng)大的多。</p><p>  AT89C52是一種高性能低功耗的采用CMOS工藝制造的8位微控制

18、器,它提供下列標(biāo)準(zhǔn)特征:4K字節(jié)的程序存儲器,128字節(jié)的RAM,32條I/O線,2個(gè)16位定時(shí)器/計(jì)數(shù)器, 一個(gè)5中斷源和兩個(gè)優(yōu)先級的中斷結(jié)構(gòu),一個(gè)雙工的串行口, 片上震蕩器和時(shí)鐘電路。</p><p><b>  引腳說明:</b></p><p><b>  ·VCC:電源電壓</b></p><p>&

19、lt;b>  ·GND:地</b></p><p>  ·P0口:P0口是一組8位漏極開路型雙向I/O口,作為輸出口用時(shí),每個(gè)引腳能驅(qū)動(dòng)8個(gè)TTL邏輯門電路。當(dāng)對0端口寫入1時(shí),可以作為高阻抗輸入端使用。</p><p>  當(dāng)P0口訪問外部程序存儲器或數(shù)據(jù)存儲器時(shí),它還可設(shè)定成地址數(shù)據(jù)總線復(fù)用的形式。在這種模式下,P0口具有內(nèi)部上拉電阻。</p

20、><p>  在EPROM編程時(shí),P0口接收指令字節(jié),同時(shí)輸出指令字節(jié)在程序校驗(yàn)時(shí)。程序校驗(yàn)時(shí)需要外接上拉電阻。</p><p>  ·P1口:P1口是一帶有內(nèi)部上拉電阻的8位雙向I/O口。P1口的輸出緩沖能接受或輸出4個(gè)TTL邏輯門電路。當(dāng)對P1口寫1時(shí),它們被內(nèi)部的上拉電阻拉升為高電平,此時(shí)可以作為輸入端使用。當(dāng)作為輸入端使用時(shí),P1口因?yàn)閮?nèi)部存在上拉電阻,所以當(dāng)外部被拉低時(shí)會輸

21、出一個(gè)低電流(IIL)。</p><p>  ·P2口:P2是一帶有內(nèi)部上拉電阻的8位雙向的I/O端口。P2口的輸出緩沖能驅(qū)動(dòng)4個(gè)TTL邏輯門電路。當(dāng)向P2口寫1時(shí),通過內(nèi)部上拉電阻把端口拉到高電平,此時(shí)可以用作輸入口。作為輸入口,因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號拉低時(shí)會輸出電流(IIL)。</p><p>  P2口在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如

22、MOVX @ DPTR)時(shí),P2口送出高8位地址數(shù)據(jù)。在這種情況下,P2口使用強(qiáng)大的內(nèi)部上拉電阻功能當(dāng)輸出1時(shí)。當(dāng)利用8位地址線訪問外部數(shù)據(jù)存儲器時(shí)(例MOVX @R1),P2口輸出特殊功能寄存器的內(nèi)容。</p><p>  當(dāng)EPROM編程或校驗(yàn)時(shí),P2口同時(shí)接收高8位地址和一些控制信號。</p><p>  ·P3口:P3是一帶有內(nèi)部上拉電阻的8位雙向的I/O端口。P3口的輸

23、出緩沖能驅(qū)動(dòng)4個(gè)TTL邏輯門電路。當(dāng)向P3口寫1時(shí),通過內(nèi)部上拉電阻把端口拉到高電平,此時(shí)可以用作輸入口。作為輸入口,因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號拉低時(shí)會輸出電流(IIL)。</p><p>  P3口同時(shí)具有AT89C52的多種特殊功能,具體如下表1所示:</p><p>  表1 P3口的第二功能</p><p>  ·RST:復(fù)位輸入。

24、當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期的高電平將使單片機(jī)復(fù)位。</p><p>  ·ALE/:當(dāng)訪問外部存儲器時(shí),地址鎖存允許是一輸出脈沖,用以鎖存地址的低8位字節(jié)。當(dāng)在Flash編程時(shí)還可以作為編程脈沖輸出()。一般情況下,ALE是以晶振頻率的1/6輸出,可以用作外部時(shí)鐘或定時(shí)目的。但也要注意,每當(dāng)訪問外部數(shù)據(jù)存儲器時(shí)將跳過一個(gè)ALE脈沖。</p><p>  ·

25、;:程序存儲允許時(shí)外部程序存儲器的讀選通信號。當(dāng)AT89S52執(zhí)行外部程序存儲器的指令時(shí),每個(gè)機(jī)器周期兩次有效,除了當(dāng)訪問外部數(shù)據(jù)存儲器時(shí),將跳過兩個(gè)信號。</p><p>  ·/VPP:外部訪問允許。為了使單片機(jī)能夠有效的傳送外部數(shù)據(jù)存儲器從0000H到FFFH單元的指令,必須同GND相連接。需要主要的是,如果加密位1被編程,復(fù)位時(shí)EA端會自動(dòng)內(nèi)部鎖存。當(dāng)執(zhí)行內(nèi)部編程指令時(shí),應(yīng)該接到VCC端。<

26、;/p><p>  ·XTAL1:振蕩器反相放大器以及內(nèi)部時(shí)鐘電路的輸入端。</p><p>  ·XTAL2:振蕩器反相放大器的輸出端。</p><p>  4.2 電路總體設(shè)計(jì)</p><p>  LCD定時(shí)鬧鐘,是以單片機(jī)及外圍接口電路為核心硬件,輔以其他外圍硬件電路,用C語言設(shè)計(jì)的程序來實(shí)現(xiàn)的。根據(jù)C51單片機(jī)的外圍

27、接口特點(diǎn)擴(kuò)展相應(yīng)的硬件電路,然后根據(jù)單片機(jī)的指令設(shè)計(jì)出數(shù)字鐘相應(yīng)的軟件,再利用軟件執(zhí)行一定的程序來實(shí)現(xiàn)數(shù)字鐘的功能。由于采用集成芯片性的單片機(jī)來制作電子鐘,這樣設(shè)計(jì)制作簡單而且功能多、精確度高,也可方便擴(kuò)充其他功能,實(shí)現(xiàn)也十分簡單。本設(shè)計(jì)是利用AT89C52單片機(jī)為主控芯片,由LCD、電阻、電容、按鍵、蜂鳴器等元件組成硬件電路,通過編寫軟件程序來實(shí)現(xiàn)和控制的數(shù)字定時(shí)鬧鐘</p><p>  4.3 主程序流程圖&

28、lt;/p><p><b>  N</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  N</b></p><p><b>  5、詳細(xì)設(shè)計(jì)</b>&

29、lt;/p><p>  5.1 硬件電路設(shè)計(jì)</p><p>  5.1.1 所需硬件</p><p>  主控芯片AT89C52(或AT89C51) 單片機(jī) </p><p>  上拉電阻respack -8</p><p>  液晶顯示器(LM016L) LCD 1 </p><p>  蜂鳴

30、器speaker</p><p>  5.1.2 單片機(jī)硬件資源分配</p><p>  1、時(shí)-分功能的控制鍵接口:</p><p>  P1.0 連接按鍵K1</p><p>  P1.2 連接按鍵K2</p><p>  P1.3 連接按鍵K3</p><p>  P1.4 連接按鍵K4&

31、lt;/p><p>  RST 連接復(fù)位鍵K5</p><p>  P3.4 連接蜂鳴器</p><p>  P0.0/AD0~P0.7/AD7依次接LCD1(LM016L)的00~07,為數(shù)據(jù)線連接</p><p>  2、 時(shí)-分-秒功能的控制接口:</p><p>  P1.0 連接按鍵K1</p>

32、<p>  P1.1 連接按鍵K2</p><p>  P1.2 連接按鍵K3</p><p>  P1.3 連接按鍵K4</p><p>  P1.4 連接按鍵K4</p><p>  RST 連接復(fù)位鍵K6</p><p>  P3.4 連接蜂鳴器</p><p>  P0.0/

33、AD0~P0.7/AD7依次接LCD1(LM016L)的00~07,為數(shù)據(jù)線連接</p><p>  5.1.3本LCD電子鬧鐘的特點(diǎn)和功能介紹</p><p><b>  數(shù)字鐘介紹</b></p><p>  時(shí)鐘是將小時(shí)、分鐘、秒顯示于人的肉眼的計(jì)時(shí)裝置。而單片機(jī)模塊中最常見的正是數(shù)字鐘,數(shù)字鐘是一種用數(shù)字電路技術(shù)實(shí)現(xiàn)時(shí)、分、秒計(jì)時(shí)的裝置

34、,與機(jī)械式時(shí)鐘相比具有更高的準(zhǔn)確性和直觀性,且無機(jī)械裝置,具有更長的使用壽命,因此得到了廣泛的使用。而LCD電子定時(shí)鬧鐘是以單片機(jī)為基礎(chǔ)的數(shù)字電路實(shí)現(xiàn)對時(shí)、分、秒的數(shù)字顯示的數(shù)字計(jì)時(shí)裝置,它的計(jì)時(shí)周期為24小時(shí),另外應(yīng)有校時(shí)功能和鬧鐘等附加功能。一個(gè)基本的數(shù)字鐘電路主要由譯碼顯示器、“時(shí)”,“分”,“秒”,“星期”計(jì)數(shù)器、校時(shí)電路、報(bào)時(shí)電路和振蕩器組成。目前電子鐘廣泛用于各種私人和公眾場合,成為我們生活、工作和學(xué)習(xí)中不可缺少的好幫手。&

35、lt;/p><p>  1602LCD液晶顯示器介紹</p><p>  為了獲得更好的效果,本設(shè)計(jì)并沒有采用常見的LED,而是采用了型號為LM016L(1602)的 LCD。LCD有比LED數(shù)碼顯示更好更直觀的效果,也更加經(jīng)久耐用。液晶顯示模塊體積小、功耗低、顯示內(nèi)容豐富,現(xiàn)在字符型液晶顯示模塊已經(jīng)是單片機(jī)應(yīng)用設(shè)計(jì)中最常用的信息顯示器件之一了。本LCD是2行16列液晶,可顯示2行16列英文字

36、符,有8位數(shù)據(jù)總線D0-D7,RS,R/W,E三個(gè)控制端口(共14線),工作電壓為5V。沒背光,和常用的1602B功能和引腳一樣(除了調(diào)背光的二個(gè)線腳)。</p><p>  D4-D7作為四位數(shù)據(jù)分兩次傳送。這樣的話可以節(jié)省MCU的I/O口資源。</p><p>  引腳說明,見表3.1。</p><p>  VDD:電源正極,4.5-5.5V,通常使用5V電壓;

37、</p><p>  RS:MCU寫入數(shù)據(jù)或者指令選擇端。MCU要寫入指令時(shí),使RS為低電平;MCU要寫入數(shù)據(jù)時(shí),使RS為高電平;</p><p>  R/W:讀寫控制端。R/W為高電平時(shí),讀取數(shù)據(jù);R/W為低電平時(shí),寫入數(shù)據(jù);</p><p>  E:LCD模塊使能信號控制端。寫數(shù)據(jù)時(shí),需要下降沿觸發(fā)模塊。</p><p>  D0~D7:

38、8位數(shù)據(jù)總線,三態(tài)雙向。如果MCU的I/O口資源緊張的話,該模塊也可以只使用4位數(shù)據(jù)線D4-D7接口傳送數(shù)據(jù)。本充電器就是采用4位數(shù)據(jù)傳送方式;</p><p>  表3.1 LCD1(LM016L)顯示屏引腳說明</p><p><b>  5.2軟件設(shè)計(jì)</b></p><p>  5.2.1軟件設(shè)計(jì)概述</p><p

39、>  這里用C的單片機(jī)程序構(gòu)成了本LCD電子鬧鐘的軟件系統(tǒng)。該程序?qū)崿F(xiàn)時(shí)間及定時(shí)(時(shí)間以0點(diǎn)0分0秒為基準(zhǔn)計(jì)算,鬧鈴定時(shí)以0時(shí)0分為基準(zhǔn)計(jì)算)的顯示,有外部中斷0和五個(gè)開關(guān)實(shí)現(xiàn)校時(shí),鬧鐘功能。其中程序的晶振頻率為12MHz,最小計(jì)時(shí)單位為1/20秒。</p><p>  主芯片p0.1-p0.7輸出數(shù)據(jù)到LCD數(shù)據(jù)總線,p3.0-p3.2輸出LCD控制信號,P2.6輸出聲音信號,.P1.0-P1.3輸入外部

40、控制信號,整個(gè)軟件系統(tǒng)也是根據(jù)這個(gè)關(guān)系連接成一個(gè)完整的系統(tǒng)。</p><p><b>  1、程序初始化</b></p><p>  在系統(tǒng)開始通電時(shí),需要.首先初始化液晶:</p><p>  void TimeInit()</p><p><b>  {</b></p><p

41、>  write_com(0x01); //初始化1602液晶</p><p>  write_com(0x80); //設(shè)置現(xiàn)實(shí)初始坐標(biāo)</p><p>  for(num=0;num<9;num++) //顯示時(shí)分秒</p><p><b>  {</b></p><p>  write_d

42、ate(table[num]); </p><p><b>  delay(5);</b></p><p><b>  }</b></p><p>  write_com(0x80+0x40+6); //寫出時(shí)間顯示部分的兩個(gè)冒號</p><p>  write_date(':')

43、;</p><p><b>  delay(5);</b></p><p>  write_com(0x80+0x40+9);</p><p>  write_date(':');</p><p><b>  delay(5);</b></p><p>  w

44、rite_sfm(4,shi); //分別送去液晶顯示</p><p>  write_com(0x80+0x40+4);</p><p>  write_sfm(7,fen);</p><p>  write_com(0x80+0x40+7);</p><p>  write_sfm(10,miao);</p><

45、;p>  write_com(0x80+0x40+10)</p><p><b>  2、鬧鐘的實(shí)現(xiàn)</b></p><p>  鬧鐘功能的實(shí)現(xiàn)涉及到兩個(gè)方面:鬧鈴時(shí)間設(shè)定和是否鬧鈴判別與相應(yīng)處理。鬧鈴時(shí)間設(shè)定模塊的設(shè)計(jì)可參照時(shí)間設(shè)定模塊,這里著重闡述鬧鈴判別與處理模塊的設(shè)計(jì)問題。鬧鈴判別與鬧鈴處理的關(guān)鍵在于判別何時(shí)要進(jìn)行鬧鈴。當(dāng)時(shí)-十位、時(shí)-個(gè)位、分-十位、分

46、-個(gè)位中任一位發(fā)生改變(進(jìn)位)時(shí),就必須進(jìn)行鬧鈴判別。程序設(shè)計(jì)思想如圖4.3。 [8]</p><p><b>  圖4.3</b></p><p><b>  N</b></p><p><b>  3、顯示程序</b></p><p>  顯示程序包括時(shí)鐘顯示和定時(shí)顯示程序

47、。具體程序見附錄。</p><p>  液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時(shí)需先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,表4.1是LM016LLCD1液晶模塊的內(nèi)部顯示地址。[15]</p><p>  表4.1 內(nèi)部顯示地址</p><p><b> ?、拧⒂?/p>

48、件原理圖</b></p><p><b>  ⑵、硬件電路圖</b></p><p>  5.2.2程序代碼如下:</p><p><b>  1、顯示時(shí)-分:</b></p><p>  #include <reg52.h> // reg52.h是AT89C52的頭

49、文件</p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  uchar code table[]="NOW TIME:";</p><p>  uchar code table1[]="SET NOW

50、 TIME:";</p><p>  uchar code table2[]="SET ALARM TIME:";</p><p>  uchar code alarm[]="ALARM TIME:";</p><p>  uchar code alarmoff[]="ALARM TIME: OFF&quo

51、t;;</p><p>  uchar code alarmon[]="ALARM TIME: ON";</p><p>  sbit lcden=P3^2; //定義icden的地址為P3.2(以下的 sbit 命令以此類推)</p><p>  sbit lcdrs=P3^0;</p><p>  sbit lcd

52、rw=P3^1;</p><p>  sbit K1=P1^0;</p><p>  sbit K2=P1^1;</p><p>  sbit K3=P1^2;</p><p>  sbit K4=P1^3;</p><p>  sbit beep=P2^6;</p><p>  uchar f

53、lag,num,count,k1num,k2num,k3num,k4num;</p><p>  char miao,shi,fen,ashi,afen;</p><p>  void delay(uint z) //延時(shí)函數(shù)</p><p><b>  {</b></p><p><b>  uint x

54、,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  }</b></p><p>  void di() //蜂鳴器子程序</p><p><b>  {

55、</b></p><p><b>  beep=0;</b></p><p>  delay(100);</p><p><b>  beep=1;</b></p><p><b>  }</b></p><p>  void write_c

56、om(uchar com) //寫命令函數(shù)</p><p><b>  {</b></p><p><b>  lcdrs=0;</b></p><p><b>  lcdrw=0;</b></p><p><b>  lcden=0;</b><

57、;/p><p><b>  P0=com;</b></p><p><b>  delay(5);</b></p><p><b>  lcden=1;</b></p><p><b>  delay(5);</b></p><p>&

58、lt;b>  lcden=0;</b></p><p><b>  }</b></p><p>  void write_date(uchar date) //寫數(shù)據(jù)函數(shù)</p><p><b>  {</b></p><p><b>  lcdrs=1;<

59、/b></p><p><b>  lcdrw=0;</b></p><p><b>  lcden=0;</b></p><p><b>  P0=date;</b></p><p><b>  delay(5);</b></p>&

60、lt;p><b>  lcden=1;</b></p><p><b>  delay(5);</b></p><p><b>  lcden=0;</b></p><p><b>  }</b></p><p>  void write_sfm(u

61、char add,uchar date) //寫時(shí)間函數(shù)</p><p><b>  {</b></p><p>  uchar shi,ge;</p><p>  shi=date/10;</p><p>  ge=date%10;</p><p>  write_com(0x80+0x40

62、+add);</p><p>  write_date(0x30+shi);</p><p>  write_date(0x30+ge);</p><p><b>  }</b></p><p>  void TimeInit() //顯示時(shí)間初始化</p><p><b>  {

63、</b></p><p>  write_com(0x01);</p><p>  write_com(0x80);</p><p>  for(num=0;num<9;num++)</p><p><b>  {</b></p><p>  write_date(table[n

64、um]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p>  write_com(0x80+0x40+6);</p><p>  write_date(':');</p><p><b&g

65、t;  delay(5);</b></p><p>  write_com(0x80+0x40+9);</p><p>  write_date(':');</p><p><b>  delay(5);</b></p><p>  write_sfm(4,shi);</p>&

66、lt;p>  write_com(0x80+0x40+4);</p><p>  write_sfm(7,fen);</p><p>  write_com(0x80+0x40+7);</p><p>  write_sfm(10,miao);</p><p>  write_com(0x80+0x40+10);</p>

67、<p><b>  }</b></p><p>  void SetNowTime() //設(shè)置當(dāng)前時(shí)間</p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b>

68、</p><p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p><p>  while(!K1);</p><p><b>  di();<

69、/b></p><p><b>  shi++;</b></p><p>  if(shi==24)</p><p><b>  shi=0;</b></p><p>  write_sfm(4,shi);</p><p>  write_com(0x80+0x40+4

70、);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p><b>  delay(

71、5);</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p>  while(!K2);</p><p><b>  di();</b></p><p><b>  

72、fen++;</b></p><p>  if(fen==60)</p><p><b>  fen=0;</b></p><p>  write_sfm(7,fen);</p><p>  write_com(0x80+0x40+7);</p><p><b>  }<

73、;/b></p><p><b>  }</b></p><p><b>  if(K3==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><

74、b>  if(K3==0)</b></p><p><b>  {</b></p><p>  while(!K3);</p><p><b>  di();</b></p><p><b>  k1num=0;</b></p><p>

75、;<b>  TR0=1;</b></p><p>  TimeInit();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void

76、SetAlarmTime() //設(shè)置鬧鐘時(shí)間</p><p><b>  {</b></p><p><b>  flag=0;</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p&g

77、t;<p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p><p>  while(!K1);</p><p><b>  di();</b>&l

78、t;/p><p><b>  ashi++;</b></p><p>  if(ashi==24)</p><p><b>  ashi=0;</b></p><p>  write_sfm(4,ashi);</p><p>  write_com(0x80+0x40+4);&l

79、t;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p><b>  delay(5);&

80、lt;/b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p>  while(!K2);</p><p><b>  di();</b></p><p><b>  afen

81、++;</b></p><p>  if(afen==60)</p><p><b>  afen=0;</b></p><p>  write_sfm(7,afen);</p><p>  write_com(0x80+0x40+7);</p><p><b>  }<

82、;/b></p><p><b>  }</b></p><p><b>  if(K3==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><

83、b>  if(K3==0)</b></p><p><b>  {</b></p><p>  while(!K3);</p><p><b>  di();</b></p><p><b>  k3num=0;</b></p><p>

84、;<b>  EA=1;</b></p><p><b>  flag=1;</b></p><p>  TimeInit();</p><p><b>  }</b></p><p><b>  }</b></p><p>&l

85、t;b>  }</b></p><p>  void DisplayAlarmTime() //顯示鬧鐘函數(shù)</p><p><b>  {</b></p><p>  write_com(0x01);</p><p>  write_com(0x80);</p><p> 

86、 for(num=0;num<11;num++)</p><p><b>  {</b></p><p>  write_date(alarm[num]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p>

87、<p>  write_com(0x80+0x40+6);</p><p>  write_date(':');</p><p><b>  delay(5);</b></p><p>  write_sfm(4,ashi);</p><p>  write_com(0x80+0x40+4)

88、;</p><p>  write_sfm(7,afen);</p><p>  write_com(0x80+0x40+7);</p><p><b>  }</b></p><p>  void keyscan() //鍵盤掃描函數(shù)</p><p><b>  {</b

89、></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p>

90、;<b>  {</b></p><p><b>  TR0=0;</b></p><p>  while(!K1);</p><p><b>  di();</b></p><p><b>  k1num++;</b></p><p&

91、gt;<b>  }</b></p><p><b>  }</b></p><p>  if(k1num!=0)</p><p><b>  {</b></p><p>  write_com(0x80);</p><p>  for(num=0;nu

92、m<13;num++)</p><p><b>  {</b></p><p>  write_date(table1[num]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p> 

93、 SetNowTime();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  if(K2==0)</b></p><p>&l

94、t;b>  {</b></p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p>  while(!K2);</p><p>

95、<b>  di();</b></p><p><b>  k2num++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k2num==1)</p><p>&l

96、t;b>  {</b></p><p><b>  EA=0;</b></p><p>  DisplayAlarmTime();</p><p><b>  k2num=2;</b></p><p><b>  }</b></p><p

97、>  if(k2num==3)</p><p><b>  {</b></p><p><b>  k2num=0;</b></p><p><b>  EA=1;</b></p><p>  TimeInit();</p><p><b&g

98、t;  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  if(K3==0)</b></p><p><b>  {</b></p><p>&

99、lt;b>  delay(5);</b></p><p><b>  if(K3==0)</b></p><p><b>  {</b></p><p>  while(!K3);</p><p><b>  di();</b></p><

100、p><b>  k3num++;</b></p><p>  write_com(0x01);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k3num==1)</p><p><b

101、>  {</b></p><p><b>  EA=0;</b></p><p>  write_com(0x80);</p><p>  for(num=0;num<15;num++)</p><p><b>  {</b></p><p>  wr

102、ite_date(table2[num]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p>  write_com(0x80+0x40+6);</p><p>  write_date(':');</p>

103、<p><b>  delay(5);</b></p><p>  write_sfm(4,ashi);</p><p>  write_com(0x80+0x40+4);</p><p>  write_sfm(7,afen);</p><p>  write_com(0x80+0x40+7);</p

104、><p>  SetAlarmTime();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  if(K4==0)</b></

105、p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  if(K4==0)</b></p><p><b>  {</b></p><p>  while(!K4);<

106、;/p><p><b>  di();</b></p><p><b>  k4num++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(k4num==1)</

107、p><p><b>  {</b></p><p><b>  di();</b></p><p><b>  k4num=2;</b></p><p><b>  flag=0;</b></p><p><b>  }<

108、;/b></p><p>  if(k4num==3)</p><p><b>  {</b></p><p><b>  k4num=0;</b></p><p><b>  di();</b></p><p>  delay(500);<

109、/p><p><b>  di();</b></p><p>  delay(500);</p><p><b>  di();</b></p><p><b>  flag=1;</b></p><p><b>  }</b><

110、;/p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  if(flag==1&&shi==ashi&&fen==afen)</p><p>

111、<b>  {</b></p><p>  beep=~beep;</p><p>  delay(500);</p><p><b>  }</b></p><p>  if(K4==0&&flag==1)</p><p><b>  {</

112、b></p><p><b>  delay(5);</b></p><p>  if(K4==0&&flag==1)</p><p><b>  {</b></p><p>  while(!K4);</p><p><b>  di();&

113、lt;/b></p><p><b>  flag=0;</b></p><p><b>  k4num=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b

114、>  }</b></p><p>  void init() //lcd1602初始化</p><p><b>  {</b></p><p><b>  lcden=0;</b></p><p><b>  shi=0;</b></p><

115、;p><b>  fen=0;</b></p><p><b>  miao=0;</b></p><p><b>  ashi=0;</b></p><p><b>  afen=0;</b></p><p><b>  count=0;

116、</b></p><p><b>  k1num=0;</b></p><p>  write_com(0x38);//設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)接口</p><p>  write_com(0x0c);//設(shè)置開顯示,不顯示光標(biāo)</p><p>  write_com(0x06);/

117、/寫一個(gè)字符后地址指針加1</p><p>  write_com(0x01);//顯示清0,數(shù)據(jù)指針清0</p><p>  TimeInit();</p><p>  TMOD=0x01;</p><p>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%

118、256;</p><p><b>  EA=1;</b></p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p>  void ma

119、in() //主函數(shù)</p><p><b>  {</b></p><p><b>  init();</b></p><p>  write_com(0x80);</p><p><b>  while(1)</b></p><p><b

120、>  {</b></p><p>  keyscan();</p><p><b>  }</b></p><p><b>  }</b></p><p>  void timer0()interrupt 1 //中斷服務(wù)子程序</p><p><b

121、>  {</b></p><p>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%256;</p><p><b>  count++;</b></p><p>  if(count==20)</p><p><b&

122、gt;  {</b></p><p><b>  count=0;</b></p><p><b>  miao++;</b></p><p>  if(miao==60)</p><p><b>  {</b></p><p><b&

123、gt;  miao=0;</b></p><p><b>  fen++;</b></p><p>  if(fen==60)</p><p><b>  {</b></p><p><b>  fen=0;</b></p><p><

124、b>  shi++;</b></p><p>  if(shi==24)</p><p><b>  {</b></p><p><b>  shi=0;</b></p><p><b>  }</b></p><p>  write_

125、sfm(4,shi);</p><p><b>  }</b></p><p>  write_sfm(7,fen);</p><p><b>  }</b></p><p>  write_sfm(10,miao);</p><p><b>  }</b&g

126、t;</p><p><b>  }</b></p><p>  4、單程序執(zhí)行結(jié)果如下(秒計(jì)數(shù)):</p><p>  5、仿真執(zhí)行結(jié)果如下:</p><p> ?、?、按K5鍵--復(fù)位初始狀態(tài)(NOW TIME)</p><p>  ⑵、按K1鍵(SET NOW TIME)</p>

127、<p>  (3)、按K3鍵(SET ALARM TIME)</p><p>  (4)、再按K2鍵即可定時(shí)1分鐘或更長</p><p>  2、顯示時(shí)-分-秒: </p><p>  #include <reg52.h> // reg52.h是AT89C52的頭文件</p><p>  #define uin

128、t unsigned int</p><p>  #define uchar unsigned char</p><p>  uchar code table[]="NOW TIME:"; //code為程序儲存器(即將語句"NOW TIME"存入程序以便顯示)</p><p>  uchar code table1[]=&

129、quot;SET NOW TIME:";</p><p>  uchar code table2[]="SET ALARM TIME:";</p><p>  uchar code alarm[]="ALARM TIME:";</p><p>  uchar code alarmoff[]="ALARM T

130、IME: OFF";</p><p>  uchar code alarmon[]="ALARM TIME: ON";</p><p>  sbit lcden=P3^2; //定義icden的地址為P3.2(以下的 sbit 命令以此類推)</p><p>  sbit lcdrs=P3^0;</p><p&g

131、t;  sbit lcdrw=P3^1;</p><p>  sbit K1=P1^0;</p><p>  sbit K2=P1^1;</p><p>  sbit K3=P1^2;</p><p>  sbit K4=P1^3;</p><p>  sbit K5=P1^4;</p><p>

132、;  sbit beep=P2^6;</p><p>  uchar flag,num,count,k1num,k2num,k3num,k4num,k5num;</p><p>  char miao,shi,fen,ashi,afen,amiao;</p><p>  void delay(uint z) //延時(shí)函數(shù)</p><p>

133、<b>  {</b></p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  }</b></p><p

134、>  void di() //蜂鳴器子程序</p><p><b>  {</b></p><p><b>  beep=0;</b></p><p>  delay(100);</p><p><b>  beep=1;</b></p><p&

135、gt;<b>  }</b></p><p>  void write_com(uchar com) //寫命令函數(shù)</p><p><b>  {</b></p><p><b>  lcdrs=0;</b></p><p><b>  lcdrw=0;<

136、;/b></p><p><b>  lcden=0;</b></p><p><b>  P0=com;</b></p><p><b>  delay(5);</b></p><p><b>  lcden=1;</b></p>&

137、lt;p><b>  delay(5);</b></p><p><b>  lcden=0;</b></p><p><b>  }</b></p><p>  void write_date(uchar date) //寫數(shù)據(jù)函數(shù)</p><p><b&

138、gt;  {</b></p><p><b>  lcdrs=1;</b></p><p><b>  lcdrw=0;</b></p><p><b>  lcden=0;</b></p><p><b>  P0=date;</b><

139、/p><p><b>  delay(5);</b></p><p><b>  lcden=1;</b></p><p><b>  delay(5);</b></p><p><b>  lcden=0;</b></p><p>&

140、lt;b>  }</b></p><p>  void write_sfm(uchar add,uchar date) //寫時(shí)間函數(shù)</p><p><b>  {</b></p><p>  uchar shi,ge;</p><p>  shi=date/10;</p><

141、p>  ge=date%10;</p><p>  write_com(0x80+0x40+add);</p><p>  write_date(0x30+shi);</p><p>  write_date(0x30+ge);</p><p><b>  }</b></p><p>  v

142、oid TimeInit() //顯示時(shí)間初始化</p><p><b>  {</b></p><p>  write_com(0x01);</p><p>  write_com(0x80);</p><p>  for(num=0;num<9;num++)</p><p><

143、;b>  {</b></p><p>  write_date(table[num]);</p><p><b>  delay(5);</b></p><p><b>  }</b></p><p>  write_com(0x80+0x40+6);</p><

144、;p>  write_date(':');</p><p><b>  delay(5);</b></p><p>  write_com(0x80+0x40+9);</p><p>  write_date(':');</p><p><b>  delay(5);<

145、;/b></p><p>  write_sfm(4,shi);</p><p>  write_com(0x80+0x40+4);</p><p>  write_sfm(7,fen);</p><p>  write_com(0x80+0x40+7);</p><p>  write_sfm(10,miao)

146、;</p><p>  write_com(0x80+0x40+10);</p><p><b>  }</b></p><p>  void SetNowTime() //設(shè)置當(dāng)前時(shí)間 </p><p><b>  {</b></p><p&

147、gt;<b>  if(K1==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b>

溫馨提示

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

評論

0/150

提交評論