前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于单片机的数字时钟(万年历)设计,DS1302芯片,年月日星期,论文,程序,原理图

基于单片机的数字时钟(万年历)设计,DS1302芯片,年月日星期,论文,程序,原理图

原创
作者头像
蒋宇智
发布2024-03-29 14:23:18
1480
发布2024-03-29 14:23:18

设计要求

1.显示公历年、月、日、星期、时、分、秒;

2.可随时调校年、月、日、时、分、秒;

3.能显示农历时间,并能标明平润年;

4.具有闹钟设定提醒功能;

5.能够显示当前环境温度;

系统概述

电子万年历系统以AT89C52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片和DS18B20温度传感器,完成时间和温度的读取,全部信息由LCD1602液晶实时显示。

日历时间的校准和闹钟的设定均由四个独立按键来实现,日历能显示公历和农历的年、月、日以及星期、时、分、秒,在显示农历年时,还能标明平润年。

整个系统的由以下几个模块组成,如下图所示。

Proteus仿真电路

原理图

仿真分析

打开Proteus仿真文件,文件后缀名为DSN。双击单片机,加载WanNianLi.hex文件(位于Keil C程序文件夹中),运行仿真,结果如下图所示。

万年历运行结果
万年历运行结果

上图可以看出,LCD显示的时间信息与DS1302 Clock-U3窗口完全一致,表明单片机成功读取DS1302芯片数据。当前日期为2020年10月9日星期五,时间为21点30分39秒,温度为31.0℃。

设置时间的操作为:点击“设置”键,秒针闪烁,此时可以通过“加键”和“减键”进行增减调整,秒针设置如下所示。

秒针的设置,光标闪烁
秒针的设置,光标闪烁

秒针设置完成后,再次点击“设置”键,分针闪烁,继续通过加减键进行设置,以此类推,来设置小时、日、月和年,年(范围可到2099年)设置完成后,再次按下“设置”键,退出时间的设置,回到LCD正常显示界面。

点击“农历/闹钟”按键,显示当前日期的农历日期,以及平润年(平年:PING 闰年:RUN),如下图所示,公历2020年10月9日所对应的农历日为8月23,且2020年为闰年,公历农历转换信息准确无误。

农历日期的显示
农历日期的显示

再次点击“农历/闹钟”键,显示闹钟时间,以及闹钟的开关状态(ON:表示闹钟开,OFF:表示闹钟关),图中系统默认闹钟时间为01:01,闹钟处于打开状态ON。

系统闹钟默认状态
系统闹钟默认状态

设置闹钟操作为:在当前闹钟显示界面下,点击“设置”键,闹钟的小时数闪烁,通过“加键”和“减键”调整小时数,小时数设置好后,再次点击“设置”键,分钟闪烁,进入分钟数的设置。

同理,分钟数设置好后,再次点击“设置”键,需要注意的是,在设定闹钟开关时,没有光标闪烁。点击“加键”或“减键”,设置闹钟的打开与关闭,ON与OFF之间切换。

以上都设置好后,再点击“设置”键,ON或OFF闪烁一下,表示闹钟设定完成。此时按下“农历/闹钟”键退出闹钟界面,回到时间正常显示的界面。

例如,设置闹钟时间为早上8:30,闹钟打开,状态为ON,结果如下。

设置闹钟时间为8:30
设置闹钟时间为8:30

闹钟定时到后,蜂鸣器发声,闹钟响;闹钟可以通过点击“加键”或“减键”或“农历/闹钟”键来关闭。

通过点击DS18B20模块的红色向上、向下箭头,可以模拟温度的改变,LCD液晶实时显示当前温度值。例如设定温度22.0℃,如图所示。

模拟温度值为22.0℃
模拟温度值为22.0℃

综上所述,电子万年历Proteus仿真设计运行效果满足设计要求。

部分C代码

代码语言:c
复制
/*
函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年)
调用函数示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:计算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均为BCD数据,c_sun为世纪标志位,c_sun=0为21世
纪,c_sun=1为19世纪
调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据
*/

void Conversion(bit c,uchar year,uchar month,uchar day)
{                         //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据
    uchar temp1,temp2,temp3,month_p;
    uint temp4,table_addr;
    bit flag2,flag_y;
    temp1=year/16;   //BCD->hex 先把数据转换为十六进制
    temp2=year%16;
   // year=temp1*10+temp2;
	year=temp1*16+temp2;
    temp1=month/16;
    temp2=month%16;
    //month=temp1*10+temp2;
	month=temp1*16+temp2;
    temp1=day/16;
    temp2=day%16;
    //day=temp1*10+temp2;
	day=temp1*16+temp2;
    //定位数据表地址
    if(c==0){                   
        table_addr=(year+0x64-1)*0x3;
    }
    else {
        table_addr=(year-1)*0x3;
    }
    //定位数据表地址完成
    //取当年春节所在的公历月份
    temp1=year_code[table_addr+2]&0x60; 
    temp1=_cror_(temp1,5);
    //取当年春节所在的公历月份完成
    //取当年春节所在的公历日
    temp2=year_code[table_addr+2]&0x1f; 
    //取当年春节所在的公历日完成
    // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月
    if(temp1==0x1){  
        temp3=temp2-1;  
    }  
    else{
        temp3=temp2+0x1f-1;        
    }

资源内容

(1)基于51单片机的电子万年历设计论文完整版;

(2)Altium Designer原理图文件;

(3)Keil C程序;

(4)Proteus仿真文件;

(5)Visio程序设计流程图;

(6)毕设任务书;

(7)芯片技术手册;

(8)元器件清单;

(9)元器件知识介绍;

资源截图

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档