計數器應用包括通話、短信、數據等類別的記錄,并支持用戶自主選擇清零日期,以及按照類別添加提醒數值,如用戶可以選擇每月任一一天,或者第一天、最后一天作為記錄循環清零日,同時添加通話時長、短信條數、數據流量數量的提醒節點。計數器的應用極為廣泛,不僅能用于計數,還可用于分頻、定時,以及組成各種檢測電路和控制電路。為了使用方便,在有些單片集成計數器上還附加了異步置零、預置數、保持等功能,并設置了相應的控制端。
在數字電子技術中應用的最多的時序邏輯電路。計數器不僅能用于對時鐘脈沖計數,還可以用于分頻、定時、產生節拍脈沖和脈沖序列以及進行數字運算等。但是并無法顯示計算結果,一般都是要通過外接LCD或LED屏才能顯示。
計數初值
定時器的初值的計算如下:在定時器模式下,計數器的計數脈沖來自于晶振脈沖的12分頻信號,即對機器周期進行計數。若選擇12M晶振,則定時器的計數頻率為1MHZ。假設定時時間為T,機器周期為T1,即12/晶振頻率。X為定時器初值。則 X=2^n-T/T1。方式0,n=13,方式1時,n=16,方式2和方式3,n=8
本題技術初值計算如下:
X=2^16-100*10^(-3)/(12/6*10^6)
=65536-50000=15536=3CB0H
123 MOV TMOD,#01H;控制字
MOV TH0,#3CH;初值高位
MOV TL0,#0B0H;初值低位
計數器的初始化與計數初值的計算
一。 定時/計數器的初始化
初始化程序應完成如下工作:
1)。 對TMOD賦值, 以確定T0和T1的工作方式。
2)。 計算初值, 并將其寫入 TH0, TL0 或者 TH1, TL1.
3)。 使用中斷方式時, 則對IE賦值, 開放中斷。
4)。 使 TR0 或 TR1 置位, 啟動定時/計數器的定時或計數。
二。 初值的計算
假設定時器工作在方式1, 則位數是16位。 定時器一旦啟動, 便在原來的數值上開始加1計數。 如果程序開始時, 我們沒有設置TH.x和TL.x, 則它們的默認值為0. 假設時鐘頻率為12MHz, 12個時鐘周期為一個機器周期, 那么此時機器周期就是1us, 計滿TH.x 和TL.x 就需要: 計數最大值-1; 再來一個脈沖, 計數器就會溢出, 隨即向CPU申請中斷。 因此溢出共需要65536us, 約等于65.5ms.
例如要定時50ms, 那么就要先給TH.x和TL.x裝初值。 TH.x和TL.x 中應該裝入的總數是65536 - 50000 = 15536; TH.x = 15536 / 256 = 60; TL.x = 15536 % 256 = 176; 在這個初值的基礎上級50000個數后就溢出, 此時剛好就是50ms中斷一次。
例如要定時1s, 但是定時/計數器的最大定時時長為65536us, 不夠。 那么我們可以設定定時50ms, 重復20次, 就剛好是1s了。(20次50ms就剛好是1s)。
三。 例子代碼
[cpp] view plain copy// P1口大約1s置反一次
#include《reg52.h》 // 包含特殊功能寄存器的定義
#define LED P1 // 宏定義LED代表P1
unsigned char ucCount = 0;
// 定時器初始化子程序
void Init_Timer0(void)
{
TMOD = 0x01; // 不影響定時計數器T1
// 使用定時計數器T0(GATE 0, C/T 0, M1 0, M0 1)
// 使用模式1, 16位定時器。
TH0 = (65536 - 50000) / 256; // 計數器計數初值, 這里使用定時器最大值從0開始計數一直到65535溢出
TL0 = (65536 - 50000) % 256;
EA = 1; // 總中斷打開
ET0 = 1; // 定時器中斷打開
TR0 = 1; // 定時器開關打開
}
void main()
{
Init_Timer0();
P1 = 0xFF;
while(1);
}
// 中斷函數
void Timer0_isr(void) interrupt 1 using 1
{
TH0 = (65536 - 50000) / 256; // 計數器計數初值, 這里使用定時器最大值從0開始計數一直到65535溢出
TL0 = (65536 - 50000) % 256;
++ucCount;
if(19 == ucCount)
{
LED = ~LED; // 指示燈反相,可以看到閃爍
ucCount = 0;
}
}
單片機計數器初值計算方法
計算:
1.晶振12M
12MHz除12為1MHz,也就是說一秒=1000000次機器周期。10ms=10000次 機器周期。 65536-10000=55536(d8f0) TH0=0xd8,TL0=0xf0
2.晶振11.0592M
11.0592MHz除12為921600Hz,就是一秒921600次機器周期,10ms=9216次機器周期。
評論
查看更多