计数器的工作原理 计数器是一种基本的数字电路,可对输入的数字时钟(脉冲)进行计数,根据计数方向可分为加法计数器、减法计数器、可逆计数器等。 十进制加法计数器如下图
加法计数器在数字时钟的驱动下,如上图中,每个上升沿的到来,就使计数值加一,其数值为0-->9,每次数值满时就会产生一个进位(溢出)信号。 定时器的本质 定时器的本质就是已知频率(周期)的数字时钟(脉冲)驱动下的计数器。比如上面的计数器,如果已知驱动时钟为1MHz,那么每个时钟周期为1us,十个计数周期就是10us,其溢出周期为10us,也可视为定时10us。如果想定时5us,则计数5个周期即可。8051的基本定时器有Timer0和Timer1,STC15F2K61S的定时器有T0、T1、T2。其T0的基本结构如下图所示(其他定时器基本类似)
定时器T0的核心是一个16位、可置数的加法计数器。配置寄存器包括:时钟源选择、方式控制、加载(初值)、中断允许等。 定时器的软件编程 以定时器T0为例,定时器编程的步骤为: (1) 确定定时器/计数器的工作方式----初始化:TMOD (2) 定时器0/1工作频率1T还是12T:AUXR (3) 定时器0/1的时钟输出是否:AUXR2 (4) 计算定时器/计数器的计数初值,装载TH和TL寄存器。 (5) 中断设置(特殊功能寄存器IE、IP):EA (6) 启动定时/计数器(TCON):TR0/TR1
相关寄存器:
定时初值的计算: 前面讲了,定时器是一个16位的加法计数器,对输入脉冲进行计数,从0计到65535 (2^16-1),然后进位溢出。软件通过溢出标志位TF0进行定时的判断,因此计数器计了多少个脉冲,是从初值开始到65535溢出,这个脉冲计数值才是其定时器的定时周数。比如工作时钟12MHz,默认12分频,即加法计数器的计数脉冲是1MHz,即计数周期1us,如果要定时1ms,则需要计数1ms/1us=1000个计数周期。先设置初值为(65536-1000),那么计数器溢出的时候它总共计数了65536-(65536-1000)=1000个周期。 因此定时器初值x的计算公式是: 其中fosc为工作频率,t为所需的定时时间。 基本定时器实验 运用定时器进行“延时”是最基本的应用。与前面的“软件延时”对应,采用定时器延时的方式,我们成为“硬件延时”。 LED灯的硬件电路如附件
LED灯L1闪烁 设定50ms亮灭1次(延时太短,人眼不能分辨出LED灯闪烁)。以STC-ISP下载界面中默认的11.0592MHz时钟频率计算,12分频,则计数器的初值应为65536-50ms*11.0592MHz/12=65536-46080=19456 定时器初始化代码为: TMOD=0; AUXR=0; TH0=19456/256; //整除取整,得高8位 TL0=19456%256; //取余,得低8位 ET0=1;EA=1; //中断使能,不采用中断,应清零 TR0=1; //开启定时器,相当于开关 (1) 采用轮询的方式
(2) 采用中断的方式 定时器T0的中断号为1
LED灯单盏灯从左到右流水 设计分析:这里采用定时中断的方式,设定一个LED灯显示变量x(8bit分别对应8盏LED灯,主程序中根据这个显示变量x去控制LED灯的亮灭;而定时中断服务程序“定时到,就移位1次”。这样就变成两个进程:主程序不停地输出控制LED;中断服务程序定时改变控制变量。
|