当前位置:网站首页>DS1302的电子万年历_51单片机,年月日、星期、时分秒、农历和温度,带闹钟,全套资料
DS1302的电子万年历_51单片机,年月日、星期、时分秒、农历和温度,带闹钟,全套资料
2022-04-23 14:13:00 【蒋宇智】
获取全套资源,请见后文说明~
设计要求
1.显示公历年、月、日、星期、时、分、秒;
2.可随时调校年、月、日、时、分、秒;
3.能显示农历时间,并能标明平润年;
4.具有闹钟设定提醒功能;
5.能够显示当前环境温度;
设计概述
电子万年历系统以AT89C52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片和DS18B20温度传感器,完成时间和温度的读取,全部信息由LCD1602液晶实时显示。
日历时间的校准和闹钟的设定均由四个独立按键来实现,日历能显示公历和农历的年、月、日以及星期、时、分、秒,在显示农历年时,还能标明平润年。
整个系统的由以下几个模块组成,如下图所示。
原理图
仿真电路图
仿真结果分析
打开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,结果如下。
闹钟定时到后,蜂鸣器发声,闹钟响;闹钟可以通过点击“加键”或“减键”或“农历/闹钟”键来关闭。
通过点击DS18B20模块的红色向上、向下箭头,可以模拟温度的改变,LCD液晶实时显示当前温度值。例如设定温度22.0℃,如图所示。
综上所述,电子万年历Proteus仿真设计运行效果满足设计要求。
部分C代码
void main()
{
init_eeprom(); //开始初始化保存的数据
P1=0xff;
// flag=ReadTemperature();
// delay(2000);
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用DS1302时钟的初始化子函数
init(); //调用定时计数器的设置子函数
led1=0; //打开LCD的背光电源
buzzer=0; //蜂鸣器长响一次
delay(100);
buzzer=1;
init_eeprom();
while(1) //无限循环下面的语句:
{
keyscan(); //调用键盘扫描子函数
led=led1;
if(timerOn==1)
alarm(); //闹钟输出
if((fen==0)&&(miao==0))
{
if(shi>12)
temp_hour=shi-12;
else
{
if(shi==0)
temp_hour=12;
else
temp_hour=shi;
}
shangyimiao=miao;
baoshi=1;
}
if(baoshi==1)
{
ZD_baoshi();
do
keyscan();
while(shangyimiao==miao);
shangyimiao=miao;
}
}
}
void timer0() interrupt 1 //取得并显示日历和时间
{
//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
// flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示
//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
//week=BCD_Decimal(read_1302(0x8b)); //不读取,直接通过日期计算得到
if((led1==0))
{
if(temp_miao!=miao)
{
temp_miao=miao;
bltime++;
}
if(bltime==10)
{
led1=1;
bltime=0;
}
}
if(T_NL_NZ==1) //显示农历
{
uint nian_temp,temp12;
temp12=nian;
nian_temp=2000+(temp12&0xF0)*10+temp12&0x0F;
if((nian_temp%400==0)||((nian_temp%100!=0)&&(nian_temp%4==0))) //判断是否为闰年
p_r=1;
else
p_r=0;
Conversion(0,nian,yue,ri);
write_1602com(er);//时间显示固定符号写入位置?
for(a=0;a<16;a++)
{
if(p_r==0)
write_1602dat(nlp[a]);//写显示时间固定符号,两个冒号
else
write_1602dat(nlr[a]);
}
write_nl(3,year_moon);//农历 年
write_nl(6,month_moon);//农历 月
write_nl(9,day_moon);//农历 日
do
keyscan();
while(T_NL_NZ==1);
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<16;a++)
{
write_1602dat(qk[a]);//写显示时间固定符号,两个冒号
}
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
}
}
分享的资源有
(1)基于51单片机的电子万年历设计论文完整版;
(2)Altium Designer原理图文件;
(3)Keil C程序;
(4)Proteus仿真文件;
(5)Visio程序设计流程图;
(6)毕设任务书;
(7)芯片技术手册;
(8)元器件清单;
(9)元器件知识介绍;
全套资源如下
重要的事情说三遍!!!
重要的事情说三遍!!!
重要的事情说三遍!!!
本设计为我的原创,获取以上电子万年历设计全套设计资料!
请微信搜索关注我的公众号:交院小智
版权声明
本文为[蒋宇智]所创,转载请带上原文链接,感谢
https://blog.csdn.net/JiaoDaBoy/article/details/109051454
边栏推荐
猜你喜欢
统信UOS PHP7.2.3升级至PHP7.2.24
Man man notes and @ reboot usage of crontab
剑指offer刷题(2)--面向华为
剑指offer刷题(1)--面向华为
进入新公司,运维工程师从下面这几项了解系统的部署
Nacos uses demo as configuration center (IV)
sar命令详解
Tongxin UOS uninstall php7 2.24, install php7 4.27 ; Uninstall and then install PHP 7.2.34
API Gateway/API 网关(二) - Kong的使用 - 负载均衡Loadbalance
Installation and use of postman pit
随机推荐
矩阵交换行列
Thread group ThreadGroup uses introduction + custom thread factory class to implement threadfactory interface
统信UOS PHP7.2.3升级至PHP7.2.24
预览CSV文件
C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【1】
KVM learning resources
微信小程序轮播图swiper
Visio画拓扑图随记
Date的after时间判断
分分钟掌握---三目运算符(三元运算符)
xx项目架构随记
ThreadGroup ThreadGroup implémente l'interface threadfactory en utilisant la classe Introduction + Custom thread Factory
顺序栈的基本操作
Introduction to the use of countdownlatch and cyclicbarrier for inter thread control
编译Openssl
source insight via samba
逻辑卷创建与扩容
Tongxin UOS php7 2.3 upgrade to php7.0 two point two four
一些小小小小记录~
浅谈skiplist在LevelDB的应用