51单片机时分秒计时器
时间: 2023-12-20 13:05:18 浏览: 117
以下是51单片机时分秒计时器的代码实现,其中使用了定时器和中断服务函数,以及数码管的动态显示:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示0~9的编码
uchar hour = 0, minute = 0, second = 0; // 时分秒变量
void delay(uint xms) // 延时函数
{
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display() // 数码管动态显示函数
{
uchar i;
for (i = 0; i < 8; i++)
{
switch (i) // 选择哪个数码管显示
{
case 0:
P2 = 0xfe;
break;
case 1:
P2 = 0xfd;
break;
case 2:
P2 = 0xfb;
break;
case 3:
P2 = 0xf7;
break;
case 4:
P2 = 0xef;
break;
case 5:
P2 = 0xdf;
break;
case 6:
P2 = 0xbf;
break;
case 7:
P2 = 0x7f;
break;
}
P0 = table[hour / 10]; // 显示小时的十位
delay(5);
P0 = table[hour % 10]; // 显示小时的个位
delay(5);
P0 = 0x00; // 关闭数码管
P0 = table[minute / 10]; // 显示分钟的十位
delay(5);
P0 = table[minute % 10]; // 显示分钟的个位
delay(5);
P0 = 0x00; // 关闭数码管
P0 = table[second / 10]; // 显示秒钟的十位
delay(5);
P0 = table[second % 10]; // 显示秒钟的个位
delay(5);
P0 = 0x00; // 关闭数码管
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = (65536 - 50000) / 256; // 重新赋初值
TL0 = (65536 - 50000) % 256;
second++; // 秒钟加1
if (second == 60) // 如果秒钟达到60
{
second = 0; // 秒钟清零
minute++; // 分钟加1
if (minute == 60) // 如果分钟达到60
{
minute = 0; // 分钟清零
hour++; // 小时加1
if (hour == 24) // 如果小时达到24
{
hour = 0; // 小时清零
}
}
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 50000) / 256; // 定时器0初值
TL0 = (65536 - 50000) % 256;
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
while (1)
{
display(); // 数码管动态显示
}
}
```
阅读全文