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





















評論