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