6.1 單片機(jī)" target="_blank">51單片機(jī)定時(shí)器概述
6.1.1 定時(shí)器的描述
要實(shí)現(xiàn)定時(shí)功能,除了利用單片機(jī)內(nèi)部的定時(shí)/計(jì)數(shù)器,也可以采用下面三種方法:
?。?)軟件定時(shí):軟件定時(shí)不占用硬件資源,但占用了CPU時(shí)間,降低了CPU的利用率。
?。?)采用時(shí)基電路定時(shí):例如采用555電路,外接必要的元器件(電阻和電容),即可構(gòu)成硬件定時(shí)電路。但在硬件連接好以后,定時(shí)值與定時(shí)范圍不能由軟件進(jìn)行控制和修改,即不可編程。
(3)采用可編程芯片定時(shí):這種定時(shí)芯片的定時(shí)值及定時(shí)范圍很容易用軟件來(lái)確定和修改,此種芯片定時(shí)功能強(qiáng),使用靈活。在單片機(jī)的定時(shí)/計(jì)數(shù)器不夠用時(shí),可以考慮進(jìn)行擴(kuò)展。
定時(shí)/計(jì)數(shù)器的實(shí)質(zhì)是加1計(jì)數(shù)器(16位),由高8位和低8位兩個(gè)寄存器組成。TMOD是定時(shí)/計(jì)數(shù)器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0,T1的啟動(dòng)和停止及設(shè)置溢出標(biāo)志。
加1計(jì)數(shù)器輸入的計(jì)數(shù)脈沖有兩個(gè)來(lái)源,一個(gè)是由系統(tǒng)的時(shí)鐘振蕩器輸出脈沖經(jīng)12分頻后送來(lái);另一個(gè)是 T0 或T1引腳輸入的外部脈沖源。每來(lái)一個(gè)脈沖計(jì)數(shù)器加1,當(dāng)加到計(jì)數(shù)器為全1時(shí),再輸入一個(gè)脈沖就使計(jì)數(shù)器回零,且計(jì)數(shù)器的溢出會(huì)使TCON中TF0或TF1置1,向CPU發(fā)出中斷請(qǐng)求(定時(shí)/計(jì)數(shù)器中斷允許時(shí))。如果定時(shí)/計(jì)數(shù)器工作于定時(shí)模式,則表示定時(shí)時(shí)間已到;如果工作于計(jì)數(shù)模式,則表示計(jì)數(shù)值已滿??梢?jiàn),由溢出時(shí)計(jì)數(shù)器的值減去計(jì)數(shù)初值才是加1計(jì)數(shù)器的計(jì)數(shù)值。
設(shè)置為定時(shí)器模式時(shí),加1計(jì)數(shù)器是對(duì)內(nèi)部機(jī)器周期計(jì)數(shù)(1個(gè)機(jī)器周期等于12個(gè)振蕩周期,即計(jì)數(shù)頻率為晶振頻率的1/12)。計(jì)數(shù)值乘以機(jī)器周期就是定時(shí)時(shí)間。
設(shè)置為計(jì)數(shù)器模式時(shí),外部事件計(jì)數(shù)脈沖由T0或T1引腳輸入到計(jì)數(shù)器。在每個(gè)機(jī)器周期的某個(gè)期間采樣T0、T1引腳電平。當(dāng)某周期采樣到一高電平輸入,而下一周期又采樣到一低電平時(shí),則計(jì)數(shù)器加1,更新的計(jì)數(shù)值在下一個(gè)機(jī)器周期裝入計(jì)數(shù)器。由于檢測(cè)一個(gè)從1到0的下降沿需要2個(gè)機(jī)器周期,因此要求被采樣的電平至少要維持一個(gè)機(jī)器周期。當(dāng)晶振頻率為12MHz 時(shí),最高計(jì)數(shù)頻率不超過(guò)6MHz,即計(jì)數(shù)脈沖的周期要大于2us。
6.1.2 51單片機(jī)定時(shí)器結(jié)構(gòu)
6.1 定時(shí)器中斷相關(guān)寄存器
6.1.1 工作模式寄存器TMOD
寄存器地址:0x89
Bit 7:定時(shí)器1門控
0:關(guān)閉門控,只要TR1為1,就可以啟動(dòng)定時(shí)/計(jì)數(shù)器工作
1:開(kāi)啟門控,此時(shí)只有當(dāng)TR1為1且外部中斷引腳為高電平時(shí),才能夠啟動(dòng)定時(shí)器工作
Bit 6:定時(shí)器1工作模式選擇
0:定時(shí)模式,時(shí)鐘源來(lái)自MCU內(nèi)部
1:計(jì)數(shù)模式,時(shí)鐘源來(lái)自T1引腳上
Bit 5~Bit 4:定時(shí)器1計(jì)數(shù)模式選擇
00:數(shù)據(jù)寄存器使用13位
01:數(shù)據(jù)寄存器使用16位
10:8位自動(dòng)重裝定時(shí)/計(jì)數(shù)器
11:T1停止計(jì)數(shù)
Bit 3:定時(shí)器0門控
0:關(guān)閉門控,只要TR0為1,就可以啟動(dòng)定時(shí)/計(jì)數(shù)器工作
1:開(kāi)啟門控,此時(shí)只有當(dāng)TR0為1且外部中斷引腳為高電平時(shí),才能夠啟動(dòng)定時(shí)器工作
Bit 2:定時(shí)器0工作模式選擇
0:定時(shí)模式,時(shí)鐘源來(lái)自MCU內(nèi)部
1:計(jì)數(shù)模式,時(shí)鐘源來(lái)自T0引腳上
Bit 1~ Bit 0:定時(shí)器0計(jì)數(shù)模式選擇
00:數(shù)據(jù)寄存器使用13位
01:數(shù)據(jù)寄存器使用16位
10:8位自動(dòng)重裝定時(shí)/計(jì)數(shù)器
11:T0分成兩個(gè)獨(dú)立的8位定時(shí)/計(jì)數(shù)器
6.1.2 定時(shí)器0數(shù)據(jù)寄存器高字節(jié)TH0
寄存器地址:0x8C
6.1.3 定時(shí)器0數(shù)據(jù)寄存器低字節(jié)TL0
寄存器地址:0x8A
6.1.4 定時(shí)器1數(shù)據(jù)寄存器高字節(jié)TH1
寄存器地址:0x8D
6.1.5 定時(shí)器1數(shù)據(jù)寄存器低字節(jié)TL1
寄存器地址:0x8B
6.2 例程分析
6.2.1 原理圖
6.2.2 實(shí)現(xiàn)的功能
使用定時(shí)器0,控制LED以1Hz頻率閃爍。
6.2.3 源代碼
重點(diǎn)關(guān)注以下幾行代碼:
第20行:定義了一個(gè)unsigned char的變量,為什么要定義這樣一個(gè)全局變量。首先定時(shí)器的數(shù)據(jù)寄存器只有16位,也就是說(shuō)最大數(shù)據(jù)范圍只有65535,超過(guò)這個(gè)數(shù)據(jù)后就會(huì)從0重新開(kāi)始計(jì)時(shí),根據(jù)單片機(jī)的計(jì)數(shù)周期設(shè)置在1us,最大定時(shí)時(shí)間只有65.535ms,而達(dá)到1s是遠(yuǎn)遠(yuǎn)不夠的,所以定義一個(gè)全局變量來(lái)計(jì)算定時(shí)器產(chǎn)生中斷的次數(shù),假設(shè)我們?cè)O(shè)置定時(shí)器50ms中斷一次,那么,當(dāng)進(jìn)入20次中斷,則意味著定時(shí)器剛好定時(shí)1s。
第28行:這里用到了一條語(yǔ)句,LED = !LED,嘆號(hào)代表取反,只能用于布爾型變量,所謂布爾型變量就是只有0和1兩種狀態(tài),也就是1個(gè)二進(jìn)制位,在C語(yǔ)言中,嘆號(hào)代表二進(jìn)制位取反,“~”則代表按位取反運(yùn)算,例如有一個(gè)二進(jìn)制位初值是1,取反的結(jié)果就是0,但是如果有一個(gè)字節(jié)0x8F,此時(shí)只能用按位取反運(yùn)算,而不能用二進(jìn)制位取反運(yùn)算,0x8F按位取反的結(jié)果應(yīng)該是0x70,例程中這條語(yǔ)句的含義就是LED二進(jìn)制位取反后將結(jié)果重新賦值給LED變量。
第23行~第24行:這兩行用于給定時(shí)器重新寫入初值,因?yàn)?1單片機(jī)的數(shù)據(jù)寄存器進(jìn)入中斷后就會(huì)從0開(kāi)始重新計(jì)數(shù),假設(shè)最開(kāi)始設(shè)置的值是1000,進(jìn)入中斷后,定時(shí)的時(shí)間就是65535-1000+1=64536us,進(jìn)入中斷如果不設(shè)置初值,那么下一次進(jìn)入中斷時(shí)定時(shí)的時(shí)間就是65536us,與最初的時(shí)間誤差是65536-64536=1000us,所以每次進(jìn)入中斷都需要給數(shù)據(jù)寄存器重新寫入初值。
第42行~第43行:定時(shí)器在初始化的時(shí)候就要給寫入初始值,為什么要寫入這個(gè)初始值呢,首先數(shù)據(jù)寄存器是只能加1運(yùn)算,從0加到65535,但是如果我們只想要定時(shí)50us就進(jìn)入中斷應(yīng)該怎么處理呢,這就需要給定時(shí)器的數(shù)據(jù)寄存器先寫入一個(gè)數(shù),讓定時(shí)器從這個(gè)數(shù)開(kāi)始加1,加到65535剛好是50us,那么這個(gè)初值就是65535-50,這個(gè)定時(shí)的時(shí)間剛好就是50us,而/和%則是代表取整和取余。
注:取整與取余運(yùn)算
?。?)取整運(yùn)算:用/表示,代表取除法運(yùn)算中整數(shù)部分,例如2/3,得到的結(jié)果就是商為0且余數(shù)為2,此時(shí)取整運(yùn)算得到的結(jié)果就是0;
?。?)取余運(yùn)算:用%表示,代表取除法運(yùn)算中余數(shù)部分,例如2/3,得到的結(jié)果就是商為0且余數(shù)為2,此時(shí)取余運(yùn)算得到的結(jié)果就是2。
更多信息可以來(lái)這里獲取==>>電子技術(shù)應(yīng)用-AET<<