定时器的简单应用——计时器

一、定时器

STC89C52具有三个定时器 (T0 T1 T2)

(1)T0、T1均有四种模式

​ 模式0(13位定时器/计数器)

​ 模式1(16位定时器/计数器)

​ 模式2(8位自动重装模式)

​ 模式3(两个八位计数器)

​ 其中最常用模式1

(2)定时器模式1工作框图

SYSclk(系统时钟) 这里指开发板上的晶振评率

定时器和计数器部分不再赘述,可以靠工具生成。

(3)中断程序

详细参考开发手册

二、计时器程序展示

【主函数】

#include <REGX52.H>
#include "Timer0.h"
#include "Delay.h"
#include "LCD1602.h"
 
unsigned int hour=0,min=0,sec=0;//对时分秒进行定义和赋值
unsigned int Timer0Count=0;	//定时器设定为没10毫秒打断一次,当目的是每1秒钟让秒数加一,就让定时器打断100次,总时长为1秒,而这个变量就是用来计定时器打断的次数。
void main()
{
	Timer0Init();							//定时器初始化
	LCD_Init();								//显示器初始化
	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 Timer0Routine() interrupt 1		//中断
{
	TL0 = 0x00;							//设置定时初值,让定时器重新开始计时			
	TH0 = 0xDC;							//设置定时初值【注意:这里的定时初值要与函数Timer0Init内的初值一样】
	Timer0Count++;						//每10ms打断一次,计数器加1
	if(Timer0Count>=100)				//当计数器到100,即经过1秒后让秒加一,然后时分做出响应变化
	{
		Timer0Count=0;
		sec++;
		if(sec>=60)
			{
				min++;
				sec=0;
				if(min>=60)
				{
					hour++;
					min=0;
					if(hour>=24)
					{
						hour=0;
					}
				}
			}
		}
	}

【定时器初始化函数】

#include <REGX52.H>
void Timer0Init(void)		//10毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;        //中断初始化【程序生成的函数内没有这个】
	EA=1;					//中断初始化
	PT0=0;				//中断初始化
}
 
 
//主函数中断示例
//void Timer0Routine() interrupt 1		//中断
//{
//	TL0 = 0x00;												//设置定时初值,让定时器重新开始计时			
//	TH0 = 0xDC;												//设置定时初值【注意:这里的定时初值要与函数Timer0Init内的初值一样】
//	Timer0Count++;										//每10ms打断一次,计数器加1
//	if(Timer0Count>=100)							//当计数器到100,即经过1秒后让秒加一,然后时分做出响应变化
//	{
//				
//	
//	}

【LCD1602驱动函数】

详见前一篇文章

(三)最终成品