





模拟电路图如图所示:
启动仿真后数码管显示初始时间:假设12-34-56
按下一拖三的开关P10,可以选择调节时,还是分还是秒。按一下调时,按两下调分钟,按三下调秒。按4下回到时。调整时的时候只有时的两位数显示,其他不显示,同理分和秒也是一样的。
如果按一下的情况下再按P11,则对应钟表数加一。
按下 P12后退出调整。数码管显示全部时间。并秒闪烁加一,跟真实的时间一样增加。
接线要和图片中一样。







模拟电路图如图所示:
启动仿真后数码管显示初始时间:假设12-34-56
按下一拖三的开关P10,可以选择调节时,还是分还是秒。按一下调时,按两下调分钟,按三下调秒。按4下回到时。调整时的时候只有时的两位数显示,其他不显示,同理分和秒也是一样的。
如果按一下的情况下再按P11,则对应钟表数加一。
按下 P12后退出调整。数码管显示全部时间。并秒闪烁加一,跟真实的时间一样增加。
接线要和图片中一样。

关注引自免费微信小程序:皆我百晓生
为了实现您的需求,我们首先需要明确几个关键点:
#include<reg51.h>
unsigned char DispCode[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0-9,A,b,C,d,E,F
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //G,H,I,J,K,L,.,-,
unsigned char Time[3] = {12, 34, 56}; // 初始时间为12:34:56
char AdjustMode = 0; // 0-时,1-分,2-秒,用于记录当前调整的模式
bit FlashFlag = 0; // 用于控制秒的闪烁
void Delay(unsigned int i);
void DisplayTime();
void IncTime(char mode);
void main()
{
// 初始化
P0 = 0xff; // 确保段选线默认为高电平
P2 = 0x01; // 假设先点亮第一个数码管
while(1)
{
// 检查调整模式按键P10
if(P10 == 0) // 按下P10
{
Delay(10); // 去抖动
if(P10 == 0)
{
AdjustMode = (AdjustMode + 1) % 3; // 循环切换调整模式
Delay(200); // 模式切换后等待一段时间
}
}
// 检查时间增加按键P11
if(P11 == 0)
{
Delay(10); // 去抖动
if(P11 == 0)
{
IncTime(AdjustMode); // 根据当前模式递增时间
}
}
// 检查退出调整模式按键P12
if(P12 == 0)
{
Delay(10); // 去抖动
if(P12 == 0)
{
FlashFlag = 1; // 开启秒闪烁,模拟真实时间计数
}
}
DisplayTime(); // 显示当前时间
}
}
void DisplayTime()
{
static unsigned char digit = 0; // 记录当前显示的数码管位
static unsigned char secDisplay = Time[2]; // 用于处理秒的闪烁
// 根据FlashFlag控制秒的显示是否闪烁
if(FlashFlag && digit == 2) // 秒位且允许闪烁
{
if(_crol_(0x80, digit)) // 使用闪烁标志控制显示
P0 = DispCode[secDisplay];
else
P0 = 0xff; // 关闭该位显示
}
else
{
P0 = DispCode[Time[digit]]; // 正常显示
}
P2 = 0x01 << digit; // 位选,点亮对应的数码管
digit = (digit + 1) % 4; // 循环显示所有位
// 控制数码管刷新频率
Delay(5);
}
void IncTime(char mode)
{
Time[mode]++;
if(mode == 0 && Time[mode] > 23) Time[mode] = 0; // 时钟调整
if(mode == 1 && Time[mode] > 59) Time[mode] = 0; // 分钟调整
if(mode == 2 && Time[mode] > 59) Time[mode] = 0; // 秒钟调整
}
void Delay(unsigned int i)
{
while(i--)
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_();
}
}