51单片机的电子钟c语言程序,基于51单片机的电子钟C语言程序
时间: 2023-11-10 16:06:32 浏览: 44
以下是一个基于51单片机的电子钟C语言程序的示例:
```c
#include <REG51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示码表
uchar hour = 12, minute = 0, second = 0; // 时间变量
uchar flag = 0; // 时间变化标志
void delay(uint t) // 延时函数
{
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display(uchar h, uchar m, uchar s) // 数码管显示函数
{
uchar h1, h2, m1, m2, s1, s2;
h1 = h / 10;
h2 = h % 10;
m1 = m / 10;
m2 = m % 10;
s1 = s / 10;
s2 = s % 10;
P2 = 0xff;
P0 = table[h1];
P2 = 0xfe;
delay(1);
P2 = 0xff;
P0 = table[h2];
P2 = 0xfd;
delay(1);
P2 = 0xff;
P0 = table[m1];
P2 = 0xfb;
delay(1);
P2 = 0xff;
P0 = table[m2];
P2 = 0xf7;
delay(1);
P2 = 0xff;
P0 = table[s1];
P2 = 0xef;
delay(1);
P2 = 0xff;
P0 = table[s2];
P2 = 0xdf;
delay(1);
}
void timer0Init() // 定时器0初始化函数
{
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器0初始值
TL0 = 0x18;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
}
void main()
{
timer0Init();
while (1)
{
if (flag) // 时间变化标志为1时,刷新数码管显示
{
flag = 0;
display(hour, minute, second);
}
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xfc; // 重装定时器0初始值
TL0 = 0x18;
second++; // 秒加1
if (second >= 60)
{
second = 0;
minute++; // 分加1
}
if (minute >= 60)
{
minute = 0;
hour++; // 时加1
}
if (hour >= 24) hour = 0;
flag = 1; // 时间变化标志置1
}
```
该程序通过定时器0中断实现时间的自动更新,通过数码管显示函数 `display()` 实现时间的显示,通过时间变化标志 `flag` 控制数码管显示的刷新。在 `timer0()` 中断服务函数中,每秒钟将时间变量加1,并判断是否需要进位,最终将时间变化标志 `flag` 置1。程序中使用了51单片机的定时器0、中断、IO口等功能,可以通过更改程序中的时间变量和数码管显示码表来实现不同功能的电子钟。