DS1302的电子万年历 | 您所在的位置:网站首页 › 年月日时分秒怎么显示 › DS1302的电子万年历 |
获取全套资源,请见后文说明~ 设计要求 1.显示公历年、月、日、星期、时、分、秒; 2.可随时调校年、月、日、时、分、秒; 3.能显示农历时间,并能标明平润年; 4.具有闹钟设定提醒功能; 5.能够显示当前环境温度; 设计概述 电子万年历系统以AT89C52单片机为核心,构成单片机控制电路,结合DS1302时钟芯片和DS18B20温度传感器,完成时间和温度的读取,全部信息由LCD1602液晶实时显示。 日历时间的校准和闹钟的设定均由四个独立按键来实现,日历能显示公历和农历的年、月、日以及星期、时、分、秒,在显示农历年时,还能标明平润年。 整个系统的由以下几个模块组成,如下图所示。 设置时间的操作为:点击“设置”键,秒针闪烁,此时可以通过“加键”和“减键”进行增减调整,秒针设置如下所示。 点击“农历/闹钟”按键,显示当前日期的农历日期,以及平润年(平年:PING 闰年:RUN),如下图所示,公历2020年10月9日所对应的农历日为8月23,且2020年为闰年,公历农历转换信息准确无误。 同理,分钟数设置好后,再次点击“设置”键,需要注意的是,在设定闹钟开关时,没有光标闪烁。点击“加键”或“减键”,设置闹钟的打开与关闭,ON与OFF之间切换。 以上都设置好后,再点击“设置”键,ON或OFF闪烁一下,表示闹钟设定完成。此时按下“农历/闹钟”键退出闹钟界面,回到时间正常显示的界面。 例如,设置闹钟时间为早上8:30,闹钟打开,状态为ON,结果如下。 通过点击DS18B20模块的红色向上、向下箭头,可以模拟温度的改变,LCD液晶实时显示当前温度值。例如设定温度22.0℃,如图所示。 部分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 write_1602dat(qk[a]);//写显示时间固定符号,两个冒号 } write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |