單片機課程設計報告--基于stc89c52單片機的電子時鐘(日歷)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  單片機課程設計論文</b></p><p>  題 目:基于STC89C52單片機的電子時鐘(日歷)</p><p>  學 院: 材料與光電物理學院</p><p>  專 業(yè): 測控技術與儀器二班 </p><p>  完成日期: 2011年9月7日 </p

2、><p><b>  目 錄</b></p><p>  目錄------------------------------------------------------------------------------1</p><p>  摘要--------------------------------------------------

3、----------------------------2</p><p>  實驗要求----------------------------------------------------------------2</p><p>  實驗主要元器件介紹-------------------------------------------------3</p><p

4、>  2.1 STC89C52單片機簡介---------------------------------------------3</p><p>  2.2 LCD1602簡介-------------------------------------------------------6</p><p>  2.3 軟件平臺-------------------------

5、-------------------------------------7</p><p>  實驗原理與設計內容-------------------------------------------------7</p><p>  3.1 實驗原理--------------------------------------------------------------7</

6、p><p>  3.2 三個組成部分--------------------------------------------------------7</p><p>  3.3 鍵盤控制模塊--------------------------------------------------------8</p><p>  調試過程----------------

7、------------------------------------------------8</p><p>  4.1 硬件調試--------------------------------------------------------------8</p><p>  4.2 軟件調試--------------------------------------------

8、------------------9</p><p>  4.3 測試數據與數據分析-----------------------------------------------9</p><p>  程序流程圖-------------------------------------------------------------10</p><p>  任務

9、分工與成果展示-------------------------------------------------11</p><p>  前期準備--------------------------------------------------------------11</p><p>  課程設計過程------------------------------------------

10、--------------11</p><p>  個人主要工作及遇到問題-----------------------------------------11</p><p>  成果展示--------------------------------------------------------------12</p><p>  課程設計總結思考與致謝--

11、-----------------------------------------13</p><p>  參考文獻----------------------------------------------------------------14</p><p>  附錄一:(程序)-----------------------------------------------------

12、--------15</p><p>  附錄二:(原理圖)----------------------------------------------------------25</p><p>  附錄三:(實物圖)----------------------------------------------------------25</p><p>  附錄四

13、:(元件清單)-------------------------------------------------------26</p><p>  摘要:數字電子鐘系統(tǒng)設計已經成熟,但是目前系統(tǒng)設計時基本都是采用LED作為顯示電路,造成硬件電路復雜、功耗高、產品體積龐大等特點;液晶顯示模塊由于具有低功耗、壽命長、體積小、顯示內容豐富、價格低、接口控制方便等優(yōu)點,因此在各類電子產品中被極廣泛地推廣和應用。字符型液

14、晶顯示模塊是一類專門用于顯示字母、數字、符號等點陣式液晶顯示模塊。本系統(tǒng)設計采用字符型液品顯示模塊LCD1602作為顯示器件,這樣不僅簡化了系統(tǒng)的硬件設計,而且極大地提高了系統(tǒng)的可靠性。</p><p>  本文詳細介紹了以液晶顯示器LCD1602作為系統(tǒng)輸出的數字電子鐘設計方案,其中包括LCD原理及接口方法、硬件電路設計、軟件程序編制等內容,并在Proteus中進行了仿真驗證。</p><p

15、>  關鍵詞:STC89C52單片機、電子時鐘、鍵盤控制、Proteus仿真。</p><p><b>  一、實驗要求</b></p><p>  課題名稱:基于單片機STC89C52的電子時鐘(附加日歷功能)。</p><p>  設計要求:本設計基于單片機技術原理,以單片機芯片STC89C52作為核心控制器,通過硬件電路的制作以及軟

16、件程序的編制,設計制作出一個多功能數字時鐘系統(tǒng)。單片機擴展的LCD顯示器用來顯示秒、分、時、日、月、年、星期七個計數單元中的值。</p><p>  目的及意義:隨著計算機科學與技術的飛速發(fā)展,計算機的應用已經滲透到國民經濟與人們生活的各個角落,正在日益改變著傳統(tǒng)的人類工作方式和生活方式, 而單片機技術又作為計算機技術中的一個獨立分支,有著性價比高,集成度高,體積小,可靠性高,控制功能強大,低功耗,低電壓,便于生

17、產,便于攜帶等特點,所以得到越來越廣泛的應用,特別是在工業(yè)控制和儀表儀器智能化中起極其重要的作用.本文利用單片機強大的控制功能和內部定時器重要部件,設計了一款自行對時間進行調整以及把時、分、秒用LCD顯示的電子鐘。</p><p>  二、實驗主要元器件介紹</p><p>  STC89C52單片機簡介</p><p>  STC89C52是一種帶8K字節(jié)閃爍可編

18、程可檫除只讀存儲器(FPEROM-Flash Programable and Erasable Read Only Memory )的低電壓,高性能COMOS8的微處理器,俗稱單片機。該器件采用ATMEL搞密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。</p><p>  單片機總控制電路如下圖1:</p><p>  圖4—1單片機總控制電路</p&

19、gt;<p><b>  (圖一)</b></p><p><b>  主要特性如下:</b></p><p>  工作電壓:5.5v ~3.3v(5v單片機)/3.8v ~2.0v(3v單片機)</p><p>  工作頻率范圍:0~40MHZ,相當于8051的0~80MHZ,實際工作頻率可大48MHZ。&

20、lt;/p><p>  用戶應用程序空間為8K字節(jié)</p><p>  片上集成512字節(jié)RAM</p><p>  通用I/O口(32個),復位后為:P1/P2/P3/P4是準雙向口/弱上拉,P0是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為I/O口使用時,需加上拉電阻。</p><p>  具有EEPROM功能與看門狗功能</p

21、><p>  具有3個16位的定時器/計數器。及定時器T0.T1.T2。</p><p><b>  工作模式:</b></p><p>  掉電模式:典型功耗小于0.1uA,可由外部中斷喚醒,中斷返回后,繼續(xù)執(zhí)行原程序。</p><p>  正常工作模式:典型功耗4mA~7mA</p><p>  

22、空閑模式:典型功耗2mA</p><p>  P0口:是一組8 位漏極開路型雙向I/O 口,也即地址/數據總線復用口。作為輸出口用時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口寫“1”可作為高阻抗輸入端用。在訪問外部數據存儲器或程序存儲器時,這組口線分時轉換地址(低8位)和數據總線復用,在訪問期間激活內部上拉電阻。在FIash編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉

23、電阻。</p><p>  P1口:是一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉</p><p>  電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。</p><p>  FIash編程和程序校驗期間,

24、P1接收低8位地址。</p><p>  P2口:是一個帶有內部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上</p><p>  拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數據存儲器(例如執(zhí)行M

25、OVX@DPTR指令)時,P2口送出高8位地址數據。在訪問8 位地址的外部數據存儲器(如執(zhí)行MOVX@RI 指令)時,P2 口線上的內容(也即特殊功能寄存器(SFR)區(qū)中R2寄存器的內容),在整個訪問期間不改變。Flash編程或校驗時,P2亦接收高位地址和其它控制信號。</p><p>  P3口:是一組帶有內部上拉電阻的8 位雙向I/O 口。P3 口輸出緩沖級可驅動(吸收或輸出電流)4 個TTL邏輯門電路。對P

26、3 口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。作輸入端時,被外部拉低的P3 口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能,如下表所示:</p><p>  P3口還接收一些用于Flash閃速存儲器編程和程序校驗的控制信號。</p><p>  RST 復位輸入。當振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復位

27、。</p><p>  ALE/PROG: 當訪問外部程序存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。即使不訪問外部存儲器,ALE 仍以時鐘振蕩頻率的l/6 輸出固定的正脈沖信號,因此它可對外輸出時鐘或用于定時</p><p>  目的。要注意的是:每當訪問外部數據存儲器時將跳過一個ALE脈沖。</p><p>  2.2、 LC

28、D1602簡介 </p><p>  液晶顯示屏LCD1602(如圖3)以其微功耗、體積小、顯示內容豐富、超薄輕巧的諸多優(yōu)點在袖珍式儀表和低功耗應用系統(tǒng)中得到越來越來廣泛的應用。</p><p>  這里介紹的是字符型液晶模塊是一種5*7點陣圖形來顯示字符的液晶顯示器,根據顯示內容可分為1行16個字、2行16個字、2行20個字等等,本設計用

29、的是常用的2行16個 圖2 </p><p>  字的1602液晶模塊。主要用于顯示時間和定時時間,并且具有字符對比度調節(jié)和背光功能。 </p><p><b>  其引腳功能如下:</b></p><p>  第1腳:VSS為地電源 </p&g

30、t;<p>  第2腳:VDD接5V正電源 </p><p>  第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度 </p><p>  第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。 </p><p>  第5腳:RW為

31、讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和RW共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平RW為低電平時可以寫入數據。 </p><p>  第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。 </p><p>  第7~14腳:D0~D7為8位雙向數據線。</p><p> 

32、 第15~16腳:空腳</p><p><b>  2.3軟件平臺</b></p><p><b>  1)Keil 編程</b></p><p>  Keil 的開發(fā)工具的使用的基本過程: 1 ○創(chuàng)建 C 或匯編語言的源程序; 2 ○編譯或匯編源文件; 3 ○糾正源文件中的錯誤; 4 ○從編譯器和匯編器連接目標文件; 5

33、 ○測試連接的應用程序。</p><p>  2)Proteus 仿真</p><p>  Proteus 軟件不僅具有其它 EDA 工具軟件的仿真功能,還能仿真單片機及外圍器 件。 它是目前最好的仿真單片機及外圍器件的工具。 在編譯方面, 它也支持 IAR, Keil, PLAB 等多種編譯器。</p><p>  三、實驗原理與設計內容</p>&

34、lt;p><b>  3.1 實驗原理</b></p><p>  電子鐘從原理上講是一種典型的數字電路,其中包括了組合邏輯電路和時序電路。因此,我們此次設計與制做數字鐘就是為了了解數字鐘的原理,從而學會制作數字鐘.而且通過數字鐘的制作進一步的了解各種在制作中用到的中小規(guī)模集成電路的作用及實用方法.且由于數字鐘包括組合邏輯電路和時敘電路.通過它可以進一步學習與掌握各種組合邏輯電路與時序

35、電路的原理與使用方法。</p><p>  本設計基于單片機技術原理,以單片機芯片AT89C52作為核心控制器,通過硬件電路的制作以及軟件程序的編制,設計制作出一個多功能數字時鐘系統(tǒng)。單片機擴展的LCD顯示器用來顯示秒、分、時計數單元中的值。整個設計包括兩大部分: 硬件部分和軟件部分,以單片機為核心, 配以一定的外圍電路和軟件。硬件是整個系統(tǒng)的基礎, 軟件部分則要合理、充分地支持和使用系統(tǒng)的硬件, 從而完成系統(tǒng)所

36、要完成的任務。</p><p>  3.2 三個組成部分</p><p>  該時鐘系統(tǒng)主要由時鐘模塊、液晶顯示模塊、鍵盤控制模塊以及信號提示模塊組成。能夠準確顯示時間(顯示格式為時時:分分:秒秒,24小時制),可隨時進行時間調整。設計以硬件軟件化為指導思想,充分發(fā)揮單片機功能,大部分功能通過軟件編程來實現(xiàn),電路簡單明了,系統(tǒng)穩(wěn)定性高。單片機在這種情況下誕生了基于單片機電子時鐘。</

37、p><p>  3.3 鍵盤控制模塊</p><p>  按鍵中有一個復位鍵及定時鍵、調時鍵加一鍵和減一鍵,一個按鍵接在復位電路上,另外四個按鍵接在P0——P4口,低電平表示有按鈕按下;按鈕沒有接防抖電路,需要設計軟件防抖。</p><p>  1、定時。按下定時鍵后可以開始定時,過程如下:定時---〉小時加/減---〉按定時---分鐘加/減---按定時。</p&

38、gt;<p>  2、調時。按下調時鍵后可以調時,過程如下:調時---年加/減---調時--月加/減---調時---日加/減---調時---時加/減---調時---分加/減---調時---秒加/減 ---調時。</p><p><b>  四、調試過程</b></p><p>  調試的主要過程包括硬件調試和軟件調試,其中軟件調試,也即程序編譯與仿真過程

39、處于本次設計調試過程的核心環(huán)節(jié)。由于本設計已經制作出液晶顯示電子鐘,所以硬件調試也很重要。兩種調試過程并非孤立或者分開的,而是緊密相關。在此我們用到的開發(fā)工具是仿真器。</p><p><b>  4.1 硬件調試</b></p><p>  完成仿真器軟件仿真后,就要連接上硬件也即液晶顯示電子鐘成品板進行硬件調試。</p><p>  將仿真

40、器通過串行電纜連接計算機上,將仿真頭接到仿真器,檢查接線是否有誤,確信沒有接錯后,接上電源,打開仿真器的電源開關。再進行仿真器和通信設置。</p><p>  仿真器和仿真頭設置正確,并且硬件連接沒有錯誤,出現(xiàn) “硬件仿真”的對話框,并顯示仿真器、仿真頭的型號及仿真器的序列號。表明仿真器初始化正確。</p><p>  硬件調試很重要也很麻煩,由于本次設計硬件非PCB制板,而是手工焊板,焊

41、點質量、布線是否合理等對系統(tǒng)的影響比較大,這無疑增加硬件調試的難度。由于此前沒有很多的練習,本次設計我所制作的液晶顯示電子鐘在質量工藝上很難達到滿意程度,不過在調試中還算穩(wěn)定,基本功能都能較穩(wěn)定地實現(xiàn)。</p><p>  難達到滿意程度,不過在調試中還算穩(wěn)定,基本功能都能較穩(wěn)定地實現(xiàn)。</p><p><b>  4.2 軟件調試</b></p>&l

42、t;p>  系統(tǒng)仿真分析電路原理圖在ISIS里設計完成,并將系統(tǒng)軟件編譯成.Hex文件,再進行電子時鐘的系統(tǒng)虛擬仿真。</p><p>  (1)在ISIS的原理圖中,右鍵單擊AT89C51將其選中,然后單擊左鍵打開AT89C51的Edit Component 對話框,如下圖所示。(2)選擇相應的.Hex文件,再在Proteus ISIS 編輯窗口的File菜單中選擇Save Design 選項,保存設計,

43、生成.DSN文件。</p><p>  4.3 測試數據與數據分析</p><p>  在Proteus ISIS的Debug菜單中選擇Execute,運行程序,系統(tǒng)仿真結果如下圖所示。</p><p><b> ?。▓D三) </b></p><p>  實現(xiàn)功能的具體方法:當進入調整功能時,按第一個鍵K1進行減運算,

44、按第二個鍵K2進行加運算。</p><p>  按下第三個鍵K3,實現(xiàn)日期\時間調整及\定時功能,等數字閃爍后,按一二鍵進行加減,從而可以進行具體日期時間調整。按下第四個鍵K4,可以進行時間\日期切換,將顯示時間或日期,采用24小時制。時間顯示格式為:時-分-秒;日期顯示格式為:日-月-年。具有顯示時間和日期的功能</p><p><b>  五、程序流程圖</b>&

45、lt;/p><p><b>  流程圖如下:</b></p><p><b>  (圖四)</b></p><p>  六、任務分工與成果展示</p><p><b>  6.1 前期準備:</b></p><p>  在課程設計前期,我和小江分好任務,便開

46、始著手查閱資料、調研,通過查閱有關書籍、論文,最終確定課題為基于STC89C52單片機的電子時鐘。</p><p>  6.2 課程設計過程</p><p>  設計電路圖,并根據所設計電路圖和單片機工作原理,為實現(xiàn)電子鐘附帶日歷及復位功能,在書上查找資料程序,并自己進行編程。經反復調試和修改,最終編譯通過,proteus仿真成功,LCD顯示器能根據程序要求來顯示時間并可通過開關進行顯示位

47、的選擇和時間的加減,而且按復位鍵可以回到初始設置,即程序中設計的2011-5-18 WED 23:59:20。</p><p>  將所編程序置入單片機內,并按照所設計電路圖在面包板上連線。經反復連線、檢查元件、檢查線路、檢驗程序,最終終于演示通過。</p><p>  按照電路圖,將各元器件焊接在電路板上,再用萬用表檢驗線路是否有空焊、短路等情況,進一步處理。顯示器正常顯示時間,并能達到

48、預期目標。課程設計完成。</p><p>  6.3 個人主要工作及遇到問題</p><p>  在本次課程設計中我主要負責軟件方面的程序的查找修改和硬件方面的焊接工作。</p><p>  過程中遇到了各種問題。程序的主體是查找資料得出的,中間加入了自己的修改。但是在改動過程中,幾次運行不成功。經多次檢查和修改,向同學請教,最終編譯通過。Proteus仿真過程是另

49、一同學完成的。</p><p>  在硬件方面,另一同學負責排線布局,我負責手工焊接。在面包板上幾次調試都不成功,顯示器亮的卻不顯示數字。曾懷疑線路連錯、元器件有損壞、背光沒有調好等問題,后經一一排除。接著就用萬用表測每條線路是否正常,終于發(fā)現(xiàn)有些應該是高電平卻不是,經過分析討論,認為可能是有接觸不良。后借了其他組的面包板嘗試,幾經波折,終于演示成功。焊接過程也是很容易出錯。焊好后接通電源,顯示屏不亮,經檢查,發(fā)

50、現(xiàn)有一處短路。稍作處理后,我們努力了一個星期的電子時鐘就成功了。</p><p><b>  6.4 成果展示</b></p><p> ?。ê附庸に嚺c排線布局)</p><p>  七、課程設計總結思考與致謝</p><p>  我們進行了為期兩周的課程設計成功結束了,時間雖短,但收獲頗多。</p>&l

51、t;p>  這次的課程設計,是一個嶄新的體驗,是一個學習的平臺,是一次興趣的啟迪,是嘗試著自己動手實踐的開始,是現(xiàn)實與需求之間差距的體現(xiàn),也是一個認識與改變的過程。</p><p>  安排課程設計的基本目的,是在于通過理論與實際的結合、人與人的溝通,進一步提高思想覺悟和領悟力。尤其是觀察、分析和解決問題的實際工作能力。作為整個學習體系的有機組成部分,課程設計雖然安排在兩周進行,但并不具有絕對獨立的意義。它

52、的一個重要功能,在于運用學習成果,檢驗學習成果。運用學習成果,把課堂上學到的系統(tǒng)化的理論知識,嘗試性地應用于實際設計工作,并從理論的高度對設計工作的現(xiàn)代化提出一些有針對性的建議和設想。檢驗學習成果,看一看課堂學習與實際工作到底有多大距離,并通過綜合分析,找出學習中存在的不足,以便為完善學習計劃,改變學習內容與方法提供實踐依據。</p><p>  對于我們理工類的本科生來說,實踐能力如何是至關重要的。而這種能力在

53、課堂上是學習不到的,必須從書本走向實踐。無論課本上的原理如何經典,課文中的描述如何生動,我們都只能理解,只能想象??墒沁@次的課程設計讓我們擁有了一個全新的體驗,與課堂完全不同,是一種耳目一新的感覺。許多人見看那些小小的元器件會說出:“原來這就是電容啊”“原來電阻這么小”“原來這又四十個引腳的小芯片就是我們所學的單片機啊”。有人說興趣是最好的老師。那么我想,在那一刻,許多人的興趣都被激發(fā)出來了。</p><p> 

54、 課程設計過程中,我們也遇到了各種各樣問題,在面包板上幾次調試都不成功,顯示器亮的卻不顯示數字。曾懷疑線路連錯、元器件有損壞、背光沒有調好等問題,后經一一排除。接著用萬用表測每條線路是否正常,終于發(fā)現(xiàn)有些應該是高電平卻不是,有些該有電壓差卻沒有,經過分析討論,認為可能是有接觸不良。后借了其他組的面包板嘗試,幾經波折,終于演示成功。</p><p>  在設計中我主要負責的是硬件布線、焊接工作。無論是布線還是焊接都

55、是精細的活,且他們的重要性是相當的。布線布的好,焊接起來不但整體布局美觀,同時能省時省力,而且減少空焊、落焊的幾率。焊接確實要精中有細。在其他的組中都是男生在焊接,因為也許他們認為拿著烙鐵焊東西不適合女生做,我卻不這么認為。男生粗手粗腳,不細心,這樣的活交給他們很可能會焊成一片,在我的自告奮勇下,帶著組員的信任,我把事先布好的導線與引腳一個一個的焊好。不只要細,還要精、穩(wěn),每次焊接結束時抬手要果斷迅速。我覺得只要心細、手穩(wěn),焊接一點都不

56、難。焊好后接電源,起初不亮,經檢查有一處短路,稍作處理,我們的顯示就正常了。成功的心情自然愉快,我焊好的板子在班級里幾乎是最漂亮、問題最少的,為此我也竊喜了一下。</p><p>  課程設計達到了專業(yè)學習的預期目的。在一個多星期的課程設計之后,我們普遍感到不僅實際動手能力有所提高,而且掌握單片機開發(fā)編程設計的基本流程,了解 Keil 及 Proteus 軟件的基本使用,了解 LCD 的基本使用,并且學習了單片機

57、硬件制作。在課程實際和制作過程中進一步激發(fā)了我們對專業(yè)知識的興趣,并能夠結合實際存在的問題在專業(yè)領域內進行更深入的學習。通過這次課程設計,我們也看到了自身狀況與現(xiàn)實需要的差距,有了這樣的認識,便于我們在今后的學習中及時補充和調整。</p><p>  我相信這次課程設計會對我以后的工作會有很大程度的益處,在此還要感謝學院為我們提供這次機會,感謝王子涵老師的用心指導!</p><p><

58、;b>  八、參考文獻</b></p><p><b>  附錄1:(程序)</b></p><p>  #include<reg51.h></p><p>  #define uchar unsigned char</p><p>  void write_hms(uchar,uchar)

59、;</p><p>  void time_setup();</p><p>  uchar a,count,hh,mm,ss,year,year0=20,year1=11,mon=5,day=18,flagy,flagw=3,flagk;</p><p>  uchar code table0[]=" 2011-05-18 WED";</

60、p><p>  uchar code table1[]=" 00:00:00";</p><p>  sbit RS=P2^0; // 數據/命令選擇端(H/L)</p><p>  sbit LE=P2^1; // 使能信號</p><p>  sbit kfun=P2^2; //功能鍵</p&

61、gt;<p>  sbit kadd=P2^3; //增加</p><p>  sbit ksub=P2^4; //減少</p><p>  void delay(uchar z) </p><p>  {uchar x,y;</p><p>  for(x=z;x>0;x--)</p><p

62、>  for(y=110;y>0;y--);</p><p><b>  }</b></p><p>  void write_com(uchar com) </p><p>  {RS=0; //寫命令</p><p><b>  P0=com;</b></p>

63、<p><b>  delay(5);</b></p><p><b>  LE=1;</b></p><p><b>  delay(5);</b></p><p><b>  LE=0;</b></p><p><b>  }&l

64、t;/b></p><p>  void write_data(uchar Data) </p><p>  {RS=1; //寫數據</p><p><b>  P0=Data;</b></p><p><b>  delay(5);</b></p><p>

65、;<b>  LE=1;</b></p><p><b>  delay(5);</b></p><p><b>  LE=0;</b></p><p><b>  }</b></p><p>  void init()</p><p&

66、gt;  {LE=0;//初始化使能信號</p><p>  write_com(0x38);//設置顯示模式</p><p>  write_com(0x0c);//顯示開關、光標設置</p><p>  write_com(0x06);//屏幕移動操作</p><p>  write_com(0x80);//寫入數據地址&l

67、t;/p><p>  write_com(0x01);//清屏</p><p>  //寫入初始化顯示值</p><p>  write_com(0x80);</p><p>  for(a=0;a<15;a++)</p><p>  {write_data(table0[a]);</p><p

68、><b>  delay(5);</b></p><p><b>  }</b></p><p>  write_com(0x80+0x40);</p><p>  for(a=0;a<12;a++)</p><p>  {write_data(table1[a]);</p>

69、<p><b>  delay(5);</b></p><p><b>  }</b></p><p>  TMOD=0x01; //開啟定時器T0中斷</p><p>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%2

70、56;</p><p><b>  EA=1;</b></p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  hh=23;</b></p><p><b

71、>  mm=58;</b></p><p><b>  ss=56;</b></p><p>  year=year0*100+year1;</p><p>  flagy=(year%4==0&&year%100!=0)||(year%400==0);</p><p>  write_

72、hms(0x40+3,hh);</p><p>  write_hms(0x40+6,mm);</p><p>  write_hms(0x40+9,ss);</p><p><b>  }</b></p><p>  void write_hms(uchar addr,uchar Data) //顯示:年、月、日、十

73、、分、秒</p><p>  {uchar shi,ge; </p><p>  shi=Data/10;</p><p>  ge=Data%10;</p><p>  write_com(0x80+addr);</p><p>  write_data(0x30+shi);</p><

74、p>  write_data(0x30+ge);</p><p>  write_com(0x80+addr);</p><p><b>  }</b></p><p>  void time0() interrupt 1//定時器T0中斷函數</p><p>  {TH0=(65536-50000)/256;

75、</p><p>  TL0=(65536-50000)%256;</p><p><b>  count++;</b></p><p>  if(count==20)</p><p><b>  {count=0;</b></p><p>  time_setup();&l

76、t;/p><p><b>  }</b></p><p><b>  }</b></p><p>  void week_setup(uchar fl)//顯示星期</p><p>  {switch(fl)</p><p><b>  {case 0:<

77、;/b></p><p>  {write_com(0x80+12);</p><p>  write_data('S');</p><p>  write_data('U');</p><p>  write_data('N');</p><p>  write_

78、com(0x80);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 1:</b></p><p>  {write_com(0x80+12);</p><p>  writ

79、e_data('M');</p><p>  write_data('O');</p><p>  write_data('N');</p><p>  write_com(0x80);</p><p><b>  break;</b></p><p&g

80、t;<b>  }</b></p><p><b>  case 2:</b></p><p>  {write_com(0x80+12);</p><p>  write_data('T');</p><p>  write_data('U');</p>

81、<p>  write_data('E');</p><p>  write_com(0x80);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 3:</b><

82、/p><p>  {write_com(0x80+12);</p><p>  write_data('W');</p><p>  write_data('E');</p><p>  write_data('D');</p><p>  write_com(0x80);&

83、lt;/p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 4:</b></p><p>  {write_com(0x80+12);</p><p>  write_data('

84、;T');</p><p>  write_data('H');</p><p>  write_data('U');</p><p>  write_com(0x80);</p><p><b>  break;</b></p><p><b>

85、  }</b></p><p><b>  case 5:</b></p><p>  {write_com(0x80+12);</p><p>  write_data('F');</p><p>  write_data('R');</p><p>

86、  write_data('I');</p><p>  write_com(0x80);</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 6: </b></p>&l

87、t;p>  {write_com(0x80+12);</p><p>  write_data('S');</p><p>  write_data('A');</p><p>  write_data('T');</p><p>  write_com(0x80);</p>

88、<p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void time_setup() //時間調整、設置函數

89、xxxx-xx-xx XXX</p><p>  { ss++; // xx:xx:xx</p><p>  if(ss==60)</p><p><b>  {ss=0;</b></p><p><b>  mm++;</b></p><p>  if(m

90、m==60)</p><p><b>  {hh++;</b></p><p><b>  mm=0;</b></p><p>  if(hh==24)</p><p><b>  {hh=0;</b></p><p><b>  day++;

91、</b></p><p><b>  flagw++;</b></p><p>  if(flagw==7){flagw=0;}</p><p>  week_setup(flagw);</p><p>  if(((day>31)&&(mon==1||mon==3||mon==5||m

92、on==7||mon==8||mon==10||mon==12))</p><p>  ||((day>30)&&(mon==4||mon==6||mon==9||mon==11))||((day>29)&&(mon==2)&&(flagy==1))</p><p>  ||((day>28)&&(mon==

93、2)&&(flagy==0)))</p><p><b>  {day=1;</b></p><p><b>  mon++;</b></p><p>  if(mon==12)</p><p><b>  {mon=1;</b></p><

94、p><b>  year1++;</b></p><p>  if(year1==100) </p><p><b>  {year0++;</b></p><p><b>  year1=0;</b></p><p>  if(year0==100) {year0=20

95、;year1=8;}</p><p><b>  }</b></p><p>  year=year0*100+year1;</p><p>  flagy=(year%4==0&&year%100!=0)||(year%400==0);</p><p>  write_hms(1,year0);<

96、/p><p>  write_hms(3,year1);</p><p><b>  }</b></p><p>  write_hms(6,mon);</p><p><b>  }</b></p><p>  write_hms(9,day);</p><

97、p><b>  }</b></p><p>  write_hms(0x40+3,hh);</p><p><b>  }</b></p><p>  write_hms(0x40+6,mm);</p><p><b>  }</b></p><p&g

98、t;  write_hms(0x40+9,ss);</p><p><b>  }</b></p><p>  void keysan()</p><p>  {if(kfun==0)</p><p>  {delay(5);</p><p>  if(kfun==0)</p>&l

99、t;p>  {while(!kfun);</p><p><b>  flagk++;</b></p><p><b>  TR0=0;</b></p><p><b>  }</b></p><p><b>  }</b></p>&

100、lt;p>  switch(flagk)</p><p>  {case 0: break; //等待中...</p><p>  case 1: //設置秒</p><p>  {write_com(0x80+0x40+10);</p><p>  write_com(0x0d);</p>

101、<p>  if(kadd==0)</p><p>  {delay(5);</p><p>  if(kadd==0)</p><p>  {while(!kadd);</p><p><b>  ss++;</b></p><p>  if(ss==60) ss=0;</p&g

102、t;<p>  write_hms(0x40+9,ss);</p><p>  write_com(0x80+0x40+10);</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(ksub==0)</p>

103、<p>  {delay(5);</p><p>  if(ksub==0)</p><p>  {while(!ksub);</p><p><b>  ss--;</b></p><p>  if(ss==255) ss=59;</p><p>  write_hms(0x40+9,

104、ss);</p><p>  write_com(0x80+0x40+10);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }&l

105、t;/b></p><p>  case 2://設置分</p><p>  {write_com(0x80+0x40+7);</p><p>  write_com(0x0d);</p><p>  if(kadd==0)</p><p>  {delay(5);</p><p

106、>  if(kadd==0)</p><p>  {while(!kadd);</p><p><b>  mm++;</b></p><p>  if(mm==60) mm=0;</p><p>  write_hms(0x40+6,mm);</p><p>  write_com(0x8

107、0+0x40+7);</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(ksub==0)</p><p>  {delay(5);</p><p>  if(ksub==0)</p><p&

108、gt;  {while(!ksub);</p><p><b>  mm--;</b></p><p>  if(mm==255) mm=59;</p><p>  write_hms(0x40+6,mm);</p><p>  write_com(0x80+0x40+7);</p><p>&l

109、t;b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case 3://設置時</p><p>  {w

110、rite_com(0x80+0x40+4);</p><p>  write_com(0x0d);</p><p>  if(kadd==0)</p><p>  {delay(5);</p><p>  if(kadd==0)</p><p>  {while(!kadd);</p><p>

111、<b>  hh++;</b></p><p>  if(hh==24) hh=0;</p><p>  write_hms(0x40+3,hh);</p><p>  write_com(0x80+0x40+4);</p><p><b>  }</b></p><p>&

112、lt;b>  }</b></p><p>  else if(ksub==0)</p><p>  {delay(5);</p><p>  if(ksub==0)</p><p>  {while(!ksub);</p><p><b>  hh--;</b></p>

113、;<p>  if(hh==255) hh=23;</p><p>  write_hms(0x40+3,hh);</p><p>  write_com(0x80+0x40+4);</p><p><b>  }</b></p><p><b>  }</b></p>

114、<p><b>  break;</b></p><p><b>  }</b></p><p>  case 4: //設置日</p><p>  {write_com(0x80+10);</p><p>  write_com(0x0d);</p><

115、p>  if(kadd==0)</p><p>  {delay(5);</p><p>  if(kadd==0)</p><p>  {while(!kadd);</p><p><b>  day++;</b></p><p>  if(((day>31)&&(m

116、on==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12))</p><p>  ||((day>30)&&(mon==4||mon==6||mon==9||mon==11))||((day>29)&&(mon==2)&&(flagy==1))</p><p>  ||((da

117、y>28)&&(mon==2)&&(flagy==0))) day=1;</p><p>  write_hms(9,day);</p><p>  write_com(0x80+10);</p><p><b>  }</b></p><p><b>  }</b&

118、gt;</p><p>  else if(ksub==0)</p><p>  {delay(5);</p><p>  if(ksub==0)</p><p>  {while(!ksub);</p><p><b>  day--;</b></p><p>  if(

119、day==0)</p><p>  {switch(mon)</p><p><b>  {case 1:</b></p><p><b>  case 3:</b></p><p><b>  case 5:</b></p><p><b>

120、  case 7:</b></p><p><b>  case 8:</b></p><p><b>  case 10:</b></p><p>  case 12:day=31;break;</p><p><b>  case 4:</b></p>

121、;<p><b>  case 6:</b></p><p><b>  case 9:</b></p><p>  case 11:day=30;break;</p><p>  case 2: if(flagy==1) {day=29;break;}</p><p>  else{

122、day=28;break;}</p><p><b>  }</b></p><p><b>  }</b></p><p>  write_hms(9,day);</p><p>  write_com(10);</p><p><b>  }</b>

123、</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case 5: //設置月</p><p>  {write_com(0x80+7);&

124、lt;/p><p>  write_com(0x0d);</p><p>  if(kadd==0)</p><p>  {delay(5);</p><p>  if(kadd==0)</p><p>  {while(!kadd);</p><p><b>  mon++;</b

125、></p><p>  if(mon==13) mon=1;</p><p>  write_hms(6,mon);</p><p>  write_com(0x80+7);</p><p><b>  }</b></p><p><b>  }</b></p&g

126、t;<p>  else if(ksub==0)</p><p>  {delay(5);</p><p>  if(ksub==0)</p><p>  {while(!ksub);</p><p><b>  mon--;</b></p><p>  if(mon==0) mon

127、=12;</p><p>  write_hms(6,mon);</p><p>  write_com(0x80+7);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b>&

128、lt;/p><p><b>  }</b></p><p>  case 6: //設置年</p><p>  {write_com(0x80+4);</p><p>  write_com(0x0d);</p><p>  if(kadd==0)</p><p>

129、;  {delay(5);</p><p>  if(kadd==0)</p><p>  {while(!kadd);</p><p><b>  year1++;</b></p><p>  if(year1==100)</p><p><b>  {year0++;</b&g

溫馨提示

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

評論

0/150

提交評論