摘 要:根據MCS-51單片機內部定時計數器的特點,提出一種通過對定時計數器中斷間隔時間進行累加的軟時鐘設計方法,并在此基礎上提出通過改變時間處理方式的進一步優化方法。此方法不僅簡化了程序設計,節省了硬件開銷,而且提高了電腦時鐘的定時精度,具有廣泛的應用價值。
關鍵詞:單片機; 軟時鐘; 定時計數器; 計數器中斷間隔; 優先級
中圖分類號:TP368文獻標識碼:A
文章編號:1004-373X(2010)15-0187-03
Optimization Methods of Soft-clock Design in MCS-51 Single Chip Computer
ZHANG Le-fang1, PANG Xin-fa2, HUANG Tian-lu3
(1.School ofInformation Engineering, Xi’an Eurasia University, Xi’an 710065, China;2. Shaanxi Province Party School of CPC, Xi’an 710061, China;
3. Xi’an Communication Institute, Xi’an 710106, China)
Abstract: A soft-clock design method cumulative with timing counter interruptive interval is proposed according to the characteristics of the timing counter in MCS-51 single chip computer. On this basis, a further optimization method to accumulate the interruptive interval time of the timing counter is put forward. This method not only simplifies the program design and reduces the hardware costs but also improves the clock timing accuracy of the computer. Therefore, it has a very wide range of applications.
Keywords: single chip computer; soft-clock; timing counter; counter interruptive interval; priority grade
0 引 言
隨著微電腦應用的普及,以MCS-51單片機為核心的微機測控系統已隨處可見。為滿足用戶要求,這些系統通常都具有數碼顯示時鐘的功能。由于MCS-51內部包含2個定時計數器,通過采用將其中一個定時計數器用于軟時鐘設計的方法,可以大大節省硬件開銷。本文提出了如何提高軟時鐘的定時精度,以及在軟時鐘存在的情況下,如何提高以 MCS-51單片機為核心的測控系統的設計質量的方法。
1 MCS-51單片機內部定時計數器概述
MCS-51單片機內部包含2個定時計數器T0和T1,它們都是16位的加法計數器,既可用于定時,也可用于計數,在用于定時的情況下,計數脈沖由內部提供,因此計數速率固定為 CPU振蕩頻率的1/12;在用于計數的情況下,計數脈沖來自外部,外部計數脈沖通過 MCS-51的引腳T0(第14腳)或T1(第15腳)輸入[1-2],在發生從1到0的跳變時計數加1。每個定時計數器又有4種工作方式可供選擇:方式0構成13位定時計數器,高3位未用;方式1構成16位定時計數器;方式2構成8位定時計數器,低位字節用于計數,高位字節存放初值[3-4];方式3只適合于T0,構成兩個獨立的8位定時計數器。在方式0、方式1及方式3時,初值不能自動裝入,當定時時間已到或計數次數已滿時,若要進行下一次定時計數,必須利用軟件裝入初值,否則,系統會按上限自動定時或計數,即以0初值進行定時或計數[5-6];而在方式2時,初值可自動裝入,只需向高位字節寫入一次初值,則當低位字節定時時間到(或計數滿)時,高位字節的初值會自動裝入低位字節,且高位字節的值保持不變。當系統需用MCS-51單片機的串行接口進行串行通信時,定時計數器T1被固定為波特率發生器,因此,在軟時鐘設計中,總是選擇T0作為定時器[7-8]。
2 軟時鐘程序設計方法1——0.1 s計數法
0.1 s計數法的基本原理如下,通過設置定時計數器0每經過0.1 s請求一次中斷,中斷處理程序會令軟時鐘的基準0.1 s單元增加1,而該單元每增加10次,再令軟時鐘的秒單元增加1,以此類推,按照時間進位令分、時、日、月直至年單元增加1。設CPU所接晶體振蕩器的振蕩頻率為6 MHz,則1個機器周期為2 μs,當T0作為定時器工作時,定時器溢出,即中斷周期:T=2×TC×10-6 s,式中TC為時間常數[9-10]。令中斷周期T=0.1 s,可得:TC=0.1/(2×10-6)=50 000=0C350H,此時間常數決定了T0必須為16位定時器,故設置為工作方式1。由于是加法計數器,初值IC應為時間常數TC的補碼,所以IC=216-TC=10000H-0C350H=3CB0H,修正以后,取IC=3CB4H,有關程序段具體設計如下。
初始化程序:
……;月、日、時、分單元初始化(略)
CHKS0:MOV A,(SBF);秒單元初始化
ADD A, #0
DA A
MOV (SBF), A
CJNE A, #60H, CHKS1
CHKS1:JC CHKL0
MOV (SBF),#0
CHKL0:MOV (BUF),#0 ;0.1 s單元初始化
MOV TL0,#0B4H ;送初值低位字節
MOV TH0,#3CH ;送初值高位字節
MOV TMOD,#01H;設置T0為定時工作方式1
MOV IP,#02H;設置T0中斷為高優先級
ORL IE,#82H;T0允許中斷
SETB TR0;啟動T0
中斷服務程序:
ORG 000BH;入口引導
LJMP CLOCK
ORG ****H
CLOCK:MOV TL0,#0B4H ;送初值低位字節
MOV TH0,#3CH ;送初值高位字節
PUSH PSW;保護程序狀態字
PUSH ACC;保護累加器
SETB RS0;選區1
CLR RS1
INC (BUF);0.1 s單元增加1
MOV A, (BUF)
CJNE A, #0AH, DONE
MOV (BUF), #0
MOV A,(SBF) ;秒單元增加1
ADD A, #1
DA A
MOV (SBF), A
CJNE A, #60H,DONE
MOV (SBF), #0
……;分、時、日、月單元增加1(略)
DONE:POP ACC;恢復累加器
POP PSW;恢復程序狀態字
RETI;中斷返回
由上述程序可知,作為16位定時器使用時,T0不能自動裝入初值,每次進入中斷服務程序后,首先必須用程序裝入初值,下一次定時實際上是從裝入初值低位字節后開始的,所以在設定T0中斷為高優先級以及CPU對T0中斷請求的響應無等待延時的理想情況下,1個中斷周期所包含的實際時間t=初值到計數滿所需時間+入口引導時間+裝入初值低位字節時間。
由于入口引導與裝入初值低位字節共占4個機器周期,所以為了使中斷周期等于0.1 s基準時間,上文對按理論推算出來的初值進行了加4修正。盡管如此,按照方法1設計的時鐘程序與測控系統的其他程序有機聯接在一起運行時,要實現準確定時也是十分困難的,因為在實用工業測控系統中常常不止1個中斷源,而是含有多個中斷源,存在著中斷優先權的管理問題。要使上述軟時鐘能夠準確定時,T0中斷必須設置為高優先級,這樣CPU對T0的定時中斷才有可能不受影響,確保每隔0.1 s執行一次定時中斷服務程序。如果T0定時中斷被設置為低優先級,那么CPU對T0定時中斷的響應就要受到影響。當CPU正在執行某一高優先級中斷源的中斷服務程序時,T0計數滿會產生中斷請求,CPU必須等到當前正在執行的中斷服務程序執行完畢之后,才能響應T0中斷,這必將延長中斷間隔,使初值不能如期裝入,破壞定時的準確性。由此可見,采用方法1設計的時鐘程序限制了系統設置中斷優先級的靈活性,降低了設計效率。例如,某些以數碼管作為顯示器的測控系統,為了節省硬件開銷,通常采用對數碼管進行巡回掃描的方法進行顯示輸出,為使顯示穩定,且無抖動現象,必須將數碼管顯示中斷設置為高優先級,以便保證掃描程序的執行周期固定不變,這便與時鐘定時中斷對優先級的要求發生了矛盾。為克服方法1的缺陷,在實際工程中,通過采用如下所述的方法2來設計時鐘程序,可獲得較好的效果。
3 軟時鐘程序設計方法2——中斷周期累加法
方法2和方法1的程序結構是完全相同的,只是在對秒以下時間的處理上有所不同。將方法1的中斷服務程序中“0.1 s單元增加1”程序段改為:
MOV A, (BUF);0.1 s單元增加1
ADD A, #10H
DA A
MOV (BUF), A
JNC DONE
通過對照容易看出,雖然兩個“0.1 s單元增加1”程序段所用指令不同,但效果是完全一樣的,可以互相替代。改動后的程序將對0.1 s中斷周期的計數,變成了對0.1 s中斷周期的累加,由此引申,對任何小于秒的中斷周期都可以進行累加,當最高位有進位時實施秒增1,同樣可以達到時鐘定時的目的。MCS-51單片機內部定時器選擇工作方式1時為16位計數器,在上述假定條件下,當初值為0時,T0的定時中斷周期T=0131 072 s,131072定義為中斷周期常數,在中斷服務程序中對其進行累加。以下是采用方法2設計的時鐘程序。
定義中斷周期常數:
CONST: DB 00H, 13H, 10H, 72H
初始化程序:
…… ;月、日、時、分、秒單元初始化(同方法1)
CHKL0: MOV (BUF0),#0 ;秒以下單元初始化
MOV (BUF1),#0 ;秒以下單元初始化
MOV (BUF2),#0 ;秒以下單元初始化
MOV TMOD,#01H;設置T0為定時工作方式1
ANL IP,#0FDH ;設置T0中斷為低優先級
ORL IE,#82H ;T0允許中斷
SETB TR0 ;啟動T0
中斷服務程序:
……;入口引導(同方法1)
CLOCK: PUSH PSW;保護程序狀態字
PUSH ACC ;保護累加器
PUSH DPH ;保護DPTR高位字節
PUSH DPL ;保護DPTR低位字節
SETB RS0 ;選區1
CLR RS1
MOV R0,#BUF0;中斷周期累加
MOV R2, #3
MOV DPTR,#CONST
CLR C
LJIA:MOV A, R2
MOVC A,@A+DPTR
ADDC A,@R0
DA A
MOV @R0, A
INC R0
DJNZ R2, LJIA
JNC DONE
…… ; 秒、分、時、日、月單元增1(同方法1)
DONE: POP DPL ;恢復DPTR低位字節
POP DPH ;恢復DPTR高位字節
POP ACC ;恢復累加器
POP PSW ;恢復程序狀態字
RETI;中斷返回
方法2采用對中斷周期進行累加的方法,令定時器滿量程計數,初值為0,計數滿后,自動重新從0開始計數,不需用程序裝入初值,從根本上擺脫了裝入初值的困擾,當然也就避免了對初值進行修正的繁瑣過程。由于不需要裝入初值,CPU可在中斷周期的任意時刻,響應定時器的中斷請求,只需保證下一次中斷請求到來之前將中斷服務程序執行完畢即可,從而使定時器大大降低了對中斷優先級的要求。因此方法2將定時器中斷設置為低優先級,而方法1則將其設置為高優先級。顯然,采用方法2不僅便于程序設計,而且提高了程序設計的效率。
方法2中,當定時器滿量程計數時,中斷周期不再是標準的0.1 s,因此中斷周期在累加過程中向秒單元的進位,大多數發生在非整秒時刻,而且進位間隔也不盡相同,具體來講,假設秒以下時間單元從0開始累加,那么向秒單元進位第一次是在1048 576 s時刻,第二次是在2097 152 s時刻,第三次是在3.014 656 s時刻,…,第一次與第二次間隔為1.048 576 s,第二次與第三次間隔為0917 504 s,……,進位間隔有時候大于1 s,有時候小于1 s,然而,對分、時、日、月這些長期時間過程來說,積累誤差可以認為等于0,從這個意義上說,方法2大大提高了定時精度。
4 結 語
提出了采用MCS-51內部定時計數器作為軟時鐘設計的方法,不僅節省了硬件開銷,而且提高軟時鐘的定時精度,具有廣泛的應用價值。在實際測試中,當晶體振蕩器的振蕩頻率不是標準6 MHz時,通過調整中斷周期常數,以及必要時通過增加秒以下時間單元緩沖區的字節數,可使中斷周期常數準確到所需精度。
參考文獻
[1]陳建鐸.單片機原理與應用[M].北京:科學出版社,2004.
[2]李群芳,方事明,游華杰.單片機原理與應用[M].湖北:武漢大學出版社,2006.
[3]李剛,林凌,姜葦.51系列單片機系統設計與應用技巧[M].北京:北京航空航天大學出版社,2004.
[4]高峰.單片微機應用系統設計及實用技術[M].北京:機械工業出版社,2004.
[5]李廣弟,朱月秀,冷祖祁.單片機基礎[M].北京:北京航空航天大學出版社,2001.
[6]張專成.多參量火警監測器的軟判決與單片機實現[J].微計算機信息,2008,24(8):149-151.
[7]黃天錄.PIC12F675單片機在復合式火災探測器設計中的應用[J].西安通信學院學報,2006(4):28-31.
[8]竇振中.單片機外圍器件使用手冊[M].北京:北京航空航天大學出版社,2003.
[9]邵貝貝.Motorola DSP型16位單片機原理與實踐[M].北京:北京航空航天大學出版社,2003.
[10]馬忠梅,籍順心,張凱,等.單片機的C語言應用程序設計[M].北京:北京航空航天大學出版社,2003.