版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 摘 要</b></p><p> 本設(shè)計以AT89C51單片機為核心芯片,與型號為1602的液晶顯示器構(gòu)成數(shù)字電子時鐘電路。AT89C51是一個低功耗,高性能CMOS 8位單片機,片內(nèi)含4K Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,
2、兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及AT89C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89C51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價比的解決方案.液晶顯示器以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點,在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中得到越來越廣泛的應(yīng)用。</p><p> 關(guān)鍵詞: 液晶顯示器;單片機;數(shù)字時鐘</p><p>
3、;<b> Abstract</b></p><p> The design AT89C51 microcontroller core chip, and the Model 1602 hungry for a digital LCD clock electronic circuit. AT89C51 SCM is a VLSI chip, which integrates CPU, M
4、emory (RAM / ROM), I / O interface, timer / counter, serial communication interface circuit. With a high degree of integration, small size, high reliability and control functions, low power consumption characteristics. M
5、odel for the 1602 character LCD with micro-power consumption, small size, content rich, Ultra-thin and light many</p><p> Keywords: liquid crystal display; microcontroller; digital clock </p><p&
6、gt;<b> 目 錄</b></p><p><b> 摘 要i</b></p><p> Abstractii</p><p> 第 1 章 緒 論1</p><p> 1.1 電子時鐘研究意義及簡介1</p><p> 1.2 數(shù)字電子時鐘的
7、功能1</p><p> 第 2 章基于單片機的數(shù)字電子時鐘的設(shè)計方案選擇2</p><p> 2.1 主控制器2</p><p> 2.1.1 采用數(shù)字邏輯芯片2</p><p> 2.1.2 采用單片機作為整個控制系統(tǒng)的核心2</p><p> 2.2 時鐘控制方案比較2</p
8、><p> 2.3 鍵盤顯示方案比較3</p><p> 第 3 章系統(tǒng)功能實現(xiàn)總體設(shè)計思路4</p><p> 3.1 系統(tǒng)器件介紹4</p><p> 3.1.1 AT89C51單片機的結(jié)構(gòu)4</p><p> 3.1.1.1 中央處理器(CPU)4</p><p>
9、; 3.1.1.2 內(nèi)部數(shù)據(jù)存儲器(內(nèi)部RAM)5</p><p> 3.1.1.3 內(nèi)部程序存儲器(內(nèi)部ROM)5</p><p> 3.1.1.4 定時器/計數(shù)器5</p><p> 3.1.1.5 并行I/O口 5</p><p> 3.1.1.6 串行口 5</p><p> 3
10、.1.1.7 時鐘電路5</p><p> 3.1.2 LCD1602液晶的介紹5</p><p> 3.1.2.1 LCD1602特征及應(yīng)用5</p><p> 3.1.2.2 LCD1602指令集5</p><p> 3.1.2.3 LCD1602管腳功能6</p><p> 3.2
11、 數(shù)字時鐘的總體設(shè)計6</p><p> 3.3 數(shù)字時鐘的功能6</p><p> 第 4 章基于單片機的數(shù)字電子鐘系統(tǒng)硬件設(shè)計8</p><p> 4.1 時鐘電路模塊8</p><p> 4.2 復(fù)位電路模塊9</p><p> 4.3 LCD1602顯示電路模塊10</p&
12、gt;<p> 4.4 按鍵電路模塊11</p><p> 4.5 鬧鈴電路模塊11</p><p> 4.6 系統(tǒng)硬件電路圖12</p><p> 第 5 章基于單片機的數(shù)字電子鐘系統(tǒng)軟件設(shè)計14</p><p> 5.1 系統(tǒng)軟件設(shè)計14</p><p> 5.2 主
13、程序設(shè)計14</p><p> 5.2.1 實現(xiàn)功能14</p><p> 5.2.2 功能流程圖15</p><p> 5.3 按鍵掃描程序設(shè)計16</p><p> 5.3.1 實現(xiàn)功能16</p><p> 5.3.2 按鍵掃描流程圖16</p><p>
14、 5.3.3 按鍵掃描部分代碼17</p><p> 5.4 時間更新程序處理函數(shù)18</p><p> 5.4.1 實現(xiàn)功能18</p><p> 5.4.2 工作流程圖18</p><p> 5.4.3 時間更新程序部分代碼19</p><p> 5.5 秒表更新程序處理函數(shù)23&
15、lt;/p><p> 5.5.1 時間更新程序部分代碼23</p><p> 5.5.2 工作流程圖24</p><p> 5.5.3 函數(shù)部分代碼25</p><p> 5.6 顯示切換函數(shù)處理程序27</p><p> 5.6.1 實現(xiàn)功能27</p><p>
16、5.6.2 工作流程圖27</p><p> 5.6.3 顯示切換函數(shù)部分代碼28</p><p><b> 結(jié) 論33</b></p><p><b> 致 謝34</b></p><p><b> 參考文獻35</b></p><p
17、><b> 附錄A36</b></p><p><b> 附錄B43</b></p><p><b> 緒 論</b></p><p> 電子時鐘研究意義及簡介</p><p> 時鐘,是我們生活中不可缺少的,隨著時代的發(fā)展,人們對時鐘的要求越來越高,這就要
18、我們對時鐘的設(shè)計的要求也越來越來高。我們用過的機械時鐘,它成本高,內(nèi)部結(jié)構(gòu)復(fù)雜,功能少;而采用集成電路的時鐘,它電路較復(fù)雜,都不符合這個時代的設(shè)計理念。通過研究對比我們選擇設(shè)計一款基于單片機的簡易電子時鐘,電子時鐘一般由震蕩器,分頻器,譯碼器,顯示器等部分組成,這些都是數(shù)字電路最基本的,應(yīng)用最廣的電路。它成本低,體積小,簡單實用,功能強大。這款簡易電子時鐘使用AT89C51單片機芯片控制電路,單片機控制電路簡單且省去了很多復(fù)雜的線路,使
19、得電路簡明易懂,使用鍵盤鍵上的按鍵來調(diào)整時鐘的年、月、日、時、分、秒和設(shè)置鬧鈴,用揚聲器來進行定時提醒,用LCD1602來進行顯示,同時使用C語言程序來控制整個時鐘顯示,使得編程變得更容易</p><p><b> 數(shù)字電子時鐘的功能</b></p><p> 電子時鐘主要是利用電子技術(shù)將時鐘電子化,數(shù)字化,擁有時間精確、體積小、界面友好、可擴展性能強等特點,被廣
20、泛應(yīng)用于生活和工作當(dāng)中。本簡易電子時鐘設(shè)計功能主要為:</p><p> 1.年月日時分秒顯示及校對功能,24小時制。</p><p><b> 2.具有鬧鈴功能。</b></p><p><b> 3.具有秒表功能。</b></p><p> 基于單片機的數(shù)字電子時鐘的設(shè)計方案選擇<
21、/p><p><b> 主控制器</b></p><p><b> 采用數(shù)字邏輯芯片</b></p><p> 本系統(tǒng)有功能設(shè)置、數(shù)據(jù)裝入、定時、顯示、音響控制多個功能模塊。各個狀態(tài)保持或轉(zhuǎn)移的條件依賴于鍵盤控制信號。由于鍵盤控制信號繁多,系統(tǒng)的邏輯狀態(tài)以及相互轉(zhuǎn)移更是復(fù)雜,用純粹的數(shù)字電路或小規(guī)模的可編程邏輯電路實現(xiàn)該
22、系統(tǒng)有一定的困難,需要用中大規(guī)模的可編程邏輯電路。這樣,系統(tǒng)的成本就會急劇上升〔相對于方案二〕。因此,本設(shè)計并未采用這種方案。</p><p> 采用單片機作為整個控制系統(tǒng)的核心</p><p> 由于單片機具有體積小、成本低、可靠性高、抗干擾能力強、應(yīng)用靈活、開發(fā)效率高、易于被產(chǎn)品化等優(yōu)點,其具有很強的面向控制的能力,自70年代以來,在很多領(lǐng)域得到廣泛的應(yīng)用。單片機有8位,如51系列
23、;有16位的如98系列;還有32位的,如當(dāng)前市場比較熱門的ARM單片機。單片機比較容易實現(xiàn)系統(tǒng)的智能化控制,而且方便,經(jīng)濟。鑒于市場上常見的51系列8位單片機的售價比較低廉,技術(shù)成熟,對于我們的系統(tǒng)在控制上完全能夠勝任。我們的設(shè)計采用AT89C51型單片機。</p><p> 本系統(tǒng)的主控制器采用AT89C51單片機作為整個控制系統(tǒng)的核心</p><p><b> 時鐘控制方
24、案比較</b></p><p> 方案一 使用專用時鐘芯片。</p><p> 使用微控制器控制專用時鐘芯片實現(xiàn)計時控制,這種方案有著計時精度高、控制簡單的優(yōu)點,而且更易于實現(xiàn)日期/時間顯示、定時烹調(diào)等計時擴展功能。</p><p> 方案二 采用小規(guī)模集成元件定時</p><p> 此方案主要使用計數(shù)器/分頻器。該方法價
25、格便宜,但是接線復(fù)雜,設(shè)計也比較困難,對時序要求比較高。同時該方案功能單一,也無法實現(xiàn)復(fù)雜功能,可擴展性差。也不能實現(xiàn)一些人性化的界面設(shè)計</p><p> 方案三 利用MCU的內(nèi)部定時器軟件現(xiàn)實時鐘功能。</p><p> 鑒于本系統(tǒng)采用AT89C51單片機作為整個控制系統(tǒng)的核心,充分利用單片機內(nèi)部的時鐘電路,進行定時控制,從而減少電路設(shè)計的復(fù)雜度,而且能夠減少整套系統(tǒng)的成本。另外,
26、單片機能夠?qū)崿F(xiàn)復(fù)雜功能,充分利用單片機擴展靈活特性,通過設(shè)計軟件,能夠設(shè)計出友好的人機界面接口和性能。況且單片機價格也比較便宜,性價比很高。</p><p> 本系統(tǒng)時鐘控制部分我們采用了方案三,從而充分體現(xiàn)出高性價比。</p><p><b> 鍵盤顯示方案比較</b></p><p> 方案一 采用并行口擴展芯片擴展并行口的方法來設(shè)計
27、鍵盤顯示系統(tǒng)。</p><p> 采用鍵盤顯示專用控制器8279顯示時鐘、火力、倒計時等等功能,而用LED顯示各種工作狀態(tài)的指示信號。這種方法鍵盤控制簡單,但8279只能顯示數(shù)字信息,顯示能力有限,不靈活。如果采用這種方法,為了表達更多的信息,就必需使用許多LED來引導(dǎo)用戶進行操作。</p><p> 方案二 中文字符顯示和端口鍵盤掃描</p><p> 采用
28、LCD液晶字符顯示。字符顯示具有強大的信息表達能力,采用這種顯示方法只需少量的鍵盤加上軟件配合,就可以實現(xiàn)多種用戶功能控制和選擇,目前市場上LCD1602系列的液晶顯示模塊技術(shù)比較成熟,這是一種能夠顯示2行,每行16個字符的液晶顯示模塊。而少量的鍵盤,使用軟件掃描方法將會比使用8279經(jīng)濟許多,而且控制起來也不為了實現(xiàn)更多的功能而又減少成本。我們采用了方案二作為本系統(tǒng)的鍵盤顯示。</p><p> 綜上所述,我
29、們的總體設(shè)計思想是硬件盡量簡單,用軟件實現(xiàn)更多的功能,這樣就可以用比較低的成本來實現(xiàn)這個系統(tǒng) 。本系統(tǒng)采用AT89C51作為主控部分,LCD1602液晶作為顯示部分,鍵盤使用軟件掃描方法,使用一個蜂鳴器作為聲音提示部分</p><p> 系統(tǒng)功能實現(xiàn)總體設(shè)計思路</p><p><b> 系統(tǒng)器件介紹</b></p><p> AT89C
30、51單片機的結(jié)構(gòu)</p><p> AT89C51單片機是美國Atmel公司生產(chǎn)低電壓,高性能CMOS 8位單片機,片內(nèi)含4k bytes的可反復(fù)擦寫的只讀程序存儲器(EPROM)和128 bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用Atmel公司的高密度、非易失性存取技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和Flash 存儲單元,功能強大。AT89C51單片機可提供許多
31、高性價比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域。</p><p> 圖3-1為AT89C51單片機的基本組成功能方塊圖。有圖可見,在這一塊芯片上,集成了一臺微型計算機的主要組成部分,其中包括CPU、存儲器、可編程I/O口、定時器/計數(shù)器、串行口等,各部分通過內(nèi)部總線相連。下面介紹幾個主要部分。</p><p> 外時鐘源外部事件數(shù)</p><p> 外中斷
32、 控制 并行口 串行通信</p><p> 圖3-1 AT89C51 功能方塊圖</p><p> 中央處理器(CPU)</p><p> 中央處理器是單片機中最核心的部分,是單片機的大腦和心臟,主要完成運算和控制功能。AT89C51的CPU是一個字長為8位的中央處理單元
33、,即它對數(shù)據(jù)的處理是按字節(jié)為單位進行的。</p><p> 內(nèi)部數(shù)據(jù)存儲器(內(nèi)部RAM)</p><p> AT89C51 中共有256個RAM單元,但其中能作為寄存器供用戶使用的僅有前面128個,后128個被專用寄存器占用。</p><p> 內(nèi)部程序存儲器(內(nèi)部ROM)</p><p> AT89C51 共有4 KB掩膜ROM,用
34、于存放程序、原始數(shù)據(jù)等</p><p><b> 定時器/計數(shù)器</b></p><p> AT89C51 共有2 個16 位的定時器/計數(shù)器,可以實現(xiàn)定時和計數(shù)功能。</p><p><b> 并行I/O口</b></p><p> AT89C51 共有4 個8 位的I/O口(P0、P1、
35、P2、P3口),可以實現(xiàn)數(shù)據(jù)的并行輸入、輸出。</p><p><b> 串行口</b></p><p> AT89C51有1 個全雙工的可編程串行口,以實現(xiàn)單片機和其他設(shè)備之間的串行數(shù)據(jù)傳送。</p><p><b> 時鐘電路</b></p><p> AT89C51 單片機內(nèi)部有時鐘電
36、路,但是晶振和微調(diào)電容需要外接。時鐘電路為單片機產(chǎn)生時鐘脈沖序列</p><p> LCD1602液晶的介紹</p><p> LCD1602特征及應(yīng)用</p><p> 微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧,常用在袖珍式儀表和低功耗應(yīng)用系統(tǒng)中</p><p> LCD1602指令集</p><p> 16
37、02通過D0~D7的8位數(shù)據(jù)端傳輸數(shù)據(jù)和指令。</p><p> 顯示模式設(shè)置: (初始化)</p><p> 0011 0000 [0x38] 設(shè)置16×2顯示,5×7點陣,8位數(shù)據(jù)接口;</p><p> 顯示開關(guān)及光標(biāo)設(shè)置: (初始化)</p><p> 0000 1DCB D顯示(1有效)、C光標(biāo)顯示(1有
38、效)、B光標(biāo)閃爍(1有效)</p><p> 0000 01NS N=1(讀或?qū)懸粋€字符后地址指針加1 &光標(biāo)加1),</p><p> N=0(讀或?qū)懸粋€字符后地址指針減1 &光標(biāo)減1),</p><p> S=1 且 N=1 (當(dāng)寫入一個字符后,整屏顯示左移)</p><p> s=0 當(dāng)寫入一個字符后,整屏顯示不
39、移動</p><p><b> 數(shù)據(jù)指針設(shè)置:</b></p><p> 數(shù)據(jù)首地址為80H,所以數(shù)據(jù)地址為80H+地址碼(0-27H,40-67H)</p><p><b> 其他設(shè)置:</b></p><p> 01H(顯示清屏,數(shù)據(jù)指針=0,所有顯示=0);02H(顯示回車,數(shù)據(jù)指針=
40、0)。</p><p> LCD1602管腳功能</p><p> 1602采用標(biāo)準(zhǔn)的16腳接口,其中:</p><p> 第1腳:VSS為電源地</p><p> 第2腳:VDD接5V電源正極</p><p> 第3腳:V0為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地電源時對比度最高(對比度過高時會
41、 產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。</p><p> 第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。</p><p> 第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。</p><p> 第6腳:E(或EN)端為使能(enable)端。</p><p&
42、gt; 第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。</p><p><b> 數(shù)字時鐘的總體設(shè)計</b></p><p> 此設(shè)計原理框圖如下圖3-2所示,此電路包括以下三個部分:單片機,鍵盤,鬧鈴電路。采用AT89C51芯片和LCD1602等來實現(xiàn)電子時鐘的功能。</p><p><b> 圖3-2總體設(shè)計圖</b&g
43、t;</p><p><b> 數(shù)字時鐘的功能</b></p><p> 電子時鐘主要是利用電子技術(shù)將時鐘電子化,數(shù)字化,擁有時間精確、體積小、界面友好、可擴展性能強等特點,被廣泛應(yīng)用于生活和工作當(dāng)中。本簡易電子時鐘設(shè)計功能主要為:</p><p> 1.年月日時分秒顯示及校對功能,24小時制。</p><p>&
44、lt;b> 2.具有鬧鈴功能。</b></p><p><b> 3.具有秒表功能。</b></p><p> 基于單片機的數(shù)字電子鐘系統(tǒng)硬件設(shè)計</p><p> 該數(shù)字電子時鐘工作原理是用一片AT89C51單片機通過編程去控制LCD1602實現(xiàn)的。通過2個開關(guān)控制來進行時間的調(diào)節(jié)以及秒表功能,P2.0(key1)口
45、控制按鍵,當(dāng)系統(tǒng)處于正常時間顯示并且按下此鍵時,可以進入秒表功能和時間功能的切換,此鍵還可以作為時間和日期以及鬧鈴的調(diào)整位選中鍵,當(dāng)系統(tǒng)處于時間顯示模式時,按此鍵可以選中相應(yīng)的需要調(diào)整的位。當(dāng)系統(tǒng)處于時間顯示模式時,P2.1(key2)口控制按鍵,按此鍵對相應(yīng)的選中位進行加,當(dāng)系統(tǒng)處于秒表工作模式時按此鍵可以控制秒表計時的啟動和暫停。</p><p><b> 其工作流程:</b><
46、/p><p> 1.年月日時分秒顯示。通電后LCD自動顯示C語言程序設(shè)置好的默認(rèn)時間</p><p> 2.鬧鐘顯示和設(shè)定。通電后,A的右邊顯示的是默認(rèn)的鬧鐘時間,通過key1和key2可以設(shè)置鬧鈴時間。</p><p> 3.秒表顯示以及啟動和暫停以及清零。LCD處于正常顯示時間模式下時按下key1釋放后可以進入秒表模式,前3次按下key2的功能依次為啟動停止清
47、零,每按3次key2為一個輪回。</p><p><b> 時鐘電路模塊</b></p><p> 下圖所示為時鐘電路原理圖,在AT89C51芯片內(nèi)部有一個高增益反相放大器,其輸出端為引腳XTAL2,輸入為芯片引腳XTAL1。而在芯片外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調(diào)電容,構(gòu)成一個穩(wěn)定的自激振蕩電路,電路產(chǎn)生的振蕩脈沖經(jīng)過觸發(fā)器進行十二分頻之后,
48、便成為單片機的時鐘信號。</p><p> 圖4-1時鐘電路模塊</p><p><b> 復(fù)位電路模塊</b></p><p> 下圖所示為復(fù)位電路原理圖,在單片機的實際應(yīng)用系統(tǒng)中,除單片機本身需復(fù)位以外,外部擴展的I/O接口電路等也需要一個復(fù)位,因此需要一個系統(tǒng)的同步復(fù)位信號,即單片機復(fù)位后,CPU開始工作,外部的電路一定要復(fù)位好,以
49、保證CPU有效地對外部電路進行初始化編程。單片機復(fù)位的條件是:必須使RST/VPD 或RST引腳加上持續(xù)兩個機器周期(即24個振蕩周期)的高電平。電路為上電復(fù)位電路,它是利用電容充電來實現(xiàn)的。在接電瞬間,RST端的電位與VCC相同,隨著充電電流的減少,RST的電位逐漸降低。只要保證RST為高電平時間大于兩個機器周期,就能正常復(fù)位。</p><p> 圖4-2復(fù)位電路模塊</p><p>
50、 LCD1602顯示電路模塊</p><p> 下圖所示為LCD1602顯示模塊電路原理圖</p><p> 圖4-3顯示電路模塊</p><p><b> 按鍵電路模塊</b></p><p> 下圖所示為獨立按鍵模塊電路原理圖,根據(jù)此電子時鐘功能要求,需要設(shè)置以下兩個功能鍵:工作模式鍵(key1),模式輔助
51、鍵(key2)。按照鍵盤與CPU的連接方式可分為獨立鍵盤和矩陣鍵盤。獨立式鍵盤是各個按鍵相互獨立,每個按鍵占用一個I/O口,外加上拉電阻,每個I/O口上的按鍵不會影響到其他I/O口的按鍵工作狀態(tài)。獨立式鍵盤電路配置靈活,軟件結(jié)構(gòu)簡單,所以本設(shè)計采用獨立式鍵盤。</p><p> 圖4-4按鍵電路模塊</p><p><b> 鬧鈴電路模塊</b></p>
52、;<p> 下圖所示為鬧鈴模塊電路原理圖,鬧鈴模式時,設(shè)定好鬧鈴的時間,鬧鈴的時間有時和分,當(dāng)設(shè)定好的鬧鈴時間與系統(tǒng)的當(dāng)前時間的時和分相等時,系統(tǒng)給P2.2端口送低交替的高低電平,蜂鳴器發(fā)出一定頻率報警聲,一分鐘后報警聲停止,如果這一分鐘內(nèi)有按鍵按下則報警聲也停止。</p><p> 圖4-5鬧鈴電路模塊</p><p><b> 系統(tǒng)硬件電路圖</b&
53、gt;</p><p> 下圖所示系統(tǒng)電路原理圖, 該數(shù)字電子時鐘工作原理是用一片AT89C51單片機通過編程去控制LCD1602實現(xiàn)的。通過2個開關(guān)控制來進行時間的調(diào)節(jié)以及秒表功能,P2.0(key1)口控制按鍵,當(dāng)系統(tǒng)處于正常時間顯示并且按下此鍵時,可以進入秒表功能和時間功能的切換,此鍵還可以作為時間和日期以及鬧鈴的調(diào)整位選中鍵,當(dāng)系統(tǒng)處于時間顯示模式時,按此鍵可以選中相應(yīng)的需要調(diào)整的位。當(dāng)系統(tǒng)處于時間顯示
54、模式時,P2.1(key2)口控制按鍵,按此鍵對相應(yīng)的選中位進行加,當(dāng)系統(tǒng)處于秒表工作模式時按此鍵可以控制秒表計時的啟動和暫停。</p><p><b> 其工作流程:</b></p><p> 1.年月日時分秒顯示。通電后LCD自動顯示C語言程序設(shè)置好的默認(rèn)時間</p><p> 2.鬧鐘顯示和設(shè)定。通電后,A的右邊顯示的是默認(rèn)的鬧鐘時
55、間,通過key1和key2可以設(shè)置鬧鈴時間。</p><p> 3.秒表顯示以及啟動和暫停以及清零。LCD處于正常顯示時間模式下時按下key1釋放后可以進入秒表模式,前3次按下key2的功能依次為啟動停止清零,每按3次key2為一個輪回。</p><p><b> 圖4-6硬件接線圖</b></p><p> 基于單片機的數(shù)字電子鐘系統(tǒng)軟
56、件設(shè)計</p><p><b> 系統(tǒng)軟件設(shè)計</b></p><p> 系統(tǒng)軟件包含四個部分:主程序,定時器掃描程序,按鍵掃描程序,按鍵處理程</p><p> 序;通過這四個部分可以實現(xiàn)數(shù)字電子鐘的功能設(shè)計。</p><p><b> 主程序設(shè)計</b></p><p
57、> 程序設(shè)計主要是通過單片機內(nèi)部TIMER0和TIMER1產(chǎn)生系統(tǒng)時鐘信號,經(jīng)過單片機的運算分別得到時間的年月日時分秒和秒表的時分秒毫秒,單片機在主程序中循環(huán)掃描按鍵端口,根據(jù)返回的鍵值分別將這些數(shù)據(jù)傳給LCD1602對應(yīng)顯示出來。</p><p><b> 實現(xiàn)功能</b></p><p> 程序?qū)崿F(xiàn)的功能是:正常顯示年月日和時分秒以及鬧鐘的時分。若單片
58、機檢測到key1第一次按下并釋放則LCD切換到顯示秒表模式00:00:00:00,第二次按下key2并釋放則返回到時鐘顯示模式。在時鐘正常顯示模式下若前5按下key2按鍵并釋放則一次選中鬧鐘的時分和時鐘的分時年月日,選中位會出現(xiàn)光標(biāo)閃爍并且時鐘不自動走動,第6次按下key2并釋放之后則正常顯示時鐘,6次為一個循環(huán)。在光標(biāo)閃爍的時候若按下key1并且釋放則可以對相應(yīng)位進行校正。若在秒表顯示模式下第一次按下key2并釋放則啟動秒表計時,第二
59、次按下key2釋放后則暫停秒表,第三次按下key2釋放后則秒表清零,三次為一個循環(huán)。</p><p><b> 功能流程圖</b></p><p> 通過以上分析可得圖5-1系統(tǒng)工作流程圖:</p><p><b> 圖5-1</b></p><p><b> 按鍵掃描程序設(shè)計&l
60、t;/b></p><p><b> 實現(xiàn)功能</b></p><p> 當(dāng)系統(tǒng)檢測到有按鍵按下時返回相應(yīng)的非零的鍵值,否則返回零。</p><p><b> 按鍵掃描流程圖</b></p><p> 圖5-2按鍵掃描流程圖</p><p><b>
61、 按鍵掃描部分代碼</b></p><p> unsigned char key scan(void)</p><p><b> {</b></p><p> static unsigned char value;//鍵值</p><p> static unsigned char do_k
62、ey;//執(zhí)行相應(yīng)命令標(biāo)識</p><p> static unsigned char key_scan_step;//鍵盤掃描步驟</p><p> if(key_scan_step==0)</p><p><b> {</b></p><p> key_value = 0;</p>&
63、lt;p> if(do_key==0)</p><p><b> {</b></p><p> if(KEY & 0x03 != 0x03)</p><p><b> {</b></p><p><b> t1=0;</b></p>&
64、lt;p> do_key=1;</p><p><b> }</b></p><p><b> }</b></p><p> if((t1>=key_shake_time)&&((KEY & 0x03) != 0x03))</p><p&
65、gt;<b> {</b></p><p> value = KEY & 0x03;</p><p> do_key = 0;</p><p> key_scan_step = 1;</p><p><b> }</b></p><p><b>
66、; }</b></p><p> if((key_scan_step==1)&&((KEY & 0x03) == 0x03))</p><p><b> {</b></p><p> key_scan_step = 0;</p><p> switch(value)</
67、p><p><b> {</b></p><p> case 0x02 :value = 1;break;</p><p> case 0x01 :value = 2;break;</p><p> case 0x03 :value = 0;break;</p><p> defau
68、lt :value = 0;break;</p><p><b> }</b></p><p> return(value);</p><p><b> }</b></p><p><b> else</b></p><p> re
69、turn(0);</p><p> 時間更新程序處理函數(shù)</p><p><b> 實現(xiàn)功能</b></p><p> 通過對t0值的判斷來得到秒分時日月年的計算。</p><p><b> 工作流程圖</b></p><p> 圖5-3時間更新程序流程圖
70、</p><p> 時間更新程序部分代碼</p><p> void update_time(void)</p><p><b> {</b></p><p> if(t0>=20)</p><p><b> {</b></p><p>
71、;<b> t0=0;</b></p><p> time.second++;</p><p> if(time.second>59)</p><p><b> {</b></p><p> time.second=0;</p><p> time.minu
72、te++;</p><p> if(time.minute>59)</p><p><b> {</b></p><p> time.minute=0;</p><p> time.hour++;</p><p> if(time.hour>23)</p>&l
73、t;p><b> {</b></p><p> time.hour=0;</p><p> time.day++;</p><p> switch(time.month)</p><p><b> {</b></p><p><b> case 1
74、:</b></p><p><b> case 3:</b></p><p><b> case 5:</b></p><p><b> case 7:</b></p><p><b> case 8:</b></p>&
75、lt;p><b> case 10:</b></p><p> case 12:if(time.day>31)</p><p><b> {</b></p><p> time.day=1;</p><p> time.month++;</p><p>
76、 if(time.month>12)</p><p><b> {</b></p><p> time.month=1;</p><p> time.year++;</p><p> if(time.year > 2060)</p><p><b> {</
77、b></p><p> time.year = 2012;</p><p><b> }</b></p><p><b> }</b></p><p><b> }break;</b></p><p><b> case 4:&
78、lt;/b></p><p><b> case 6:</b></p><p><b> case 9:</b></p><p> case 11:if(time.day>30)</p><p><b> {</b></p><p>
79、 time.day=1;</p><p> time.month++;</p><p> if(time.month>12)</p><p><b> {</b></p><p> time.month=1;</p><p> time.year++;</p>&l
80、t;p> if(time.year > 2060)</p><p><b> {</b></p><p> time.year = 2012;</p><p><b> }</b></p><p> }</p><p><b>
81、; }break;</b></p><p> case2:if(((time.year/4==0)&&(time.year/100!=0)||(time.year/400==0))&&(time.day>29))</p><p><b> {</b></p><p> time.day=
82、1;</p><p> time.month++;</p><p> if(time.month>12)</p><p><b> {</b></p><p> time.month=1;</p><p> time.year++;</p><p> if
83、(time.year > MAX_YEAR)</p><p><b> {</b></p><p> time.year = MIN_YEAR;</p><p><b> }</b></p><p><b> }</b></p><p>&
84、lt;b> }</b></p><p> else if(time.day>28)</p><p><b> {</b></p><p> time.day=1;</p><p> time.month++;</p><p> if(time.month>
85、12)</p><p><b> {</b></p><p> time.month=1;</p><p> time.year++;</p><p> if(time.year > 2060)</p><p><b> {</b></p>&l
86、t;p> time.year = 2012;</p><p><b> }</b></p><p><b> } </b></p><p><b> }break;</b></p><p> default:break;</p><
87、;p><b> }</b></p><p> if(model_flag == 0)</p><p><b> {</b></p><p> write_lcd(0x8C,WCMD);</p><p> write_lcd(time.day%10+'0',WDATA)
88、;</p><p> write_lcd(0x8B,WCMD);</p><p> write_lcd(time.day/10+'0',WDATA);</p><p> write_lcd(0x89,WCMD);</p><p> write_lcd(time.month%10+'0',WDATA);&
89、lt;/p><p> write_lcd(0x88,WCMD);</p><p> write_lcd(time.month/10+'0',WDATA);</p><p> write_lcd(0x83,WCMD);</p><p> write_lcd((time.year/1000)+'0',WDAT
90、A);</p><p> write_lcd(0x84,WCMD);</p><p> write_lcd((time.year%1000/100)+'0',WDATA);</p><p> write_lcd(0x85,WCMD);</p><p> write_lcd((time.year%1000%100/10)
91、+'0',WDATA);</p><p> write_lcd(0x86,WCMD);</p><p> write_lcd(time.year%10+'0',WDATA);</p><p><b> }</b></p><p><b> }</b>
92、</p><p> if(model_flag == 0)</p><p><b> {</b></p><p> write_lcd(0xC1,WCMD);</p><p> write_lcd(time.hour%10+'0',WDATA);</p><p> wri
93、te_lcd(0xC0,WCMD);</p><p> write_lcd(time.hour/10+'0',WDATA);</p><p><b> }</b></p><p><b> }</b></p><p> if(model_flag == 0)</
94、p><p><b> {</b></p><p> write_lcd(0xC4,WCMD);</p><p> write_lcd(time.minute%10+'0',WDATA);</p><p> write_lcd(0xC3,WCMD);</p><p> writ
95、e_lcd(time.minute/10+'0',WDATA);</p><p><b> }</b></p><p><b> }</b></p><p> if(model_flag == 0)</p><p><b> {</b></p
96、><p> write_lcd(0xC7,WCMD);</p><p> write_lcd(time.second%10+'0',WDATA);</p><p> write_lcd(0xC6,WCMD);</p><p> write_lcd(time.second/10+'0',WDATA);&
97、lt;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 秒表更新程序處理函數(shù)</p><p> 時間更新程序部分代碼</p><p> 通過對
98、t1值的判斷來得到秒表的毫秒、秒、分、時的計算</p><p><b> 工作流程圖</b></p><p> 圖5-4秒表更新程序流程圖</p><p><b> 函數(shù)部分代碼</b></p><p> void update_stop_watch(void)</p><
99、;p><b> {</b></p><p> if(sw_t1>=1)</p><p><b> {</b></p><p><b> sw_t1=0;</b></p><p> time.sw_msecond++;</p><p>
100、; if(time.sw_msecond>99)</p><p><b> {</b></p><p> time.sw_msecond=0;</p><p> time.sw_second++;</p><p> if(time.sw_second>59)</p><p>
101、<b> {</b></p><p> time.sw_second=0;</p><p> time.sw_minute++;</p><p> if(time.sw_minute>59)</p><p><b> {</b></p><p> time.
102、sw_minute=0;</p><p> time.sw_hour++;</p><p> if(time.sw_hour>23)</p><p><b> {</b></p><p> time.sw_hour=0;</p><p><b> }</b&g
103、t;</p><p> if(model_flag == 1)</p><p><b> {</b></p><p> write_lcd(0xC3,WCMD);</p><p> write_lcd(time.sw_hour%10+'0',WDATA);</p><p>
104、 write_lcd(0xC2,WCMD);</p><p> write_lcd(time.sw_hour/10+'0',WDATA);</p><p><b> }</b></p><p><b> }</b></p><p> if(model_flag == 1)&
105、lt;/p><p><b> {</b></p><p> write_lcd(0xC6,WCMD);</p><p> write_lcd(time.sw_minute%10+'0',WDATA);</p><p> write_lcd(0xC5,WCMD);</p><p>
106、; write_lcd(time.sw_minute/10+'0',WDATA);</p><p><b> }</b></p><p><b> }</b></p><p> if(model_flag == 1)</p><p><b> {</
107、b></p><p> write_lcd(0xC9,WCMD);</p><p> write_lcd(time.sw_second%10+'0',WDATA);</p><p> write_lcd(0xC8,WCMD);</p><p> write_lcd(time.sw_second/10+'0
108、',WDATA);</p><p><b> }</b></p><p><b> }</b></p><p> if(model_flag == 1)</p><p><b> {</b></p><p> write_lcd(0x
109、CC,WCMD);</p><p> write_lcd(time.sw_msecond%10+'0',WDATA);</p><p> write_lcd(0xCB,WCMD);</p><p> write_lcd(time.sw_msecond/10+'0',WDATA);</p><p>&l
110、t;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 顯示切換函數(shù)處理程序</p><p><b> 實現(xiàn)功能</b></p><p> 通過對模式標(biāo)志位mode
111、l_flag值的判斷來決定顯示器的顯示模式。</p><p><b> 工作流程圖</b></p><p> 圖5-5切換程序流程圖</p><p> 顯示切換函數(shù)部分代碼</p><p> void shift_display(void)</p><p><b> {<
112、/b></p><p> if(model_flag == 0 && time_change_flag == 0 && shift_flag ==0)</p><p><b> {</b></p><p> shift_flag = 1;</p><p><b>
113、 do</b></p><p><b> {</b></p><p> write_lcd(0x01,WCMD);//清屏</p><p> write_lcd(0x8B,WCMD);</p><p> write_lcd(time.day/10+'0',WDATA);</p&
114、gt;<p> write_lcd(0x8B,WCMD);</p><p> write_lcd(time.day/10+'0',WDATA);</p><p> write_lcd(0x8C,WCMD);</p><p> write_lcd(time.day%10+'0',WDATA);</p>
115、<p> write_lcd(0x8A,WCMD);</p><p> write_lcd('-',WDATA);</p><p> write_lcd(0x88,WCMD);</p><p> write_lcd(time.month/10+'0',WDATA);</p><p> wr
116、ite_lcd(0x89,WCMD);</p><p> write_lcd(time.month%10+'0',WDATA);</p><p> write_lcd(0x87,WCMD);</p><p> write_lcd('-',WDATA);</p><p> write_lcd(0x83,W
117、CMD);</p><p> write_lcd((time.year)/1000+'0',WDATA);</p><p> write_lcd(0x84,WCMD);</p><p> write_lcd(time.year%1000/100+'0',WDATA);</p><p> write_l
118、cd(0x85,WCMD);</p><p> write_lcd((time.year)%1000%100/10+'0',WDATA);</p><p> write_lcd(0x86,WCMD);</p><p> write_lcd((time.year)%10+'0',WDATA);</p><p&g
119、t; write_lcd(0xCF,WCMD);</p><p> write_lcd(time.alarm_minute%10+'0',WDATA);</p><p> write_lcd(0xCE,WCMD);</p><p> write_lcd(time.alarm_minute/10+'0',WDATA);</
120、p><p> write_lcd(0xCD,WCMD);</p><p> write_lcd(':',WDATA);</p><p> write_lcd(0xCC,WCMD);</p><p> write_lcd(time.alarm_hour%10+'0',WDATA);</p>&l
121、t;p> write_lcd(0xCB,WCMD);</p><p> write_lcd(time.alarm_hour/10+'0',WDATA);</p><p> write_lcd(0xC9,WCMD);</p><p> write_lcd('A',WDATA);</p><p>
122、write_lcd(0xC7,WCMD);</p><p> write_lcd(time.second%10+'0',WDATA);</p><p> write_lcd(0xC6,WCMD);</p><p> write_lcd(time.second/10+'0',WDATA);</p><p>
123、 write_lcd(0xC5,WCMD);</p><p> write_lcd(':',WDATA);</p><p> write_lcd(0xC4,WCMD);</p><p> write_lcd(time.minute%10+'0',WDATA);</p><p> write_lcd(0
124、xC3,WCMD);</p><p> write_lcd(time.minute/10+'0',WDATA);</p><p> write_lcd(0xC2,WCMD);</p><p> write_lcd(':',WDATA);</p><p> write_lcd(0xC1,WCMD);<
125、;/p><p> write_lcd(time.hour%10+'0',WDATA);</p><p> write_lcd(0xC0,WCMD);</p><p> write_lcd(time.hour/10+'0',WDATA);</p><p> }while(0);</p><
126、p><b> }</b></p><p> else if(model_flag == 1&& sw_stop_flag == 2 && shift_flag == 1)</p><p><b> {</b></p><p> shift_flag =0;</p>
127、<p> sw_t1 = 0;</p><p> time.sw_msecond = 0;</p><p> time.sw_second = 0;</p><p> time.sw_minute = 0;</p><p> time.sw_hour = 0;</p><p><b>
128、 do</b></p><p><b> {</b></p><p> write_lcd(0x01,WCMD);//清屏</p><p> write_lcd(0x8C,WCMD);</p><p> write_lcd('h',WDATA);</p><p&
129、gt; write_lcd(0x8C,WCMD);</p><p> write_lcd('h',WDATA);</p><p> write_lcd(0x8B,WCMD);</p><p> write_lcd('c',WDATA);</p><p> write_lcd(0x8A,WCMD);&l
130、t;/p><p> write_lcd('t',WDATA);</p><p> write_lcd(0x89,WCMD);</p><p> write_lcd('a',WDATA);</p><p> write_lcd(0x88,WCMD);</p><p> write_l
131、cd('W',WDATA);</p><p> write_lcd(0x86,WCMD);</p><p> write_lcd('p',WDATA);</p><p> write_lcd(0x85,WCMD);</p><p> write_lcd('o',WDATA);</
132、p><p> write_lcd(0x84,WCMD);</p><p> write_lcd('t',WDATA);</p><p> write_lcd(0x83,WCMD);</p><p> write_lcd('S',WDATA);</p><p> write_lcd(
133、0xCB,WCMD);</p><p> write_lcd(time.sw_msecond/10+'0',WDATA);</p><p> write_lcd(0xCB,WCMD);</p><p> write_lcd(time.sw_msecond/10+'0',WDATA);</p><p>
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機電子時鐘畢業(yè)論文
- 單片機電子時鐘畢業(yè)論文
- 單片機電子時鐘畢業(yè)論文
- 單片機電子時鐘畢業(yè)論文
- 單片機電子時鐘畢業(yè)論文 (2)
- 單片機電子時鐘畢業(yè)論文設(shè)計
- 單片機電子時鐘畢業(yè)論文設(shè)計
- 單片機電子時鐘畢業(yè)論文設(shè)計
- 單片機電子時鐘畢業(yè)論文設(shè)計
- 單片機電子時鐘畢業(yè)論文設(shè)計
- 單片機電子時鐘畢業(yè)論文設(shè)計
- 單片機電子時鐘畢業(yè)論文設(shè)計 (2)
- 畢業(yè)論文--基于單片機電子時鐘的設(shè)計
- 畢業(yè)設(shè)計論文----單片機電子時鐘
- 單片機電子時鐘 畢業(yè)設(shè)計論文
- 論文_單片機電子時鐘的設(shè)計
- 畢業(yè)設(shè)計(論文) 單片機電子時鐘設(shè)計
- 單片機電子時鐘畢業(yè)設(shè)計
- 畢業(yè)設(shè)計--單片機電子時鐘
- 單片機電子時鐘畢業(yè)設(shè)計
評論
0/150
提交評論