重点学习51单片机定时器1工作在模式0的应用。
在51单片机中,定时器1工作在模式0,它和定时器0一样,TL1占低5位,TH1占高8位,合计13位,也是向上计数。
1、定时器1工作在模式0
1)、定时器1工作在模式0的框图:
2)、定时器1输入时钟:
①、TMOD寄存器的bit6(C/T)=0,定时器输入时钟为CPU时钟经过12分频后得到的。
②、TMOD寄存器的bit6(C/T)=1,定时器输入时钟为来自T1引脚(P3.5),我们也可以理解为计数脉冲。
3)、定时器1启动:
①、当TMOD寄存器的bit7(GATE)=0时,将TR1=1,则会启动定时器1;
②、当TMOD寄存器的bit7(GATE)=1时,给INT1引脚(P3.3)施加高电平,同时TR1=1,则会启动定时器1;
4)、定时器1溢出标志TF1建立的条件
TH1和TL1从装载的初始值开始计数,直到TH1和TL1从0x1FFF变成0x2000时产生溢出,此时定时器1的溢出标志TF1=1;
5)、定时器1产生中断条件
定时器1的溢出标志TF1=1
定时器1的中断使能位ET1=1
总中断使能位EA=1
只有这3个条件同时满足,定时器1才会进入到中断服务程序。
6)、定时器1工作在模式0的初始化程序
#define T1_Load_Value (0x2000-3000) //配置T0为3000us中断一次;
//函数功能: 定时器1工作在模式0的初始化;
void timer1_initializtion(void)
{
TMOD &= 0x0F;//清除高4位
//TMOD寄存器的bit6(C/T)=0,定时器输入时钟为CPU时钟经过12分频后得到的
//配置Timer1为方式0(13位定时器)
//设置GATE1=0,即不允许外部INT1脚控制Timer1;
TL1=T1_Load_Value&0x1F; //手动装载最低5位值;
TH1=T1_Load_Value>>5; //手动装载剩下的8位值;
TR1=1; //当GATE1=0时,TR1=1,表示启动T1开始工作;
ET1=1; //允许Timer1中断;
EA=1; //开总中断允许位;
}
//函数功能: Timer1的中断服务函数,每3000us中断一次;
void timer1_interrupt_program() interrupt 3 using 1
{ TL1=T1_Load_Value&0x1F; //手动装载最低5位值;
TH1=T1_Load_Value>>5; //手动装载剩下的8位值;
///其它处理程序///
}
void main(void)
{ timer1_initializtion(); //定时器1工作在模式0的初始化;
while(1);
{
}
}