用C语言写基于AT89C51的6位共阴极数码管显示时分秒,按键增减时分秒,并对程序进行注释
时间: 2024-03-17 18:45:21 浏览: 78
好的,下面是基于AT89C51的6位共阴极数码管显示时分秒的 C 语言程序,其中包括注释来解释代码的功能和工作原理:
```c
#include <reg51.h> // 引入 51 单片机的寄存器头文件
#define uchar unsigned char // 定义 unsigned char 类型为 uchar 类型
#define uint unsigned int // 定义 unsigned int 类型为 uint 类型
sbit dula = P2^6; // 定义段选锁存器的控制端口
sbit wela = P2^7; // 定义位选锁存器的控制端口
uchar code table[] = { // 数码管显示表,0-9 数码的编码
0xc0, // 0
0xf9, // 1
0xa4, // 2
0xb0, // 3
0x99, // 4
0x92, // 5
0x82, // 6
0xf8, // 7
0x80, // 8
0x90 // 9
};
uchar hour = 0, minute = 0, second = 0; // 定义时分秒变量并初始化为 0
void delay(uint x) { // 延时函数,参数为延时时间
uint i, j;
for(i = x; i > 0; i--) {
for(j = 110; j > 0; j--);
}
}
void display(uchar num, uchar pos) { // 数码管显示函数,参数为要显示的数值和数码管位置
P1 = num; // 将数值赋值给 P1 端口,控制数码管的显示
switch(pos) { // 根据数码管位置,控制位选锁存器的控制端口
case 1: wela = 0; dula = 1; break; // 第一位数码管
case 2: wela = 0; dula = 0; break; // 第二位数码管
case 3: wela = 1; dula = 1; break; // 第三位数码管
case 4: wela = 1; dula = 0; break; // 第四位数码管
case 5: wela = 1; dula = 1; break; // 第五位数码管
case 6: wela = 1; dula = 0; break; // 第六位数码管
}
delay(10); // 延时 10 毫秒,保证数码管能够稳定显示
wela = 1; dula = 1; // 位选锁存器和段选锁存器复位
}
void init() { // 初始化函数,对时分秒变量进行初始化
hour = 0; minute = 0; second = 0; // 将时分秒变量初始化为 0
}
void main() { // 主函数
init(); // 调用初始化函数
while(1) { // 无限循环
display(table[hour / 10], 1); // 显示小时的十位数码
display(table[hour % 10], 2); // 显示小时的个位数码
display(0x3f, 3); // 显示冒号
display(table[minute / 10], 4); // 显示分钟的十位数码
display(table[minute % 10], 5); // 显示分钟的个位数码
display(0x3f, 6); // 显示冒号
delay(1000); // 延时 1 秒,保证时分秒能够正常更新
second++; // 秒数加 1
if(second == 60) { // 如果秒数为 60,将秒数和分钟数重置为 0,小时数加 1
second = 0;
minute++;
if(minute == 60) {
minute = 0;
hour++;
if(hour == 24) { // 如果小时数为 24,将其重置为 0
hour = 0;
}
}
}
// 按键检测,增加时分秒
if(P3 == 0x7e) { // 检测 P3.0 是否按下
hour++;
if(hour == 24) {
hour = 0;
}
while(P3 == 0x7e); // 等待按键松开
} else if(P3 == 0x7d) { // 检测 P3.1 是否按下
minute++;
if(minute == 60) {
minute = 0;
}
while(P3 == 0x7d); // 等待按键松开
} else if(P3 == 0x7b) { // 检测 P3.2 是否按下
second++;
if(second == 60) {
second = 0;
}
while(P3 == 0x7b); // 等待按键松开
}
}
}
```
这个程序使用 P1 接口来控制数码管的显示。程序首先定义了一个数码管显示表,其中包含了 0-9 数码的编码。然后,程序定义了时分秒变量,并将其初始化为 0。
程序的主函数中,使用 display 函数来显示时分秒。这个函数接受两个参数:要显示的数值和数码管位置。根据数码管位置,控制位选锁存器和段选锁存器的控制端口,从而实现控制数码管显示的目的。
程序还包括一个延时函数 delay,这个函数用于控制数码管的显示时间,保证数码管能够稳定显示。
程序使用一个无限循环来不断地更新时分秒,同时检测按键是否按下,如果按下则增加时分秒。程序的逻辑比较简单,您可以根据注释理解代码的工作原理。
阅读全文