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

下載本文檔

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

文檔簡介

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

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

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

4、達學(xué)習(xí)、設(shè)計、開發(fā)軟、硬件的能力。</p><p>  關(guān)鍵詞: STC11F02E;單片機;電子時鐘;</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 單片機技術(shù)的研究現(xiàn)狀1</p><p>  1.3 總體設(shè)計方案2</p><p>  1.3.1 設(shè)計思路2</p><p>  第2章 系統(tǒng)硬件原理及設(shè)計4</p><p>  2.1 核心器件STC11F02E介紹4</p><p>  2.2 主要設(shè)計軟件介紹

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è)計框圖及設(shè)計原理圖7</p><p>  第3章 系統(tǒng)軟件設(shè)計8</p><p>  3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

28、TC11Fxx 系列電壓: 5.5V-4.1V/3.7V(5V 單片機)STC11Lxx 系列電壓:3.6V-2.4V/2.1V(3V 單片機)</p><p>  3. 工作頻率范圍:0 - 35MHz,相當(dāng)于普通8051 的 0~420MHz</p><p>  4. STC11F/Lxx 系列單片機用戶應(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 系列單片機 :RAM 為1280 字節(jié)或256 字節(jié)。STC10 系列單片機 :RAM 為512 字節(jié)或256 字節(jié)</p><p>  6. 通用I/O 口(40/36 個),復(fù)位后為: 準(zhǔn)雙向口/ 弱上拉(普通8051 傳統(tǒng)I/O 口)可設(shè)置成四種模式:準(zhǔn)雙向口/ 弱上拉,推挽/ 強上拉,僅為輸入/ 高阻,開漏每個I/O 口

30、驅(qū)動能力均可達到20mA,但整個芯片最大不要超過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 以下時,要選擇高的復(fù)位門檻電壓,如4.1V 以下復(fù)位,晶體頻率在12MHz 以下時,可選擇低的復(fù)位門檻電壓,如3.7V 以下復(fù)位,復(fù)位腳接1K 電阻到地)</p><p>  11. 內(nèi)置一個對內(nèi)部Vcc 進行掉電檢測的掉電檢測電路,可設(shè)置為中斷或復(fù)位5V 單片機掉電檢測門檻電壓為4.1V/3.7V 附

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

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

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)部掉電喚醒專用定時器喚醒(ST

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

36、用,可低成本實現(xiàn)2 個串口,當(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(暫時盡量不要選PLCC44)SOP16/DIP16 有12 個I/O 口,SOP20/PDI

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

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

39、真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是目前世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持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>  單片機開發(fā)中除必要的硬件外,同樣離不開軟件,我們寫的匯編語言源程序要變?yōu)镃PU可以執(zhí)行的機器碼有兩種方法,一種是手工匯編,另一種是機器匯編,目前已極少使用手工匯編的方法了。機器匯編是通過匯編軟件將源程序變?yōu)闄C器碼,用于MCS-51單片機的匯編軟件有早期的A51,隨著單片機開發(fā)技術(shù)的不

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

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

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

44、單元用來儲存計數(shù)的時.分.秒,在顯示初值之后,進入主循環(huán)。在主程序中,對不同的按鍵進行掃描,實現(xiàn)秒表,時間調(diào)整,復(fù)位清零等功能,系統(tǒng)總流程圖如下圖:</p><p>  3.2 軟件程序設(shè)計</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ù)最后處理的時候要合并*/</p><p>  uchar comnum;//公共端顯示值</p><p>  uchar timecount;//時間計數(shù)值</p><p>  uchar sec=59,min=59,hour=11;//秒分時</p><p>  uc

47、har point;//控制中間兩點</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;//計算上面按鍵按住的長數(shù) </p><p>  uchar cnt_plus2;//計算下面按鍵長按的計算值</p><p>  uchar cnt_plus3;//長加</p><p>  uchar keycount;//按鍵計數(shù)值</p><p>  uchar se

50、c1,min1,hour1;//用于設(shè)置時間時所用到</p><p>  uchar setnum;//用于設(shè)置的是當(dāng)前那個值</p><p>  uchar flashcount;//閃爍計算值</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;//報時標(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ù)(有正負)</p><p>  uchar cal_sec2;//用于轉(zhuǎn)換cal_sec為整數(shù)時用到</p><p>  bit cal_finish;//用于設(shè)置負數(shù)時

53、確定是否只設(shè)置一次</p><p>  uchar table1[]={0xfd,0x70,0xee,0xfa/*3*/,0x73,0xbb,0xbf,0xf0,0xff,0xfb};//顯示碼表(0-9,不帶方格)(共陰) (h點要置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個公共端控制數(shù)組</p><p>  uchar data numtable[5];//顯示那個數(shù)碼管 (5代表5

55、個數(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;//中間點</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;//兩個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);//判斷是否點動,異或:不同就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)//第一個按鍵長按,進入設(shè)置時間</p><p><b>  {</b></p><p>  cnt_plus++;//計時</p><p>  if(cnt_plus>32)//大概2.5秒的時候觸

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

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

70、<p>  if(Trg & Key1)//第一個按鍵是否短按</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)項目*******/</p><p>  if(setnum==1)//調(diào)節(jié)的是小時</p><p><b>  {</b></p><p>  if(Trg & Key2)//小時加</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è)置時間時長按長加***********************/</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>  /***********以下是人動設(shè)置

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

83、  {</b></p><p>  cnt_plus2++;//為區(qū)分第一個長按,用cnt_plus2代表第二個長按</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、,負數(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ù):計算時間</p><p><b>  {</b></p><p>  TH0=(65536-49996)/256;</p><p&g

88、t;  TL0=(65536-49996)%256;</p><p>  timecount++;//時間計算值,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;}/***中間點閃爍,與上:0011 0000,后面6位保持為0***/</p><p>  /********************添加校準(zhǔn)時間:在凌晨1點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)//如果是負數(shù)要考慮之后再到達此時刻的情況</p><p><b>  {</b></p&g

94、t;<p>  cal_finish=~cal_finish;</p><p>  if(cal_finish)//進入校準(zhǔn)</p><p><b>  {</b></p><p>  sec=sec+cal_sec;/*校準(zhǔn)負數(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>  /************添加整點半點報時功能*************/</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、;  }//整點報時</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>  }//半點報時</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)//每個方格負責(zé)的余數(shù)是一樣的</p><p><b>  {</b></p><p>  case 0:com3num=11;break;//報時的時候全亮起!</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)//每個方格負責(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; //中間兩點 和 方格值的 與 運算 從0開始!</p><p>  numtable[3]=table1[sec%10];//分</p><p>  numtable[4]=t

108、able2[com3num];</p><p><b>  }</b></p><p>  else//否則顯示的是時分</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];}//時</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)//進入是否設(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時的顯示</p><p><b>  {</b></p><p>  numtable[0]=0x00;//前1個不顯示</p><

116、p>  if(cal_sec>=0) numtable[1]=0x00;</p><p>  else numtable[1]=0x02;//負號</p><p>  numtable[4]=0x03;//共陰版:下面一行右邊兩個亮起</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;(修改點:P3=P3 | 0x1f)</p><p>  P1=numtable[comnum];//輸入要顯示的數(shù)據(jù)</p><p>  /*******************************************/</p><p>  P3=

122、P3&comtable[comnum];//掃描從左到右(修改點:P3=P3 | comtable[comnum] )</p><p>  keycount++;/*計算何時進入按鍵*/</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)時程序**************/</p><p>  if(TR0==0)//判斷是否為調(diào)時狀態(tài) 中間兩點常亮</p><p><b>  {</b></p><p>  //h1=0xf7;h2=0xf7;h4=0xf7;h5=0xf7;//調(diào)節(jié)時間方格全亮!&

125、lt;/p><p>  flashcount++;/*閃爍時間計算值*/</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];}//時</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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論