#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "MatrixKey.h"
#include "Timer0.h"
#include "DS18B20.h"
#include "buzzer.h"
#define music_num 3
uchar KeyNum, MODE1, MODE2, TimeSetSelect, TimeSetFlashFlag, disp1, disp2, con, set, music_sel;
char ClockTime[2]={18, 26};
uchar clock_min,clock_hour;
uchar ClockSetSelect;
uchar key_sta, count;
extern uchar FreqSelect;
extern uint const FreqTable[];
void TimeShow(void)//时间显示功能
{
DS1302_ReadTime(); //读取时间
LCD_ShowNum(1, 1, 20, 2);
LCD_ShowNum(1, 3, DS1302_Time[0], 2); //显示年
LCD_ShowNum(1, 6, DS1302_Time[1], 2); //显示月
LCD_ShowNum(1, 9, DS1302_Time[2], 2); //显示日
LCD_ShowNum(2, 1, DS1302_Time[3], 2); //显示时
LCD_ShowNum(2, 4, DS1302_Time[4], 2); //显示分
LCD_ShowNum(2, 7, DS1302_Time[5], 2); //显示秒
LCD_ShowNum(2, 16, DS1302_Time[6], 1);//显示星期
}
void TimeSet(void)//时间设置功能
{
if(KeyNum==5) //按键5按下
{
TimeSetSelect++; //设置选择位加1
TimeSetSelect %= 7; //越界清零
}
if(KeyNum==6) //按键6按下
{
DS1302_Time[TimeSetSelect]++; //时间设置位数值加1
if(DS1302_Time[0] > 99){DS1302_Time[0] = 0;}//年越界判断
if(DS1302_Time[1] > 12){DS1302_Time[1] = 1;}//月越界判断
if(DS1302_Time[1] == 1 || DS1302_Time[1] == 3 || DS1302_Time[1] == 5 || DS1302_Time[1] == 7 ||
DS1302_Time[1] == 8 || DS1302_Time[1] == 10 || DS1302_Time[1] == 12)
{
if(DS1302_Time[2] > 31){DS1302_Time[2] = 1;}//大月
}
else if(DS1302_Time[1] == 4 || DS1302_Time[1] == 6 || DS1302_Time[1] == 9 || DS1302_Time[1] == 11)
{
if(DS1302_Time[2] > 30){DS1302_Time[2] = 1;}//小月
}
else if(DS1302_Time[1] == 2)
{
if(DS1302_Time[0] % 4 == 0)
{
if(DS1302_Time[2] > 29){DS1302_Time[2] = 1;}//闰年2月
}
else
{
if(DS1302_Time[2] > 28){DS1302_Time[2] = 1;}//平年2月
}
}//日越界判断
if(DS1302_Time[3] > 23){DS1302_Time[3] = 0;}//时越界判断
if(DS1302_Time[4] > 59){DS1302_Time[4] = 0;}//分越界判断
if(DS1302_Time[5] > 59){DS1302_Time[5] = 0;}//秒越界判断
if(DS1302_Time[6] > 7) {DS1302_Time[6] = 1;}//星期越界判断
}
if(KeyNum==7)//按键7按下
{
DS1302_Time[TimeSetSelect]--; //时间设置位数值减1
if(DS1302_Time[0] < 0){DS1302_Time[0] = 99;}//年越界判断
if(DS1302_Time[1] < 1){DS1302_Time[1] = 12;} //月越界判断
if(DS1302_Time[1] == 1 || DS1302_Time[1] == 3 || DS1302_Time[1] == 5 || DS1302_Time[1] == 7 ||
DS1302_Time[1] == 8 || DS1302_Time[1] == 10 || DS1302_Time[1] == 12)
{
if(DS1302_Time[2] < 1){DS1302_Time[2] = 31;}//大月
if(DS1302_Time[2] > 31){DS1302_Time[2] = 1;}
}
else if(DS1302_Time[1] == 4 || DS1302_Time[1] == 6 || DS1302_Time[1] == 9 || DS1302_Time[1] == 11)
{
if(DS1302_Time[2] < 1){DS1302_Time[2] = 30;}//小月
if(DS1302_Time[2] > 30){DS1302_Time[2] = 1;}
}
else if(DS1302_Time[1] == 2)
{
if(DS1302_Time[0] % 4 == 0)
{
if(DS1302_Time[2] < 1){DS1302_Time[2] = 29;}//闰年2月
if(DS1302_Time[2] > 29){DS1302_Time[2] = 1;}
}
else
{
if(DS1302_Time[2] < 1){DS1302_Time[2] = 28;}//平年2月
if(DS1302_Time[2] > 28){DS1302_Time[2] = 1;}
}
}//日越界判断
if(DS1302_Time[3] < 0){DS1302_Time[3] = 23;}//时越界判断
if(DS1302_Time[4] < 0){DS1302_Time[4] = 59;}//分越界判断
if(DS1302_Time[5] < 0){DS1302_Time[5] = 59;}//秒越界判断
if(DS1302_Time[6] < 1){DS1302_Time[6] = 7; }//星期越界判断
}
//更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
if(TimeSetSelect == 0 && TimeSetFlashFlag == 1){LCD_ShowString(1, 3, " ");}
else{LCD_ShowNum(1, 3, DS1302_Time[0], 2);}
if(TimeSetSelect == 1 && TimeSetFlashFlag == 1){LCD_ShowString(1, 6, " ");}
else{LCD_ShowNum(1, 6, DS1302_Time[1], 2);}
if(TimeSetSelect == 2 && TimeSetFlashFlag == 1){LCD_ShowString(1, 9, " ");}
else{LCD_ShowNum(1, 9, DS1302_Time[2], 2);}
if(TimeSetSelect == 3 && TimeSetFlashFlag == 1){LCD_ShowString(2, 1, " ");}
else{LCD_ShowNum(2, 1, DS1302_Time[3], 2);}
if(TimeSetSelect == 4 && TimeSetFlashFlag == 1){LCD_ShowString(2, 4, " ");}
else{LCD_ShowNum(2, 4, DS1302_Time[4], 2);}
if(TimeSetSelect == 5 && TimeSetFlashFlag == 1){LCD_ShowString(2, 7, " ");}
else{LCD_ShowNum(2, 7, DS1302_Time[5], 2);}
if(TimeSetSelect == 6 && TimeSetFlashFlag == 1){LCD_ShowString(2, 16, " ");}
else{LCD_ShowNum(2, 16, DS1302_Time[6], 1);}
}
void clock_show(void)//时间显示功能
{
DS1302_ReadTime(); //读取时间
LCD_ShowString(1, 5, "-");
LCD_ShowString(1, 8, "-");
LCD_ShowString(2, 3, ":");
LCD_ShowNum(1, 1, 20, 2);
LCD_ShowNum(1, 3, DS1302_Time[0], 2); //显示年
LCD_ShowNum(1, 6, DS1302_Time[1], 2); //显示月
LCD_ShowNum(1, 9, DS1302_Time[2], 2); //显示日
LCD_ShowNum(2, 1, ClockTime[0], 2); //显示时
LCD_ShowNum(2, 4, ClockTime[1], 2); //显示分
}
void clock_set(void)
{
if(KeyNum==5) //按键5按下
{
ClockSetSelect++; //设置选择位加1
ClockSetSelect %= 2; //越界清零
}
if(KeyNum==6) //按键6按下
{
ClockTime[ClockSetSelect]++;
if(ClockTime[0] > 23){ClockTime[0] = 0;}//时越界判断
if(ClockTime[1] > 59){ClockTime[1] = 0;}//分越界判断
}
if(KeyNum==7) //按键7按下
{
ClockTime[ClockSetSelect]--;
if(ClockTime[0] < 0){ClockTime[0] = 23;}//时越界判断
if(ClockTime[1] < 0){ClockTime[1] = 59;}//分越界判断
}
if(ClockSetSelect == 0 && TimeSetFlashFlag == 1){LCD_ShowString(2, 1, " ");}
else{LCD_ShowNum(2, 1, ClockTime[0], 2);}
if(ClockSetSelect == 1 && TimeSetFlashFlag == 1){LCD_ShowString(2, 4, " ");}
else{LCD_ShowNum(2, 4, ClockTime[1], 2);}
}
void key_proc()
{
if(KeyNum==1 && con==0)
{
if(disp1 < 3)
{
disp1++;
if(disp1 == 2)
{
disp2 =! disp2;
disp1 = 0;
}
}
}
if(KeyNum==1 && disp1==1 && disp2==1 && con==1)
{
music_sel++;
if(music_sel%2==0)LCD_Clear();
music_sel%=music_num;
}
if(KeyNum==2)
{
LCD_Clear();
con = 1;
}
if(KeyNum==3)
{
LCD_Clear();
con = 0;
}
if(KeyNum==4 && disp1==0 && disp2==0) //按键1按下
{
if(MODE1 == 0) {MODE1 = 1; TimeSetSelect = 0;}//功能切换
else if(MODE1 == 1) {MODE1 = 0; DS1302_SetTime();}
}
if(KeyNum==4 && disp1==1 && disp2==0) //按键1按下
{
if(MODE2 == 0) {MODE2 = 1; ClockSetSelect = 0;}//功能切换
else if(MODE2 == 1) {MODE2 = 0;}
}
}
void LCD_proc()
{
if(disp2==0 && con==0)
{
LCD_ShowString(1, 1, "1.time");
LCD_ShowString(2, 1, "2.clock");
}
if(disp2==1 && con==0)
{
LCD_ShowString(1, 1, "3.temp");
LCD_ShowString(2, 1, "4.music");
}
if(disp1==0 && con==0)
{
LCD_ShowString(1, 15, "<<");
LCD_ShowString(2, 15, " ");
}
if(disp1==1 && con==0)
{
LCD_ShowString(1, 15, " ");
LCD_ShowString(2, 15, "<<");
}
if(disp1==0 && disp2==0 && con==1)
{
LCD_ShowString(1, 5, "-");
LCD_ShowString(1, 8, "-");
LCD_ShowString(2, 3, ":");
LCD_ShowString(2, 6, ":");
LCD_ShowString(2, 10, "Week:");
switch(MODE1)//根据不同的功能执行不同的函数
{
case 0 : TimeShow(); break;
case 1 : TimeSet(); break;
}
}
if(disp1==1 && disp2==0 && con==1)
{
switch(MODE2)//根据不同的功能执行不同的函数
{
case 0 : clock_show(); break;
case 1 : clock_set(); break;
}
}
if(disp1==0 && disp2==1 && con==1)
{
Temp_Disp();
}
if(disp1==1 && disp2==1 && con==1)
{
if(music_sel<music_num-1)
{
LCD_ShowString(1, 1, "1.small star"); //静态字符初始化显示
LCD_ShowString(2, 1, "2.sky castle");
}
if(music_sel>=music_num-1)
{
LCD_ShowString(1, 1, "3.jntm"); //静态字符初始化显示
}
if(music_sel%2==0)
{
LCD_ShowString(1, 15, "<<");
LCD_ShowString(2, 15, " ");
}
if(music_sel%2==1)
{
LCD_ShowString(1, 15, " ");
LCD_ShowString(2, 15, "<<");
}
}
}
void Init(void)
{
IT0 = 1; //设置Int0 边沿触发
EX0
万年历Plus(代码+仿真文件)
需积分: 0 19 浏览量
更新于2024-06-13
收藏 288KB ZIP 举报
【万年历Plus(代码+仿真文件)】项目是一个基于51单片机的课程设计,旨在教授学生如何开发一个可以显示多年日期和时间的系统。这个系统通常用于日常生活、办公环境或者电子设备中,提供准确的日历信息。在本项目中,学生将接触到51单片机的基本操作,编程技巧以及硬件接口设计。
51单片机是微控制器的一种,由Intel公司开发,广泛应用于嵌入式系统中。它的核心是8051微处理器,拥有4KB的ROM(只读存储器),256B的RAM(随机访问存储器)以及几个I/O端口,这些特性使得51单片机非常适合实现简单的控制任务,如万年历的功能。
项目中包含两个不同版本的源代码:2.2万年历_XDATA.pdsprj和2.1万年历_DATA.pdsprj。这些代码文件可能是使用Proteus或者其他类似软件的工程文件,用于在模拟环境中测试和验证51单片机程序。XDATA和DATA可能指的是程序中的数据存储区域,XDATA通常用于外部数据存储,而DATA则用于内部RAM。
万年历的实现涉及到以下几个关键知识点:
1. **日期计算算法**:为了能够显示任何年份的日期,程序需要实现一个算法来处理公历的闰年规则,即每四年一闰,但是世纪年(如2100年)如果不是400的倍数,则不是闰年。此外,还需要处理月份天数的差异,如二月的28或29天。
2. **时钟更新机制**:万年历需要实时更新当前的时间,这可能通过定时器中断来实现。51单片机的定时器可以设置为自动重装载模式,每隔一定时间(例如1秒)触发中断,从而更新时间。
3. **LCD显示**:通常,51单片机会连接一块LCD(液晶显示屏)来显示日期和时间。这需要了解LCD的工作原理,如命令和数据传输,以及字符显示的控制。
4. **按键交互**:为了允许用户查看不同日期或设置时间,系统可能包含按键输入。需要编写代码来处理按键中断和解析用户的操作。
5. **电源管理**:考虑到节能,万年历可能会有低功耗模式,例如在无操作一段时间后自动进入休眠状态。
6. **仿真与调试**:2.1万年历_DATA.pdsprj和2.2万年历_XDATA.pdsprj可能包含了仿真配置,用于在不实际使用硬件的情况下验证程序的正确性。仿真工具可以帮助开发者快速定位和修复错误。
通过完成这个项目,学生不仅可以掌握51单片机的编程,还能学习到硬件接口设计、软件调试以及系统集成等方面的知识,这对于未来从事嵌入式系统开发的工程师来说是非常宝贵的经验。
YE_lou
- 粉丝: 217
- 资源: 4
最新资源
- FR12345678.txt
- 我的将打败v的v据哦是风笛回复1
- UWB定位最基本原理逻辑框架
- 变身道具i速度放缓士大夫是ubv2
- 台湾香港注音输入法 Sougou zhuyin input
- Docker环境中高效构建LNMP架构的技术指南及应用
- 会丢功夫欧文回复我额和人物4
- c语言数据结构文档和代码
- Python实现缺失值处理代码
- 基于51单片机微波炉仿真(原理图+仿真+源码)
- Docker容器技术详解-涵盖操作流程、安全防护、性能调优及应用部署
- python-38.台阶问题-个人两阶两阶走.py
- python-1.自底向上合并排序算法.py
- python-test-2.最长公共子序列.py
- Docker搭建LNMP环境:2025年最新详解及优化策略
- C++语言实例-毕业设计项目:宾馆客房管理系统设计与实现-开题报告,论文,答辩PPT参考