單片機電子時鐘課程設計_第1頁
已閱讀1頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  單片機電子時鐘</b></p><p><b>  摘 要</b></p><p>  單片機 即單片微型計算機。(Single-Chip Microcomputer ),是 集 CPU ,RAM ,ROM ,定時,計數(shù)和多種接口于一體的微控制器。他體積小,成本低,功能強,廣泛應用于工業(yè)自動化上和智能產(chǎn)品。&l

2、t;/p><p>  我們課程設計小組設想:可不可以利用單片機功能集成化高,價格又便宜的特點設計一款結(jié)構(gòu)簡單的單片機電子時鐘呢? </p><p>  基于這種情況,我們課程設計小組成員多方查閱資料,反復論證設計出了這款既簡單實用的單片機電子時鐘。</p><p>  關(guān)鍵詞:單片機 、 時鐘 、 計時</p><p><b>  目

3、 錄</b></p><p><b>  摘要1</b></p><p>  第一章 系統(tǒng)設計要求2</p><p>  1.1 基本功能2</p><p>  1.2 擴展功能2</p><p>  第二章 硬件總體設計方案3</p><p> 

4、 2.1系統(tǒng)功能實現(xiàn)總體設計思路3</p><p>  2.2各部分功能實現(xiàn)4</p><p>  2.3系統(tǒng)工作原理5</p><p>  2.4時鐘各功能分析及圖解6</p><p>  2.4.1電路各功能圖解分析6</p><p>  2.4.2電路功能使用說明10</p><p

5、>  第三章 控制電路的C語言源程序16</p><p>  第四章 課程設計結(jié)果分析23</p><p><b>  第五章 總結(jié)24</b></p><p><b>  引 言</b></p><p>  時鐘,自從它發(fā)明的那天起,就成為人類的朋友,但隨著時間的推移,科學技

6、術(shù)的不斷發(fā)展,人們對時間計量的精度要求越來越高,應用越來越廣。怎樣讓時鐘更好的為人民服務,怎樣讓我們的老朋友煥發(fā)青春呢?這就要求人們不斷設計出新型時鐘。</p><p>  現(xiàn)今,高精度的計時工具大多數(shù)都使用了石英晶體振蕩器,由于電子鐘,石英表,石英鐘都采用了石英技術(shù),因此走時精度高,穩(wěn)定性好,使用方便,不需要經(jīng)常調(diào)校,數(shù)字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替顯示器代替指針顯示進而顯示

7、時間,減小了計時誤差,這種表具有時,分,秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。</p><p>  時鐘電路在計算機系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎。在一個單片機應用系統(tǒng)中,時鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準振蕩定時信號,主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機系統(tǒng)工作的快慢;二是指系統(tǒng)的標準定時時鐘,即定時時間,它通常有兩種實現(xiàn)方法:一是用軟件實

8、現(xiàn),即用單片機內(nèi)部的可編程定時/計數(shù)器來實現(xiàn),但誤差很大,主要用在對時間精度要求不高的場合;二是用專門的時鐘芯片實現(xiàn),在對時間精度要求很高的情況下,通常采用這種方法,典型的時鐘芯片有:DS1302,DS12887,X1203等都可以滿足高精度的要求。</p><p>  本文主要介紹用單片機內(nèi)部的定時/計數(shù)器來實現(xiàn)電子時鐘的方法,本設計由單片機AT89S51芯片和LED數(shù)碼管為核心,輔以必要的電路,構(gòu)成了一個單片

9、機電子時鐘。</p><p>  第一章 系統(tǒng)設計要求</p><p><b>  1.1 基本功能</b></p><p> ?。?)能夠顯示時分秒</p><p> ?。?)能夠調(diào)整時分秒</p><p><b>  1.2 擴展功能</b></p><

10、;p> ?。?)能夠任意設置定時時間</p><p> ?。?)定時時間到鬧鈴能夠報警</p><p>  (3)實現(xiàn)了秒表功能</p><p>  第二章 硬件總體設計方案</p><p>  本次設計時鐘電路,使用了AT89C51單片機芯片控制電路,單片機控制電路簡單且省去了很多復雜的線路,使得電路簡明易懂,使用鍵盤鍵上的按鍵來調(diào)整

11、時鐘的時、分、秒,用一揚聲器來進行定時提醒,同時使用C語言程序來控制整個時鐘顯示,使得編程變得更容易,這樣通過四個模塊:鍵盤、芯片、揚聲器、顯示屏即可滿足設計要求。</p><p>  2.1系統(tǒng)功能實現(xiàn)總體設計思路</p><p>  此設計原理框圖如圖2-1所示,此電路包括以下四個部分:單片機,鍵盤,鬧鈴電路及顯示電路。</p><p>  圖2-1 設計原理

12、框圖</p><p>  經(jīng)多方論證硬件我們小組采用AT89C51單片機和7SED八位共陽極數(shù)碼管等來實現(xiàn)單片機電子時鐘的功能。</p><p><b>  AT89C51簡介</b></p><p>  AT89C51是一種帶4K字節(jié)FLASH存儲器(FPEROM—Flash Programmable and Erasable Read On

13、ly Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片

14、機為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。外形及引腳排列如圖所示 </p><p><b>  主要特性:</b></p><p>  ·與MCS-51 兼容 </p><p>  ·4K字節(jié)可編程FLASH存儲器 </p><p>  ·壽命:1000寫/擦循環(huán) </p&

15、gt;<p>  ·數(shù)據(jù)保留時間:10年 </p><p>  ·全靜態(tài)工作:0Hz-24MHz </p><p>  ·三級程序存儲器鎖定 </p><p>  ·128×8位內(nèi)部RAM </p><p>  ·32可編程I/O線 </p><p&

16、gt;  ·兩個16位定時器/計數(shù)器 </p><p><b>  ·5個中斷源 </b></p><p><b>  ·可編程串行通道 </b></p><p>  ·低功耗的閑置和掉電模式 </p><p>  ·片內(nèi)振蕩器和時鐘電路 </

17、p><p><b>  管腳說明:</b></p><p>  VCC:供電電壓。 </p><p><b>  GND:接地。 </b></p><p>  P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P0口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存

18、儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 </p><p>  P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八

19、位地址接收。 </p><p>  P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當對外部八位地址數(shù)據(jù)

20、存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 </p><p>  P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 </p><p>  P3口也可作為

21、AT89C51的一些特殊功能口,如下表所示: </p><p><b>  口管腳 備選功能 </b></p><p>  P3.0 RXD(串行輸入口) </p><p>  P3.1 TXD(串行輸出口) </p><p>  P3.2 /INT0(外部中斷0) </p><p>  P3.3

22、 /INT1(外部中斷1) </p><p>  P3.4 T0(記時器0外部輸入) </p><p>  P3.5 T1(記時器1外部輸入) </p><p>  P3.6 /WR(外部數(shù)據(jù)存儲器寫選通) </p><p>  P3.7 /RD(外部數(shù)據(jù)存儲器讀選通) </p><p>  P3口同時為閃爍編程和編程

23、校驗接收一些控制信號。 </p><p>  RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。 </p><p>  ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時

24、目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 </p><p>  /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/

25、PSEN信號將不出現(xiàn)。 </p><p>  /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 </p><p>  XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路

26、的輸入。 </p><p>  XTAL2:來自反向振蕩器的輸出。 </p><p><b>  振蕩器特性: </b></p><p>  XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時鐘源驅(qū)動器件,XTAL2應不接。有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,

27、因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度。 </p><p><b>  芯片擦除:</b></p><p>  整個PEROM陣列和三個鎖定位的電擦除可通過正確的控制信號組合,并保持ALE管腳處于低電平10ms 來完成。在芯片擦操作中,代碼陣列全被寫“1”且在任何非空存儲字節(jié)被重復編程以前,該操作必須被執(zhí)行。 </p>&

28、lt;p>  此外,AT89C51設有穩(wěn)態(tài)邏輯,可以在低到零頻率的條件下靜態(tài)邏輯,支持兩種軟件可選的掉電模式。在閑置模式下,CPU停止工作。但RAM,定時器,計數(shù)器,串口和中斷系統(tǒng)仍在工作。在掉電模式下,保存RAM的內(nèi)容并且凍結(jié)振蕩器,禁止所用其他芯片功能,直到下一個硬件復位為止。 </p><p><b>  串口通訊 </b></p><p>  單片機的結(jié)

29、構(gòu)和特殊寄存器,這是你編寫軟件的關(guān)鍵。至于串口通信需要用到那些特殊功能寄存器呢,它們是SCON,TCON,TMOD,SCON等,各代表什么含義呢? </p><p>  SBUF 數(shù)據(jù)緩沖寄存器這是一個可以直接尋址的串行口專用寄存器。有朋友這樣問起過“為何在串行口收發(fā)中,都只是使用到同一個寄存器SBUF?而不是收發(fā)各用一個寄存器?!睂嶋H上SBUF 包含了兩個獨立的寄存器,一個是發(fā)送寄存,另一個是接收寄存器,但它們

30、都共同使用同一個尋址地址-99H。CPU 在讀SBUF 時會指到接收寄存器,在寫時會指到發(fā)送寄存器,而且接收寄存器是雙緩沖寄存器,這樣可以避免接收中斷沒有及時的被響應,數(shù)據(jù)沒有被取走,下一幀數(shù)據(jù)已到來,而造成的數(shù)據(jù)重疊問題。發(fā)送器則不需要用到雙緩沖,一般情況下我們在寫發(fā)送程序時也不必用到發(fā)送中斷去外理發(fā)送數(shù)據(jù)。操作SBUF寄存器的方法則很簡單,只要把這個99H 地址用關(guān)鍵字sfr定義為一個變量就可以對其進行讀寫操作了,如sfr SBUF

31、 = 0x99;當然你也可以用其它的名稱。通常在標準的reg51.h 或at89x51.h 等頭文件中已對其做了定義,只要用#include 引用就可以了。 </p><p>  SCON 串行口控制寄存器通常在芯片或設備中為了監(jiān)視或控制接口狀態(tài),都會引用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存器。它的尋址地址是98H,是一個可以位尋址的寄存器,作用就是監(jiān)視和控制51 芯片串行口的工作狀態(tài)。51

32、 芯片的串口可以工作在幾個不同的工作模式下,其工作模式的設置就是使用SCON 寄存器。它的各個位的具體定義如下: </p><p>  SM0 SM1 SM2 REN TB8 RB8 TI RI </p><p>  SM0、SM1 為串行口工作模式設置位,這樣兩位可以對應進行四種模式的設置。串行口工作模式設置。 </p><p>  SM0 SM1 模式 功能 波

33、特率 </p><p>  0 0 0 同步移位寄存器 fosc/12 </p><p>  0 1 1 8位UART 可變 </p><p>  1 0 2 9位UART fosc/32 或fosc/64 </p><p>  1 1 3 9位UART 可變 </p><p>  在這里只說明最常用的模式1,其它的模

34、式也就一一略過,有興趣的朋友可以找相關(guān)的硬件資料查看。表中的fosc 代表振蕩器的頻率,也就是晶振的頻率。UART 為(Universal Asynchronous Receiver)的英文縮寫。 </p><p>  SM2 在模式2、模式3 中為多處理機通信使能位。在模式0 中要求該位為0。 </p><p>  REM 為允許接收位,REM 置1 時串口允許接收,置0 時禁止接收。R

35、EM 是由軟件置位或清零。如果在一個電路中接收和發(fā)送引腳P3.0,P3.1 都和上位機相連,在軟件上有串口中斷處理程序,當要求在處理某個子程序時不允許串口被上位機來的控制字符產(chǎn)生中斷,那么可以在這個子程序的開始處加入REM=0 來禁止接收,在子程序結(jié)束處加入REM=1 再次打開串口接收。大家也可以用上面的實際源碼加入REM=0 來進行實驗。 </p><p>  TB8 發(fā)送數(shù)據(jù)位8,在模式2 和3 是要發(fā)送的第

36、9 位。該位可以用軟件根據(jù)需要置位或清除,通常這位在通信協(xié)議中做奇偶位,在多處理機通信中這一位則用于表示是地址幀還是數(shù)據(jù)幀。 </p><p>  RB8 接收數(shù)據(jù)位8,在模式2 和3 是已接收數(shù)據(jù)的第9 位。該位可能是奇偶位,地址/數(shù)據(jù)標識位。在模式0 中,RB8 為保留位沒有被使用。在模式1 中,當SM2=0,RB8 是已接收數(shù)據(jù)的停止位。 </p><p>  TI 發(fā)送中斷標識位。

37、在模式0,發(fā)送完第8 位數(shù)據(jù)時,由硬件置位。其它模式中則是在發(fā)送停止位之初,由硬件置位。TI 置位后,申請中斷,CPU 響應中斷后,發(fā)送下一幀數(shù)據(jù)。在任何模式下,TI 都必須由軟件來清除,也就是說在數(shù)據(jù)寫入到SBUF 后,硬件發(fā)送數(shù)據(jù),中斷響應(如中斷打開),這時TI=1,表明發(fā)送已完成,TI 不會由硬件清除,所以這時必須用軟件對其清零。 </p><p>  RI 接收中斷標識位。在模式0,接收第8 位結(jié)束時,

38、由硬件置位。其它模式中則是在接收停止位的半中間,由硬件置位。RI=1,申請中斷,要求CPU 取走數(shù)據(jù)。但在模式1 中,SM2=1時,當未收到有效的停止位,則不會對RI 置位。同樣RI 也必須要靠軟件清除。常用的串口模式1 是傳輸10 個位的,1 位起始位為0,8 位數(shù)據(jù)位,低位在先,1 位停止位為1。它的波特率是可變的,其速率是取決于定時器1 或定時器2 的定時值(溢出速率)。AT89C51 和AT89C2051 等51 系列芯片只有兩

39、個定時器,定時器0 和定時器1,而定時器2是89C52 系列芯片才有的。 </p><p>  波特率在使用串口做通訊時,一個很重要的參數(shù)就是波特率,只有上下位機的波特率一樣時才可以進行正常通訊。波特率是指串行端口每秒內(nèi)可以傳輸?shù)牟ㄌ匚粩?shù)。有一些初學的朋友認為波特率是指每秒傳輸?shù)淖止?jié)數(shù),如標準9600 會被誤認為每秒種可以傳送9600個字節(jié),而實際上它是指每秒可以傳送9600 個二進位,而一個字節(jié)要8 個二進位,

40、如用串口模式1 來傳輸那么加上起始位和停止位,每個數(shù)據(jù)字節(jié)就要占用10 個二進位,9600 波特率用模式1 傳輸時,每秒傳輸?shù)淖止?jié)數(shù)是9600÷10=960 字節(jié)。51 芯片的串口工作模式0的波特率是固定的,為fosc/12,以一個12M 的晶振來計算,那么它的波特率可以達到1M。模式2 的波特率是固定在fosc/64 或fosc/32,具體用那一種就取決于PCON 寄存器中的SMOD位,如SMOD 為0,波特率為focs/6

41、4,SMOD 為1,波特率為focs/32。模式1 和模式3 的波特率是可變的,取決于定時器1 或2(52 芯片)的溢出速率。那么我們怎么去計算這兩個模 </p><p>  式的波特率設置時相關(guān)的寄存器的值呢?可以用以下的公式去計算。 </p><p>  波特率=(2SMOD÷32)×定時器1 溢出速率 </p><p>  上式中如設置了P

42、CON 寄存器中的SMOD 位為1 時就可以把波特率提升2 倍。通常會使用定時器1 工作在定時器工作模式2 下,這時定時值中的TL1 做為計數(shù),TH1 做為自動重裝值 ,這個定時模式下,定時器溢出后,TH1 的值會自動裝載到TL1,再次開始計數(shù),這樣可以不用軟件去干預,使得定時更準確。在這個定時模式2 下定時器1 溢出速率的計算公式如下: </p><p>  溢出速率=(計數(shù)速率)/(256-TH1) <

43、/p><p>  上式中的“計數(shù)速率”與所使用的晶體振蕩器頻率有關(guān),在51 芯片中定時器啟動后會在每一個機器周期使定時寄存器TH 的值增加一,一個機器周期等于十二個振蕩周期,所以可以得知51 芯片的計數(shù)速率為晶體振蕩器頻率的1/12,一個12M 的晶振用在51 芯片上,那么51 的計數(shù)速率就為1M。通常用11.0592M 晶體是為了得到標準的無誤差的波特率,那么為何呢?計算一下就知道了。如我們要得到9600 的波特率

44、,晶振為11.0592M 和12M,定時器1 為模式2,SMOD 設為1,分別看看那所要求的TH1 為何值。代入公式: </p><p><b>  11.0592M </b></p><p>  9600=(2÷32)×((11.0592M/12)/(256-TH1)) </p><p><b>  TH1=25

45、0 </b></p><p><b>  12M </b></p><p>  9600=(2÷32)×((12M/12)/(256-TH1)) </p><p>  TH1≈249.49 </p><p>  上面的計算可以看出使用12M 晶體的時候計算出來的TH1 不為整數(shù),而TH1

46、的值只能取整數(shù),這樣它就會有一定的誤差存在不能產(chǎn)生精確的9600 波特率。當然一定的誤差是可以在使用中被接受的,就算使用11.0592M 的晶體振蕩器也會因晶體本身所存在的誤差使波特率產(chǎn)生誤差,但晶體本身的誤差對波特率的影響是十分之小的,可以忽略不計。</p><p>  詳細元器件列表如表2.1所示:</p><p>  2.2各部分功能實現(xiàn)</p><p>  

47、單片機發(fā)送的信號通過程序控制最終在數(shù)碼管上顯示出來。</p><p>  單片機通過輸出各種電脈沖信號來驅(qū)動控制各部分正常工作。</p><p>  為使時鐘走時與標準時間一致,校時電路是必不可少的,鍵盤用來校正數(shù)碼管上顯示的時間。</p><p>  單片機通過控制鬧鈴電路來完成 定時鬧鐘的功能。</p><p><b>  2.

48、3系統(tǒng)工作原理</b></p><p>  設計的電路主要由四模塊構(gòu)成:單片機控制電路,顯示電路、鬧鈴電路以及校正電路。</p><p>  詳細電路功能圖如圖2-2:</p><p>  圖2-2 詳細電路功能圖</p><p>  本設計采用C語言程序設計,使單片機控制數(shù)碼管顯示時、分、秒,當秒計數(shù)計滿60時就向分進位,分計

49、數(shù)器計滿60后向時計數(shù)器進位,小時計數(shù)器按“23翻0”規(guī)律計數(shù)。時、分、秒的計數(shù)結(jié)果經(jīng)過數(shù)據(jù)處理可直接送顯示器顯示。當計時發(fā)生誤差的時候可以用校時電路進行校正。設計采用的是時、分、秒顯示,單片機對數(shù)據(jù)進行處理同時在數(shù)碼管上顯示。</p><p>  2.4時鐘各功能分析及圖解</p><p>  2.4.1電路各功能圖解分析</p><p><b> ?。?/p>

50、1) 時鐘運行圖</b></p><p>  仿真開始運行時,或按下key4鍵時,時鐘從12:00:00開始運行,其中key2鍵對分進行調(diào)整,key3對小時進行調(diào)整,key6可以讓時鐘暫停。</p><p>  時鐘運行圖如圖 2-3 所示: </p><p>  圖2-3 時鐘運行圖</p><p><b> ?。?)

51、秒表計時圖</b></p><p>  當按下key1鍵進入秒表計時狀態(tài),key6是秒表暫停鍵,可按key4鍵跳出秒表計時狀態(tài)。</p><p><b>  如圖2-4:</b></p><p>  圖2-4 秒表計時圖</p><p>  (3)鬧鈴設置圖及運行圖</p><p> 

52、 當按下key5,開始定時,分別按key2調(diào)分,key3調(diào)時設置鬧鈴時間,然后按下key4鍵恢復時鐘運行狀態(tài)(圖2-5)當鬧鈴設置時間到時,蜂鳴器將發(fā)出10秒中蜂鳴聲(圖2-6)。</p><p>  圖2-5 鬧鈴時間設置圖</p><p>  圖2-6 鬧鈴運行圖</p><p>  該數(shù)字鐘是用一片AT89C51單片機通過編程去驅(qū)動8個數(shù)碼管實現(xiàn)的。通過6個開

53、關(guān)控制,從上到下6個開關(guān)KEY1-KEY6的功能分別為:KEY1,切換至秒表;KEY2,調(diào)節(jié)時間,每調(diào)一次時加1;KEY3, 調(diào)節(jié)時間,每調(diào)一次分加1;KEY4,從其它狀態(tài)切換至時鐘狀態(tài);KEY5,切換至鬧鐘設置狀態(tài),也可以對秒表清零;KEY6,秒表暫停.控制鍵分別與P1.0~P1.5口連接.其中:</p><p>  A通過P2口和P3口去控制數(shù)碼管的顯示如圖所示P2口接數(shù)碼管的a——g端,是控制輸出編碼,P3

54、口接數(shù)碼管的1——8端,是控制動態(tài)掃描輸出.</p><p>  B從P0.0輸出一個信號使二極管發(fā)光,二極管在設置的鬧鐘時間到了時候發(fā)光,若有樂曲可以去驅(qū)動揚聲器實現(xiàn)。</p><p>  2.4.2電路功能使用說明</p><p>  (1) 各個控制鍵的功能:可對時間進行校準調(diào)節(jié)(只能加1);按下設置鍵數(shù)字時鐘進入鬧鐘設置狀態(tài),設置鬧鐘的時間;時加1、分加1鍵

55、是在校準時間時或設置鬧鐘時間對小時數(shù)或分鐘數(shù)調(diào)節(jié)而設置的;按下秒切換鍵就可以進入秒表模式,同時秒表也開始計時,按下秒表暫停、復位鍵就暫停、歸零,如果要重新對秒計時則可以按秒表開始、復位;清零鍵可以對鬧鐘清零。</p><p>  AT89C51單片機,通過編寫程序?qū)?shù)碼顯示進行控制。</p><p>  八個7段數(shù)碼管顯示時鐘和秒表信號。</p><p>  第三章

56、 電路控制源程序</p><p>  #include<reg51.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #define delay_time 3/*宏定義*/</p><p&

57、gt;  uchar k,dat[]={0,0,0,0,0,0,0,0};</p><p>  uint tcount,t,u;</p><p>  uchar dat1[]={0,0,0,0,0,0,2,1};</p><p>  uchar dat2[]={0,0,0,0,0,0,0,0};</p><p>  uchar alarms[

58、]={0,0,0,0,0,0,0,0};</p><p>  uchar dis_bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};</p><p>  unsigned char code SEG7[11]={0xC0,/*0*/ 0xF9,/*1*/ </p><p>  0x

59、A4,/*2*/ 0xB0,/*3*/ </p><p>  0x99,/*4*/ 0x92,/*5*/ </p><p>  0x82,/*6*/

60、 0xF8,/*7*/ </p><p>  0x80,/*8*/ </p><p>  0x90,/*9*/</p><p>  0xBF,/*-*/</p><p>  };/*數(shù)字顯示數(shù)組*/</p><p>  sbit miaobiao1=P1^0

61、;</p><p>  sbit tminute=P1^1;</p><p>  sbit thour=P1^2;</p><p>  sbit miaobiao2=P1^3;</p><p>  sbit alarm=P1^4;</p><p>  sbit P0_0=P0^0;</p><p&g

62、t;  sbit P1_5=P1^5;</p><p>  sbit P1_6=P1^6;</p><p>  sbit P1_7=P1^7;/*端口定義*/</p><p>  uchar ms=0;</p><p>  uchar flag=0;</p><p>  uchar sec=0;</p>

63、<p>  uchar minit=0;</p><p>  struct time{uchar second;uchar minute;uchar hour;}</p><p><b>  time1;</b></p><p>  uchar n,i;</p><p>  void delay(n)</

64、p><p>  {while(n--)</p><p><b>  {</b></p><p>  for(i=120;i>0;i--);</p><p><b>  } </b></p><p><b>  }</b></p><

65、p><b>  /*延時子程序*/</b></p><p>  void modify(void)</p><p><b>  {</b></p><p><b>  EA=0;</b></p><p>  if(thour==0)</p><p>

66、;<b>  { </b></p><p>  if(flag==0)</p><p><b>  {</b></p><p>  dat1[6]++;delay(280);</p><p>  if(dat1[6]>9)</p><p><b>  { &

67、lt;/b></p><p>  dat1[6]=0;</p><p>  dat1[7]++;</p><p><b>  }</b></p><p>  else if((dat1[7]>1)&&(dat1[6]>3))</p><p>  {dat1[7

68、]=0; dat1[6]=0; }</p><p><b>  }</b></p><p>  if(flag==1)</p><p><b>  {</b></p><p>  alarms[6]++;delay(300);</p><p>  if(alarms[6]&

69、gt;9)</p><p><b>  {</b></p><p>  alarms[6]=0;alarms[7]++;</p><p>  if(alarms[7]>2)</p><p><b>  {</b></p><p>  alarms[7]=0;</p

70、><p><b>  }</b></p><p><b>  }</b></p><p>  dat[6]=alarms[6];</p><p>  dat[7]=alarms[7];</p><p><b>  }</b></p><p

71、><b>  }</b></p><p>  if(tminute==0)</p><p><b>  { </b></p><p>  if(flag==0)</p><p><b>  {</b></p><p>  dat1[3]++;del

72、ay(280);</p><p>  if(dat[3]>=9)</p><p><b>  {</b></p><p>  dat1[4]++;dat1[3]=0;</p><p>  if(dat1[4]>5)</p><p><b>  {</b></

73、p><p>  dat1[4]=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(flag==1)</p><p><b>

74、;  {</b></p><p>  alarms[3]++;delay(300);</p><p>  if(alarms[3]>9)</p><p><b>  {</b></p><p>  alarms[4]++;alarms[3]=0;</p><p>  if(al

75、arms[4]>5)</p><p><b>  {</b></p><p>  alarms[4]=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  dat[3]=alarms[3];<

76、;/p><p>  dat[4]=alarms[4];</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(miaobiao1==0)</p><p>  {TR0=0;ET0=0;TR1=1;ET1=1;</p>

77、<p><b>  }</b></p><p>  if(miaobiao2==0)</p><p><b>  { </b></p><p>  TR0=1;ET0=1;TR1=0;ET1=0;</p><p>  dat2[0]=0;</p><p>  d

78、at2[1]=0;</p><p>  dat2[3]=0;</p><p>  dat2[4]=0;</p><p>  dat2[6]=0;</p><p>  dat2[7]=0;</p><p><b>  ms=0;</b></p><p><b>  

79、sec=0;</b></p><p><b>  minit=0;</b></p><p><b>  }</b></p><p>  if(P1_5==0)</p><p><b>  {</b></p><p>  TR0=0;ET0=0

80、;TR1=0;ET1=0; </p><p><b>  }</b></p><p>  if(alarm==0)</p><p><b>  {</b></p><p>  TR0=0;ET0=0;TR1=0;ET1=0;flag=1;</p><p><b> 

81、 dat[0]=0;</b></p><p><b>  dat[1]=0;</b></p><p>  dat[2]=10;</p><p><b>  dat[3]=0;</b></p><p><b>  dat[4]=0;</b></p>&l

82、t;p>  dat[5]=10;</p><p><b>  dat[6]=0;</b></p><p><b>  dat[7]=0;</b></p><p><b>  }</b></p><p><b>  EA=1;</b></p>

83、;<p><b>  }/*按鍵掃描*/</b></p><p>  void init(void)</p><p><b>  {</b></p><p>  TMOD = 0x11; </p><p>  TH0 = 0xDB;</p><p>  TL0

84、=0xFF;</p><p><b>  TH1=0xDB;</b></p><p><b>  TL1=0xFF;</b></p><p>  ET0 = 1; //10ms</p><p><b>  ET1=1;</b></p><p>

85、<b>  //TR1=1;</b></p><p><b>  TR0=1;</b></p><p><b>  tcount=0;</b></p><p><b>  ms=0;</b></p><p><b>  sec=0;</b

86、></p><p><b>  minit=0;</b></p><p><b>  EA = 1;</b></p><p><b>  }/*初始化*/</b></p><p>  void test(void){</p><p>  for(k

87、=0;k<8;k++)</p><p><b>  {</b></p><p>  P3=dis_bit[k];</p><p>  P2=SEG7[dat[k]]; delay(1);</p><p><b>  P3=0X00;</b></p><p><b&

88、gt;  }</b></p><p><b>  }/*數(shù)字顯示*/</b></p><p>  void main()</p><p><b>  {init();</b></p><p>  delay(10);</p><p><b>  whil

89、e(1)</b></p><p><b>  {</b></p><p><b>  modify();</b></p><p><b>  test();</b></p><p><b>  }</b></p><p>

90、;<b>  }/*主函數(shù)*/</b></p><p>  Void diplay() interrupt 1</p><p><b>  { </b></p><p><b>  ET0=0;</b></p><p><b>  TR0=0;</b>&

91、lt;/p><p>  TH0 = 0xDB;</p><p>  TL0 = 0xff;</p><p><b>  TR0=1;</b></p><p><b>  tcount++;</b></p><p>  if(tcount==100) </p><

92、;p><b>  {</b></p><p>  time1.second++;</p><p><b>  tcount=0;</b></p><p>  dat1[0]=(time1.second)%10;</p><p>  dat1[1]=(time1.second)/10;</

93、p><p><b>  }</b></p><p>  if(time1.second==60)</p><p>  { dat1[0]=0;dat1[1]=0;</p><p>  time1.second=0;</p><p>  time1.minute++;</p><

94、p>  dat1[3]=(time1.minute)%10;</p><p>  dat1[4]=(time1.minute)/10;</p><p><b>  } </b></p><p>  if(time1.minute==60)</p><p><b>  {</b></p&g

95、t;<p>  time1.minute=0;</p><p>  time1.hour++; </p><p>  dat1[6]=time1.hour%10;</p><p>  dat1[7]=time1.hour/10;</p><p><b>  }</b></p><p>

96、;  if(time1.hour>23)</p><p><b>  {</b></p><p>  time1.hour=0; </p><p><b>  }</b></p><p>  dat[5]=10;</p><p>  dat[2]=10;</p&g

97、t;<p>  dat[0]=dat1[0];</p><p>  dat[1]=dat1[1];</p><p>  dat[3]=dat1[3];</p><p>  dat[4]=dat1[4];</p><p>  dat[6]=dat1[6];</p><p>  dat[7]=dat1[7];

98、</p><p><b>  flag=0;</b></p><p><b>  P0=0x01;</b></p><p>  if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alar

99、ms[3]==dat1[3])&&(dat1[1]<1))</p><p><b>  {</b></p><p><b>  P0=0x00;</b></p><p><b>  }</b></p><p><b>  ET0=1;</b

100、></p><p><b>  }</b></p><p>  void time_2(void)interrupt 3</p><p><b>  {</b></p><p><b>  EA=0; </b></p><p><b> 

101、 TR0=0;</b></p><p><b>  TH1=0xDB;</b></p><p><b>  TL1=0xFF;</b></p><p><b>  TR1=1;</b></p><p><b>  ms++;</b></p

102、><p>  dat2[0]=ms%10;</p><p>  dat2[1]=ms/10;</p><p>  if(ms>=100)</p><p><b>  {</b></p><p><b>  ms=0;</b></p><p><

103、b>  sec++;</b></p><p>  dat2[3]=sec%10;</p><p>  dat2[4]=sec/10;</p><p>  if(sec>=60)</p><p><b>  {</b></p><p><b>  sec=0;<

104、;/b></p><p><b>  minit++;</b></p><p>  dat2[6]=minit%10;</p><p>  dat2[7]=minit/10;</p><p><b>  }</b></p><p><b>  }</b&

105、gt;</p><p>  dat[5]=10;</p><p>  dat[2]=10;</p><p>  dat[0]=dat2[0];</p><p>  dat[1]=dat2[1];</p><p>  dat[3]=dat2[3];</p><p>  dat[4]=dat2[4]

106、;</p><p>  dat[6]=dat2[6];</p><p>  dat[7]=dat2[7];</p><p><b>  EA=1;</b></p><p>  第四章 課程設計結(jié)果分析</p><p>  此時鐘設計是利用protues仿真軟件進行仿真,基本上實現(xiàn)了課程設計要求

107、實現(xiàn)的功能。</p><p>  硬件部分設置了的六個按鍵。當按鍵一按下時,進入秒表顯示狀態(tài),秒表開始計時,當按鍵六按下時,秒表暫停;當按鍵四按下時恢復到時間顯示功能;當按鍵二按下時,進入調(diào)分狀態(tài),按一次,分加一,60一循環(huán);按鍵三按下時,進入調(diào)時狀態(tài),按一次,時加一,60一循環(huán);按鍵五按下時,進入鬧鈴設置功能,緊接著按下按鍵二和按鍵三進行時和分的設置,再按下按鍵4恢復顯示時間,當顯示的時間和定時設置的時間一致時

108、,蜂鳴器發(fā)出蜂鳴聲,蜂鳴時間我們設置為10秒。</p><p>  另外,鬧鈴電路有音樂鬧鐘的擴展的功能(可以將蜂鳴器換成揚聲器再加一段音樂程序即可實現(xiàn))。</p><p>  調(diào)試階段,出現(xiàn)一些問題。比如,實際小時顯示到29才歸零,分鐘顯示到60才進一……經(jīng)過軟件調(diào)試,以上問題均一一排除,結(jié)果達到預期目標。但時間有限,部分擴展功能不能及時實現(xiàn),比如音樂鬧鈴。</p><

109、;p><b>  第五章 總結(jié)</b></p><p>  經(jīng)過一周的單片機課程設計,我組成員已基本完成課題要求。功能上基本達標:時鐘的顯示,秒表顯示,定時功能,調(diào)時功能。時鐘顯示功能,精確度完全可以滿足日常生活顯示時間的需要;秒表功能,可以滿足比賽計時的需要;調(diào)時功能,方便快捷;定時功能準確可靠,還有擴展成音樂鬧鐘的余地。硬件設施合乎要求,軟件設計可以配合硬件實現(xiàn)要求功能。但是由于時

110、間比較短,出現(xiàn)部分不足:使用定時和秒表功能時時間顯示功能停止運行。經(jīng)討論只是軟件部分還不完善。不過,我們相信,如果時間充足,將軟件改進,我們完全可以很好實現(xiàn)所有功能。 </p><p>  另外,在本次設計的過程中,我們發(fā)現(xiàn)很多的問題,雖然以前沒有做過這樣的設計但通過這次設計我學會了很多東西,單片機課程設計重點就在于軟件算法的設計,需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我們覺的寫好一個程序并不是一件簡單

111、的事,比如寫一個程序看其功能很少認為編寫程序簡單,但到編的時候才發(fā)現(xiàn)一些細微的知識或低級錯誤經(jīng)常犯做不到最后常常失敗,所以有些東西只有學精弄懂并且要細心才行,只學習理論有些東西是很難理解的,更談不上掌握。</p><p>  從這次的課程設計中,我們真真正正的意識到,在以后的學習中,要理論聯(lián)系實際,把我們所學的理論知識用到實際當中,學習單機片機更是如此,程序只有在經(jīng)常的練習的過程中才能提高,我想這就是我在這次課程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論