主函数
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"
unsigned char Sec = 55,Min = 59,Hour = 23;
void main()
{
LCD_Init(); //初始化LCD1602显示屏
Timer0Init(); //调用 Timer0Init() 函数初始化定时器0,并设置中断
LCD_ShowString(1,1,"Clock:"); /*使用 LCD_ShowString() 和 LCD_ShowNum()
函数在LCD上显示初始的时钟字符串和时间*/
LCD_ShowString(2,1," : :");
while(1) //无限循环,在每次迭代中调用 LCD_ShowNum()
//函数更新LCD上的时间显示。
{
LCD_ShowNum(2,1,Hour,2);
LCD_ShowNum(2,4,Min,2);
LCD_ShowNum(2,7,Sec,2);
}
}
void Time0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18;
TH0 = 0Xfc; //使用 TL0 和 TH0 设置定时器0的初始值
T0Count++; //在每次中断中,T0Count 自增并进行判断
if(T0Count>=1000) //如果 T0Count 达到 1000(约为1秒),
//则将其重置为 0,并进行时间递增操作。
{
T0Count = 0; //时间递增的逻辑为:秒数 Sec 自增,
//如果秒数超过等于 60,则秒数重置为 0,
//分钟数 Min 自增,如果分钟数超过等于 60,则分钟数重置为 0,
//小时数 Hour 自增,如果小时数超过等于 24,则小时数重置为 0
Sec++;
if(Sec>=60)
{
Sec=0;
Min++;
if(Min>=60)
{
Min = 0;
Hour++;
if(Hour>=24)
{
Hour = 0;
}
}
}
}
}
定时器初始化函数
#include <REGX52.H>
/*
*:定时器初始化
*/
void Timer0Init(void)
{
//TMOD = 0X01; //0000 0001
TMOD = TMOD&0xF0; //把低四位清0,高四位不变;配置 TMOD 寄存器:通过位运算清零低四位,保留高四位,并将最低位置1,以设置定时器0的工作方式
TMOD = TMOD|0x01; //把最低位置1,高四位不变
TL0 = 0x18;
TH0 = 0Xfc; //设置定时初始值
TF0 = 0;
TR0 = 1;
ET0 =1;
EA=1; //打开总中断开关
PT0=0;
}
/* 定时器模板
void Time0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18;
TH0 = 0Xfc; //设置定时初始值
T0Count++;
if(T0Count>=1000)
{
T0Count = 0;
P2_0 = ~P2_0;
}
}
*/
代码解读:
这段代码是一个定时器初始化函数
Timer0Init()
的定义,用于初始化8051单片机的定时器0。在函数内部的操作包括:
- 配置
TMOD
寄存器:通过位运算清零低四位,保留高四位,并将最低位置1,以设置定时器0的工作方式。- 设置
TL0
和TH0
的初始值:将TL0
设置为 0x18,将TH0
设置为 0xFC,这是用来控制定时器0计数的初值。- 清除定时器0溢出标志
TF0
。- 启动定时器0:将
TR0
设置为 1,启动定时器0的计数。- 允许定时器0中断
ET0
,使能定时器0中断。- 打开总中断开关
EA
,允许中断的触发。- 设置定时器0中断的优先级
PT0
。这段代码的作用是初始化定时器0,使其开始工作并能够触发中断。
在使用这段代码时,需要在主程序中调用
Timer0Init()
函数来初始化定时器0,以启动定时器的计数和中断功能。