#include <reg51.h>
#define DISPLAY_PORT P0
unsigned char hour = 0; // 小时
unsigned char minute = 0; // 分钟
unsigned char second = 0; // 秒
void delay(unsigned int); // 延时函数
void displayTime(unsigned char); // 显示时间函数
void main()
{
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 定时器初值为0xFC67,定时1ms
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断允许
while (1)
{
displayTime(hour * 100 + minute); // 显示小时和分钟
delay(1000); // 延时1秒
second++; // 秒数加1
if (second >= 60)
{
second = 0;
minute++; // 分钟数加1
if (minute >= 60)
{
minute = 0;
hour++; // 小时数加1
if (hour >= 24)
{
hour = 0;
}
}
}
}
}
// 定时器0中断处理函数
void timer0_ISR(void) interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67;
}
// 延时函数
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 114; j++);
}
}
// 数码管显示函数
void displayTime(unsigned char time)
{
unsigned char units, tens;
units = time % 10; // 取个位数
tens = time / 10; // 取十位数
DISPLAY_PORT = ~(0x01 << 7); // 点亮第一个数码管(个位)
DISPLAY_PORT = ~(0x01 << units); // 显示个位数
delay(5); // 延时一段时间
DISPLAY_PORT = ~(0x01 << 6); // 点亮第二个数码管(十位)
DISPLAY_PORT = ~(0x01 << tens); // 显示十位数
delay(5); // 延时一段时间
}