基于51單片機的電子時鐘設計 *** 山東工商學院 264005 摘 要:本文介紹了基于51單片機的電子時鐘的設計,從硬件和軟件兩個方面給出了具體實現過程。該時鐘的設計采用功能分塊的思想方法,將硬件電路劃分為開關電路,顯示驅動電路和數碼管電路等若干獨立模塊,而軟件的實現則由鬧鐘的聲音程序、時間顯示程序、日期顯示程序,秒表顯示程序,時間調整程序、鬧鐘調整程序、定時調整程序,延時程序等組成。文中給出了各個模塊的電路圖,并用Proteus的ISIS軟件對電子時鐘系統的各個功能進行了仿真,并給出了相應的仿真結果圖像。 關鍵詞:單片機;電子時鐘;鍵盤控制 Electronic Clock DesignBased on 51 Single-chip *** Shandong Institute of Business and Technology , 264005 Abstract: This paperintroduces the electronic clock design based on 51 single-chip microcomputer,and it provides us specific implementation process from aspects of hardware andsoftware. This clock is designed by the method of function blocks. In hardware,it’s circuit is divided into switch block, display drive block and digitalcontrol block. However, the software consist of the program of alarm clock,time display, date display, stopwatch display, time adjust, timing adjustment,the alarm clock adjustment, time delay and so on. Circuit diagrams of eachmodule is also given and the corresponding simulation image of this clock producedby software of Proteus is also showed in this paper. Key words: single chip microcomputer; electronic clock; Keyboard control 一, 引言 1957年,Ventura發明了世界上第一個電子表,從而奠定了電子時鐘的基礎,電子時鐘開始迅速發展起來。現代的電子時鐘是基于單片機的一種計時工具,采用延時程序產生一定的時間中斷,用于一秒的定義,通過計數方式進行滿六十秒分鐘進一,滿六十分小時進一,滿二十四小時小時清零。從而達到計時的功能,是人民日常生活補課缺少的工具。現在高精度的計時工具大多數都使用了石英晶體振蕩器,由于電子鐘、石英鐘、石英表都采用了石英技術,因此走時精度高,穩定性好,使用方便,不需要經常調試,數字式電子鐘用集成電路計時時,譯碼代替機械式傳動,用LED顯示器代替指針顯示進而顯示時間,減小了計時誤差,這種表具有時、分、秒顯示時間的功能,還可以進行時和分的校對,片選的靈活性好。 二,時鐘的基本原理分析 利用單片機定時器完成計時功能,定時器0計時中斷程序每隔0.01s中斷一次并當作一個計數,設定定時1秒的中斷計數初值為100,每中斷一次中斷計數初值減1,當減到0時,則表示1s到了,秒變量加1,同理再判斷是否1min鐘到了,再判斷是否1h到了。 為了將時間在LED數碼管上顯示,可采用靜態顯示法和動態顯示法,由于靜態顯示法需要譯碼器,數據鎖存器等較多硬件,可采用動態顯示法實現LED顯示,通過對每位數碼管的依次掃描,使對應數碼管亮,同時向該數碼管送對應的字碼,使其顯示數字。由于數碼管掃描周期很短,由于人眼的視覺暫留效應,使數碼管看起來總是亮的,從而實現了各種顯示。 三,時鐘設計分析 針對要實現的功能,采用AT89S51單片機進行設計,AT89S51 單片機是一款低功耗,高性能CMOS8位單片機,片內含4KB在線可編程(ISP)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用高密度、非易失性存儲技術制造,兼容標準MCS- 51指令系統及80C51引腳結構。這樣,既能做到經濟合理又能實現預期的功能。 在程序方面,采用分塊設計的方法,這樣既減小了編程難度、使程序易于理解,又能便于添加各項功能。程序可分為鬧鐘的聲音程序、時間顯示程序、日期顯示程序,秒表顯示程序,時間調整程序、鬧鐘調整程序、定時調整程序,延時程序等。運用這種方法,關鍵在于各模塊的兼容和配合,若各模塊不匹配會出現意想不到的錯誤。 首先,在編程之前必須了解硬件結構尤其是各引腳的用法,以及內部寄存器、存儲單元的用法,否則,編程無從下手,電路也無法設計。這是前期準備工作。第二部分是硬件部分:依據想要的功能分塊設計設計,比如輸入需要開關電路,輸出需要顯示驅動電路和數碼管電路等。第三部分是軟件部分:先學習理解匯編語言的編程方法再根據設計的硬件電路進行分塊的編程調試,最終完成程序設計。第四部分是軟件畫圖部分:設計好電路后進行畫圖,包括電路圖和仿真圖的繪制。第五部分是軟件仿真部分:軟硬件設計好后將軟件載入芯片中進行仿真,仿真無法完成時檢查軟件程序和硬件電路并進行修改直到仿真成功。第六部分是硬件實現部分:連接電路并導入程序檢查電路,若與設計的完全一樣一般能實現想要的功能。最后進行功能擴展,在已經正確的設計基礎上,添加額外的功能! 四,時鐘的實現 A.電路設計 1. 整體設計 此次設計主要是應用單片機來設計電子時鐘,硬件部分主要分以下電路模塊:顯示電路用8個共陰數碼管分別顯示,星期(年份),小時、分鐘(月份)和秒(日),通過動態掃描進行顯示,從而避免了譯碼器的使用,同時節約了I/0端口,使電路更加簡單。單片機采用AT89S51系列,這種單片機應用簡單,適合電子鐘設計。 電路的總體設計框架如下:
| | file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.pngfile:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png |
2. 分塊設計 模塊電路主要分為:輸入部分、輸出部分、復位和晶振電路。 2.1 輸入部分 輸入信號主要是各種模式選擇和調整信號,由按鍵開關提供。 以下為輸入部分樣例: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 在本實驗中主要用用P3口輸入按鍵信號,還用到了特殊的P0口。對于P0口,由于其存在高阻狀態,為了實現開關功能,給其添加上拉電阻,具體如下圖所示: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 2.2 輸出部分 本電路的輸出信號為7段數碼管的位選和段選信號,鬧鈴脈沖信號,提示燈信號。 本實驗的數碼管是共陰的,為了防止段選信號不能驅動數碼管,故在P1口連接上拉電阻后,再送段選信號,以提高驅動,位選信號直接從P2口接入,如下圖: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg 鬧鈴由P2.6端輸出,模塊如下: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg 2.3 晶振與復位電路 本實驗單片機時鐘用內部時鐘,模塊如下: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 復位電路為手動復位構成,模塊如下: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg 各模塊拼接組合,電路總體設計圖如下file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg: B.程序設計 B.1 程序總體設計 本實驗用匯編程序完成. 程序總的流程圖如下: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png
3. B.2 程序主要模塊 B.2.1 延時模塊 數碼管顯示動態掃描時,用到延時程序,這里使用延遲1ms的程序,此程序需反復調,除數碼管動態掃描外,數碼管的閃爍提示,以及音樂模塊也用到了延時,只是延時的長短不同罷了,在此不再贅述。 B.2.2中斷服務程序 本實驗中,計數器T0,T1中斷都有運用,其中T0中斷為時鐘定時所用,T1中斷用于音樂播放。T0的定時長度為0.01s,工作于方式1,計數1次,時長1us,故計數器計數10000次,進入中斷,計數初值為65536-10000=55536=#0D8F0,裝滿定時器需要0.01s的時間,從而100次中斷為一秒,一秒之后,判斷是否到60秒,若不到則秒加一,然后返回,若到,則秒賦值為0,分加一,依次類推。包括日期顯示的功能也是如此。另外,由于要實現倒計時功能,因此在中斷程序中還要加入減一的寄存器,需要時將其進行顯示。基于以上考慮,以R3為倒計時中的秒,R4為倒計時的分,當秒加1時R3減一,減到0之后,秒賦值為59,分減一,直到分為0。 計數器T1工作于方式1, 當調用響鈴程序時,其計數功能開啟,為音樂音調不同頻率的方波的形成,提供延時。其中斷服務程序就是根據音調改變音樂方波輸出口電平的高低,用語句 CPL實現。 中斷服務程序中日歷的實現較為復雜,要考慮平年,閏年,特殊的2月,每月的天數的不盡相同。具體的邏輯判斷方法為:首先,要考慮年份是不是閏年,閏年的判斷方法是:將年份除以100,若能整除,則將年份除以400,若還能整除,則為閏年,若不能,則為平年;若不能被100整除,則判斷是否能被4整除,若能,則為閏年,若不能則為平年。只有2月與平、閏年相關,因此在閏年和平年的子程序中,要判斷是不是2月,若是則在相應的年中進行日期的增加,若不是則轉入平時的月份。其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月為每月30天。 日歷進位判斷流程圖如下: file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png
本實驗用8個數碼管,剛好能顯示年,月,日,掃描顯示與時間的掃描顯示類似。年比較特殊,由兩個寄存器存儲,個位,十位為0時,表明年數能被100整除,若此時千位,百位 組成兩位數能被4整除,則年數被400整除,為閏年。若十位,個位組成兩位數能被4整除,則年數能被4整除,為閏年。 B.2.3主程序 主程序主要對按鍵進行掃描,以及判斷定時和鬧鈴時間是否已到,若到則調用相關程序。 B.2.4 顯示子程序 8個數碼管輪流進行顯示,分別顯示1ms,依賴人的視覺 暫留效應,給人以數碼管持續高亮的錯覺。 日期的顯示,秒表的顯示,倒計時的顯示,調鬧鈴,調定時的顯示,閃爍的顯示程序與以上的的掃描相似,有的以子程序的方式出現,通過子程序調用語句ACALL調用;有點直接嵌套在相應的程序里面,順序執行,或者用調轉語句AJMP調用。 C 程序調試及仿真 本程序通過Keil單片機開發平臺實現程序的編譯,鏈接,生成HEX文件。通過Keil和硬件仿真平臺Proteus的聯合,可以將設計效果仿真出來,根據效果,有目的的改變設計,優化程序。 利用Proteus仿真實驗過程截圖: 普通時間顯示模式仿真圖,表示:星期一 9點10分38秒 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg 五,總結 本文先從整體論述了設計電子鐘的大致思路,然后再采用劃分模塊的方法,將硬件電路劃分為開關電路,顯示驅動電路,以及數碼管電路等,而軟件部分,則依據要實現的功能,劃分為:鬧鐘的聲音程序,時間顯示程序,日期顯示程序,秒表顯示程序,時間調整程序、鬧鐘調整程序、定時調整程序,延時程序等。最后將各模塊集成為一個整體,合成一個多功能的電子鐘。 參考文獻 [1] 謝自美.電子線路設計·實驗·測試[M].武漢:華中理工大學出版社,1992. [2] 何立民.單片機應用系統設計[M].北京:北京航空航天大學出版社,1993. [3] 樓然笛.單片機開發[M].北京:人民郵電出版社,1994.
[4] 付家才.單片機控制工程實踐技術[M].北京:化學工業出版社 2004.3.
[5] 李光才.單片機課程設計 實例指導[M]. 北京:北京航空航天大學出版社 2004.3.
[6] 朱定華.單片機原理及接口技術實驗[M].北京:北方交通大學出版社2002.11. [7] 劉湘濤.江世明.單片機原理與應用[M]. 北京:電子工業出版社,2006. 附錄: 延時程序: D_1MS: MOV R7,#2 D_5: MOV R2,#250 DJNZ R2,$ DJNZ R7,D_5 RET 主程序: MAIN: JNBP3.0,DATETZ ;按下0鍵,顯示日期并可對日期進行調整 JNB P3.1,ZSTZ1 ;按下1鍵,顯示時間,并可調時 JNB P3.2,NLTZZ ;按下2鍵,進行鬧鈴設置 JNB P3.3,DSTZ ;按下3鍵,進行定時設置 JNB P3.4,CESHI ;鬧鈴測試 JNBP3.6,STOPWATCHTZ ;按下6鍵,進入秒表方式 ACALL DISP ;調用時鐘顯示子程序 JNB P0.6,RERING ;判斷是否開啟鬧鈴重響功能 RE: JNB P2.7,DSPDKQ ;判斷是否開啟鬧鈴功能,沒開則去判斷定時 FMQPD: ;判斷定時值R4,R3是否到零、鬧鈴時刻是否已到 MOV A,HOUR; SUBB A,38H; JZ FEN ;判斷小時數是否到鬧鈴所定時間,若到,則對分進行判斷;若不到,則對定時進行判斷 AJMP DSPDKQ FEN: MOV A,MINUTE; SUBB A,37H; JZ MIAO ;判斷分是否到鬧鈴所定時間,若到,則對秒進行判斷;若不到,則對定時進行判斷 AJMP DSPDKQ MIAO: MOV A,SECOND SUBB A,#0 JZ SHENGYIN1 ;判斷秒是否到鬧鈴所定時間,若到,則時,分,秒都到達鬧鈴時刻,進入響鈴子程序;若不到則判斷定時 AJMP DSPDKQ RERING: ;鬧鈴重響判斷程序 JNB F0, RE ;標志位F0為0,不進行鬧鈴重響設定 CPL F0 MOV 3CH,#1 ;定時判斷標志位賦1,定時判斷功能開啟 JNB P0.7,M1 ;鬧鈴重響間隔時間選取 MOV R4,#0 ;鬧鈴重響間隔30秒 MOV R3,#30 AJMP MAIN M1: ;鬧鈴重響間隔60秒 MOV R4,#1 MOV R3,#0 AJMP MAIN DSPDKQ: ;判斷是否應該進行定時判斷 MOV A,3CH ;3CH是引入的判斷因子,當其為0時,不對定時時間是否到0進行判斷 JNZ DSPD2 ;當3CH不是0時,跳轉到定時判斷程序 AJMP MAIN DSPD2: MOV A,R4; JZ S_PD ;R4所存定時分數為0,則轉而判斷R3所存定時秒數 AJMP MAIN; S_PD: MOV A,R3; JNZ MAIN ;R4,R3所存參數減為0,定時長度已到 JNBP0.6,SHENGYIN2 ;鬧鈴重響功能開啟時,跳入響鈴程序 AJMP TISHI ;不是鬧鈴重響定時,則定時時間到時,跳入提示程序 AJMP MAIN CESHI: ACALL RING AJMP MAIN SHENGYIN1: ;調用響鈴子程序 LCALL RING AJMP MAIN SHENGYIN2: SETB F0 ;鬧鈴重響標志位設定 LCALL RING ;響鈴 CLR F0 ;標志位復位 AJMP MAIN NLTZZ: AJMP NLTZ1 ;跳入鬧鈴調整程序 DSTZ: AJMP DSTZ1 ;跳入定時調整程序 DATETZ: AJMP DATETZ1 ;跳入日期調整程序 STOPWATCHTZ: AJMPSTOPWATCHTZ1 ;跳入秒表程序 顯示子程序: DISP: ;時間顯示子程序 JNB P3.7,OUT1 ;判斷節能開關7是否按下,按下則數碼管不顯示,延長其壽命 MOV DPTR,#LEDTAB MOV A,SECOND ;顯示當前時間秒位 MOV B,#10 DIV AB ;A存十位,B存個位 MOVC A,@A+DPTR MOV P1,A CLR SEC_S ACALL D_1MS ;顯示當前時間秒十位 SETB SEC_S MOV A,B MOVC A,@A+DPTR MOV P1,A CLR SEC_G ACALL D_1MS ;顯示當前時間秒個位 SETB SEC_G MOV A,MINUTE ;顯示當前時間分位 MOV B,#10 DIV AB MOVC A,@A+DPTR MOV P1,A CLR MIN_S ACALL D_1MS SETB MIN_S MOV A,B MOVC A,@A+DPTR MOV P1,A CLR MIN_G ACALL D_1MS SETB MIN_G MOV A,HOUR ;顯示當前時間時位 MOV B,#10 DIV AB MOV DPTR,#LEDTAB MOVC A,@A+DPTR MOV P1,A CLR HOU_S ACALL D_1MS SETB HOU_S MOV A,B MOVC A,@A+DPTR MOV P1,A CLR HOU_G ACALL D_1MS SETB HOU_G MOV A,WEEK ;顯示當前星期數 MOVC A,@A+DPTR MOV P1,A CLR Y_S ACALL D_1MS SETB Y_S OUT1: RET
|