2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

16、p><p>  設(shè)置當(dāng)前時間或鬧鈴時間如下:</p><p><b>  K1—對時的調(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è)計</b></p><p>  4.1 AT89C52單片機簡介</p><p>  許多由關(guān)硬件設(shè)計中都使用到單片機AT89C52,其功能比以往的單片機強大的多。</p><p>  AT89C52是一種高性能低功耗的采用CMOS工藝制造的8位微控制

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

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

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

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

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

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

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

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

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

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

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

30、器speaker</p><p>  5.1.2 單片機硬件資源分配</p><p>  1、時-分功能的控制鍵接口:</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、 時-分-秒功能的控制接口:</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電子鬧鐘的特點和功能介紹</p><p><b>  數(shù)字鐘介紹</b></p><p>  時鐘是將小時、分鐘、秒顯示于人的肉眼的計時裝置。而單片機模塊中最常見的正是數(shù)字鐘,數(shù)字鐘是一種用數(shù)字電路技術(shù)實現(xiàn)時、分、秒計時的裝置

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

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

36、符,有8位數(shù)據(jù)總線D0-D7,RS,R/W,E三個控制端口(共14線),工作電壓為5V。沒背光,和常用的1602B功能和引腳一樣(除了調(diào)背光的二個線腳)。</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要寫入指令時,使RS為低電平;MCU要寫入數(shù)據(jù)時,使RS為高電平;</p><p>  R/W:讀寫控制端。R/W為高電平時,讀取數(shù)據(jù);R/W為低電平時,寫入數(shù)據(jù);</p><p>  E:LCD模塊使能信號控制端。寫數(shù)據(jù)時,需要下降沿觸發(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è)計</b></p><p>  5.2.1軟件設(shè)計概述</p><p

39、>  這里用C的單片機程序構(gòu)成了本LCD電子鬧鐘的軟件系統(tǒng)。該程序?qū)崿F(xiàn)時間及定時(時間以0點0分0秒為基準(zhǔn)計算,鬧鈴定時以0時0分為基準(zhǔn)計算)的顯示,有外部中斷0和五個開關(guān)實現(xiàn)校時,鬧鐘功能。其中程序的晶振頻率為12MHz,最小計時單位為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、控制信號,整個軟件系統(tǒng)也是根據(jù)這個關(guān)系連接成一個完整的系統(tǒng)。</p><p><b>  1、程序初始化</b></p><p>  在系統(tǒng)開始通電時,需要.首先初始化液晶:</p><p>  void TimeInit()</p><p><b>  {</b></p><p

41、>  write_com(0x01); //初始化1602液晶</p><p>  write_com(0x80); //設(shè)置現(xiàn)實初始坐標(biāo)</p><p>  for(num=0;num<9;num++) //顯示時分秒</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); //寫出時間顯示部分的兩個冒號</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、鬧鐘的實現(xiàn)</b></p><p>  鬧鐘功能的實現(xiàn)涉及到兩個方面:鬧鈴時間設(shè)定和是否鬧鈴判別與相應(yīng)處理。鬧鈴時間設(shè)定模塊的設(shè)計可參照時間設(shè)定模塊,這里著重闡述鬧鈴判別與處理模塊的設(shè)計問題。鬧鈴判別與鬧鈴處理的關(guān)鍵在于判別何時要進行鬧鈴。當(dāng)時-十位、時-個位、分-十位、分

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

47、。具體程序見附錄。</p><p>  液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時需先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,表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、顯示時-分:</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ù)</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ù)</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() //顯示時間初始化</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)前時間</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è)置鬧鐘時間</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點陣,8位數(shù)據(jù)接口</p><p>  write_com(0x0c);//設(shè)置開顯示,不顯示光標(biāo)</p><p>  write_com(0x06);/

117、/寫一個字符后地址指針加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é)果如下(秒計數(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鍵即可定時1分鐘或更長</p><p>  2、顯示時-分-秒: </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ù)</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ù)</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() //顯示時間初始化</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)前時間 </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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論