基于51单片机的数字电子钟万年历闰年判断闹钟设计 您所在的位置:网站首页 通用万年历 基于51单片机的数字电子钟万年历闰年判断闹钟设计

基于51单片机的数字电子钟万年历闰年判断闹钟设计

2023-03-03 21:08| 来源: 网络整理| 查看: 265

基于51单片机的数字电子钟万年历闰年判断闹钟设计 视频1 开发环境2 功能说明介绍3 仿真图4 程序5 原理图6 视频讲解7 设计报告7.1 设计目的7.2 概述 8 资料清单下载链接

视频 1 开发环境

仿真图:proteus8.9以上

程序代码:KEIL4/KEIL5

原理图:AD

设计编号:A0009

2 功能说明介绍

结合实际情况,基于51单片机设计一个电子钟万年历闹钟设计。该系统应满足的功能要求为:

功能:

由51单片机、DS1302时钟芯片、按键模块、LCD1602显示、电源构成。

1、可以显示年、月、日、时、分、秒、星期、农历;

2、按键可以设置闹钟及报警;

3、按键可以调整时间,显示是平年还是闰年。

4、共4个按键可以实现设置时间/闹钟、时间加、时间减、设置切换。

3 仿真图

AT89C51可以替换为AT89C52,实物可以换做STC89C51,STC89C52

AT89C51是美国ATMEL公司生产的低电压,高性能CMOS16位单片机,片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器,期间采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用16位中央处理器和Flash存储单元,功能强大的AT89C51单片机可灵活应用于各种控制领域。

AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个1 6位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

本系统中央控制器采用的AT89C51单片机,复位电路采用上电复位电路。外接的晶振为12MHz晶振。

img

闰年平年显示

img

4 程序

工程文件使用Keil4/keil5打开。编译产生hex加载到对应的单片机中。实物代码和仿真代码略有不同。分别的工程文件。

img

部分代码

//*******************主函数************************** //*************************************************** void main() { init_eeprom(); //开始初始化保存的数据 P1=0xff; // 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 //取得并显示日历和时间 { //读取秒时分周日月年七个数据(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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有