前言
定时器作为单片机的内设用途十分广泛:控制信号的采样周期、产生周期信号、测量单片机运行时间、时间片轮转多线程…
关于51单片机定时器的详细解释在我的另外一篇文章:51单片机定时器中有介绍,这里就不再重复了,本篇文章主要是介绍蓝桥杯比赛中需要知道的定时器模式等,介绍如何快速使用编写代码。
定时器配置
- 在比赛的时候可以使用STC-ISP软件来对定时器的模式和初值进行配置;
- 系统频率:你所使用的晶振频率;
- 选择定时器:一般51单片机常用的是定时器0和定时器1;
- 定时器模式:16位就是0xFFFF=65535次计数容量
- 定时器时钟(FOSC):1T则是晶振频率为单位的一个周期,12T则是12次晶振震荡周期作为定时器计数一次;
定时器中断
通过ISP工具配置完定时器之后,是没有开启定时器中断的,这里还需要我们去在初始化定时器后,再去配置中断寄存器;
51单片机中断允许寄存器IE
位序号 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
位符号 |
EA |
– |
ET2 |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
- EA:全局中断(中断总开关)
- ET2、ET1、ET0:定时器2,定时器1,定时器0中断
- ES:串口中断
- EX1、EX0:外部中断
所以我们如果想开启定时器0中断,那么需要使能EA和ET0
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
/*上述的代码是ISP工具生成的定时器的模式初值设置代码,如果要开启中断则要自己写下面两句,开启中断*/
EA=1;//开启总中断
ET0=1;//开启定时器0中断
}
中断服务函数
51单片机的中断服务函数是在正常函数定义后面加上interrupt 中断服务号
来编写的,中断服务号就存储了对应中断源的中断入口地址;
- 定时器0:interrupt 1
- 定时器1:interrupt 3
void Time0Isr() interrupt 1 //定时器0中断回调函数
{
static uint8_t num=0;
if(num<100)
{
num++;
}
else
{
LED1=~LED1;//中断服务函数,如果是定时器没有自动重装载的话记得在这里重装初始,即设置:TH0和TL0的值
num=0;
}
}