做了个比较叼的,数码管显示出年月日时分秒星期以及阴历的月份和日期。
按键可以修改年月日时分秒,星期几是根据年月日计算的,阴历也是计算出来的,不用按键修改。
本实验旨在利用51单片机实现一个具备电子时钟功能的数码管万年历。系统能够显示公历、农历和星期,并通过按键实现时间和日期的调整。本实验涉及的主要芯片包括DS1302时钟芯片和74LS138译码器。
51单片机(型号:STC89C52)
DS1302时钟芯片
74LS138译码器
数码管
按键
电源模块
DS1302连接:
RST 接 P3.2
SCLK 接 P3.3
DATA 接 P3.4
74LS138连接:
A 接 P1.0
B 接 P1.1
C 接 P1.2
G1/G2/G3分别接P2.0/P2.1/P2.2
按键连接:
按键1 接 P3.5
按键2 接 P3.6
按键3 接 P3.7
按键4 接 P3.1
定时器1被初始化为1ms的定时中断,用于驱动数码管显示。定时器中断服务程序中,每次中断都会选择下一个数码管并刷新显示内容。
cvoid initTimer1(void)
{
TMOD = 0x10; // Timer1 mode 1
TH1 = (65536 - 1000) / 256;
TL1 = (65536 - 1000) % 256;
EA = 1; // Enable global interrupts
ET1 = 1; // Enable Timer1 interrupts
TR1 = 1; // Start Timer1
}
通过扫描按键的电平变化检测按键按下情况,使用简单的延时去抖动。按键检测函数返回按键编号。
cunsigned char KeySscan(void)
{
if (key_01 == 0)
{
delay_ms_key(10);
if (key_01 == 0)
{
while (key_01 == 0);
return 1;
}
}
// 类似的代码检测key_02, key_03, key_04
return 0;
}
使用74LS138译码器选择数码管,通过三位二进制输入控制选择一位数码管。
cvoid selectOne7Seg(uchar segW)
{
if (segW <= 8)
{
segW = segW - 1;
LS1 = 1; LS2 = 0; LS3 = 0;
AA = segW & 0x01;
BB = segW & 0x02;
CC = segW & 0x04;
}
// 类似的代码选择其他数码管
}
DS1302用于存储和读取时间信息,通过SPI协议进行通信。初始化和读取时间的函数如下:
cvoid Ds1302Init()
{
uchar n;
WriteSet1302(0x8E, 0x00); // Disable write protection
for (n = 0; n < 7; n++)
{
WriteSet1302(WRITE_RTC_ADDR[n], TIME[n]);
}
WriteSet1302(0x8E, 0x80); // Enable write protection
}
void Ds1302ReadTime()
{
uchar n;
for (n = 0; n < 7; n++)
{
TIME[n] = ReadSet1302(READ_RTC_ADDR[n]);
}
}
通过读取DS1302中的时间数据,并转换为数码管可显示的格式,按一定的刷新频率在数码管上显示时间信息。
cvoid ALL_Display(void)
{
static char miaoa;
if (display_mode_alarm_page == 0)
{
if (miaoa != TIME[0])
{
miaoa = TIME[0];
display_time_page0(0); // Normal display
}
}
else
{
display_time_page0(1); // Setting mode display
}
}
通过按键调整时间和日期,并更新到DS1302中保存。
cvoid DoUserKey(unsigned char key)
{
uchar map[] = { 6, 4, 3, 2, 1, 0 };
if (key == 1)
{
display_mode_alarm_page = (display_mode_alarm_page + 1) % 7;
}
else if (key == 2)
{
TIME[map[display_mode_alarm_page - 1]]++;
shiti_Limit(TIME);
Ds1302Init();
}
else if (key == 3)
{
TIME[map[display_mode_alarm_page - 1]]--;
shiti_Limit(TIME);
Ds1302Init();
}
else if (key == 4)
{
display_mode_alarm_page = 0;
}
}
本实验通过51单片机驱动数码管实现了一个具备显示公历、农历和星期功能的万年历电子时钟。系统可以通过按键调整时间和日期,并实时更新显示。DS1302时钟芯片提供了稳定的时间数据存储和读取功能,74LS138译码器则简化了数码管的驱动设计。本实验验证了硬件与软件结合设计电子时钟的可行性,具有一定的参考价值。
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!