写一个基于51单片机的电子钟
时间: 2024-02-05 22:10:29 浏览: 20
好的,下面是一个基于51单片机的电子钟的程序:
```c
#include <reg51.h>
// 定义数码管位选和段选的端口
#define LED_COM P2
#define LED_SEG P0
// 定义常量
#define HOUR 0x80
#define MINUTE 0x40
#define SECOND 0x20
// 定义变量
unsigned char hour = 0;
unsigned char minute = 0;
unsigned char second = 0;
// 定义函数
void delay(unsigned int t);
void display(unsigned char num, unsigned char point);
void main()
{
// 初始化定时器
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x4C; // 定时器0初始值为0x4C06,1ms中断一次
TL0 = 0x06;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 开始计时
while (1)
{
// 时、分、秒加1
second++;
if (second == 60)
{
second = 0;
minute++;
if (minute == 60)
{
minute = 0;
hour++;
if (hour == 24)
{
hour = 0;
}
}
}
// 显示时、分、秒
display(hour, HOUR);
delay(5);
display(minute, MINUTE);
delay(5);
display(second, SECOND);
delay(5);
}
}
// 延时函数
void delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++)
{
for (j = 0; j < 1000; j++);
}
}
// 显示函数
void display(unsigned char num, unsigned char point)
{
unsigned char i, j;
unsigned char code seg[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; // 数码管段选码表
// 分离十位和个位
i = num / 10;
j = num % 10;
// 显示十位
LED_COM = point;
LED_SEG = seg[i];
delay(1);
// 显示个位(带小数点)
LED_COM = point | 0x10;
LED_SEG = seg[j] | 0x80;
delay(1);
// 关闭显示
LED_COM = 0;
LED_SEG = 0;
}
```
这个电子钟使用了定时器中断来计时,并且使用了数码管来显示时、分、秒。在主函数中,时、分、秒会每秒钟自动加1,并且通过`display()`函数来显示在数码管上。`delay()`函数用于延时,以控制数码管刷新的频率。注释中有详细的解释,希望对你有帮助!