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
#include
void timer0_init()
void timer0_isr(void) interrupt 1 }
void main()
51微控制器 定時器
定時 計數器的結構和工作原理 定時 計數器的實質是加1計數器 16位 由高8位和低8位兩個暫存器組成。80c51 微控制器定時 計數器的工作是由兩個特殊功能暫存器控制的。tmod是定時 計數器的工 作方式暫存器,確定工作方式和功能,低四位用於t0,高四位用於t1。t con是控制寄 存器,控制t0和...
51微控制器 定時器
標準的51微控制器內部有t0和t1兩個定時器。定時器的計數值儲存在暫存器中。th0 tl0用於t0,th1 tl1用於t1.定時器儲存暫存器 名稱描述 sfr位址 復位值th0 t0高位元組 0x8c 0x00 tl0t0低位元組 0x8a 0x00 th1t1高位元組 0x8d 0x00 tl1t...
微控制器的定時器
定時器則是由微控制器自身提供的乙個非常穩定的計數器,這個穩定的計數器就是微控制器上連線的晶振部件,晶振經過12分頻之後提供給微控制器的只有1mhz的穩定脈衝 晶振的頻率是非常準確的,所以微控制器的計數脈衝之間的時間間隔也是非常準確的,這個準確的時間間隔是1微秒 12mhz晶振內部的工作頻率 時鐘脈衝...