stc89c52rc的单片机自带了三个定时器,T0,T1,T2。
在sfr特殊功能寄存器中,给每个定时器都分配了两个8bit的空间用于计数。也就是最多计数2的10次方。
当这两个八位的计数空间计数满(也就是变为11111111 11111111)后就会触发定时器中断,执行相应中断触发后设置执行的代码。
在sfr中还有个TCON的区域,用来控制定时器中断。如定时器是否中断的标志位,启动定时器的标志位。
sfr中还有一个TMOD区域,用来配置定时器的模式,比如两个8位都用来计数,计数完成后手动将其置为初始值。或者只用其中一个8位来计数,另一个8位用来记录初始值,在计数完成后自动置为初始值。还有其他模式一共有4中模式,这些模式的配置就在这块区域。还有配置用来计数还是定时:定时的时候输入的频率来源就是晶振,计数的话频率来源可以由外部输入信号或者自己设置。
标准的51单片机是12T的,stc89c52就是12T的,也就是12个晶振的周期就是一个机器周期(即cpu进行一次最小操作所用的时间),这里的定时器如果用于定时的话就是一个机器周期进一位,如果我们使用的是12MHz的晶振,那么一个机器周期就刚好是1微秒,也就是定时器滴答一下就是1微秒,而最多两个8位用于计数,也就是最大定时65532微秒。如果围殴么需要的计数周期小于65532微秒就可以通过给两个8位计数器赋初始值的方式减少计数次数。如果大于65532微秒就需要采用其他的方式了。
#include <reg52.h>
#include <intrins.h>
sbit Buzzer = P3^6;//定义蜂鸣器
void timer0() interrupt 1//编号为1的中断器就是定时器0
{
TH0 = 255;//在中断触发的时候首先给定时器的低八位和高八位赋为初值
TH0 = 206;
Buzzer = ~Buzzer;
}
void main()
{
TMOD=0x01;//设置定时器的模式为16位
TH0 = 255;//为定时器的低八位和高八位赋为初值
TL0 = 206;
ET0 = 1;//允许定时器中断
EA=1;//允许中断器的触发
TR0=1;//开始计数
while(1);
}
注意:TH0和TL0的计算。这里我们希望定时器的触发时50微秒,也就是计数50次,就需要给低八位和高八位赋初始值。计算公式为:TH0 = (65536-50)/256=255 TL0=(65536-50)%256