魯道旺,趙文龍,謝敏,阮艷鳳
(南昌航空大學 信息工程學院,南昌 330063)
魯道旺、謝敏、阮艷鳳(碩士研究生),主要研究領域為控制工程;趙文龍(教授),主要研究領域為計算機控制、嵌入式技術、工業過程控制。
在對時間的精度要求比較高的場合,一般要求對采用單片機做控制器的系統進行精確的時間計算。有人對此問題做了研究并提出了很好的解決方法[1-3],但是他們有的是針對單片機使用頻率為12 MHz晶振下匯編語言的特點作出的分析,有的是針對特定的使用條件或環境下的分析,不適合晶振頻率為11.059 2 MHz的情況。為此,針對單片機定時器的特點,在此晶振頻率下,利用TKStudio對定時器T0方式2進行分析仿真,取得了精確的定時時間,合理地解決了定時常數為小數的問題,為單片機定時提出了一種新思路。
單片機有4種定時方式。方式0、方式1、方式3有一個共同點是有定時器溢出中斷的響應時間誤差,而方式2具有自動重載功能,沒有這些誤差。
產生中斷溢出的響應時間誤差的原因有3個:一是中斷響應時間;二是定時器溢出中斷信號時,CPU正在執行某指令;三是定時器溢出中斷信號時,CPU正在執行某中斷服務程序[4]。由于每條指令的執行時間不同且中斷時不知道CPU會執行哪一條指令,這就導致中斷溢出的響應時間不確定。
方式2是自動重載的,可以很好地免去上面的不確定時間。方式2的定時時間為 T=12×(256-a)/fosc[5]。以頻率為11.059 2 MHz的晶振為例,定時250 μ s分析,易得a=25.6。通常情況下,使用定時器時裝的初值為常數,但是此處為小數,要想得到準確的250 μ s,還必須要用a=25.6。下面為解決小數問題的分析:若a=25,則25-25.6=-0.6;若 a=26,則 26-25.6=0.4。那么以25.6為常數中斷40次便是10 ms,試想前16次中斷用a=25,誤差為16×(-0.6)=-9.6,后24次中斷用 a=26,誤差為24×0.4=9.6,可以看出,經過40次的中斷便沒有誤差了,10 ms是準確值。這樣,便可以用10 ms為基數產生出秒、分、時等。
編寫一個計時程序,對其進行分析仿真。代碼如下:

把程序放到TKStudio中進行仿真,在配置目標工程中填寫11.059 2 MHz的晶振頻率進行軟件仿真。編譯后開始調試,按程序標記分別對各個斷點進行調試。
首先在第一個斷點處調試,單擊啟動/停止按鈕后,程序初始化,可以看出初始化時間為639.106 μ s(如圖1所示);然后單擊運行按鈕,運行到斷點處會自動停止并顯示運行的時間為10.037 977 ms(如圖2所示),這里包括運行主函數其他指令的時間和執行一次timeflag變化的時間;然后再單擊一次運行按鈕,顯示時間為10 ms(如圖3所示),這一次為執行一次timeflag變化的時間,即中斷40次 250 μ s的時間 ;

圖1 斷點1程序單擊啟動/停止調試按鈕后初始化時間

圖2 在斷點1處運行第一次顯示的數據

圖3 在斷點1處運行第二次顯示的數據
繼續按運行操作,可以發現以后的delta_s均是10 ms。取消斷點1處的斷點,在斷點2處設斷點,執行與斷點1處相同的操作步驟得到的結果如圖4~圖6所示,其后的執行結果delta_s均為1 s。

圖4 斷點2程序單擊啟動/停止調試按鈕后初始化時間

圖5 在斷點2處運行第一次顯示的數據

圖6 在斷點2處運行第二次顯示的數據
同樣,在斷點3處設斷點運行,結果如圖7~圖9所示,以后的每次delta_s均為60 s。斷點4處運行結果如圖10~圖12所示,以后每次delta_s均為3 600 s。

圖7 斷點3程序單擊啟動/停止調試按鈕后初始化時間

圖8 在斷點3處運行第一次顯示的數據

圖9 在斷點3處運行第二次顯示的數據

圖10 斷點4程序單擊啟動/停止調試按鈕后初始化時間

圖11 在斷點4處運行第一次顯示的數據

圖12 在斷點4處運行第二次顯示的數據
本文對常用的頻率為11.059 2 MHz的晶振在定時器T0方式2下做了分析,仿真結果良好;同時,提出了一種解決定時常數為小數問題的辦法,能夠推廣應用于其他情況。
[1]方飛,謝麗春.利用Keilx51實現 T0的精確定時[J].單片機與嵌入式系統應用,2006(1):64-66.
[2]蹇興亮.單片機定時中斷的精確定時編程方法種種[J].單片機與嵌入式系統應用,2004(8):70-71.
[3]朱蓉,鄭建華.基于MCS-51單片機定時精確控制的研究[J].現代電子技術,2005(17):32-34.
[4]楊洪亮.基于MCS51單片機定時誤差分析及糾正[J].福建電腦,2006(12):145-146.
[5]張友德,趙志英,涂時亮.單片微型機原理、應用與實驗[M].5版.上海:復旦大學出版社,2008:106-113.