stc89c52rc的微控制器自帶了三個定時器,t0,t1,t2。
在sfr特殊功能暫存器中,給每個定時器都分配了兩個8bit的空間用於計數。也就是最多計數2的10次方。
當這兩個八位的計數空間計數滿(也就是變為11111111 11111111)後就會觸發定時器中斷,執行相應中斷觸發後設定執行的**。
在sfr中還有個tcon的區域,用來控制定時器中斷。如定時器是否中斷的標誌位,啟動定時器的標誌位。
sfr中還有乙個tmod區域,用來配置定時器的模式,比如兩個8位都用來計數,計數完成後手動將其置為初始值。或者只用其中乙個8位來計數,另乙個8位用來記錄初始值,在計數完成後自動置為初始值。還有其他模式一共有4中模式,這些模式的配置就在這塊區域。還有配置用來計數還是定時:定時的時候輸入的頻率**就是晶振,計數的話頻率**可以由外部輸入訊號或者自己設定。
標準的51微控制器是12t的,stc89c52就是12t的,也就是12個晶振的週期就是乙個機器週期(即cpu進行一次最小操作所用的時間),這裡的定時器如果用於定時的話就是乙個機器週期進一位,如果我們使用的是12mhz的晶振,那麼乙個機器週期就剛好是1微秒,也就是定時器滴答一下就是1微秒,而最多兩個8位用於計數,也就是最大定時65532微秒。如果圍毆麼需要的計數週期小於65532微秒就可以通過給兩個8位計數器賦初始值的方式減少計數次數。如果大於65532微秒就需要採用其他的方式了。
#include
#include
sbit buzzer = p3^6;//定義蜂鳴器
void timer0() interrupt 1//編號為1的中斷器就是定時器0
th0 = 255;//在中斷觸發的時候首先給定時器的低八位和高八位賦為初值
th0 = 206;
buzzer = ~buzzer;
void main()
tmod=0x01;//設定定時器的模式為16位
th0 = 255;//為定時器的低八位和高八位賦為初值
tl0 = 206;
et0 = 1;//允許定時器中斷
ea=1;//允許中斷器的觸發
tr0=1;//開始計數
while(1);
注意:th0和tl0的計算。這裡我們希望定時器的觸發時50微秒,也就是計數50次,就需要給低八位和高八位賦初始值。計算公式為:th0 = (65536-50)/256=255 tl0=(65536-50)%256
定時器中斷
系統初始化的時候在預設的系統初始化函式 systeminit 函式裡面已經初始化 apb1 的時鐘為 2 分頻,所以 apb1 的時鐘為 36m。當 apb1 的時鐘分頻數為 1 的時候,tim2 7 的時鐘為 apb1 的時鐘,而如果 apb1 的時鐘分頻數不為 1,那麼 tim2 7 的時鐘頻率...
定時器中斷
tmod 0x01 th0 65536 50000 256 tl0 65536 50000 6 ea 1 et0 1 tr0 1 void timer0 interrupt 1 ea 1 開總中斷允許 et0 1 開定時器0允許 tmod 0x01 定時器選擇軟體啟動,工作方式為1 th0 6553...
定時器 中斷
1 實現電視劇集中的10s定時炸彈功能 炸彈炸了用蜂鳴器模擬 include unsigned char code smgduan 17 unsigned int ms,sec 10,s sbit p1 0 p1 0 void delay unsigned int n void isr timer0...