【普中开发板】

基于51单片机电子钟万年历闹钟日期数码管显示设计

本设计包含proteus仿真+程序+设计报告+讲解视频

一、开发环境

仿真图proteus8.17(有低版本)

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:P28

二、主要功能

本设计旨在设计一个基于51单片机的简易电子钟日历闹钟设计。

1、采用8位七段数码管显示,DS1302记录日历和时间。

2、可以通过独立按键设置时间、日期和闹钟时间。

3、通过按键控制显示时间、日期和闹钟时间,不同模式下对应LED指示灯亮起。

4、可以通过 proteus 仿真和普中开发板运行。

主要硬件 51单片机 DS1302 数码管 独立按键 LED

(目前仅完全适配普中51-实验板234,其他普中开发板型号可能需要接线)

img

需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

资料下载链接:

P系列单片机设计下载链接(复制到浏览器打开)

https://docs.qq.com/doc/DS2pPenNRaHB6SlR1

以下为本设计资料展示图:

三、实物图

显示的时间是00:00:08

img

四、仿真设计

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后数码管显示时间00:00:00。单片机读取DS1302时钟芯片的时间,时间逐秒+1。

img

显示时间的情况下,按下设置键进入设置模式,时钟闪烁表示当前正在设置时钟,再按下设置键进入分钟设置模式,分钟闪烁,再按下设置键进入秒钟设置模式,秒钟闪烁。设置完秒钟再按设置退出设置模式,数码管正常显示。

img

按下功能切换按键显示日期,再按下显示闹钟时间。日期和闹钟时间设置闪烁效果和时钟设置一致。

img

闹钟时间到,蜂鸣器闹铃,蜂鸣器响持续15s。

五、程序代码

使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。

img

u8 mode = 0;
u8 cixu = 0;
u16 time = 0;
u8 beep_flag = 0, beep_flag0 = 0;
u8 shi0 = 0, fen0 = 1, miao0 = 0;
u8 code smgduan0[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
u8 code smgduan1[11] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40};
u8 flag = 0;

// 添加中间变量用于保存设置值
u8 temp_sec = 0;
u8 temp_min = 0;
u8 temp_hour = 0;
u8 temp_day = 0;
u8 temp_month = 0;
u8 temp_year = 0;

void delay(u16 i)
{
    while(i--);
}

// 更新临时变量为当前时间值
void UpdateTempToCurrentTime()
{
    temp_sec = ds1302_time[0];
    temp_min = ds1302_time[1];
    temp_hour = ds1302_time[2];
}

// 更新临时变量为当前日期值
void UpdateTempToCurrentDate()
{
    temp_day = ds1302_time[3];
    temp_month = ds1302_time[4];
    temp_year = ds1302_time[6];
}

void display1()
{
    // 在时间设置模式下,始终显示临时变量的值
    u8 sec_display = (mode == 0 && cixu != 0) ? temp_sec : ds1302_time[0];
    u8 min_display = (mode == 0 && cixu != 0) ? temp_min : ds1302_time[1];
    u8 hour_display = (mode == 0 && cixu != 0) ? temp_hour : ds1302_time[2];

    if((cixu == 3) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 0; smg2 = 0; smg1 = 0; P0 = smgduan0[sec_display % 10]; delay(50);
        P0 = 0; smg3 = 0; smg2 = 0; smg1 = 1; P0 = smgduan0[sec_display / 10]; delay(50);
    }
    P0 = 0; smg3 = 0; smg2 = 1; smg1 = 0; P0 = 0x40; delay(50);
    if((cixu == 2) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 0; smg2 = 1; smg1 = 1; P0 = smgduan0[min_display % 10]; delay(50);
        P0 = 0; smg3 = 1; smg2 = 0; smg1 = 0; P0 = smgduan0[min_display / 10]; delay(50);
    }
    P0 = 0; smg3 = 1; smg2 = 0; smg1 = 1; P0 = 0x40; delay(50);
    if((cixu == 1) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 1; smg2 = 1; smg1 = 0; P0 = smgduan0[hour_display % 10]; delay(50);
        P0 = 0; smg3 = 1; smg2 = 1; smg1 = 1; P0 = smgduan0[hour_display / 10]; delay(50);
    }
}

void display2()
{
    // 在日期设置模式下,始终显示临时变量的值
    u8 year_display = (mode == 1 && cixu != 0) ? temp_year : ds1302_time[6];
    u8 month_display = (mode == 1 && cixu != 0) ? temp_month : ds1302_time[4];
    u8 day_display = (mode == 1 && cixu != 0) ? temp_day : ds1302_time[3];

    if((cixu == 1) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 1; smg2 = 1; smg1 = 1; P0 = smgduan0[2]; delay(50);
        P0 = 0; smg3 = 1; smg2 = 1; smg1 = 0; P0 = smgduan0[0]; delay(50);
        P0 = 0; smg3 = 1; smg2 = 0; smg1 = 1; P0 = smgduan0[year_display / 10]; delay(50);
        P0 = 0; smg3 = 1; smg2 = 0; smg1 = 0; P0 = smgduan1[year_display % 10]; delay(50);
    }
    if((cixu == 2) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 0; smg2 = 1; smg1 = 1; P0 = smgduan0[month_display / 10]; delay(50);
        P0 = 0; smg3 = 0; smg2 = 1; smg1 = 0; P0 = smgduan1[month_display % 10]; delay(50);
    }
    if((cixu == 3) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 0; smg2 = 0; smg1 = 1; P0 = smgduan0[day_display / 10]; delay(50);
        P0 = 0; smg3 = 0; smg2 = 0; smg1 = 0; P0 = smgduan0[day_display % 10]; delay(50);
    }
}

void display3()
{
    // 闹钟设置模式下,直接显示闹钟变量
    if((cixu == 1) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 1; smg2 = 1; smg1 = 1; P0 = smgduan0[shi0 / 10]; delay(50);
        P0 = 0; smg3 = 1; smg2 = 1; smg1 = 0; P0 = smgduan0[shi0 % 10]; delay(50);
    }
    if((cixu == 2) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 1; smg2 = 0; smg1 = 0; P0 = smgduan0[fen0 / 10]; delay(50);
        P0 = 0; smg3 = 0; smg2 = 1; smg1 = 1; P0 = smgduan0[fen0 % 10]; delay(50);
    }
    if((cixu == 3) && flag)
    {
        // 闪烁处理:不显示
    }
    else
    {
        P0 = 0; smg3 = 0; smg2 = 0; smg1 = 1; P0 = smgduan0[miao0 / 10]; delay(50);
        P0 = 0; smg3 = 0; smg2 = 0; smg1 = 0; P0 = smgduan0[miao0 % 10]; delay(50);
    }
}

void Timer0Init()
{
    TMOD |= 0X01;
    TH0 = 0Xfc;
    TL0 = 0X18;
    ET0 = 1;
    EA = 1;
    TR0 = 1;
}

int MonthDays(int year, int month)
{
    int days;
    if (month == 2)
    {
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        {
            days = 29;
        }
        else
        {
            days = 28;
        }
    }
    else if (month == 4 || month == 6 || month == 9 || month == 11)
    {
        days = 30;
    }
    else
    {
        days = 31;
    }
    return days;
}

// 保存设置到DS1302
void SaveSettings()
{
    if(mode == 0) // 时间模式
    {
        ds1302_time[0] = temp_sec;
        ds1302_time[1] = temp_min;
        ds1302_time[2] = temp_hour;
    }
    else if(mode == 1) // 日期模式
    {
        ds1302_time[3] = temp_day;
        ds1302_time[4] = temp_month;
        ds1302_time[6] = temp_year;
    }
    Ds1302Init(); // 写入设置到DS1302
}
完整代码见文章下载链接
void main()
{
    uchar k = 0;
    Ds1302Init();
    Timer0Init();
    beep = 0;
    mode = 0;
    
    // 初始化临时变量
    UpdateTempToCurrentTime();
    UpdateTempToCurrentDate();

    while(1)
    {

六、设计报告

6715字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等

img

七、设计资料内容清单&&下载链接

资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

img

0、常见使用问题及解决方法–必读!!!!

1、程序

2、proteus仿真

3、功能要求

4、软硬件流程图

5、开题报告

6、设计报告

7、烧录工具

8、讲解视频

9、实物图

Altium Designer 安装破解

KEIL+proteus 单片机仿真设计教程

KEIL安装破解

Proteus元器件查找

Proteus安装

Proteus简易使用教程

单片机学习资料

相关数据手册

答辩技巧

设计报告常用描述

鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

资料下载链接(可点击):

https://docs.qq.com/doc/DS2pPenNRaHB6SlR1

更多资源 点击下方链接:

https://docs.qq.com/sheet/DS0xIa0llTmtNakRW

微信公众号:嘉盛单片机

img