單片機定時器學習彙總

1時鐘週期=1/晶振頻率M

1機器週期=12(51系列12T,若1T則爲1)X時鐘週期 = 12(1)X(1/晶振頻率M) = 1 us(1/12 us)

1us機器週期脈衝數=晶振頻率f/12

 

假設12MHZ晶振工作在51單片機12T模式下,需要使用定時器進行50MS定時操作,定時器工作在方式1;

12M的晶振每秒(s)可產生1M(10^6 us)個機器週期

50ms就需要50×1000 us × 1us(1機器週期)個機器週期 = 50000

定時器在方式1工作,是16位計數器,最大值爲65536(2^16),也就是能進行最大65536次計數

50ms定時操作需要50000個機器週期,1個機器週期=1us,所以需要50000次計數操作

爲了計數器定時器工作,需要預先填充定時器初值(初值=定時器計數最大計數次數 - 所需定時計數次數)

所以需設置定時器初值15536 = 65536 -50000,即3CB0H(10進制15536轉換成16進制數3CB0),所以TH0=0x3c,TL0=0xb0,高位就是TH0的值,低位爲TL0的值

若假設使用11.0592MHZ的晶振,其他條件不變

11.0592M的晶振每秒可產生0.9216M個機器週期,50ms就需要46080個機器週期

定時器在方式1工作,是16位計數器,最大值爲65536,所以需設置初值19456 = 65536 - 46080,即4C00H

所以TH0=0x4c,TL0=0x00。

 

推導方式1 ,16位定時器/計數器初值設定高8位TH0,低TL0的公式爲:
TH0=(65536- 所需計數次數)/256    = 初值/256;         
TL0=(65536 - 所需技術次數)%256 = 初值%256;

 爲什麼除以256,因爲我們的計時器是兩個8位組成的,那麼要把那些差值裝進這兩個8位,計數從低8位開始,那麼低8位最多能裝256個機器週期,那麼256計滿了就用高8位的,就是說低8位滿一次高8位加1,那麼高8位裝多少,低8位就滿了幾次,算法就是用差值除一下256取其整數,剩下的,就是還剩了小於256次數的就放在低8位,就是差值 的餘數。

 

void timer0() interrupt 1

 TH0=(65536-50000)/256; 

 TL0=(65536-50000)%256; 

 flag++;

 if(flag==20)//當定時到1秒時執行花括號裏面的語句

 {    } 

}

---------------------------------------------------------------------------------------

at89s52,晶振頻率12m
其程序如下:
#include<stdio.h>
#include<reg51.h>

void timer0_init()
{
TMOD=0x01;//方式1
TL0=0xb0;
TH0=0x3c;
TR0=1;
ET0=1;
}

void timer0_ISR(void) interrupt 1
{
TL0=0xb0;
TH0=0x3c;//50ms中斷一次
single++;
if(single==20)
{ kk++;
single=0;
}
}
void main()
{
int kk=0;//計數器
int single=0;
timer0_init();


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章