單片機(jī)課程設(shè)計(jì)--- 基于51單片機(jī)的簡約電子鐘_第1頁
已閱讀1頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  單片機(jī)課程設(shè)計(jì)</b></p><p>  項(xiàng)目名稱 基于51單片機(jī)的簡約電子鐘 </p><p>  專業(yè)班級 通信091班 </p><p>  學(xué)生姓名 </p

2、><p>  指導(dǎo)教師 </p><p>  2012 年 12 月 21 日</p><p><b>  摘 要</b></p><p>  單片機(jī)自20世紀(jì)70年代問世以來,以其極高的性能價(jià)格比,受到人們的重視和關(guān)注,應(yīng)用很廣、發(fā)展很快。單片機(jī)體積小、重

3、量輕、抗干擾能力強(qiáng)、環(huán)境要求不高、價(jià)格低廉、可靠性高、靈活性好、開發(fā)較為容易。由于具有上述優(yōu)點(diǎn),在我國,單片機(jī)已廣泛地應(yīng)用在工業(yè)自動(dòng)化控制、自動(dòng)檢測、智能儀器儀表、家用電器、電力電子、機(jī)電一體化設(shè)備等各個(gè)方面,而51單片機(jī)是各單片機(jī)中最為典型和最有代表性的一種。這次課程設(shè)計(jì)通過對它的學(xué)習(xí)、應(yīng)用,以STC11F02E芯片為核心,輔以必要的電路,設(shè)計(jì)了一個(gè)簡易的電子時(shí)鐘,它由4.5V直流電源供電,通過數(shù)碼管能夠準(zhǔn)確顯示時(shí)間,調(diào)整時(shí)間,從而到

4、達(dá)學(xué)習(xí)、設(shè)計(jì)、開發(fā)軟、硬件的能力。</p><p>  關(guān)鍵詞: STC11F02E;單片機(jī);電子時(shí)鐘;</p><p><b>  Abstract</b></p><p>  SCM since its introduction in the 1970s, with its high performance and low cost, th

5、e attention and concern of the people of the very wide application microcontroller since its introduction in the 1970s, with its high performance and low cost, by the peoplewide attention and concern, has developed rapid

6、ly. Microcontroller small size, light weight, strong anti-interference ability, the environment less demanding, low price, high reliability, good flexibility, easier development. Due to the above a</p><p>&l

7、t;b>  目 錄</b></p><p><b>  摘 要I</b></p><p>  AbstractII</p><p><b>  第1章 緒論1</b></p><p><b>  1.1 概述1</b></p>&

8、lt;p>  1.2 單片機(jī)技術(shù)的研究現(xiàn)狀1</p><p>  1.3 總體設(shè)計(jì)方案2</p><p>  1.3.1 設(shè)計(jì)思路2</p><p>  第2章 系統(tǒng)硬件原理及設(shè)計(jì)4</p><p>  2.1 核心器件STC11F02E介紹4</p><p>  2.2 主要設(shè)計(jì)軟件介紹

9、6</p><p>  2.2.1 PROTEUS軟件簡介6</p><p>  2.2.2 KEIL簡介6</p><p>  2.3 硬件電路7</p><p>  2.3.1 總體設(shè)計(jì)框圖及設(shè)計(jì)原理圖7</p><p>  第3章 系統(tǒng)軟件設(shè)計(jì)8</p><p>  3

10、.1 軟件設(shè)計(jì)分析8</p><p>  3.2 軟件程序設(shè)計(jì)8</p><p><b>  結(jié)論19</b></p><p><b>  參考文獻(xiàn)20</b></p><p><b>  附錄 121</b></p><p><b&

11、gt;  附錄 222</b></p><p>  項(xiàng)目創(chuàng)新及特色23</p><p><b>  第1章 緒論</b></p><p><b>  1.1 概述</b></p><p>  單片微型計(jì)算機(jī)簡稱單片機(jī),是典型的嵌入式微控制器(Microcontroller Uni

12、t),常用英文字母的縮寫MCU表示單片機(jī),單片機(jī)又稱單片微控制器,它不是完成某一個(gè)邏輯功能的芯片,而是把一個(gè)計(jì)算機(jī)系統(tǒng)集成到一個(gè)芯片上。單片機(jī)由運(yùn)算器,控制器,存儲(chǔ)器,輸入輸出設(shè)備構(gòu)成,相當(dāng)于一個(gè)微型的計(jì)算機(jī),和計(jì)算機(jī)相比,單片機(jī)只缺少了I/O設(shè)備。概括的講:一塊芯片就成了一臺(tái)計(jì)算機(jī)。它的體積小、質(zhì)量輕、價(jià)格便宜、為學(xué)習(xí)、應(yīng)用和開發(fā)提供了便利條件。同時(shí),學(xué)習(xí)使用單片機(jī)是了解計(jì)算機(jī)原理與結(jié)構(gòu)的最佳選擇。它最早是被用在工業(yè)控制領(lǐng)域。<

13、/p><p>  由于單片機(jī)在工業(yè)控制領(lǐng)域的廣泛應(yīng)用,單片機(jī)由芯片內(nèi)僅有CPU的專用處理器發(fā)展而來。最早的設(shè)計(jì)理念是通過將大量外圍設(shè)備和CPU集成在一個(gè)芯片中,使計(jì)算機(jī)系統(tǒng)更小,更容易集成進(jìn)復(fù)雜的而對體積要求嚴(yán)格的控制設(shè)備當(dāng)中。</p><p>  INTEL的Z80是最早按照這種思想設(shè)計(jì)出的處理器,當(dāng)時(shí)的單片機(jī)都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上發(fā)展出了MC

14、S51系列單片機(jī)系統(tǒng)。因?yàn)楹唵慰煽慷阅懿诲e(cuò)獲得了很大的好評。盡管2000年以后ARM已經(jīng)發(fā)展出了32位的主頻超過300M的高端單片機(jī),直到目前基于8031的單片機(jī)還在廣泛的使用。在很多方面單片機(jī)比專用處理器更適合應(yīng)用于嵌入式系統(tǒng),因此它得到了廣泛的應(yīng)用。事實(shí)上單片機(jī)是世界上數(shù)量最多處理器,隨著單片機(jī)家族的發(fā)展壯大,單片機(jī)和專用處理器的發(fā)展便分道揚(yáng)鑣。</p><p>  現(xiàn)代人類生活中所用的幾乎每件電子和機(jī)械產(chǎn)

15、品中都會(huì)集成有單片機(jī)。手機(jī)、電話、計(jì)算器、家用電器、電子玩具、掌上電腦以及鼠標(biāo)等電腦配件中都配有1-2部單片機(jī)。 汽車上一般配備40多部單片機(jī),復(fù)雜的工業(yè)控制系統(tǒng)上甚至可能有數(shù)百臺(tái)單片機(jī)在同時(shí)工作!單片機(jī)的數(shù)量不僅遠(yuǎn)超過PC機(jī)和其他計(jì)算的總和,甚至比人類的數(shù)量還要多。</p><p>  1.2 單片機(jī)技術(shù)的研究現(xiàn)狀</p><p>  單片機(jī)誕生于1971年,經(jīng)歷了SCM、MCU、So

16、C三大階段,早期的SCM單片機(jī)都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上發(fā)展出了MCS51系列MCU系統(tǒng)。基于這一系統(tǒng)的單片機(jī)系統(tǒng)直到現(xiàn)在還在廣泛使用。隨著工業(yè)控制領(lǐng)域要求的提高,開始出現(xiàn)了16位單片機(jī),但因?yàn)樾詢r(jià)比不理想并未得到很廣泛的應(yīng)用。90年代后隨著消費(fèi)電子產(chǎn)品大發(fā)展,單片機(jī)技術(shù)得到了巨大提高。隨著INTEL i960系列特別是后來的ARM系列的廣泛應(yīng)用,32位單片機(jī)迅速取代16位單片機(jī)的高端地位,并

17、且進(jìn)入主流市場。</p><p>  而傳統(tǒng)的8位單片機(jī)的性能也得到了飛速提高,處理能力比起80年代提高了數(shù)百倍。目前,高端的32位Soc單片機(jī)主頻已經(jīng)超過300MHz,性能直追90年代中期的專用處理器,而普通的型號出廠價(jià)格跌落至1美元,最高端的型號也只有10美元。</p><p>  當(dāng)代單片機(jī)系統(tǒng)已經(jīng)不再只在裸機(jī)環(huán)境下開發(fā)和使用,大量專用的嵌入式操作系統(tǒng)被廣泛應(yīng)用在全系列的單片機(jī)上。而

18、在作為掌上電腦和手機(jī)核心處理的高端單片機(jī)甚至可以直接使用專用的Windows和Linux操作系統(tǒng)。</p><p>  當(dāng)前趨勢SoC嵌入式系統(tǒng)(System on Chip)式的獨(dú)立發(fā)展之路,向MCU階段發(fā)展的重要因素,就是尋求應(yīng)用系統(tǒng)在芯片上的最大化解決,因此,專用單片機(jī)的發(fā)展自然形成了SoC化趨勢。隨著微電子技術(shù)、IC設(shè)計(jì)、EDA工具的發(fā)展,基于SoC的單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)會(huì)有較大的發(fā)展。因此,對單片機(jī)的理解

19、可以從單片微型計(jì)算機(jī)、單片微控制器延伸到單片應(yīng)用系統(tǒng)。</p><p>  1.3 總體設(shè)計(jì)方案</p><p>  1.3.1 設(shè)計(jì)思路</p><p>  利用單片機(jī)(STC11F02E)制作簡易電子時(shí)鐘,采用了共陰數(shù)碼管,在數(shù)碼管的a-h 段都加上330 歐姆的上拉電阻,增大數(shù)碼管的驅(qū)動(dòng)電流,然后還采用了一個(gè)蜂鳴器做報(bào)時(shí)用,外加兩個(gè)按鍵,電路非常簡單,但是

20、它的亮點(diǎn)是程序,程序使用了一種全新的按鍵處理方法,一個(gè)按鍵實(shí)現(xiàn)長按,短按功能。</p><p>  1.3.2 設(shè)計(jì)方案 </p><p>  根據(jù)設(shè)計(jì)任務(wù)的基本要求,設(shè)計(jì)了由單片機(jī)(STC11F02E)作為主控器件,

21、按鍵組成的按鍵操作電路,以及三極管、蜂鳴器組成的發(fā)聲電路。本次設(shè)計(jì)時(shí)鐘電路,使用了STC11F02E單片機(jī)芯片控制電路,單片機(jī)控制電路簡單且省去了很多復(fù)雜的線路,使得電路簡明易懂,使用鍵盤鍵上的按鍵來調(diào)整時(shí)鐘的時(shí)、分、秒,用一揚(yáng)聲器來進(jìn)行定時(shí)提醒,同時(shí)使用匯編語言程序來控制整個(gè)時(shí)鐘顯示,使得編程變得更容易,這樣通過四個(gè)模塊:鍵盤、芯片、揚(yáng)聲器、LED顯示即可滿足設(shè)計(jì)要求。</p><p><b>  1

22、.4 課題意義</b></p><p>  時(shí)鐘,自從它發(fā)明的那天起,就成為人類的朋友,但隨著時(shí)間的推移,科學(xué)技術(shù)的不斷發(fā)展,人們對時(shí)間計(jì)量的精度要求越來越高,應(yīng)用越來越廣。怎樣讓時(shí)鐘更好的為人民服務(wù),怎樣讓我們的老朋友煥發(fā)青春呢?這就要求人們不斷設(shè)計(jì)出新型時(shí)鐘。</p><p>  現(xiàn)今,高精度的計(jì)時(shí)工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘,石英表,石英鐘都采用了石英技

23、術(shù),因此走時(shí)精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)校,數(shù)字式電子鐘用集成電路計(jì)時(shí)時(shí),譯碼代替機(jī)械式傳動(dòng),用LED顯示器代替顯示器代替指針顯示進(jìn)而顯示時(shí)間,減小了計(jì)時(shí)誤差,這種表具有時(shí),分,秒顯示時(shí)間的功能,還可以進(jìn)行時(shí)和分的校對,片選的靈活性好。</p><p>  時(shí)鐘電路在計(jì)算機(jī)系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個(gè)單片機(jī)應(yīng)用系統(tǒng)中,時(shí)鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準(zhǔn)振蕩

24、定時(shí)信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機(jī)系統(tǒng)工作的快慢;二是指系統(tǒng)的標(biāo)準(zhǔn)定時(shí)時(shí)鐘,即定時(shí)時(shí)間,它通常有兩種實(shí)現(xiàn)方法:一是用軟件實(shí)現(xiàn),即用單片機(jī)內(nèi)部的可編程定時(shí)/計(jì)數(shù)器來實(shí)現(xiàn),但誤差很大,主要用在對時(shí)間精度要求不高的場合;二是用專門的時(shí)鐘芯片實(shí)現(xiàn),在對時(shí)間精度要求很高的情況下,通常采用這種方法,典型的時(shí)鐘芯片有:DS1302,DS12887,X1203等都可以滿足高精度的要求。</p><p>

25、;  本文主要介紹用單片機(jī)內(nèi)部的定時(shí)/計(jì)數(shù)器來實(shí)現(xiàn)電子時(shí)鐘的方法,本設(shè)計(jì)由單片機(jī)STC11F02E芯片和LED數(shù)碼管為核心,輔以必要的電路,沒有用到時(shí)鐘芯片,因此采用校準(zhǔn)功能,構(gòu)成了一個(gè)超級簡單的單片機(jī)電子時(shí)鐘,該方案節(jié)省硬件成本,但程序設(shè)計(jì)較為復(fù)雜。</p><p>  第2章 系統(tǒng)硬件原理及設(shè)計(jì)</p><p>  2.1 核心器件STC11F02E介紹</p>&l

26、t;p>  STC11F02E單片機(jī)是宏晶科技設(shè)計(jì)生產(chǎn)的單時(shí)鐘/ 機(jī)器周期(1T)的單片機(jī),是高速/ 低功耗/ 超強(qiáng)抗干擾的新一代8051 單片機(jī),指令代碼完全兼容傳統(tǒng)8051,但速度快8-12 倍。內(nèi)部集成高可靠復(fù)位電路,針對高速通信,智能控制,強(qiáng)干擾場合。STC11/10xx系列單片機(jī)的定時(shí)器0/定時(shí)器1/串行口與傳統(tǒng)8051兼容,增加了獨(dú)立波特率發(fā)生器,省去了定時(shí)器2.傳統(tǒng)8051 的111 條指令執(zhí)行速度全面提速,最快的指

27、令快24 倍,最慢的指令快3 倍.外形及引腳排列如圖所示:</p><p>  圖2-1 STC11F02E外形圖及引腳序列</p><p><b>  主要特性:</b></p><p>  1. 增強(qiáng)型 8051 CPU,1T,單時(shí)鐘/ 機(jī)器周期,指令代碼完全兼容傳統(tǒng)8051</p><p>  2. 工作電壓:S

28、TC11Fxx 系列電壓: 5.5V-4.1V/3.7V(5V 單片機(jī))STC11Lxx 系列電壓:3.6V-2.4V/2.1V(3V 單片機(jī))</p><p>  3. 工作頻率范圍:0 - 35MHz,相當(dāng)于普通8051 的 0~420MHz</p><p>  4. STC11F/Lxx 系列單片機(jī)用戶應(yīng)用程序空間: 1/2/3/4/5/6/8/16/20/32/40/48/52/5

29、6/60/62K 字節(jié)</p><p>  5. STC11 系列單片機(jī) :RAM 為1280 字節(jié)或256 字節(jié)。STC10 系列單片機(jī) :RAM 為512 字節(jié)或256 字節(jié)</p><p>  6. 通用I/O 口(40/36 個(gè)),復(fù)位后為: 準(zhǔn)雙向口/ 弱上拉(普通8051 傳統(tǒng)I/O 口)可設(shè)置成四種模式:準(zhǔn)雙向口/ 弱上拉,推挽/ 強(qiáng)上拉,僅為輸入/ 高阻,開漏每個(gè)I/O 口

30、驅(qū)動(dòng)能力均可達(dá)到20mA,但整個(gè)芯片最大不要超過100mA</p><p>  7. ISP (在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數(shù)秒即可完成一片</p><p>  8. 有EEPROM 功能</p><p><b>  9. 看門狗</b>

31、</p><p>  10. 內(nèi)部集成MAX810 專用復(fù)位電路(晶體頻率在24MHz 以下時(shí),要選擇高的復(fù)位門檻電壓,如4.1V 以下復(fù)位,晶體頻率在12MHz 以下時(shí),可選擇低的復(fù)位門檻電壓,如3.7V 以下復(fù)位,復(fù)位腳接1K 電阻到地)</p><p>  11. 內(nèi)置一個(gè)對內(nèi)部Vcc 進(jìn)行掉電檢測的掉電檢測電路,可設(shè)置為中斷或復(fù)位5V 單片機(jī)掉電檢測門檻電壓為4.1V/3.7V 附

32、近,3.3V 單片機(jī)掉電檢測門檻電壓為2.4V 附近</p><p>  12. 時(shí)鐘源:外部高精度晶體/ 時(shí)鐘,內(nèi)部R/C 振蕩器用戶在下載用戶程序時(shí),可選擇是使用內(nèi)部R/C 振蕩器還是外部晶體/ 時(shí)鐘常溫下內(nèi)部R/C 振蕩器頻率為: 4MHz ~ 8MHz精度要求不高時(shí),可選擇使用內(nèi)部時(shí)鐘,但因?yàn)橛兄圃煺`差和溫漂,以實(shí)際測試為準(zhǔn)</p><p>  13. 2 個(gè)16 位定時(shí)器(與傳統(tǒng)

33、8051 兼容的定時(shí)器/ 計(jì)數(shù)器,16 位定時(shí)器T0 和T1)1個(gè)獨(dú)立波特率發(fā)生器(故不必用T2做為波特率發(fā)生器,詳細(xì)使用方法請參考獨(dú)立波特率發(fā)生器做串口通訊的相關(guān)使用說明及示例程序)</p><p>  14. 3 個(gè)時(shí)鐘輸出口,可由T0 的溢出在P3.4/T0 輸出時(shí)鐘,可由T1 的溢出在P3.5/T1 輸出時(shí)鐘,獨(dú)立波特率發(fā)生器可以在P1.0口輸出時(shí)鐘(部分型號無獨(dú)立波特率發(fā)生器,詳情請參閱單片機(jī)選型一覽表

34、)</p><p>  15. 外部中斷I/O 口有5 路,支持傳統(tǒng)的下降沿中斷或低電平觸發(fā)中斷Power Down(掉電)模式可由外部中斷喚醒,INT0/P3.2, INT1/P3.3, INT/T0/P3.4, INT/T1/P3.5,INT/RxD/P3.0(或INT/RxD/P1.6)</p><p>  16. Power Down(掉電)模式可由內(nèi)部掉電喚醒專用定時(shí)器喚醒(ST

35、C11xx 系列有此功能,STC10xx 無此功能),也可由上面提到的外部中斷口中斷喚醒,由于INT/RxD 支持下降沿中斷,故也可支持遠(yuǎn)程通信喚醒</p><p>  17. 一個(gè)獨(dú)立的通用全雙工異步串行口(UART),做主機(jī)時(shí)可以當(dāng)2 個(gè)串口使用[RxD/P3.0,TxD/P3.1]可以切換到[RxD/P1.6,TxD/P1.7],通過將串口在P3 口和P1 口之間來回切換,將1 個(gè)串口作為2 個(gè)主串口分時(shí)復(fù)

36、用,可低成本實(shí)現(xiàn)2 個(gè)串口,當(dāng)然有其局限性</p><p>  18. 工作溫度范圍: -40 - +85℃(工業(yè)級) / 0 - 75℃(商業(yè)級)</p><p>  19. SOP16/DIP16/DIP18/SOP20/DIP20/LSSOP20/PDIP-40/LQFP-44/PLCC44(暫時(shí)盡量不要選PLCC44)SOP16/DIP16 有12 個(gè)I/O 口,SOP20/PDI

37、P20/LSSOP20 有16 個(gè)I/O 口,LQFP44 有40 個(gè)I/O 口,PDIP40 有36 個(gè)I/O 口。</p><p>  2.2 主要設(shè)計(jì)軟件介紹</p><p>  本設(shè)計(jì)利用KEIL編程軟件對時(shí)鐘源程序進(jìn)行編程并調(diào)試,配合PROTEUS仿真軟件對硬件進(jìn)行仿真調(diào)試,兩種軟件的簡介如下:</p><p>  2.2.1 PROTEUS軟件簡介&

38、lt;/p><p>  Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件(該軟件中國總代理為廣州風(fēng)標(biāo)電子技術(shù)有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。它是目前最好的仿真單片機(jī)及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機(jī)愛好者、從事單片機(jī)教學(xué)的教師、致力于單片機(jī)開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿

39、真軟件),從原理圖布圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。是目前世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái),其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即將增加Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR

40、、Keil和MPLAB等多種編譯器。 </p><p>  2.2.2 KEIL簡介</p><p>  單片機(jī)開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機(jī)器碼有兩種方法,一種是手工匯編,另一種是機(jī)器匯編,目前已極少使用手工匯編的方法了。機(jī)器匯編是通過匯編軟件將源程序變?yōu)闄C(jī)器碼,用于MCS-51單片機(jī)的匯編軟件有早期的A51,隨著單片機(jī)開發(fā)技術(shù)的不

41、斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機(jī)的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機(jī)的軟件,這從近年來各仿真機(jī)廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運(yùn)行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的

42、硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機(jī)的愛好者來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會(huì)令你</p><p><b>  2.3 硬件電路</b></p><p>  2.3.1 總

43、體設(shè)計(jì)框圖及設(shè)計(jì)原理圖</p><p>  圖2.3.1 總體設(shè)計(jì)框圖</p><p>  圖2.3.2 設(shè)計(jì)原理圖</p><p>  第3章 系統(tǒng)軟件設(shè)計(jì)</p><p>  3.1 軟件設(shè)計(jì)分析</p><p>  在編程上,首先進(jìn)行了初始化,定義程序的的入口地址以及中斷的入口地址,在主程序開始定義了一組固定

44、單元用來儲(chǔ)存計(jì)數(shù)的時(shí).分.秒,在顯示初值之后,進(jìn)入主循環(huán)。在主程序中,對不同的按鍵進(jìn)行掃描,實(shí)現(xiàn)秒表,時(shí)間調(diào)整,復(fù)位清零等功能,系統(tǒng)總流程圖如下圖:</p><p>  3.2 軟件程序設(shè)計(jì)</p><p>  #include<reg52.h></p><p>  #include<stdio.h></p><p>

45、;  #include<math.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  #define Key1 0x80 //P3.7,按鍵1</p><p>  #define Key2 0x20 //P

46、3.5, 按鍵2</p><p>  /*以下數(shù)據(jù)最后處理的時(shí)候要合并*/</p><p>  uchar comnum;//公共端顯示值</p><p>  uchar timecount;//時(shí)間計(jì)數(shù)值</p><p>  uchar sec=59,min=59,hour=11;//秒分時(shí)</p><p>  uc

47、har point;//控制中間兩點(diǎn)</p><p>  uchar com3num;/*公共端3控制的方格數(shù)值*/</p><p>  uchar h1,h2,h4,h5;/*1,2,4,5控制的方格值*/</p><p>  void init();//初始化函數(shù)聲明</p><p>  //void KeyInit();/*讀取按鍵函數(shù)

48、,按鍵初始設(shè)置*/</p><p>  void KeyRead();//讀取按鍵并且執(zhí)行按鍵操作</p><p>  /****以下是按鍵相關(guān)定義*****/</p><p>  uchar Trg=0;//Trg(triger代表是觸發(fā))</p><p>  uchar Cont=0;//Cont(continue)代表是連續(xù)按下<

49、/p><p>  uchar cnt_plus;//計(jì)算上面按鍵按住的長數(shù) </p><p>  uchar cnt_plus2;//計(jì)算下面按鍵長按的計(jì)算值</p><p>  uchar cnt_plus3;//長加</p><p>  uchar keycount;//按鍵計(jì)數(shù)值</p><p>  uchar se

50、c1,min1,hour1;//用于設(shè)置時(shí)間時(shí)所用到</p><p>  uchar setnum;//用于設(shè)置的是當(dāng)前那個(gè)值</p><p>  uchar flashcount;//閃爍計(jì)算值</p><p>  bit flashflag;//閃爍標(biāo)志</p><p>  //bit longkeyflag;//長按標(biāo)志</p&g

51、t;<p>  sbit beep=P3^6;//蜂鳴器控制管腳</p><p>  //sbit longkey2=P3^5;</p><p>  bit beepflag;//報(bào)時(shí)標(biāo)志</p><p>  bit openbeep;//是否打開蜂鳴器標(biāo)志</p><p>  bit opennum;</p>&

52、lt;p>  bit lightflag;</p><p>  bit cal_flag;/*校準(zhǔn)標(biāo)志*/</p><p>  char cal_sec;//校準(zhǔn)的秒數(shù)(有正負(fù))</p><p>  uchar cal_sec2;//用于轉(zhuǎn)換cal_sec為整數(shù)時(shí)用到</p><p>  bit cal_finish;//用于設(shè)置負(fù)數(shù)時(shí)

53、確定是否只設(shè)置一次</p><p>  uchar table1[]={0xfd,0x70,0xee,0xfa/*3*/,0x73,0xbb,0xbf,0xf0,0xff,0xfb};//顯示碼表(0-9,不帶方格)(共陰) (h點(diǎn)要置1)!!</p><p>  uchar table2[]={0x00/*不亮*/,0xa0,0x60,0x30,0x28,0x24,0x21,</p

54、><p>  0x22,0x81/*8兩邊*/,0x42/*次兩邊*/,0x1c/*中間三橫*/,0xff/*11全亮*/};//下面的8段</p><p>  uchar comtable[]={0xfe,0xfd,0xfb,0xf7,0xef};//5個(gè)公共端控制數(shù)組</p><p>  uchar data numtable[5];//顯示那個(gè)數(shù)碼管 (5代表5

55、個(gè)數(shù)據(jù)!?。ark?。。?lt;/p><p>  void main()</p><p><b>  {</b></p><p>  timecount=19;</p><p><b>  comnum=0;</b></p><p>  com3num=1;</p>

56、<p>  cnt_plus=0;</p><p>  keycount=0;</p><p>  //P3=0xff;//暫定</p><p>  point=0x00;//中間點(diǎn)</p><p>  //beep=0;</p><p><b>  setnum=0;</b>&

57、lt;/p><p>  flashcount=0;</p><p>  openbeep=0;</p><p>  opennum=1;</p><p>  lightflag=0;</p><p>  cal_flag=0;</p><p>  cal_sec=0;//校準(zhǔn)值初始為0秒</p

58、><p>  cal_finish=0;</p><p>  //longkeyflag=1;</p><p><b>  init();</b></p><p><b>  while(1)</b></p><p><b>  {</b></p&g

59、t;<p><b>  }</b></p><p><b>  }</b></p><p>  void init()//初始化函數(shù)</p><p><b>  {</b></p><p>  TMOD=0x11;//兩個(gè)16位</p><p

60、>  TH0=(65536-49996)/256;//49996</p><p>  TL0=(65536-49996)%256;</p><p>  TH1=(65536-3721)/256;//</p><p>  TL1=(65536-3721)%256;</p><p><b>  EA=1; </b>&l

61、t;/p><p>  ET0=1;//暫定</p><p>  TR0=1;//暫定</p><p><b>  ET1=1;</b></p><p><b>  TR1=1;</b></p><p><b>  }</b></p><p

62、>  /**********按鍵讀取函數(shù)***********/</p><p>  void KeyRead()//讀取按鍵并且執(zhí)行按鍵操作</p><p><b>  {</b></p><p>  uchar ReadData=~(P3|0x5f);//(P3|0x5f)^0xff;//P3組需要處理,沒有按鍵的不變化(~P3)&l

63、t;/p><p>  Trg=ReadData &(ReadData^Cont);//判斷是否點(diǎn)動(dòng),異或:不同就1</p><p>  Cont=ReadData;//判斷是否長按</p><p>  if(setnum==0)</p><p><b>  {</b></p><p>  if

64、(cal_flag==0)//用于區(qū)分校準(zhǔn)的按鍵</p><p><b>  {</b></p><p>  if(Trg & Key1)/*設(shè)置是否需要鳴叫*/</p><p><b>  {</b></p><p>  openbeep=~openbeep;</p><

65、;p><b>  }</b></p><p><b>  }</b></p><p>  if(openbeep)</p><p><b>  {</b></p><p>  if(Trg & Key2)//開:ON;</p><p>&l

66、t;b>  {</b></p><p>  opennum=~opennum;</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  /****

67、***************************/</p><p>  if(Cont & Key1)//第一個(gè)按鍵長按,進(jìn)入設(shè)置時(shí)間</p><p><b>  {</b></p><p>  cnt_plus++;//計(jì)時(shí)</p><p>  if(cnt_plus>32)//大概2.5秒的時(shí)候觸

68、發(fā)</p><p><b>  {</b></p><p>  cnt_plus=0;//清零</p><p>  setnum=1;//進(jìn)入時(shí)的設(shè)置</p><p><b>  ET0=0;//</b></p><p>  TR0=0;//暫停定時(shí)器</p>

69、<p><b>  }</b></p><p><b>  }</b></p><p>  else cnt_plus=0;//清零,有毛刺</p><p>  if(TR0==0)//確定是否是設(shè)置時(shí)間</p><p><b>  {</b></p>

70、<p>  if(Trg & Key1)//第一個(gè)按鍵是否短按</p><p><b>  {</b></p><p><b>  setnum++;</b></p><p>  if(setnum>3) </p><p><b>  {</b><

71、/p><p><b>  setnum=0;</b></p><p><b>  ET0=1;</b></p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p><b>  }&

72、lt;/b></p><p>  /******根據(jù)setnum而設(shè)置相應(yīng)項(xiàng)目*******/</p><p>  if(setnum==1)//調(diào)節(jié)的是小時(shí)</p><p><b>  {</b></p><p>  if(Trg & Key2)//小時(shí)加</p><p><

73、;b>  {</b></p><p>  cnt_plus3=0;</p><p><b>  hour++;</b></p><p>  if(hour>23) hour=0;</p><p><b>  }</b></p><p><b>

74、;  }</b></p><p>  if(setnum==2)//調(diào)節(jié)的是分鐘</p><p><b>  {</b></p><p>  if(Trg & Key2)//分鐘加</p><p><b>  {</b></p><p>  cnt_plu

75、s3=0;</p><p><b>  min++;</b></p><p>  if(min>59) min=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(setnum==3)//

76、調(diào)節(jié)的是秒</p><p><b>  {</b></p><p>  if(Trg & Key2)//秒加</p><p><b>  {</b></p><p>  cnt_plus3=0;//要清零</p><p><b>  sec++;</b

77、></p><p>  if(sec>59) sec=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*************設(shè)置時(shí)間時(shí)長按長加***********************/</p><p

78、>  if(Cont & Key2)//</p><p><b>  {</b></p><p>  cnt_plus3++;</p><p>  if(cnt_plus3>28)</p><p><b>  {</b></p><p>  cnt_plu

79、s3=26;</p><p>  switch(setnum)</p><p><b>  {</b></p><p>  case 1:hour++;if(hour>23){hour=0;};break;</p><p>  case 2:min++;if(min>59){min=0;};break;<

80、;/p><p>  case 3:sec++;if(sec>59){sec=0;};break;</p><p>  default : break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  

81、}</b></p><p>  /**********************************/</p><p><b>  }</b></p><p>  /****************************************/</p><p>  /***********以下是人動(dòng)設(shè)置

82、校準(zhǔn)時(shí)間,范圍是每日校準(zhǔn):-20~~20秒*************/</p><p>  if(TR0==1)//時(shí)間沒有調(diào)節(jié)的時(shí)候才能進(jìn)入</p><p><b>  {</b></p><p>  if(Cont & Key2)/*下面的按鍵長按:進(jìn)入用戶人動(dòng)校準(zhǔn)時(shí)間*/</p><p><b>

83、  {</b></p><p>  cnt_plus2++;//為區(qū)分第一個(gè)長按,用cnt_plus2代表第二個(gè)長按</p><p>  if(cnt_plus2>32)</p><p><b>  {</b></p><p>  cnt_plus2=0;//清零</p><p>

84、;  cal_flag=~cal_flag;//校準(zhǔn)標(biāo)志</p><p><b>  }</b></p><p><b>  }</b></p><p>  else cnt_plus2=0;</p><p>  if(cal_flag)/*短觸用于設(shè)置校準(zhǔn)值:-20~~20秒范圍。正數(shù)表示加快秒數(shù)

85、,負(fù)數(shù)表示減慢秒數(shù)*/</p><p><b>  {</b></p><p>  if(Trg & Key1)//cal_sec加</p><p><b>  {</b></p><p>  cal_sec++;</p><p>  if(cal_sec>20

86、) cal_sec=-20;//大于20變?yōu)?20</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /******************************************

87、********/</p><p><b>  }</b></p><p>  void timer0() interrupt 1 //中斷1任務(wù):計(jì)算時(shí)間</p><p><b>  {</b></p><p>  TH0=(65536-49996)/256;</p><p&g

88、t;  TL0=(65536-49996)%256;</p><p>  timecount++;//時(shí)間計(jì)算值,50ms一次</p><p>  if(timecount>19)</p><p><b>  {</b></p><p>  timecount=0;//清零</p><p>

89、  sec++;//秒加一</p><p>  if(sec>59)</p><p><b>  {</b></p><p><b>  sec=0;</b></p><p><b>  min++;</b></p><p>  if(min>

90、;59)</p><p><b>  {</b></p><p><b>  min=0;</b></p><p><b>  hour++;</b></p><p>  if(hour>23)</p><p><b>  {</b

91、></p><p><b>  hour=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</

92、b></p><p>  if(timecount%10==0) {point=(~point)& 0x20;}/***中間點(diǎn)閃爍,與上:0011 0000,后面6位保持為0***/</p><p>  /********************添加校準(zhǔn)時(shí)間:在凌晨1點(diǎn)00分30秒開始校準(zhǔn)(神不知鬼不覺。。。)*/</p><p>  if(hour=

93、=1 && min==0 && sec==30 && timecount<1)</p><p><b>  {</b></p><p>  if(cal_sec<0)//如果是負(fù)數(shù)要考慮之后再到達(dá)此時(shí)刻的情況</p><p><b>  {</b></p&g

94、t;<p>  cal_finish=~cal_finish;</p><p>  if(cal_finish)//進(jìn)入校準(zhǔn)</p><p><b>  {</b></p><p>  sec=sec+cal_sec;/*校準(zhǔn)負(fù)數(shù)的時(shí)候*/</p><p><b>  }</b><

95、;/p><p>  }//完成校準(zhǔn)標(biāo)志,防止下次遇到</p><p>  else//如果是正數(shù)</p><p><b>  {</b></p><p>  sec=sec+cal_sec;</p><p><b>  }</b></p><p><

96、b>  }</b></p><p>  /*************************************************************************************/</p><p>  /************添加整點(diǎn)半點(diǎn)報(bào)時(shí)功能*************/</p><p>  if((sec&l

97、t;2)&&(min==0)) </p><p><b>  {</b></p><p>  beepflag=1;</p><p>  if(opennum) beep=0;</p><p>  else {beep=1;}//只留下led閃爍</p><p><b>

98、;  }//整點(diǎn)報(bào)時(shí)</b></p><p>  else if((sec==0)&&(min==30)&&(timecount<8)) </p><p><b>  {</b></p><p>  if(opennum) beep=0;</p><p>  else {

99、beep=1;lightflag=1;}</p><p><b>  }//半點(diǎn)報(bào)時(shí)</b></p><p>  else {beep=1;lightflag=0;}</p><p>  /***分離秒,分開管理***/</p><p>  if((beepflag==1)||(beep==0)||(lightflag=

100、=1))</p><p><b>  {</b></p><p>  switch(sec%10)//每個(gè)方格負(fù)責(zé)的余數(shù)是一樣的</p><p><b>  {</b></p><p>  case 0:com3num=11;break;//報(bào)時(shí)的時(shí)候全亮起!</p><p>

101、;  case 1:com3num=0;break;</p><p>  case 2:com3num=11;if(timecount>18) {beepflag=0;}break;</p><p>  default :break;</p><p><b>  }</b></p><p><b>  }

102、</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  switch(sec%10)//每個(gè)方格負(fù)責(zé)的余數(shù)是一樣的</p><p><b>  {</b></p><p>  cas

103、e 0:com3num=1;break;</p><p>  case 1:com3num=2;break;</p><p>  case 2:com3num=3;break;</p><p>  case 3:com3num=4;break;</p><p>  case 4:com3num=5;break;</p><

104、p>  case 5:com3num=6;break;</p><p>  case 6:com3num=7;break;</p><p>  case 7:com3num=8;break;</p><p>  case 8:com3num=9;break;</p><p>  case 9:com3num=10;break;</

105、p><p>  default :break;</p><p><b>  }</b></p><p><b>  //////</b></p><p><b>  }</b></p><p>  /*********以下是切換顯示*********/<

106、;/p><p>  if(((sec>14)&&(sec<21))||((sec>34)&&(sec<41))||(sec>54))//顯示秒行走的區(qū)間</p><p><b>  {</b></p><p>  numtable[0]=0x00; /*0是關(guān)閉*/</p>

107、<p>  numtable[1]=0x20 & point;</p><p>  numtable[2]=table1[sec/10] & point; //中間兩點(diǎn) 和 方格值的 與 運(yùn)算 從0開始!</p><p>  numtable[3]=table1[sec%10];//分</p><p>  numtable[4]=t

108、able2[com3num];</p><p><b>  }</b></p><p>  else//否則顯示的是時(shí)分</p><p><b>  {</b></p><p>  if(hour<10) //去除前面的零</p><p>  {numtable[0

109、]=table1[hour/10] & 0x00;}</p><p><b>  else</b></p><p>  {numtable[0]=table1[hour/10];}//時(shí)</p><p>  numtable[1]=table1[hour%10] & point;</p><p>  nu

110、mtable[2]=table1[min/10] & point;//分</p><p>  numtable[3]=table1[min%10];</p><p>  numtable[4]=table2[com3num];</p><p><b>  }</b></p><p>  /************

111、********/</p><p>  if(openbeep)//進(jìn)入是否設(shè)置鳴叫的顯示</p><p><b>  {</b></p><p>  if(opennum)</p><p><b>  {</b></p><p>  numtable[0]=0x1f;//

112、b</p><p>  numtable[1]=0x00;</p><p>  numtable[2]=0x1e;//o</p><p>  numtable[3]=0x16;//n</p><p>  numtable[4]=0x00;//</p><p><b>  }</b></p&g

113、t;<p><b>  else</b></p><p><b>  {</b></p><p>  numtable[0]=0x1f;//b</p><p>  numtable[1]=0xdd;//O</p><p>  numtable[2]=0x87;//F</p>

114、<p>  numtable[3]=0x87;//F</p><p>  numtable[4]=0x00;//</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*******************************

115、******/</p><p>  /*************以下是設(shè)置校準(zhǔn)秒數(shù)的顯示*********/</p><p>  if(cal_flag)//校準(zhǔn)標(biāo)志為1時(shí)的顯示</p><p><b>  {</b></p><p>  numtable[0]=0x00;//前1個(gè)不顯示</p><

116、p>  if(cal_sec>=0) numtable[1]=0x00;</p><p>  else numtable[1]=0x02;//負(fù)號</p><p>  numtable[4]=0x03;//共陰版:下面一行右邊兩個(gè)亮起</p><p>  if(cal_sec<0) </p><p><b>  {

117、</b></p><p>  cal_sec2=abs(cal_sec);/*取整數(shù),好處理*/</p><p>  numtable[2]=table1[cal_sec2/10]&0xdf;</p><p>  numtable[3]=table1[cal_sec2%10];</p><p><b>  }&l

118、t;/b></p><p><b>  else</b></p><p><b>  {</b></p><p>  numtable[2]=table1[cal_sec/10]&0xdf;</p><p>  numtable[3]=table1[cal_sec%10];</p

119、><p><b>  }</b></p><p><b>  }</b></p><p>  /***************************************************/</p><p><b>  }</b></p><p>

120、  void timer1() interrupt 3//中斷3任務(wù):掃描,按鍵檢測</p><p><b>  {</b></p><p>  TH1=(65536-3721)/256;</p><p>  TL1=(65536-3721)%256;</p><p>  //readtemp=P3;//</p&

121、gt;<p>  P3=P3|0x1f;//低五位關(guān)閉(公共端位) P3=P3 | 0x1f;(修改點(diǎn):P3=P3 | 0x1f)</p><p>  P1=numtable[comnum];//輸入要顯示的數(shù)據(jù)</p><p>  /*******************************************/</p><p>  P3=

122、P3&comtable[comnum];//掃描從左到右(修改點(diǎn):P3=P3 | comtable[comnum] )</p><p>  keycount++;/*計(jì)算何時(shí)進(jìn)入按鍵*/</p><p><b>  comnum++;</b></p><p>  if(comnum>4) comnum=0;</p>

123、<p>  if(keycount>12)//大概80ms</p><p><b>  {</b></p><p>  keycount=0;</p><p>  KeyRead();//讀取按鍵操作(暫未引用)</p><p><b>  }</b></p>&

124、lt;p>  /********************下面添加調(diào)時(shí)程序**************/</p><p>  if(TR0==0)//判斷是否為調(diào)時(shí)狀態(tài) 中間兩點(diǎn)常亮</p><p><b>  {</b></p><p>  //h1=0xf7;h2=0xf7;h4=0xf7;h5=0xf7;//調(diào)節(jié)時(shí)間方格全亮!&

125、lt;/p><p>  flashcount++;/*閃爍時(shí)間計(jì)算值*/</p><p>  if(flashcount==120)flashflag=~flashflag; //大概閃爍0.4秒</p><p>  if(flashcount>240)</p><p><b>  {</b></p>

126、<p>  flashcount=0;</p><p>  flashflag=~flashflag;</p><p><b>  }</b></p><p>  /********************************************************/</p><p>  if(se

127、tnum==3)</p><p><b>  {</b></p><p>  numtable[0]=0x00;</p><p>  numtable[1]=0x20;//h2亮起</p><p>  numtable[2]=table1[sec/10];//秒 h3亮起</p><p>  nu

128、mtable[3]=table1[sec%10];//秒</p><p>  numtable[4]=0xff;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>

129、;  if(hour<10) //去除前面的零</p><p>  {numtable[0]=0x00;}</p><p><b>  else</b></p><p>  {numtable[0]=table1[hour/10];}//時(shí)</p><p>  numtable[1]=table1[hour%10]

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論