个人觉得定时器是一个十分重要的内容,这东西忘简单说其实就是一个计数器,从设定的初始值开始加一操作,每当计数器满了,引发一次计数器中断,芯片的CPU过来进行中断处理,然后一直重复这样的过程。替代长时间的Delay,提高CPU的运行效率和处理速度。
首先,我们来考虑第一个问题,定时器的代码如何书写?好消息!不用自己写!继续使用STC-ISP生成即可。
一、 定时器原理
注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。
STC89C52的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器
注意下图的代码
注意:第一行AUXR用不到,可以直接删除。
主要操作的是TMOD,TL0,TH0,TF0,TR0。我们依次学习:
1.1 T0模式1的原理图
先看时钟部分:
可以通过SYSclk系统时钟(就是晶振,十分稳定)进行6分频,12分频作为计数器的时间源。(c/t = 0)
或者可以使用T0 Pin这样一个外部时钟来提供时间源。直接接在单片机的P3_4接口上。(c/t = 1)
再看计时部分:
因为是16BIT,所以最大存储65535。每来一次脉冲,这里的数字就会+1,直到达到我们的最大值65535时,下一个脉冲,就会溢出,使得设置标志位TF0,然后申请中断,执行终端任务。
最后再看中断部分
中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3).中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等
我们在定时器0的中断用到的就是,interrupt 1.
1.2 TMOD 计时器工作模式寄存器
我们通过对TMOD进行设置,调整工作模式。
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
我们解读一下这个代码TMOD = 1111 0000,然后变成1111 0001。使得定时器1不工作,计时器0工作在16位的THL0+TH0模式。TL+TH有自己独立的地址,直接赋值即可。
1.3 TCON 计时器控制寄存器
一般不直接使用TCON控制所有寄存器,而是直接操纵位如上面代码的TF0,TR0。
二、定时器实现 -- 时钟跳动
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"
unsigned char Sec=55,Min=59,Hour=23;
void main()
{
LCD_Init();
Timer0Init();
LCD_ShowString(1,1,"Clock:"); //上电显示静态字符串
LCD_ShowString(2,1," : :");
while(1)
{
LCD_ShowNum(2,1,Hour,2); //显示时分秒
LCD_ShowNum(2,4,Min,2);
LCD_ShowNum(2,7,Sec,2);
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count>=1000) //定时器分频,1s
{
T0Count=0;
Sec++; //1秒到,Sec自增
if(Sec>=60)
{
Sec=0; //60秒到,Sec清0,Min自增
Min++;
if(Min>=60)
{
Min=0; //60分钟到,Min清0,Hour自增
Hour++;
if(Hour>=24)
{
Hour=0; //24小时到,Hour清0
}
}
}
}
}
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
这里采用了分模块编写的方式,方便以后直接进行调用,为了方便查看,我把初始化方法放在下面了。
分析上述代码:1、我们静态显示“:”,所以放在while之外。2、在while中我们只做一件事不断刷新显示我们的数据。3、数据如何刷新?通过中断函数刷新,我们的计时器我们设置为1Mhz的频率,所以每记满1000次则是1s,所以我们在终端中每1000次加一次sec。4、注意进位,sec每60清0一次,min加一,min每60进一,hour加一,hour大于等于24则为0.
三、总结
其实计时器的操作简单总结分为以下几步:
1、计时器初始化,设定工作模式,设定初值,设定中断,设定使能。
2、写计时器的中断函数,此处记得要重新给计时器赋初值,然后还可以通过for循环延长我们的计时时间
3、写主函数逻辑
标签:定时器,Hour,C51,中断,模式,---,TMOD,计时器 From: https://blog.csdn.net/SPIRITE_SYF/article/details/139388956