-
1 # 文小簷
-
2 # Nicetrip
12兆晶振每隔一微秒計數器加一,也就是從0x00變成0x01需要一微秒。經過65536個脈衝當計數器溢位時的總時間為65.536ms毫秒。如果0x00看成是一個時間單位,那麼,第65536個脈衝可以視為0,我這樣說你明白了嗎?就像零點和二十四點是一個意思,看你怎麼理解了。兩個數字才能構成時間跨度,單純一個數字無論是幾都和時間沒有半毛錢關係。
-
3 # 一起學微控制器
沒理解你的問題,看來你對定時器的工作還有一些疑惑,用STC89C52微控制器來說,它有3個定時器,分別是T0,T1和T2。其中T2有捕捉功能。
舉例如定時器配置為 16 位定時器/計數器(模式1), TL0 的 8 位和 TH0 的 8 位所構成16位計數器(就是2位數16位,轉換為10進位制就是0到65535),當它溢位是將置位TCON的TF0位。如果開了T0中斷,將進入T0中斷程式(一定要有,哪怕是空的),硬體將自動清除中斷標誌。
初值的意義就是從這個數字開始到65536溢位,這個差值乘以計數週期就是定時的時間。如果初值為0,就是最長定時週期,如果為65535,就是來一個計數週期,就會溢位,產生中斷。 用一段程式來說明。要使用定時器,需要設定TMOD定時器暫存器,指定工作模式,設定定時器初值。開定時器,開中斷。如果不開,就需要程式中手動判斷TF0標誌位,進行處理。
/*定時器0,系統時鐘為11.059200M,12T模式,定時器5ms,則初值計算為65536-11059200/12*0.005=60928=0xEE00,則TH0=0xEE,TL0=0x00;*/
void T0_init()
{
TMOD&=0xF0;
TMOD|=0x01;
TH0=0xEE;
TL0=0x00;
TR0=1; //開定時器
ET0=1; //開中斷
}
void Timer0() interrupt 1 //中斷程式,需要重新賦初值
{ static unsigned char cnt=0;
TH0=0xEE;
TL0=0x00;
cnt++; //200次中斷,產生1秒標誌位 if(cnt>=200)
{ cnt=0;
flag1s=1;
LED=~LED; //1sLED指示
} P0 = 0xFF; //消隱
switch(i) //動態切換P0口,顯示LED值
{ case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=(LedBuff[1]&0x7F);break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i=0; P0=LedBuff[2];break;
default:break;
}
}
附圖是T0模式1的結構,89C52可以選擇6T(速度快1倍))或12T模式。定時器計數器模式選擇。是否與外部中斷0一起控制啟動計數器(脈寬測量)。來一個計數脈衝TH0TL0加1,到65536,溢位置位標誌TF0,產生中斷。
-
4 # 電子學習
題主你好!微控制器中0x00作為定時器的初值,在計數時0x00不計算在內,但參與了計數。為何這樣說,從以下分析便可清楚。
1:51微控制器的定時器/計數器是加計數器。工作時該微控制器有0至3四種工作方式,每種方式的定時/計數最大值都不一樣;
2:設定某種方式後,都是定時/計數到該方式最大值後才會溢位,產生中斷訊號給微控制器中CPU。溢位啟動中斷後須對中斷位清零,重新對定時器高低賦值。
3:假設設定定時工作方式為0方式,此時微控制器定時/計數最大值為8192,若設定初值為0x00,啟動定時器後,定時器便會以0x00為基數開始加1,直至數滿溢位,產生中斷。具體過程參看下圖便明白。
從上面波形圖可以看出:
①:定時初值賦為0x00時,定時從0到1每加一次,都由一個由高(低)到低(高)的高低兩個電平組成;
②賦初值為零(0x00)時,定時啟動後,無論0x00處是高或低電平開始,都豎到1(0x01)才為加1。
故而講,0x00計數時不計算在內,但參與了計數!
回覆列表
不知道問題0x00計算在內是什麼意思,定時器從0開始,計時一次為1,計時2次為2,依次累加,工作方式2的8位定時器計到2∧8=256,工作方式1的16位定時器計到65536,假設微控制器晶振為12MHz,則一個機器週期為1us,所以8位定時器最大定時為256us,16位定時器最大定時為65ms。當微控制器到達最大定時時間時就會產生定時中斷,在中斷程式中需要清除中斷標誌位,並對定時器重新賦值才能再次進行定時。