定時/計數器實質上是乙個加1計數器,計數值是存在thx,tlx(x取0或1)這2個8位的暫存器裡的.它隨著計數器的輸入脈衝進行自加1,也就是每來乙個脈衝,計數器就自動加1,,當加到計數器為全1時,再輸入乙個脈衝就使計數器回零,且計數器的溢位使相應的中斷標誌位置1,向cpu發出中斷請求(定時/計數器中斷允許時)。如果定時/計數器工作於定時模式,則表示定時時間已到;如果工作於計數模式,則表示計數值已滿。
定時/計數器t0和t1的原理圖:
除了用於存計數值的暫存器外,還有2個暫存器,乙個是工作方式暫存器tmod,作用是確定t0/t1的工作方式和功能。第二個是控制暫存器tcon,作用是控制t0/t1的啟動和停止及設定溢位標誌.
工作方式暫存器tmod的原理圖:
每一位功能說明
然後這個工作方式一般都是選方式1的,因為這時候是16位定時/計數器,就是把thx和tlx的全部位也就是16位都用來存計數值了,這樣子的話能存的計數值是65535。 ps:再計乙個數就溢位變成0了
控制暫存器tcon的原理圖:
位說明:
另外補充說明一下只有高4位是用於定時/計數器的,低4位是用於外部中斷0和1的.
最後總結一下當我們使用於定時/計數器時需要做的事
1.對tmod賦值,以確定t0,t1的工作方式和功能
2.計算初值,並將其寫入thx,tlx
3.要用定時/計數器中斷時,要對ea賦值,開放定時器中斷.
4.使tr1/tr0置位,啟動定時/計數器t0/t1來定時或計數.
接下來具體說說怎麼計數初值,在這之前要先理解機器週期,因為th0,tl0存的計數值是每乙個機器週期加1的
機器週期也就是cpu完成乙個基本操作所需要的時間。
機器週期=1/微控制器的時鐘頻率。
51微控制器內部時鐘頻率是外部時鐘的12分頻。也就是說當外部晶振的頻率輸入到微控制器裡面的時候要進行12分頻。比如說你用的是12mhz的晶振,那麼微控制器內部的時鐘頻率就是12/12mhz,當你使用12mhz的外部晶振的時候。機器週期=1/1m=1us。
而我們定時1ms的初值是多少呢,1ms/1us=1000。也就是要計數1000個數,初值=65536-1000(初值=溢位值-計數值)=64536.
計算出初值以後就把初值存到thx,tlx裡,tlx=初值%256,thx=初值/256.可以把計數值理解為256進製的數,thx存的是高位,tlx存的是低位,低位每滿256就清0,同時向高位(thx)進1.
下面貼乙份應用了定時器的**,目的是在點陣上輪流顯示1到10.
#include "reg51.h"
#includetypedef unsigned char u8;
typedef unsigned int u16;
sbit srclk=p3^6;
sbit rclk=p3^5;
sbit ser=p3^4;
u8 code tabledu=;//段選資料表,輸入到74hc595晶元
u8 code tablewe=;//位選表,用於依次點亮1到8列
void hc595(u8 dat) //要注意輸入到595的資料只能是u8型
rclk=1;
_nop_();
_nop_();
rclk=0;
}void main()
}hc595(0x00);
switch(i) }}
}
定時 計數器的原理和應用
定時 計數器實質上是乙個加1計數器,計數值是存在thx,tlx x取0或1 這2個8位的暫存器裡的.它隨著計數器的輸入脈衝進行自加1,也就是每來乙個脈衝,計數器就自動加1,當加到計數器為全1時,再輸入乙個脈衝就使計數器回零,且計數器的溢位使相應的中斷標誌位置1,向cpu發出中斷請求 定時 計數器中斷...
定時計數器
1 工作方式0 當tmod中的m1,m2設定成0,0時,定時器 計數器就工作在方式0,工作方式0是一種13位定時器 計數器方式。可用來測量外訊號的脈衝寬度所持續的時間。2 工作方式1 工作方式1為16位定時器 計數其結構和操作與工作方式0基本相同,唯一的區別是工作方式1的計數器由tl0的8位和th0...
可程式設計定時 計數器應用實驗
了解定時器 計數器 8253 的原理,掌握編制定時器 計數器程式設計方法。設計連線和程式,以1mhz的訊號為時鐘訊號,利用 8253 產生1s的定時控制發光二極體變化。使用者時鐘的1mhz輸出接 8253 的clk1。8253 的gate1接 5v 在實驗箱的左上角和右上角 8253out1接 82...