51单片机8位数码管时钟程序
时间: 2023-08-05 18:25:31 浏览: 101
51单片机8位数码管-简单时钟
下面是一个简单的51单片机8位数码管时钟程序:
```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
};
sbit DIO = P1^0; // 数码管数据线
sbit CLK = P1^1; // 数码管时钟线
void delay(uint t) { // 延时函数
uint i, j;
for(i = t; i > 0; i--)
for(j = 110; j > 0; j--);
}
void display(uchar *arr) { // 数码管显示函数
uchar i;
for(i = 0; i < 8; i++) {
DIO = arr[i] >> 7; // 发送最高位
CLK = 0;
CLK = 1;
DIO = arr[i] >> 6; // 发送第二高位
CLK = 0;
CLK = 1;
DIO = arr[i] >> 5; // 发送第三高位
CLK = 0;
CLK = 1;
DIO = arr[i] >> 4; // 发送第四高位
CLK = 0;
CLK = 1;
DIO = arr[i] >> 3; // 发送第五高位
CLK = 0;
CLK = 1;
DIO = arr[i] >> 2; // 发送第六高位
CLK = 0;
CLK = 1;
DIO = arr[i] >> 1; // 发送第七高位
CLK = 0;
CLK = 1;
DIO = arr[i]; // 发送最低位
CLK = 0;
CLK = 1;
}
}
void main() {
uchar hour = 23, minute = 59, second = 50;
uchar arr[8] = { // 数码管显示数组
table[hour / 10], table[hour % 10],
0x40, // 冒号
table[minute / 10], table[minute % 10],
0x40, // 冒号
table[second / 10], table[second % 10]
};
while(1) {
display(arr); // 显示当前时间
delay(1000); // 1秒延时
second++; // 秒数加1
if(second == 60) { // 如果秒数达到60
second = 0; // 秒数清零
minute++; // 分钟加1
if(minute == 60) { // 如果分钟达到60
minute = 0; // 分钟清零
hour++; // 小时加1
if(hour == 24) // 如果小时达到24
hour = 0; // 小时清零
arr[0] = table[hour / 10]; // 更新小时的十位数码管
arr[1] = table[hour % 10]; // 更新小时的个位数码管
}
arr[3] = table[minute / 10]; // 更新分钟的十位数码管
arr[4] = table[minute % 10]; // 更新分钟的个位数码管
}
arr[6] = table[second / 10]; // 更新秒数的十位数码管
arr[7] = table[second % 10]; // 更新秒数的个位数码管
}
}
```
这个程序使用一个简单的循环来实现时钟的功能。每秒钟,程序会更新数码管的显示,同时将秒数加1。当秒数达到60时,程序会将秒数清零,并将分钟加1。当分钟达到60时,程序会将分钟清零,并将小时加1。当小时达到24时,程序会将小时清零。程序使用一个数组来保存当前时间的显示值,并使用一个显示函数来将数组中的值发送到数码管上。
阅读全文