89C51單片機有兩個計數(shù)器T0和T1,每個計數(shù)器都是由兩個8位的RAM 單元組成的,即每個計數(shù)器都是16 位的計數(shù)器,最大的計數(shù)容量是216=65536,記住是從0-65535。
其次、提供給定時器的計數(shù)源又是從哪里來的呢?就是由單片機的晶振經(jīng)過12 分頻后獲得的一個脈沖源。一個12M 的晶振,它提供給計數(shù)器的脈沖時間間隔是就是1us。
最后、預(yù)置數(shù)計數(shù)法。如果每個脈沖是1微秒,則計滿65536個脈沖需時65.536毫秒。但是如果只需要10毫秒就可以了,怎么辦?只要在計數(shù)器里預(yù)先放進55536,這樣只需要計數(shù)65536-55536=10000次,也就是10毫秒了。
51單片機定時器設(shè)置入門
STC單片機定時器的使用可以說非常簡單,只要掌握原理,有一點的C語言基礎(chǔ)就行了。要點有以下幾個:
1. 一定要知道英文縮寫的原形,這樣寄存器的名字就不用記了。
理解是最好的記憶方法。好的教材一定會給出所有英文縮寫的原形。
2. 盡量用形像的方法記憶
比如TCON和TMOD兩個寄存器各位上的功能,教程一般有個圖表,你就在學(xué)習(xí)中不斷回憶那個圖表的形像
TMOD:定時器/計數(shù)器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
定時器/計數(shù)器模式控制寄存器TMOD是一個逐位定義的8位寄存器,但只能使用字節(jié)尋址,其字節(jié)地址為89H。
其格式為:
其中低四位定義定時器/計數(shù)器C/T0,高四位定義定時器/計數(shù)器C/T1,各位的說明:
GATE——門控制。
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。
當INT0引腳為高電平時TR0置位,啟動定時器T0;
當INT1引腳為高電平時TR1置位,啟動定時器T1。
GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
C/T——功能選擇位
C/T=0時為定時功能,C/T=1時為計數(shù)功能。
置位時選擇計數(shù)功能,清零時選擇定時功能。
M0、M1——方式選擇功能
由于有2位,因此有4種工作方式:
M1M0 工作方式 計數(shù)器模式 TMOD(設(shè)置定時器模式)
0 0 方式0 13位計數(shù)器 TMOD=0x00
0 1 方式1 16位計數(shù)器 TMOD=0x01
1 0 方式2 自動重裝8位計數(shù)器 TMOD=0x02
1 1 方式3 T0分為2個8位獨立計數(shù)器,T1為無中斷重裝8位計數(shù)器 TMOD=0x03
單片機定時器0設(shè)置為工作方式1為TMOD=0x01
這里我們一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。至于每位上的功能,你只要記住圖表,并知道每個英文縮寫的原型就可以了。
在程序中用到TMOD時,先立即回憶圖表,并根據(jù)縮寫的單詞原形理出每位的意義,如果意義不是很清楚,就查下手冊,幾次下來,TMOD的圖表就已經(jīng)在腦子里了。
8位 GATE位,本身是門的意思。
7位 C/T Counter/Timer
6位 M1 Mode 1
5位 M0 Mode 0
TCON: 定時器/計數(shù)器控制寄存器(TIMER/COUNTER CONTROL REGISTER)
TMOD分成2段,TCON控制更加精細,分成四段,在本文中只要用到高四段。
TF0(TF1)——計數(shù)溢出標志位,當計數(shù)器計數(shù)溢出時,該位置1。
TR0(TR1)——定時器運行控制位
當TR0(TR1)=0 停止定時器/計數(shù)器工作
當TR0(TR1)=1 啟動定時器/計數(shù)器工作
IE0(IE1)——外中斷請求標志位
當CPU采樣到P3.2(P3.3)出現(xiàn)有效中斷請求時,此位由硬件置1。在中斷響應(yīng)完成后轉(zhuǎn)向中斷服務(wù)時,再由硬件自動清0。
IT0(IT1)——外中斷請求信號方式控制位
當IT0(IT1)=1 脈沖方式(后沿負跳有效)
當IT0(IT1)=0 電平方式(低電平有效)此位由軟件置1或清0。
TF0(TF1)——計數(shù)溢出標志位
當計數(shù)器產(chǎn)生計數(shù)溢出時,此位由硬件置1。當轉(zhuǎn)向中斷服務(wù)時,再有硬件自動清0。計數(shù)溢出的標志位的使用有兩種情況:采用中斷方式時,作中斷請求標志位來使用;采用查詢方式時,作查詢狀態(tài)位來使用。
注意記憶方法,理解單詞原形,就絕對不會把TF和TR搞混。TF的F也就是溢出Over Flow的F。國外有個著名的IT知識問答社區(qū),網(wǎng)址就stackoverflow點com
TR的R就是運行Run。默認是0不運行,當然要置1才運行。
編輯推薦: 單片機定時器初值計算公式
編輯推薦: 80C51單片機定時器/計數(shù)器詳解
?
下面我們看個定時器/計數(shù)器0,產(chǎn)生定時中斷的例程。
晶振頻率12M,其程序如下:
#include《reg51.h》
void timer0_init()
{
TMOD = 0x01; //定時器在方式1工作,是16位計數(shù)器,最大值為65536
TL0 = 0xb0; //給TL0賦計數(shù)初值0xb0
TH0 = 0x3c; //給TH0賦計數(shù)初值0x3c
TR0 = 1; //定時器開始計數(shù)
ET0 = 1; //定時器中斷允許
EA = 1; //開總中斷
}
void main()
{
timer0_init();
while(1);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256; //在中斷處理函數(shù)中需要重新給TH0賦初值。
TL0=(65536-50000)%6; //在中斷處理函數(shù)中需要重新給TL0賦初值。
加上我們希望的語句。
}
上面給大家看了一段例程,講的是如何用定時器/計數(shù)器0實現(xiàn)中斷。單片機一般還有一個定時器/計數(shù)器1,它的編程和定時器/計數(shù)器0差不多。
評論