一、定时器
stc89c52 具有三个定时器 (T0 T1 T2)
(1)T0、T1均有四种模式
最常用模式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驱动函数】
详见前一篇文章
(三)最终成品
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)