定時器在單片機(jī)內(nèi)部就像一個小鬧鐘一樣,根據(jù)時鐘的輸出信號,每隔“一秒”,計數(shù)單元的數(shù)值就增加一,當(dāng)計數(shù)單元數(shù)值增加到“設(shè)定的鬧鐘提醒時間”時,計數(shù)單元就會向中斷系統(tǒng)發(fā)出中斷申請,產(chǎn)生“響鈴提醒”,使程序跳轉(zhuǎn)到中斷服務(wù)函數(shù)中執(zhí)行。
了解定時器就一定要先了解中斷,中斷,即在 cpu 的一步步按照指令運行(A)的過程中,可能會有其它的更緊急的事情(B)需要做的事情, 需要 cpu 暫時停止當(dāng)前的程序,做完了事情B之后,又可以繼續(xù)去運行先前的程序(A)。
舉一個很簡單的例子,比如我們今天9點要去參加一個會議,我們定了一個鬧鐘,九點前的這段時間我們會做我們該做的想做的任何事情,但到了9點,鬧鐘響起我們就要先去參加會議,等到開完會以后在做我們想做的事情,以此循環(huán)類推。
另一個概念叫溢出,我們知道秒表計時到59秒的時候,再過1秒就變成了00。同理,當(dāng)我們的unsigned char類型的變量的數(shù)值為255時,再加1就變?yōu)?了, unsigned int的變量如果此時的值為65535,后面再加1也同樣成為0,這些都叫溢出。
在控制系統(tǒng)中,常常要求有一些實時時鐘以實現(xiàn)定時或者延時控制,如定時中斷、定時檢測、定時掃描等等,也往往要求有計數(shù)器,對外部事件進(jìn)行計數(shù)。
要實現(xiàn)定時或者延時功能,一般有三種方法:軟件固定時,不可編程硬件固定時和可編程硬件固定時。
1.軟件固定時——讓軟件循環(huán)執(zhí)行一段程序,程序本身并無執(zhí)行目的,而是通過執(zhí)行程序延時固定的時間,也就是以前的程序中經(jīng)常使用的延時程序。這種方法降低了cpu的利用率。
2.不可編程硬件固定時——如外部芯片555 時基電路,通過外部阻容,達(dá)到一定的延時功能,改變阻容大小可以改變延時長度。這種定時器取決于硬件,設(shè)定好以后不能通過軟件更改。
3.可編程固定時器——這種定時器的定時值可以通過軟件確定和修改,使用靈活便捷。
定時器和計數(shù)器
時鐘周期:時鐘周期 T 是時序中最小的時間單位,具體計算的方法就是 1/時鐘源頻率,我們 KST-51 單片機(jī)開發(fā)板上用的晶振是 11.0592M,那么對于我們這個單片機(jī)系統(tǒng)來說,時鐘周期=1/11059200 秒。
機(jī)器周期:單片機(jī)完成一個操作的最短時間。
定時器:定時器就是用來進(jìn)行定時的。定時器內(nèi)部有一個寄存器,我們讓它開始計數(shù)后,這個寄存器的值每經(jīng)過一個機(jī)器周期就會自動加 1,因此,我們可以把機(jī)器周期理解為定時器的計數(shù)周期。秒表,每經(jīng)過一秒,數(shù)字加1,而這個定時器就是每過一個機(jī)器周期的時間,也就是12/11059200秒,數(shù)字加1。還有一個特別注意的地方,就是秒表是加到60后,秒就自動變成0了,這種情況在單片機(jī)和計算機(jī)里我們稱之為溢出。那定時器加到多少才會溢出呢?定時器有幾種模式,假如是16位的定時器,也就是2個字節(jié),最大值就是65535,那么加到65535后,再加1就算溢出,如果有其他位數(shù)的話,道理是一樣的,對于51單片機(jī)來說,溢出后,這個值會直接變成0。從某一個初值,經(jīng)過計算確定的時間后溢出,這個過程就是其定時的含義。