学过一段时间单片机的你发现,中断服务函数可以在主函数进行的同时,进行一些对时间要求高的模块的配置时,则要用到定时器中断。而如果你要实现多个功能的操作,会使用多个定时器是必要的STC89C51单片机所有的资源中最不好搞清楚的就是定时器2,尤其是对于那些以前从来没有玩过单片机的新手。定时器2是新增资源,也是51单片机定时器里面功能最强大的一个定时器。
定时器2有三个模式,在这里我们只是介绍系统的简单配置与将定时器2当成一般递增/递减计数器的使用代码,剩下的模式可以自己查阅手册:
下面我带着大家简单配置一下:
手册上写着T2CON是可位寻址的。意思就是可以单独对一个位进行配置。打开单片机的头文件#include <REGX52.H>,可以看到,这些位的具体定义。
TH2,TL2为大家熟悉的定时器计数初值的配置,RCAP2L与RCAP2H称作陷阱寄存器,用作重装载值的配置。可以在DECN=0的原理图里看到reload字样,表示重装载
需要我们手动配置的也就是TF2(定时器溢出标志)和TR2(定时器开关)剩下的寄存器一部分配置定时器的工作模式,这里选择16位自动重装,所以都配置为0
EXEN2,由于我们不使用捕获模式,所以不用,将其置0.
这里需要我们配置的寄存器比较少,所以采用T2CON = 0;先将所有位都置0,然后再按位寻址,
源码/模板:
/**
* @brief 定时器2初始化,1毫秒@11.0592MHz
* @param 无
* @retval 无
*/
void Timer2_Init(void)
{
T2MOD = 0; //初始化模式寄存器
T2CON = 0; //初始化控制寄存器
TL2 = 0x66; //设置定时初值
TH2 = 0xFC; //设置定时初值
ET2=1;
EA=1;
PT2=0;
TR2 = 1; //定时器2开始计时
}
//中断服务函数模板
void Timer2_Routine() interrupt 5
{
TF2 = 0; //中断标志复位
RCAP2L = 0x66 //设置低位定时初值
RCAP2H = 0xFC //设置高位定时初值
/***/
}
————————————————
#include <STC89C5xRC.H>
void InitT0(){
TMOD=0X01;
TH0=0XFC;
TL0=0x66;
ET0=1;
TR0=1;
}
void servicet0() interrupt 1{
static unsigned int t_1s=0;
TH0=0XFC;
TL0=0x66;
t_1s++;
if(t_1s>=1000){
t_1s=0;
P00=~P00;
}
}
void InitT2(){
T2MOD = 0; //初始化模式寄存器
T2CON = 0; //初始化控制寄存器
TL2 = 0x66; //设置定时初始值
TH2 = 0xFC; //设置定时初始值
RCAP2L = 0x66; //设置定时重载值
RCAP2H = 0xFC; //设置定时重载值
TR2 = 1; //定时器2开始计时
PT2=0; //感觉比定时器0快一些
ET2=1;
}
void servicet2() interrupt 5{
static unsigned int t_1s=0;
TF2=0;
t_1s++;
if(t_1s>=1000){
t_1s=0;
P01=~P01;
}
}
void main(){
InitT0();
InitT2();
EA=1;
P1=(P1&0XE0)|0X0E;
while(1){
}
}
原文链接:https://blog.csdn.net/qq_60521516/article/details/124450447