计数器应用包括通话、短信、数据等类别的记录,并支持用户自主选择清零日期,以及按照类别添加提醒数值,如用户可以选择每月任一一天,或者第一天、最后一天作为记录循环清零日,同时添加通话时长、短信条数、数据流量数量的提醒节点。计数器的应用极为广泛,不仅能用于计数,还可用于分频、定时,以及组成各种检测电路和控制电路。为了使用方便,在有些单片集成计数器上还附加了异步置零、预置数、保持等功能,并设置了相应的控制端。
在数字电子技术中应用的最多的时序逻辑电路。计数器不仅能用于对时钟脉冲计数,还可以用于分频、定时、产生节拍脉冲和脉冲序列以及进行数字运算等。但是并无法显示计算结果,一般都是要通过外接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次机器周期。
评论
查看更多