80c51的定时器
80c51单片机内有两个可编程的定时/计数器T0、T1。它们是一个16位计数器,分别由一个高8位和一个低8位的寄存器组成的。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
定时/计数器的工作原理
定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。
工作方式寄存器TMOD
GATE:门控制
0时:仅有运行控制位TRx来控制定时/计数器的开启
1时:由TRx和外部中断脉冲计数(用于计算外部中断负跳变 的次数)
C/T:计数器模式和定时器模式选择
0时:选择定时器模式
1时:选择为计数器模式
M1和M0:选择定时/计数器的工作方式
定时器/计数器控制寄存器TCON
-
IT0和IT1是设置外部中断的触发方式
当其为0时,为低电平触发方式
当其为1时,为负跳变触发方式
-
IE0和IE1是外部中断标志位
-
TF0和TF1是定时器的中断标志
-
TR1和TR0是打开相应的定时器
-
其他的是定时/计数器的控制
定时/计数器的工作方式
-
方式1
方式1为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
-
方式2
方式2的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器 。
-
方式3
方式3为自动重装初值的8位计数方式。
-
方式4
方式4只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
定时器操作步骤:
选择工作方式(设置M1,M0)
选择控制方式(设置GATE)
选择定时器还是计数器模式(设置C/T)
给定时/计数器赋初值(设置THx和TLx)
开启定时器中断(设置ET0或ET1)
开启总中断(设置EA)
打开计数器(设置TR1或TR0)
定时器小程序
void TimerConfiguration()
{
TMOD = 0x01; //定时器0选择工作方式1
TH0 = 0x3C; //设置初始值
TL0 = 0xB0;
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
单片机之定时器LED程序
实验效果 :LED每隔500ms左移一次
void main(void)
{
Time=0;
GPIO_LED=0XFE;
TimerConfiguration();
while(1)
{
if(Time==10)
{
GPIO_LED=_crol_(GPIO_LED,1);
Time=0;
}
}
}
void TimerConfiguration()
{
TMOD = 0x01; //选择工作方式1
TH0 = 0x3C; //设置初始值,定时50MS
TL0 = 0xB0;
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
void Timer0() interrupt 1
{
TH0 = 0x3C; //设置初始值
TL0 = 0xB0;
Time++;
}