2024-09-01
售卖作品
00

目录

实验报告:基于51单片机的数码管万年历电子时钟
一、实验背景
二、实验器件
三、硬件连接
四、系统功能设计
1. 定时器初始化
2. 按键驱动
3. 74LS138译码器
4. DS1302时钟芯片
5. 时间显示
6. 按键设置
五、实验总结
代码资源

做了个比较叼的,数码管显示出年月日时分秒星期以及阴历的月份和日期。

按键可以修改年月日时分秒,星期几是根据年月日计算的,阴历也是计算出来的,不用按键修改。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实验报告:基于51单片机的数码管万年历电子时钟

一、实验背景

本实验旨在利用51单片机实现一个具备电子时钟功能的数码管万年历。系统能够显示公历、农历和星期,并通过按键实现时间和日期的调整。本实验涉及的主要芯片包括DS1302时钟芯片和74LS138译码器。

二、实验器件

  • 51单片机(型号:STC89C52)

  • DS1302时钟芯片

  • 74LS138译码器

  • 数码管

  • 按键

  • 电源模块

三、硬件连接

  1. DS1302连接:

    • RST 接 P3.2

    • SCLK 接 P3.3

    • DATA 接 P3.4

  2. 74LS138连接:

    • A 接 P1.0

    • B 接 P1.1

    • C 接 P1.2

    • G1/G2/G3分别接P2.0/P2.1/P2.2

  3. 按键连接:

    • 按键1 接 P3.5

    • 按键2 接 P3.6

    • 按键3 接 P3.7

    • 按键4 接 P3.1

四、系统功能设计

1. 定时器初始化

定时器1被初始化为1ms的定时中断,用于驱动数码管显示。定时器中断服务程序中,每次中断都会选择下一个数码管并刷新显示内容。

c
void 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 }

2. 按键驱动

通过扫描按键的电平变化检测按键按下情况,使用简单的延时去抖动。按键检测函数返回按键编号。

c
unsigned 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; }

3. 74LS138译码器

使用74LS138译码器选择数码管,通过三位二进制输入控制选择一位数码管。

c
void selectOne7Seg(uchar segW) { if (segW <= 8) { segW = segW - 1; LS1 = 1; LS2 = 0; LS3 = 0; AA = segW & 0x01; BB = segW & 0x02; CC = segW & 0x04; } // 类似的代码选择其他数码管 }

4. DS1302时钟芯片

DS1302用于存储和读取时间信息,通过SPI协议进行通信。初始化和读取时间的函数如下:

c
void 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]); } }

5. 时间显示

通过读取DS1302中的时间数据,并转换为数码管可显示的格式,按一定的刷新频率在数码管上显示时间信息。

c
void 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 } }

6. 按键设置

通过按键调整时间和日期,并更新到DS1302中保存。

c
void 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
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!