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