

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 單片機課程設計</b></p><p> 項目名稱 基于51單片機的簡約電子鐘 </p><p> 專業(yè)班級 通信091班 </p><p> 學生姓名 </p
2、><p> 指導教師 </p><p> 2012 年 12 月 21 日</p><p><b> 摘 要</b></p><p> 單片機自20世紀70年代問世以來,以其極高的性能價格比,受到人們的重視和關注,應用很廣、發(fā)展很快。單片機體積小、重
3、量輕、抗干擾能力強、環(huán)境要求不高、價格低廉、可靠性高、靈活性好、開發(fā)較為容易。由于具有上述優(yōu)點,在我國,單片機已廣泛地應用在工業(yè)自動化控制、自動檢測、智能儀器儀表、家用電器、電力電子、機電一體化設備等各個方面,而51單片機是各單片機中最為典型和最有代表性的一種。這次課程設計通過對它的學習、應用,以STC11F02E芯片為核心,輔以必要的電路,設計了一個簡易的電子時鐘,它由4.5V直流電源供電,通過數碼管能夠準確顯示時間,調整時間,從而到
4、達學習、設計、開發(fā)軟、硬件的能力。</p><p> 關鍵詞: 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 單片機技術的研究現(xiàn)狀1</p><p> 1.3 總體設計方案2</p><p> 1.3.1 設計思路2</p><p> 第2章 系統(tǒng)硬件原理及設計4</p><p> 2.1 核心器件STC11F02E介紹4</p><p> 2.2 主要設計軟件介紹
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 總體設計框圖及設計原理圖7</p><p> 第3章 系統(tǒng)軟件設計8</p><p> 3
10、.1 軟件設計分析8</p><p> 3.2 軟件程序設計8</p><p><b> 結論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)集成到一個芯片上。單片機由運算器,控制器,存儲器,輸入輸出設備構成,相當于一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。概括的講:一塊芯片就成了一臺計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發(fā)提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。它最早是被用在工業(yè)控制領域。<
13、/p><p> 由于單片機在工業(yè)控制領域的廣泛應用,單片機由芯片內僅有CPU的專用處理器發(fā)展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個芯片中,使計算機系統(tǒng)更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。</p><p> INTEL的Z80是最早按照這種思想設計出的處理器,當時的單片機都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上發(fā)展出了MC
14、S51系列單片機系統(tǒng)。因為簡單可靠而性能不錯獲得了很大的好評。盡管2000年以后ARM已經發(fā)展出了32位的主頻超過300M的高端單片機,直到目前基于8031的單片機還在廣泛的使用。在很多方面單片機比專用處理器更適合應用于嵌入式系統(tǒng),因此它得到了廣泛的應用。事實上單片機是世界上數量最多處理器,隨著單片機家族的發(fā)展壯大,單片機和專用處理器的發(fā)展便分道揚鑣。</p><p> 現(xiàn)代人類生活中所用的幾乎每件電子和機械產
15、品中都會集成有單片機。手機、電話、計算器、家用電器、電子玩具、掌上電腦以及鼠標等電腦配件中都配有1-2部單片機。 汽車上一般配備40多部單片機,復雜的工業(yè)控制系統(tǒng)上甚至可能有數百臺單片機在同時工作!單片機的數量不僅遠超過PC機和其他計算的總和,甚至比人類的數量還要多。</p><p> 1.2 單片機技術的研究現(xiàn)狀</p><p> 單片機誕生于1971年,經歷了SCM、MCU、So
16、C三大階段,早期的SCM單片機都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上發(fā)展出了MCS51系列MCU系統(tǒng)?;谶@一系統(tǒng)的單片機系統(tǒng)直到現(xiàn)在還在廣泛使用。隨著工業(yè)控制領域要求的提高,開始出現(xiàn)了16位單片機,但因為性價比不理想并未得到很廣泛的應用。90年代后隨著消費電子產品大發(fā)展,單片機技術得到了巨大提高。隨著INTEL i960系列特別是后來的ARM系列的廣泛應用,32位單片機迅速取代16位單片機的高端地位,并
17、且進入主流市場。</p><p> 而傳統(tǒng)的8位單片機的性能也得到了飛速提高,處理能力比起80年代提高了數百倍。目前,高端的32位Soc單片機主頻已經超過300MHz,性能直追90年代中期的專用處理器,而普通的型號出廠價格跌落至1美元,最高端的型號也只有10美元。</p><p> 當代單片機系統(tǒng)已經不再只在裸機環(huán)境下開發(fā)和使用,大量專用的嵌入式操作系統(tǒng)被廣泛應用在全系列的單片機上。而
18、在作為掌上電腦和手機核心處理的高端單片機甚至可以直接使用專用的Windows和Linux操作系統(tǒng)。</p><p> 當前趨勢SoC嵌入式系統(tǒng)(System on Chip)式的獨立發(fā)展之路,向MCU階段發(fā)展的重要因素,就是尋求應用系統(tǒng)在芯片上的最大化解決,因此,專用單片機的發(fā)展自然形成了SoC化趨勢。隨著微電子技術、IC設計、EDA工具的發(fā)展,基于SoC的單片機應用系統(tǒng)設計會有較大的發(fā)展。因此,對單片機的理解
19、可以從單片微型計算機、單片微控制器延伸到單片應用系統(tǒng)。</p><p> 1.3 總體設計方案</p><p> 1.3.1 設計思路</p><p> 利用單片機(STC11F02E)制作簡易電子時鐘,采用了共陰數碼管,在數碼管的a-h 段都加上330 歐姆的上拉電阻,增大數碼管的驅動電流,然后還采用了一個蜂鳴器做報時用,外加兩個按鍵,電路非常簡單,但是
20、它的亮點是程序,程序使用了一種全新的按鍵處理方法,一個按鍵實現(xiàn)長按,短按功能。</p><p> 1.3.2 設計方案 </p><p> 根據設計任務的基本要求,設計了由單片機(STC11F02E)作為主控器件,
21、按鍵組成的按鍵操作電路,以及三極管、蜂鳴器組成的發(fā)聲電路。本次設計時鐘電路,使用了STC11F02E單片機芯片控制電路,單片機控制電路簡單且省去了很多復雜的線路,使得電路簡明易懂,使用鍵盤鍵上的按鍵來調整時鐘的時、分、秒,用一揚聲器來進行定時提醒,同時使用匯編語言程序來控制整個時鐘顯示,使得編程變得更容易,這樣通過四個模塊:鍵盤、芯片、揚聲器、LED顯示即可滿足設計要求。</p><p><b> 1
22、.4 課題意義</b></p><p> 時鐘,自從它發(fā)明的那天起,就成為人類的朋友,但隨著時間的推移,科學技術的不斷發(fā)展,人們對時間計量的精度要求越來越高,應用越來越廣。怎樣讓時鐘更好的為人民服務,怎樣讓我們的老朋友煥發(fā)青春呢?這就要求人們不斷設計出新型時鐘。</p><p> 現(xiàn)今,高精度的計時工具大多數都使用了石英晶體振蕩器,由于電子鐘,石英表,石英鐘都采用了石英技
23、術,因此走時精度高,穩(wěn)定性好,使用方便,不需要經常調校,數字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替顯示器代替指針顯示進而顯示時間,減小了計時誤差,這種表具有時,分,秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。</p><p> 時鐘電路在計算機系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎。在一個單片機應用系統(tǒng)中,時鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準振蕩
24、定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的快慢;二是指系統(tǒng)的標準定時時鐘,即定時時間,它通常有兩種實現(xiàn)方法:一是用軟件實現(xiàn),即用單片機內部的可編程定時/計數器來實現(xiàn),但誤差很大,主要用在對時間精度要求不高的場合;二是用專門的時鐘芯片實現(xiàn),在對時間精度要求很高的情況下,通常采用這種方法,典型的時鐘芯片有:DS1302,DS12887,X1203等都可以滿足高精度的要求。</p><p>
25、; 本文主要介紹用單片機內部的定時/計數器來實現(xiàn)電子時鐘的方法,本設計由單片機STC11F02E芯片和LED數碼管為核心,輔以必要的電路,沒有用到時鐘芯片,因此采用校準功能,構成了一個超級簡單的單片機電子時鐘,該方案節(jié)省硬件成本,但程序設計較為復雜。</p><p> 第2章 系統(tǒng)硬件原理及設計</p><p> 2.1 核心器件STC11F02E介紹</p>&l
26、t;p> STC11F02E單片機是宏晶科技設計生產的單時鐘/ 機器周期(1T)的單片機,是高速/ 低功耗/ 超強抗干擾的新一代8051 單片機,指令代碼完全兼容傳統(tǒng)8051,但速度快8-12 倍。內部集成高可靠復位電路,針對高速通信,智能控制,強干擾場合。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,相當于普通8051 的 0~420MHz</p><p> 4. STC11F/Lxx 系列單片機用戶應用程序空間: 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 個),復位后為: 準雙向口/ 弱上拉(普通8051 傳統(tǒng)I/O 口)可設置成四種模式:準雙向口/ 弱上拉,推挽/ 強上拉,僅為輸入/ 高阻,開漏每個I/O 口
30、驅動能力均可達到20mA,但整個芯片最大不要超過100mA</p><p> 7. ISP (在系統(tǒng)可編程)/IAP(在應用可編程),無需專用編程器,無需專用仿真器可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程序,數秒即可完成一片</p><p> 8. 有EEPROM 功能</p><p><b> 9. 看門狗</b>
31、</p><p> 10. 內部集成MAX810 專用復位電路(晶體頻率在24MHz 以下時,要選擇高的復位門檻電壓,如4.1V 以下復位,晶體頻率在12MHz 以下時,可選擇低的復位門檻電壓,如3.7V 以下復位,復位腳接1K 電阻到地)</p><p> 11. 內置一個對內部Vcc 進行掉電檢測的掉電檢測電路,可設置為中斷或復位5V 單片機掉電檢測門檻電壓為4.1V/3.7V 附
32、近,3.3V 單片機掉電檢測門檻電壓為2.4V 附近</p><p> 12. 時鐘源:外部高精度晶體/ 時鐘,內部R/C 振蕩器用戶在下載用戶程序時,可選擇是使用內部R/C 振蕩器還是外部晶體/ 時鐘常溫下內部R/C 振蕩器頻率為: 4MHz ~ 8MHz精度要求不高時,可選擇使用內部時鐘,但因為有制造誤差和溫漂,以實際測試為準</p><p> 13. 2 個16 位定時器(與傳統(tǒng)
33、8051 兼容的定時器/ 計數器,16 位定時器T0 和T1)1個獨立波特率發(fā)生器(故不必用T2做為波特率發(fā)生器,詳細使用方法請參考獨立波特率發(fā)生器做串口通訊的相關使用說明及示例程序)</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(掉電)模式可由內部掉電喚醒專用定時器喚醒(ST
35、C11xx 系列有此功能,STC10xx 無此功能),也可由上面提到的外部中斷口中斷喚醒,由于INT/RxD 支持下降沿中斷,故也可支持遠程通信喚醒</p><p> 17. 一個獨立的通用全雙工異步串行口(UART),做主機時可以當2 個串口使用[RxD/P3.0,TxD/P3.1]可以切換到[RxD/P1.6,TxD/P1.7],通過將串口在P3 口和P1 口之間來回切換,將1 個串口作為2 個主串口分時復
36、用,可低成本實現(xiàn)2 個串口,當然有其局限性</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 主要設計軟件介紹</p><p> 本設計利用KEIL編程軟件對時鐘源程序進行編程并調試,配合PROTEUS仿真軟件對硬件進行仿真調試,兩種軟件的簡介如下:</p><p> 2.2.1 PROTEUS軟件簡介&
38、lt;/p><p> Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件(該軟件中國總代理為廣州風標電子技術有限公司)。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。雖然目前國內推廣剛起步,但已受到單片機愛好者、從事單片機教學的教師、致力于單片機開發(fā)應用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿
39、真軟件),從原理圖布圖、代碼調試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設計,真正實現(xiàn)了從概念到產品的完整設計。是目前世界上唯一將電路仿真軟件、PCB設計軟件和虛擬模型仿真軟件三合一的設計平臺,其處理器模型支持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ā)技術的不
41、斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言開發(fā),單片機的開發(fā)軟件也在不斷發(fā)展,Keil軟件是目前最流行開發(fā)MCS-51系列單片機的軟件,這從近年來各仿真機廠商紛紛宣布全面支持Keil即可看出。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部份組合在一起。運行Keil軟件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空閑的
42、硬盤空間、WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。掌握這一軟件的使用對于使用51系列單片機的愛好者來說是十分必要的,如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強大的軟件仿真調試工具也會令你</p><p><b> 2.3 硬件電路</b></p><p> 2.3.1 總
43、體設計框圖及設計原理圖</p><p> 圖2.3.1 總體設計框圖</p><p> 圖2.3.2 設計原理圖</p><p> 第3章 系統(tǒng)軟件設計</p><p> 3.1 軟件設計分析</p><p> 在編程上,首先進行了初始化,定義程序的的入口地址以及中斷的入口地址,在主程序開始定義了一組固定
44、單元用來儲存計數的時.分.秒,在顯示初值之后,進入主循環(huán)。在主程序中,對不同的按鍵進行掃描,實現(xiàn)秒表,時間調整,復位清零等功能,系統(tǒng)總流程圖如下圖:</p><p> 3.2 軟件程序設計</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> /*以下數據最后處理的時候要合并*/</p><p> uchar comnum;//公共端顯示值</p><p> uchar timecount;//時間計數值</p><p> uchar sec=59,min=59,hour=11;//秒分時</p><p> uc
47、har point;//控制中間兩點</p><p> uchar com3num;/*公共端3控制的方格數值*/</p><p> uchar h1,h2,h4,h5;/*1,2,4,5控制的方格值*/</p><p> void init();//初始化函數聲明</p><p> //void KeyInit();/*讀取按鍵函數
48、,按鍵初始設置*/</p><p> void KeyRead();//讀取按鍵并且執(zhí)行按鍵操作</p><p> /****以下是按鍵相關定義*****/</p><p> uchar Trg=0;//Trg(triger代表是觸發(fā))</p><p> uchar Cont=0;//Cont(continue)代表是連續(xù)按下<
49、/p><p> uchar cnt_plus;//計算上面按鍵按住的長數 </p><p> uchar cnt_plus2;//計算下面按鍵長按的計算值</p><p> uchar cnt_plus3;//長加</p><p> uchar keycount;//按鍵計數值</p><p> uchar se
50、c1,min1,hour1;//用于設置時間時所用到</p><p> uchar setnum;//用于設置的是當前那個值</p><p> uchar flashcount;//閃爍計算值</p><p> bit flashflag;//閃爍標志</p><p> //bit longkeyflag;//長按標志</p&g
51、t;<p> sbit beep=P3^6;//蜂鳴器控制管腳</p><p> //sbit longkey2=P3^5;</p><p> bit beepflag;//報時標志</p><p> bit openbeep;//是否打開蜂鳴器標志</p><p> bit opennum;</p>&
52、lt;p> bit lightflag;</p><p> bit cal_flag;/*校準標志*/</p><p> char cal_sec;//校準的秒數(有正負)</p><p> uchar cal_sec2;//用于轉換cal_sec為整數時用到</p><p> bit cal_finish;//用于設置負數時
53、確定是否只設置一次</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個公共端控制數組</p><p> uchar data numtable[5];//顯示那個數碼管 (5代表5
55、個數據?。。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;//校準值初始為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()//初始化函數</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、> /**********按鍵讀取函數***********/</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ū)分校準的按鍵</p><p><b> {</b></p><p> if(Trg & Key1)/*設置是否需要鳴叫*/</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)//第一個按鍵長按,進入設置時間</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;//進入時的設置</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)//確定是否是設置時間</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> /******根據setnum而設置相應項目*******/</p><p> if(setnum==1)//調節(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)//調節(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、調節(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> /*************設置時間時長按長加***********************/</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> /***********以下是人動設置
82、校準時間,范圍是每日校準:-20~~20秒*************/</p><p> if(TR0==1)//時間沒有調節(jié)的時候才能進入</p><p><b> {</b></p><p> if(Cont & Key2)/*下面的按鍵長按:進入用戶人動校準時間*/</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;//校準標志</p><p><b> }</b></p><p><b> }</b></p><p> else cnt_plus2=0;</p><p> if(cal_flag)/*短觸用于設置校準值:-20~~20秒范圍。正數表示加快秒數
85、,負數表示減慢秒數*/</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任務:計算時間</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> /********************添加校準時間:在凌晨1點00分30秒開始校準(神不知鬼不覺。。。)*/</p><p> if(hour=
93、=1 && min==0 && sec==30 && timecount<1)</p><p><b> {</b></p><p> if(cal_sec<0)//如果是負數要考慮之后再到達此時刻的情況</p><p><b> {</b></p&g
94、t;<p> cal_finish=~cal_finish;</p><p> if(cal_finish)//進入校準</p><p><b> {</b></p><p> sec=sec+cal_sec;/*校準負數的時候*/</p><p><b> }</b><
95、;/p><p> }//完成校準標志,防止下次遇到</p><p> else//如果是正數</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)//每個方格負責的余數是一樣的</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)//每個方格負責的余數是一樣的</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是關閉*/</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)//進入是否設置鳴叫的顯示</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> /*************以下是設置校準秒數的顯示*********/</p><p> if(cal_flag)//校準標志為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);/*取整數,好處理*/</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任務:掃描,按鍵檢測</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;//低五位關閉(公共端位) P3=P3 | 0x1f;(修改點:P3=P3 | 0x1f)</p><p> P1=numtable[comnum];//輸入要顯示的數據</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> /********************下面添加調時程序**************/</p><p> if(TR0==0)//判斷是否為調時狀態(tài) 中間兩點常亮</p><p><b> {</b></p><p> //h1=0xf7;h2=0xf7;h4=0xf7;h5=0xf7;//調節(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計---基于51單片機的電子鐘設計
- 單片機課程設計--基于單片機的數字電子鐘
- 單片機課程設計--基于單片機的電子鐘的設計
- 單片機課程設計報告---單片機的電子鐘設計
- 電子鐘單片機課程設計
- 單片機c語言課程設計--基于單片機的電子鐘設計
- 單片機課程設計--電子鐘
- 單片機課程設計(電子鐘)
- 基于單片機的電子鐘課程設計
- 電子鐘課程設計--基于單片機的電子鐘設計
- 基于單片機的電子鐘課程設計
- 單片機課程設計-基于單片機的多功能電子鐘的設計
- 單片機課程設計——數字電子鐘
- 單片機課程設計--數字電子鐘
- 單片機課程設計--數字電子鐘
- 單片機課程設計---智能電子鐘
- 單片機原理課程設計--電子鐘
- 單片機數字電子鐘課程設計
- 基于51單片機的數字電子鐘設計
- 單片機課程設計--數字電子鐘
評論
0/150
提交評論