编写51单片机6位数码管显示时分秒、按键修改时间,无闹钟,共阴极数码管程序并注释
时间: 2024-03-08 19:48:05 浏览: 100
数码管显示时分秒_按键修改时间
好的,下面是51单片机6位数码管显示时分秒、按键修改时间,无闹钟,共阴极数码管程序以及注释。
```c
#include <reg52.h> // 包含51单片机的头文件
#define uchar unsigned char // 定义无符号字符类型
#define uint unsigned int // 定义无符号整数类型
sbit dula = P2 ^ 6; // 数码管段选1
sbit wela = P2 ^ 7; // 数码管段选2
uchar code table[] = { // 数码管显示字符表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
// 定义全局变量
uchar hour = 12; // 小时
uchar minute = 0; // 分钟
uchar second = 0; // 秒钟
// 延时函数
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
for (y = 110; y > 0; y--);
}
// 数码管显示函数
void display(uint time)
{
uchar shiwei, gewei, baiwei;
shiwei = time / 10; // 十位
gewei = time % 10; // 个位
baiwei = 0; // 百位为0
dula = 1; // 打开数码管段选1
P0 = table[shiwei]; // 显示十位
dula = 0; // 关闭数码管段选1
wela = 1; // 打开数码管段选2
P0 = 0xfe; // 显示第一位数码管
wela = 0; // 关闭数码管段选2
delay(5); // 延时5ms
dula = 1; // 打开数码管段选1
P0 = table[gewei]; // 显示个位
dula = 0; // 关闭数码管段选1
wela = 1; // 打开数码管段选2
P0 = 0xfd; // 显示第二位数码管
wela = 0; // 关闭数码管段选2
delay(5); // 延时5ms
dula = 1; // 打开数码管段选1
P0 = table[baiwei]; // 显示百位
dula = 0; // 关闭数码管段选1
wela = 1; // 打开数码管段选2
P0 = 0xfb; // 显示第三位数码管
wela = 0; // 关闭数码管段选2
delay(5); // 延时5ms
}
// 中断函数
void timer0() interrupt 1
{
TH0 = 0xfc; // 重新赋值高8位,定时50us
TL0 = 0x18; // 重新赋值低8位
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 = 0xfc; // 给定时器0赋初值,定时50us
TL0 = 0x18;
TR0 = 1; // 启动定时器0
ET0 = 1; // 打开定时器0中断
EA = 1; // 打开总中断开关
while (1) { // 进入循环
display(hour * 100 + minute); // 显示时分
if (P3 == 0xfe) { // 如果P3.0按键按下,则小时加1
delay(20); // 延时20ms
if (P3 == 0xfe) { // 再次检测按键状态,避免抖动
hour++; // 小时加1
if (hour == 24) // 如果小时达到24时,则清零
hour = 0;
}
}
if (P3 == 0xfd) { // 如果P3.1按键按下,则分钟加1
delay(20); // 延时20ms
if (P3 == 0xfd) { // 再次检测按键状态,避免抖动
minute++; // 分钟加1
if (minute == 60) { // 如果分钟达到60分,则进位
minute = 0; // 分钟清零
hour++; // 小时加1
if (hour == 24) // 如果小时达到24时,则清零
hour = 0;
}
}
}
}
}
```
程序实现了时分秒的显示和按键修改时间的功能,具体实现方式如下:
1. 定义全局变量hour、minute、second,分别表示小时、分钟、秒钟,初值分别为12、0、0。
2. 定义延时函数delay,用于实现一定时间的延时。
3. 定义数码管显示函数display,将时间参数转换为十进制数码管显示。
4. 定义定时器0中断函数timer0,每50us中断一次,实现秒钟的计数和进位。
5. 在主函数中,初始化定时器0、打开定时器0中断和总中断开关,进入循环。在循环中,先调用display函数显示当前的小时和分钟,然后检测P3.0、P3.1按键的状态,如果按键按下则修改时间变量,并且进行一定时间的延时和按键状态检测,避免按键抖动。
请注意,该程序基于共阴极数码管,如果使用共阳极数码管则需要修改数码管的驱动方式。
阅读全文