版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 單片機的時鐘設計</b></p><p><b> 小組成員:</b></p><p><b> 班級: </b></p><p><b> 課程老師: </b></p><p><b> 目錄</b&
2、gt;</p><p> 一、硬件結構………………………………………………3</p><p> 1硬件原理…………………………………………………3</p><p> 1 89C52…………………………………………………… 3</p><p> 1.1硬件原理…………………………………………………3</p><p&
3、gt; 1.2 主要功能特性…………………………………………3</p><p> 1.3 管腳說明………………………………………………4</p><p> 1.4振蕩器特性……………………………………………5</p><p> 1.5結構特點……………………………………………… 5</p><p> 2、數碼管……………………………
4、…………………… 6</p><p> 2.1數碼管分類………………………………………………6</p><p> 2.2數碼管結構…………………………………………… 7</p><p> 2.3驅動方式…………………………………………………8</p><p> 3、排阻………………………………………………………9</p>
5、<p> 3.1排阻的作用………………………………………………9</p><p> 3.2排阻引腳說明……………………………………………9</p><p> 4、晶振……………………………………………………10</p><p> 4.1晶振構成…………………………………………………10</p><p> 4.2工作原理…
6、…………………………………………… 11</p><p> 4.3功能作用…………………………………………………11</p><p> 軟件結構概述…………………………………………12</p><p> 1、顯示子程序………………………………………………12</p><p> 2、鍵盤掃描子程序…………………………………………13&l
7、t;/p><p> 3、中斷程序…………………………………………………16</p><p> 4、流程圖………………………………………………… 18</p><p> 三、調試過程…………………………………………………20</p><p> 四、心得體會………………………………………………………22</p><p&g
8、t; 五、參考文獻………………………………………………………23</p><p> 六、硬件電路圖……………………………………………………23</p><p> 七、程序清單………………………………………………………25</p><p><b> 硬件結構概述</b></p><p><b> 89C
9、52</b></p><p><b> 1.1硬件原理 </b></p><p> 89C52是INTEL公司MCS-51系列單片機中基本的產品,它采用ATMEL公司可靠的CMOS工藝技術制造的高性能8位單片機,屬于標準的MCS-51的HCMOS產品。它結合了CMOS的高速和高密度技術及CMOS的低功耗特征,它基于標準的MCS-51單片機體系結構和指令
10、系統(tǒng),屬于89C51增強型單片機版本,集成了時鐘輸出和向上或向下計數器等更多的功能,適合于類似馬達控制等應用場合。89C52內置8位中央處理單元、256字節(jié)內部數據存儲器RAM、8k片內程序存儲器(ROM)32個雙向輸入/輸出(I/O)口、3個16位定時/計數器和5個兩級中斷結構,一個全雙工串行通信口,片內時鐘振蕩電路。此外,89C52還可工作于低功耗模式,可通過兩種軟件選擇空閑和掉電模式。在空閑模式下凍結CPU而RAM定時器、串行口和
11、中斷系統(tǒng)維持其功能。掉電模式下,保存RAM數據,時鐘振蕩停止,同時停止芯片內其它功能。89C52有PDIP(40pin)和PLCC(44pin)兩種封裝形式。</p><p> 1.2 主要功能特性</p><p> · 標準MCS-51內核和指令系統(tǒng)</p><p> · 32個雙向I/O口</p><p> &
12、#183; 3個16位可編程定時/計數器</p><p> · 向上或向下定時計數器</p><p><b> · 6個中斷源</b></p><p> · 全雙工串行通信口</p><p> · 空閑和掉電節(jié)省模式</p><p> ·
13、 片內8kROM(可擴充64kB外部存儲器)</p><p> · 256x8bit內部RAM(可擴充64kB外部存儲器)</p><p> · 時鐘頻率3.5-12/24/33MHz</p><p> · 改進型快速編程脈沖算法</p><p> · 5.0V工作電壓</p>&
14、lt;p><b> · 布爾處理器</b></p><p> · 4層優(yōu)先級中斷結構</p><p> · 兼容TTL和CMOS邏輯電平</p><p> · PDIP(40)和PLCC(44)封裝形式</p><p><b> ·—幀錯誤偵測&
15、lt;/b></p><p><b> ·—自動地址識別</b></p><p><b> 1.3 管腳說明</b></p><p> VCC:供電電壓。 GND:接地。 </p><p> P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8個TTL門電流。當P0口的
16、管腳第一次寫“1”時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 </p><p> P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4個TTL門電流。P1口管腳寫入“1”后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸
17、出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 </p><p> P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地
18、址的高八位。在給出地址“1”時,它利用內部上拉優(yōu)勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 </p><p> P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上
19、拉的緣故。P3口作為AT89C51的一些特殊功能口,管腳 備選功能 </p><p> P3.0 RXD(串行輸入口) </p><p> P3.1 TXD(串行輸出口) </p><p> P3.2 /INT0(外部中斷0) </p><p> P3.3 /INT1(外部中斷1) </p><p> P3.
20、4 T0(計時器0外部輸入) </p><p> P3.5 T1(計時器1外部輸入) </p><p> P3.6 /WR(外部數據存儲器寫選通) </p><p> P3.7 /RD(外部數據存儲器讀選通) </p><p> RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。 </p>&
21、lt;p> ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。 </p><p> 在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, A
22、LE只有在執(zhí)行MOVX,MOVC指令是ALE才起用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 </p><p> /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。/EA / VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程
23、序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 </p><p> XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。 </p><p> XTAL2:來自反向振蕩器的輸出。</p><p><b> 1.4振蕩器特性<
24、;/b></p><p> 外接石英晶體或者陶瓷諧振器以及電容C1、C2接在放大器的反饋回路(AT89C52內部有一個用于構成內部振蕩器的高增益反相放大電路,XTAL1、XTAL2分別是該放大器的輸入和輸出端)中構成并聯振蕩電路。 </p><p> 為了使裝置能夠被外部時鐘信號激活,XATL1應該有效,而XTAL2應該被懸空。由于輸入到內部的時鐘信號電路通過了一個二分頻的信號,
25、外部信號的工作周期比沒有別的要求,但是最大值和最小值的大小可以在數據表上觀察出來。 </p><p> 當正常工作時,外部振蕩器可以計算出XTAL1上的電容,最大可達到100pF。這是由于振蕩器電容和反饋電容之間的相互作用。當外部信號是標準高電平或者低電平時,電容不會超過20pF.</p><p><b> 1.5結構特點</b></p><p
26、> n 互補高性能金屬氧化物半導體結構可擦可 編程只讀存儲器/只讀存儲器/中央處理器 </p><p> n 12/24/33MHz操作 </p><p> n 三個16位的定時器/計數器 </p><p> n 可編程的時鐘輸出 </p><p> n Up/Down定時器/計數器 </p><p>
27、 n 三級程序鎖定系統(tǒng) </p><p> n 8K/16K/32K片內程序存儲器 </p><p> n 256字節(jié)片內RAM </p><p> n 改進的快速脈沖編程算法 </p><p><b> n 布爾處理器 </b></p><p> n 32根可編程的輸入/輸出線 &l
28、t;/p><p><b> n 六個中斷源 </b></p><p> n 可編程的串行通道帶有:——幀錯誤檢測 ——自動地址識別 </p><p> n TTL和CMOS兼容邏輯電平 </p><p> n 64K片外程序存儲空間 </p><p> n 64K片外數據存儲空間 </
29、p><p> n MCS51單片機可兼容指令集 </p><p> n 閑置節(jié)能和掉電模式 </p><p> n ONCE(On-Circuit仿真)模式 </p><p> n 四級中斷優(yōu)先級 </p><p> n 擴展溫度范圍(﹣40℃到﹢85℃)</p><p><b>
30、; 數碼管</b></p><p><b> 2.1數碼管分類</b></p><p> 數碼管按段數分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發(fā)光二極管單元(多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、4位等等數碼管; </p><p> 按發(fā)光二極管單元連接方式分為共陽極數碼管和共陰極數碼管。
31、共陽數碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數碼管,共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發(fā)光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就不亮。共陰數碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數碼管,共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發(fā)光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就
32、不亮。</p><p><b> 2.2數碼管結構</b></p><p> led數碼管(LED Segment Displays)是由多個發(fā)光二極管封裝在一起組成“8”字型的器件,引線已在內部連接完成,只需引出它們的各個筆劃,公共電極。led數碼管常用段數一般為7段有的另加一個小數點,還有一種是類似于3位“+1”型。位數有半位,1,2,3,4,5,6,8,10
33、位等等....,led數碼管根據LED的接法不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬件電路有差異外,編程方法也是不同的。圖2是共陰和共陽極數碼管的內部電路,它們的發(fā)光原理是一樣的,只是它們的電源極性不同而已。顏色有紅,綠,藍,黃等幾種。led數碼管廣泛用于儀表,時鐘,車站,家電等場合。選用時要注意產品尺寸顏色,功耗,亮度,波長等。</p><p><
34、b> 2.3驅動方式</b></p><p><b> 靜態(tài)顯示驅動</b></p><p> 靜態(tài)驅動也稱直流驅動。靜態(tài)驅動是指每個數碼管的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。靜態(tài)驅動的優(yōu)點是編程簡單,顯示亮度高,缺點是占用I/O端口多,如驅動5個數碼管靜態(tài)顯示則需要5×8=
35、40根I/O端口來驅動,要知道一個89S51單片機可用的I/O端口才32個呢:),實際應用時必須增加譯碼驅動器進行驅動,增加了硬件電路的復雜性。 </p><p><b> 動態(tài)顯示驅動</b></p><p> 數碼管動態(tài)顯示接口是單片機中應用最為廣泛的一種顯示方式之一,動態(tài)驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"
36、的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是哪個數碼管會顯示出字形,取決于單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態(tài)驅動。在輪流顯示過程中,每位數碼管的點亮時間為
37、1~2ms,由于人的視覺暫留現象及發(fā)光二極管的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數據,不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低。</p><p><b> 排阻</b></p><p><b> 3.1排阻的作用 </b></p&
38、gt;<p> 內存芯片下方均勻分布的“芝麻?!?,實際上是位于內存顆粒和金手指之間的“排阻”。排阻,是一排電阻的簡稱。我們知道,內存在處理、傳輸數據時會產生大小不一的工作電流。而在內存顆粒走線的必經之處安裝一排電阻,則能夠幫助內存起到穩(wěn)壓作用,讓內存工作更穩(wěn)定。從而提升內存的穩(wěn)定性,增強內存使用壽命。內存右邊角上的“小綠豆”,我們一般稱之為SPD。SPD是一存儲體,它存儲了廠商對內存的詳細配置信息:如內存的工作電壓,位寬
39、,操作時序等。每次開機后自檢時,系統(tǒng)都會首先讀取內存SPD中的相關信息,來自動配置硬件資源,以避免出錯。上拉、限流。和普通電阻一樣,相比而言簡化了PCB的設計、安裝,減小空間,保證焊接質量。</p><p><b> 3.2排阻引腳說明</b></p><p> 1與a 2與b 3與c 4 與d之間的電阻都是10歐,與其它的管腳沒有任何關系.就是一排電阻,做在了一
40、個原件上.</p><p> 有的還有一個公腳,就是為了方便使用,拿萬用表量一下就會發(fā)現所有腳對公共腳的阻值均是標稱值,除公共腳外其它任意兩腳阻值是標稱值的兩倍,很明顯任意兩腳通過公共腳腳串聯的嘛!用在有很多上下拉電阻的場合應用特方便,比如并行通訊線上,還節(jié)省空間。</p><p><b> 晶振</b></p><p><b>
41、 4.1晶振構成</b></p><p> 石英晶體振蕩器是利用石英晶體(二氧化硅的結晶體)的壓電效應制成的一種諧振器件,它的基本構成大致是:從一塊石英晶體上按一定方位角切下薄片(簡稱為晶片,它可以是正方形、矩形或圓形等),在它的兩個對應面上涂敷銀層作為電極,在每個電極上各焊一根引線接到管腳 上,再加上封裝外殼就構成了石英晶體諧振器,簡稱為石英晶體或晶體、晶振;而在封裝內部添加IC組成振蕩電路的晶
42、體元件稱為晶體振蕩器。其產品一般用金屬外殼封裝,也有用玻璃殼、陶瓷或塑料封裝的。</p><p><b> 4.2工作原理</b></p><p> 計算機都有個計時電路,盡管一般使用“時鐘”這個詞來表示這些設備,但它們實際上并不是通常意義的時鐘,把它們稱為計時器(timer)可能更恰當一點。計算機的計時器通常是一個精密加工過的石英晶體,石英晶體在其張力限度內以一
43、定的頻率振蕩,這種頻率取決于晶體本身如何切割及其受到張力的大小。有兩個寄存器與每個石英晶體相關聯,一個計數器(counter)和一個保持寄存器(holdingregister)。石英晶體的每次振蕩使計數器減1。當計數器減為0時,產生一個中斷,計數器從保持計數器中重新裝入初始值。這種方法使得對一個計時器進行編程,令其每秒產生60次中斷(或者以任何其它希望的頻率產生中斷)成為可能。每次中斷稱為一個時鐘嘀嗒(clocktick)。 </
44、p><p> 晶振在電氣上可以等效成一個電容和一個電阻并聯再串聯一個電容的二端網絡,電工學上這個網絡有兩個諧振點,以頻率的高低分其中較低的頻率為串聯諧振,較高的頻率為并聯諧振。由于晶體自身的特性致使這兩個頻率的距離相當的接近,在這個極窄的頻率范圍內,晶振等效為一個電感,所以只要晶振的兩端并聯上合適的電容它就會組成并聯諧振電路。這個并聯諧振電路加到一個負反饋電路中就可以構成正弦波振蕩電路,由于晶振等效為電感的頻率范圍
45、很窄,所以即使其他元件的參數變化很大,這個振蕩器的頻率也不會有很大的變化。晶振有一個重要的參數,那就是負載電容值,選擇與負載電容值相等的并聯電容,就可以得到晶振標稱的諧振頻率。一般的晶振振蕩電路都是在一個反相放大器(注意是放大器不是反相器)的兩端接入晶振,再有兩個電容分別接到晶振的兩端,每個電容的另一端再接到地,這兩個電容串聯的容量值就應該等于負載電容,請注意一般IC的引腳都有等效輸入電容,這個不能忽略。一般的晶振的負載電容為15p或1
46、2.5p,如果再考慮元件引腳的等效輸入電容,則兩個22p的電容構成晶振的振蕩電路就是比較好的選擇。</p><p><b> 4.3功能作用</b></p><p> 晶振在應用具體起到的作用,微控制器的時鐘源可以分為兩類:基于機械諧振器件的時鐘源,如晶振、陶瓷諧振槽路;RC(電阻、電容)振蕩器。一種是皮爾斯振蕩器配置,適用于晶振和陶瓷諧振槽路。另一種為簡單的分立
47、RC振蕩器?;诰д衽c陶瓷諧振槽路的振蕩器通常能提供非常高的初始精度和較低的溫度系數。RC振蕩器能夠快速啟動,成本也比較低,但通常在整個溫度和工作電源電壓范圍內精度較差,會在標稱輸出頻率的5%至50%范圍內變化。但其性能受環(huán)境條件和電路元件選擇的影響。需認真對待振蕩器電路的元件選擇和線路板布局。在使用時,陶瓷諧振槽路和相應的負載電容必須根據特定的邏輯系列進行優(yōu)化。具有高Q值的晶振對放大器的選擇并不敏感,但在過驅動時很容易產生頻率漂移(甚
48、至可能損壞)。影響振蕩器工作的環(huán)境因素有:電磁干擾(EMI)、機械震動與沖擊、濕度和溫度。這些因素會增大輸出頻率的變化,增加不穩(wěn)定性,并且在有些情況下,還會造成振蕩器停振。上述大部分問題都可以通過使用振蕩器模塊避免。這些模塊自帶振蕩器、提供低阻方波輸出,并且能夠在一定條件下保證運行。最常用的兩種類型是晶振模塊和集成RC振蕩器(硅振蕩器)。晶振模塊提供與分立晶振</p><p> 選擇振蕩器時還需要考慮功耗。分立
49、振蕩器的功耗主要由反饋放大器的電源電流以及電路內部的電容值所決定。CMOS放大器功耗與工作頻率成正比,可以表示為功率耗散電容值。比如,HC04反相器門電路的功率耗散電容值是90pF。在4MHz、5V電源下工作時,相當于1.8mA的電源電流。再加上20pF的晶振負載電容,整個電源電流為2.2mA。陶瓷諧振槽路一般具有較大的負載電容,相應地也需要更多的電流。相比之下,晶振模塊一般需要電源電流為10mA ~60mA。硅振蕩器的電源電流取決于其
50、類型與功能,范圍可以從低頻(固定)器件的幾個微安到可編程器件的幾個毫安。一種低功率的硅振蕩器,如MAX7375,工作在4MHz時只需不到2mA的電流。在特定的應用場合優(yōu)化時鐘源需要綜合考慮以下一些因素:精度、成本、功耗以及環(huán)境需求。</p><p><b> 軟件結構概述</b></p><p><b> 1顯示子程序</b></p&g
51、t;<p> 1.1顯示函數 display()</p><p> void display()</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<8;i++)</p><
52、;p><b> {</b></p><p> P0=LED[i];</p><p> P2=wei[i];</p><p> delay_ms(2);</p><p><b> P2=0xff;</b></p><p><b> }</b
53、></p><p><b> }</b></p><p> 這次所用到的數碼管為8個,分別顯示小時、分鐘、秒,所以這里用到了一個6容量的數組LED[6]來做數碼管顯示緩沖區(qū)。</p><p> 這次使用的是動態(tài)掃描顯示,一次對六個數碼管都做掃描,每位數碼管的點亮時間為2ms,其中P0做數碼管的位驅動,P2位段驅動。</p>
54、;<p> 1.2時鐘顯示處理函數 disp_time()</p><p> void disp_time()</p><p><b> {</b></p><p> a=second%10;</p><p> b=second/10;</p><p> c=minute
55、%10;</p><p> d=minute/10;</p><p> e=hour%10;</p><p> f=hour/10;</p><p> LED[0]=duan[a];</p><p> LED[1]=duan[b];</p><p> LED[2]=duan[c];&
56、lt;/p><p> LED[3]=duan[d];</p><p> LED[4]=duan[e];</p><p> LED[5]=duan[f];</p><p><b> }</b></p><p> 其中a位秒的個位,b為秒的十位,c為分的個位,d為分的十位,e為小時的個位,f為小
57、時的十位。</p><p> LED[0]、LED[1]、LED[2]、LED[3]、LED[4]、LED[5]對應得顯示秒的個位十位,分的個位十位,小時的個位十位。</p><p> 1.3秒表的顯示處理函數 disp_miao()</p><p> void disp_miao()</p><p><b> {</
58、b></p><p><b> a=C%10;</b></p><p><b> b=C/10;</b></p><p><b> c=B%10;</b></p><p><b> d=B/10;</b></p><p&g
59、t;<b> e=A%10;</b></p><p><b> f=A/10;</b></p><p> LED[0]=duan[a];</p><p> LED[1]=duan[b];</p><p> LED[2]=duan[c];</p><p> LED[
60、3]=duan[d];</p><p> LED[4]=duan[e];</p><p> LED[5]=duan[f];</p><p><b> }</b></p><p> 其中C為秒表的百秒、千秒,B為秒表的十秒、秒,A為秒表的1/10秒、1/100秒。</p><p> LED
61、[0]、LED[1]、LED[2]、LED[3]、LED[4]、LED[5]對應得顯示秒表的百秒、千秒,十秒、秒,1/10秒、1/100秒。</p><p> 2、鍵盤掃描子程序 key_scan()</p><p> 2.1 K1鍵的掃描</p><p><b> if(k1==0)</b></p><p>&l
62、t;b> {</b></p><p> delay_ms(10);</p><p><b> if(k1==0)</b></p><p><b> {</b></p><p> while(!k1); </p><p><b> TR0
63、=0; </b></p><p> set_flag=1; </p><p> k1_flag++;</p><p> if(k1_flag==4)k1_flag=1;</p><p><b> }</b></p><p> 當K0有鍵按下是為0,則進入IF函數里,首先程序延
64、時10MS防止抖動造成誤操作,當K1按下時為調時工作,即選擇小時,分鐘,秒,調時中設置一個調時標志位K1_FLAG,以便調時可以循環(huán)的選擇。</p><p> 2.2 K2鍵的掃描</p><p><b> if(k2==0)</b></p><p><b> {</b></p><p>
65、delay_ms(10);</p><p> if(k2==0&choose_flag>=1)</p><p><b> {</b></p><p> while(!k2);</p><p> k2_flag++;</p><p> if(k2_flag==2)k2_fla
66、g=0;</p><p> TR1=k2_flag;</p><p><b> }</b></p><p> if(k2==0&set_flag==1)</p><p><b> {</b></p><p> while(!k2);</p>&
67、lt;p> switch (k1_flag)</p><p><b> {</b></p><p> case 1:hour++;if(hour==24)hour=0;break;</p><p> case 2:minute++;if(minute==60)minute=0;break;</p><p>
68、 case 3:second++;if(second==60)second=0;break;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> K2鍵在秒表時為計數的開始與停止,在時鐘
69、里作為加一功能鍵,在區(qū)分是秒表還是時鐘方面,選擇了一個標志位choose_flag來區(qū)分當其大于1時就表示為秒表模式,當其為0時表示為時鐘模式,choose_flag的值是根據切換鍵來決定的。</p><p> 當進入秒表時,K2每按一下都會改變k2_flag的狀態(tài),k2_flag也決定著時鐘是停是走,當進入時鐘時由k1_flag的狀態(tài)決定哪一環(huán)節(jié)被加,而實現加的就是K2影響k2_flag的結果。</p&
70、gt;<p> 2.3 K3鍵的掃描</p><p><b> if(k3==0)</b></p><p><b> {</b></p><p> delay_ms(10);</p><p> if(k3==0&choose_flag>=1)</p>
71、<p><b> {</b></p><p> while(!k3);</p><p> H=0;L=0;M=0;</p><p><b> TR1=0;</b></p><p><b> }</b></p><p> if(k
72、3==0&set_flag==1)</p><p><b> {</b></p><p> while(!k3);</p><p> switch (k1_flag)</p><p><b> {</b></p><p> case 1:if(hour==0
73、)hour=24;hour--;break;</p><p> case 2:if(minute==0)minute=60;minute--;break;</p><p> case 3:if(second==0)second=60;second--;break;</p><p><b> }</b></p><p&
74、gt;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> K3鍵的作用于K2鍵是相對應的。</p><p> K3鍵在秒表時為計數的清零,在時鐘里作為減一功能鍵,在區(qū)分是秒表還是時鐘方面,選擇了一個標志
75、位choose_flag來區(qū)分當其大于1時就表示為秒表模式,當其為0時表示為時鐘模式,choose_flag的值是根據切換鍵來決定的。</p><p> 當進入秒表時,K3按一下會使得秒表的計數值被清零,當進入時鐘時由k1_flag的狀態(tài)決定哪一環(huán)節(jié)被加,而實現加的就是K2影響k2_flag的結果。</p><p> 2.4 K4鍵的掃描</p><p><
76、;b> if(k4==0)</b></p><p><b> {</b></p><p> delay_ms(10);</p><p> if(set_flag==0&k4==0) </p><p><b> {</b></p><p>
77、 while(!k4);</p><p> start_flag++;</p><p> if(start_flag==2) </p><p><b> {</b></p><p> TR1=1; </p><p> start_flag=0;<
78、;/p><p><b> } </b></p><p> choose_flag++;</p><p> if(choose_flag==3)</p><p><b> {</b></p><p><b> TR0=1;</b></p&g
79、t;<p> choose_flag=0;</p><p><b> }</b></p><p><b> }</b></p><p> if(k4==0&set_flag==1)</p><p><b> {</b></p>&l
80、t;p> while(!k4);</p><p> set_flag=0;</p><p> k1_flag=0;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p><b> }</b>
81、;</p><p> K4鍵的作用時時鐘、秒表間的切換,當K4被按一下則進入到秒表,進入秒表模式是數碼管的全部內容被清空,等待著啟動,K4再被按一下則啟動秒表,k4被按第三下時秒表又回到時鐘,如上是在沒有處在調節(jié)時間的條件下,當時鐘正處在時間調節(jié)下時那K4的作用就是將其退到時鐘狀態(tài)</p><p><b> 3、中斷程序</b></p><p&
82、gt; 3.1 時鐘中斷程序</p><p> void timer0() interrupt 1</p><p><b> {</b></p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p><
83、;b> t++;</b></p><p><b> if(t==20)</b></p><p><b> {</b></p><p><b> t=0;</b></p><p><b> second++;</b></p&
84、gt;<p> if(second==60)</p><p><b> {</b></p><p><b> minute++;</b></p><p><b> second=0;</b></p><p> if(minute==60)</p&g
85、t;<p><b> {</b></p><p><b> hour++;</b></p><p><b> minute=0;</b></p><p> if(hour==24)</p><p><b> {</b></p&
86、gt;<p><b> hour=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p
87、><p> 該中斷用的是定時器T0,沒50ms中斷一次,沒中斷20次秒加一,秒加到60后向分進位,即秒清零,分加一,當分加到60后向小時進位,即秒分都清零小時加一。</p><p> 3.2 秒表中斷程序</p><p> void timer1() interrupt 3</p><p><b> {</b><
88、;/p><p> TH1=(65536-10000)/256;</p><p> TL1=(65536-10000)%256;</p><p><b> n++;</b></p><p><b> if(n==1)</b></p><p><b> {<
89、/b></p><p><b> n=0;</b></p><p><b> C++;</b></p><p> if(C==100)</p><p><b> {</b></p><p><b> C=0;</b>
90、</p><p><b> B++;</b></p><p> if(B==100)</p><p><b> {</b></p><p><b> B=0;</b></p><p><b> A++;</b></p
91、><p> if(A==100)</p><p><b> {</b></p><p><b> A=0;</b></p><p><b> }</b></p><p><b> }</b></p><p&
92、gt;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 該中斷用到定時器T1,T1每計數10ms則產生一次中斷,秒表里是逢百進位,進位方式與前面相似。</p><p><b> 調試過程<
93、;/b></p><p><b> 3.1 時鐘</b></p><p><b> 3.2 時鐘調時</b></p><p><b> 3.3 秒表</b></p><p><b> 3.4 秒表計時</b></p><p
94、><b> 四、心得體會</b></p><p> 經過一周的課程設計,我收獲頗多,有深刻的心得體會。 實踐讓我們受益匪淺。首先是關于單片機方面的,為了順利完成程序的構成,我們學了一些關于單片機系統(tǒng)開發(fā)的C語言知識,最開始從已學過的C語言知識到最后的老師在課堂上補充的關于匯編的C語言,使我們得到了充分的鍛煉。其次,它讓我體會到了什么才是teamwork spirit。一如:兩個人的
95、分工、合作的經驗、團隊意識的提升和協(xié)調能力等等,這些都會讓我們終身受益。 通過此次課程設計,使我更加扎實的掌握了有關電子線路單片機方面的知識,因為這次我們不僅寫出了程序,而且還為寫出的程序作出了實物,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查我終于找出了問題所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐才能出真知,實踐才是檢驗真理的唯一標準,唯有通過親自動手制作,才能令我們掌握的知識不再是一些紙
96、上談兵的東西。 在這次的課程設計中,我們遇到了很多困難,過程很艱難,但是我們都克服了,這是對我們自己的肯定。我們不斷發(fā)現錯誤,不斷改正,不斷領悟,不斷獲取。我們也曾灰心,也曾茫然,也曾不知所措,從一開始的自信滿滿,到最后的緊張繁</p><p> 在這次程序設計中我們有許多值得思考的問題,首先、當老師建議作出實物時我和另一個組員猶豫是否作出這個東西,因為想著仿真多簡單啊,但是看到身邊同學毫不猶豫的選擇作出實物來
97、時,我們?yōu)槲覀兺硕笃浯蔚南敕☉M愧;其次、在畫板子時我們明顯的發(fā)現自己不知從何處下手,在實驗室里呆了一天并且包了夜才漸漸的摸到門路,這時我們才發(fā)現這些看似很簡單的東西都是需要許多功夫和辛勞的;最后、在程序方面雖然我們這學期學習的是匯編語言,但是發(fā)現自己用匯編實現老師要求的能力遠遠不過,于是轉向用C語言來解決,但是從這個方面來做我們組還是依賴了實驗室的同學很多,我們先是學習他們的程序,消化吸收才有了我們的程序,在這里覺得我們的水平還是太差
98、,也非常感謝那些幫助過我們的同學。</p><p><b> 五、參考文獻</b></p><p> (1)胡漢才 單片機原理及其接口技術(第二版). 北京:清華大學出版社,2004.2</p><p> ?。?)徐安等 單片機原理及應用. 北京:北京希望電子出版社,2003.2</p><p> ?。?)丁元杰
99、單片微機原理及應用(第二版). 北京:機械工業(yè)出版社,1999.10</p><p> ?。?)李建忠 單片機原理及應用. 西安:西安電子科技大學出版社,2002.2</p><p> ?。?)徐惠民 單片微型計算機原理、接口及應用(第二版). 北京:北京郵電大學出版社,2000.10</p><p> ?。?)閆玉德 MCS-51單片機原理及應用(C語言版). 北
100、京:機械工業(yè)出版社</p><p> (7)何橋等 單片機原理及應用. 北京:中國鐵道出版社,2004.3</p><p> (8)李群芳 單片機原理、接口及應用—嵌入式系統(tǒng)技術基礎. 北京:清華大學出版社,2005.3</p><p><b> 六、硬件電路圖</b></p><p><b> 七、程
101、序清單</b></p><p> #include <reg52.h></p><p> #include <intrins.h></p><p> #define uint unsigned int </p><p> #define uchar unsigned char </p>
102、<p> sbit k1 = P1^0; //定義按鍵K</p><p> sbit k2 = P1^1;</p><p> sbit k3 = P1^2;</p><p> sbit k4 = P1^3;</p><p> unsigned char LED[8]={0x00};//數碼管顯示緩沖區(qū)</p>
103、<p> unsigned int t; //定時器0單位時間標識值</p><p> int n; //計數器1單位時間標志值</p><p> unsigned char a=0,b=0,c=0,d=0,e=0,f=0;//待顯示位置的形參</p><p> unsigned char hour=23; //定義小時變量并賦初值&l
104、t;/p><p> unsigned char minute=54;//定義分鐘變量并賦初值</p><p> unsigned char second=50;//定義秒變量并賦初值</p><p> unsigned char A=0; //百秒、千秒形參</p><p> unsigned char B=0; //十秒、秒形參
105、</p><p> unsigned char C=0; //1/10秒、1/100秒形參</p><p> unsigned char start_flag=0;//秒表開始計時標志位,為2開始</p><p> unsigned char k1_flag=0; //調時對象選擇標識:hour,minute,second,循環(huán)調節(jié)</p&g
106、t;<p> unsigned char k2_flag=1; //秒表暫停標識,為0:暫停,為1:繼續(xù)</p><p> unsigned char set_flag=0; /時間設置標志位,為0:正常走時,為1:停止走時并進入調時狀態(tài)</p><p> unsigned char choose_flag=0; //顯示模式選擇標識。為0:時鐘模式,為1:秒表模式&l
107、t;/p><p> unsigned char wei[8]={0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef};</p><p> unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};</p><p> //<&
108、lt;<<<<<<<<<<<<<<<<<<<<<<<<<<<<函數申明>>>>>>>>>>>>>>>>>>>>>>>>>&
109、gt;>>>>>>>></p><p> void delay_ms(uint z); //ms延時函數申明</p><p> void display(); //緩沖區(qū)數值顯示函數申明</p><p> void disp_time(); //時鐘模式下顯示處理函數申明
110、</p><p> void system_init(); //初始化TMOD申明</p><p> void disp_miao(); //秒表模式下顯示處理函數申明</p><p> void key_scan(); //按鍵檢測、鍵值處理函數申明</p><p> void key_sc
111、an()</p><p><b> {</b></p><p><b> if(k1==0)</b></p><p><b> {</b></p><p> delay_ms(10); //去抖</p><p><b>
112、if(k1==0)</b></p><p><b> {</b></p><p> while(!k1); //等待按鍵釋放</p><p> TR0=0; //調時模式下停止走時</p><p> set_flag=1; //設置相應標志位</p>
113、<p> k1_flag++;</p><p> if(k1_flag==4)k1_flag=1;</p><p><b> }</b></p><p><b> }</b></p><p><b> if(k4==0)</b></p>&
114、lt;p><b> {</b></p><p> delay_ms(10);</p><p> if(set_flag==0&k4==0) //進入秒表模式</p><p><b> {</b></p><p> while(!k4);</p>&
115、lt;p> start_flag++;</p><p> if(start_flag==2) //進入秒表模式下,全部清空,等待啟動</p><p><b> {</b></p><p> TR1=1; //啟動秒表</p><p> start_fla
116、g=0;</p><p><b> } </b></p><p> choose_flag++;</p><p> if(choose_flag==3)</p><p><b> {</b></p><p><b> TR0=1;</b>&
117、lt;/p><p> choose_flag=0;</p><p><b> }</b></p><p><b> }</b></p><p> if(k4==0&set_flag==1)</p><p><b> {</b></p&
118、gt;<p> while(!k4);</p><p> set_flag=0;</p><p> k1_flag=0;</p><p><b> TR0=1;</b></p><p><b> }</b></p><p><b> }&l
119、t;/b></p><p><b> if(k2==0)</b></p><p><b> {</b></p><p> delay_ms(10);</p><p> if(k2==0&choose_flag>=1)</p><p><b&g
120、t; {</b></p><p> while(!k2);</p><p> k2_flag++;</p><p> if(k2_flag==2)k2_flag=0;</p><p> TR1=k2_flag;</p><p><b> }</b></p>&
121、lt;p> if(k2==0&set_flag==1)</p><p><b> {</b></p><p> while(!k2);</p><p> switch (k1_flag)</p><p><b> {</b></p><p> cas
122、e 1:hour++;if(hour==24)hour=0;break;</p><p> case 2:minute++;if(minute==60)minute=0;break;</p><p> case 3:second++;if(second==60)second=0;break;</p><p><b> }</b><
123、/p><p><b> }</b></p><p><b> }</b></p><p><b> if(k3==0)</b></p><p><b> {</b></p><p> delay_ms(10);</p&g
124、t;<p> if(k3==0&choose_flag>=1)</p><p><b> {</b></p><p> while(!k3);</p><p> H=0;L=0;M=0;</p><p><b> TR1=0;</b></p>&l
125、t;p><b> }</b></p><p> if(k3==0&set_flag==1)</p><p><b> {</b></p><p> while(!k3);</p><p> switch (k1_flag)</p><p><b&
126、gt; {</b></p><p> case 1:if(hour==0)hour=24;hour--;break;</p><p> case 2:if(minute==0)minute=60;minute--;break;</p><p> case 3:if(second==0)second=60;second--;break;</
127、p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void display()</p><
128、;p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<6;i++)</p><p><b> {</b></p><p> P0=LED[i];</p><p> P
129、2=wei[i];</p><p> delay_ms(2);</p><p><b> P2=0xff;</b></p><p><b> }</b></p><p><b> }</b></p><p> void disp_time(
130、)</p><p><b> {</b></p><p> a=second%10;</p><p> b=second/10;</p><p> c=minute%10;</p><p> d=minute/10;</p><p> e=hour%10;<
131、;/p><p> f=hour/10;</p><p> LED[0]=duan[a];</p><p> LED[1]=duan[b];</p><p> LED[2]=duan[c];</p><p> LED[3]=duan[d];</p><p> LED[4]=duan[e];
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論