编写一万年历系统

合集下载

单片机万年历设计编程

单片机万年历设计编程

单片机万年历设计编程一.实验目的1.掌握时钟程序的使用方法2.掌握时间函数的使用方法3.利用单片机设计万年历二.设计要求通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,七个按钮连接P0口可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。

三.设计方案1.原理构成框图本设计用AT89C51作为核心控制部分,外接晶振电路与复位电路,74LS138作为位选扩展电路,P0口接七个开关作为时间调整部分,以两个四位数码管作为显示部分,开关控制显示时间与日期,P2口作为段选,P1口作为位选部分。

具体框图如图所示:2.主程序设计系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,其次,按照Proteous 的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。

系统程序主要包括主程序,读出时钟子程序、计算时间子程序、键盘扫描子程序和显示数据刷新子程序。

主程序流程图如图所示:3时间调整电路的设计采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下SHI JIAN键两个四位数码管显示时间和星期,按下RI QI键两个数码管显示日期,按下TIAO SHI键可以对时间和日期进行调节,JIA键表示加,JIAN键表示减,YI WEI表示选择所要调节的位置,QUE DING按键按下,时间调节结束。

所连线路和单片机接口仿真图如图所示:4.LED数码管的选择LED数码管分为共阴和共阳两种,以利用AT89C51的P2口作为LED显示的段选部分,以P1口的P1.0、P1.1、P1.2、三个口作为显示部分的位选,通过三八译码器扩展为八位的位选分别接在两个四位数码管的位选部分。

详细电路图如图所示:5.实物的制作与调试原理图的绘制PCB的绘制四.设计总结这次的设计的任务是万年历时钟的设计,对于时钟以前学习C51时有些接触,通过C51芯片程序控制显示万年历。

万年历程序设计说明书

万年历程序设计说明书

万年历程序设计说明书一、引言万年历是一种常见的日历工具,用于显示日期和计算日期间的差异。

本说明书旨在介绍万年历程序的设计原理和功能,帮助用户更好地理解和使用该程序。

二、程序设计原理1. 数据结构万年历程序主要基于日期的计算和显示,因此需要设计合适的数据结构来存储日期信息。

常用的数据结构包括日期对象、月份对象和年份对象。

2. 界面设计万年历程序需要提供用户友好的界面,以便用户能够方便地输入和查看日期信息。

界面设计应简洁明了,同时考虑不同屏幕尺寸和分辨率的适配。

3. 算法设计万年历程序的核心功能是日期的计算和显示。

算法设计应能够准确计算日期间的差异,包括年份、月份和天数的计算。

同时,还需要考虑闰年和月份天数不同的情况。

三、功能介绍1. 日期查询用户可以通过输入日期来查询该日期的详细信息,包括星期几、所在月份和年份等。

程序应能够准确显示查询结果并提供相关操作选项。

2. 日期计算用户可以输入两个日期,程序将计算并显示这两个日期之间的差异,包括相差的年份、月份和天数。

程序应能够处理闰年和月份天数不同的情况。

3. 节假日提醒万年历程序可以提供节假日的提醒功能,用户可以设置节假日的提醒日期和提醒方式。

程序应能够准确提醒用户,并提供相应的操作选项。

4. 日期转换用户可以输入不同的日期格式,程序将自动转换为标准的日期格式进行计算和显示。

程序应支持常见的日期格式,并提供错误处理机制。

四、程序设计实现1. 开发环境万年历程序可以使用各种编程语言和开发工具进行实现。

常见的开发环境包括Java、Python、C++等。

选择合适的开发环境可以提高开发效率和程序性能。

2. 数据库设计万年历程序可以使用数据库存储节假日和相关数据,以便程序查询和显示。

数据库设计应考虑数据的结构和索引,提高数据的查询效率和程序的响应速度。

3. 界面设计万年历程序的界面设计应简洁明了,用户可以方便地输入和查看日期信息。

界面设计可以使用图形界面或命令行界面,根据实际需求选择合适的设计方式。

C语言万年历系统

C语言万年历系统

山东交通学院面向对象课程设计字符统计软件院(系)别信息科学与电气工程学院班级计算111学号姓名李峰辉指导教师徐硕博时间2012-03-05—2012-03-09课程设计任务书题目万年历系统程序设计系 (部) 信息科学与电气工程学院专业计算机科学与技术班级计算111 学生姓名李峰辉学号3 月 5 日至 3 月 9 日共 1 周指导教师(签字)系主任(签字)年月日一、设计内容及要求编写一万年历系统(限最多1人完成)要求: 模仿现实生活中的挂历.当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几). 当系统日期变到下一月时,系统自动翻页到下一月.二、设计原始资料C语言程序与设计三、主要参考资料谭浩强《C程序设计》第四版四、设计完成后提交的文件和图表文件:万年历系统文件,及源代码图表1,进入万年历系统2,任意键进入菜单3,当输入非法字符时,提示错误,重新输入4,进入选项1,日历显示并显示日历5,进入选项2,日历查询并显示所查询的日期6,当查询输入非法字符时,提示错误,返回主菜单7,进入选项3,退出五,流程图功能模块显示模块月历显示日期查询日期判断日期调整闰年判断程序进入显示当前时1、日期显示1、日期显示2、日期查询3、退出程序3、退出程序2、日期查询六,源代码#include<stdio.h>#include<time.h>#include<math.h>#include<windows.h>int year,month,day; //全局变量记录时间intdaysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,3 1,30,31,31,30,31, 30,31}};void main(){int runYear(int year);struct tm* getDay();//从系统取得当前时间,结构体,在函数中指定程序员需要的标准类型(实践结构体)int chaxunday(int year,int month,int day);//检查日期是否正确int qudeDay(int year,int month,int day);//取得星期void printrili(int year,int month,int day);//打印月历void checkrili();//查询日历void backMenu();void mainMenu(int &year,int &month,int &day);//主菜单struct tm *gmt=getDay();//用系统时间进行初始化,year=gmt->tm_year+1900;month=gmt->tm_mon+1;day=gmt->tm_mday;printrili(year,month,day);//打印当前月历backMenu();mainMenu(year,month,day);}struct tm* getDay()//从系统取得当前时间{time_t timer;struct tm* gmt;time(&timer);gmt=localtime(&timer);return gmt;}int runYear(int year) //判断是否是闰年{int run=0;if(year%400==0||(year%4==0&&year%100!=0))run=1;return run;}int chaxunday(int year,int month,int day)//检查正确{if(year<=0&&year>=10000||month<1&&month>12||day<1||day>31) return 0;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12: if(day>31)return 0;break;case 4:case 6:case 9:case 11:if(day>30)return 0;break;default:if(runYear(year)&&day>29)return 0;else if(runYear(year)==0&&day>28)return 0;}return 1;}int qudeDay(int year,int month,int day)//取得星期{int nday=0,nDay,i,x;for(i=0;i<month-1;i++)nday+=daysOfMonth[runYear(year)][i];nday+=day;nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;x=nDay%7;return x;}void printrili(int year,int month,int day)//打印月历{int i;char wday[7][4]={"日","一","二","三","四","五","六"};printf(" %d年%d月%d日\n",year,month,day);for(i=0;i<7;i++)printf("%5s",wday[i]);printf("\n");int w;int nowDay=1;w=qudeDay(year,month,nowDay);//找到第一天的星期int n;n=daysOfMonth[runYear(year)][month-1];switch(w) //放置第一天{case 0:printf("%5d",nowDay);break;case 1:printf("%10d",nowDay);break;case 2:printf("%15d",nowDay);break;case 3:printf("%20d",nowDay);break;case 4:printf("%25d",nowDay);break;case 5:printf("%30d",nowDay);break;default:printf("%35d\n",nowDay);}nowDay++;for(i=1;i<n;i++){w=qudeDay(year,month,nowDay);printf("%5d",nowDay);if(w==6) //如果是星期六则换行打印puts("\n");nowDay++;}}void checkrili()//查询日历{system("cls");printf("请输入你要查询的日期(如2012 3 9):");scanf("%d%d%d",&year,&month,&day);while(!chaxunday(year,month,day)) //如果日期输入不正确,则重新输入{printf("%c你输入的日期错误,请重新输入:",7);scanf("%d%d%d",&year,&month,&day);}system("cls");if(runYear(year))printf("\n 闰年\n\n");else printf("\n 平年\n\n");printrili(year,month,day);}void backMenu(){int x;printf("请按任意字符键返回主菜单:");scanf("%d",&x);system("cls");}void mainMenu(int &year,int &month,int &day)//主菜单{printf(" * * * * \n");printf(" * *主菜单* *\n");printf(" * 1、日历显示 *\n");printf(" * 2、日历查询 *\n");printf(" * 3、退出 *\n");printf(" * *\n");printf(" * *\n");printf(" * *\n");printf(" *\n");char menu[100];//定义数组int flag=0;do{int f=0;do{f=0;printf("\n 请输入相应数字:");scanf("%s",menu);if(strlen(menu)>2)f=1; //测量字符串长度。

JAVA万年历系统课程设计报告附源码

JAVA万年历系统课程设计报告附源码

2013-2014学年第二学期《面向对象程序设计》课程设计报告题目:万年历系统专业:计算机科学与技术班级::学号:指导教师:成绩:计算机与信息工程系2014年6月6日目录1 设计容及要求 (1)1.1设计容 (1)1.2设计任务及具体要求 (1)2 概要设计 (2)2.1程序设计思路 (2)2.2 总体程序框图 (3)3 设计过程或程序代码 (4)3.1各个模块的程序流程图及运行界面 (4)3.2对关键代码加以分析说明 (8)4 设计结果与分析 (14)4.1程序调试的结果 (14)4.2程序设计分析 (14)5 小结 (15)致 (16)参考文献 (17)源程序 (18)1 设计容及要求1.1设计容万年历,实际上就是记录一定时间围(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。

在我设计的万年历中主要有:(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用规。

(2)按月份查询,实现了显示查询1901~2100年某月所有日期的阴阳历对照。

(3)并且添加了重大节日与星座等信息,界面采用日常的星期与月份结合的格式,方便查看与使用。

(4)编写万年历的课程设计,是为了使同学们更加了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。

为后续各门计算机课程的学习和毕业设计打下坚实基础。

1.2设计任务及具体要求利用JAVA语言编写的万年历系统采用了多种JAVA语句来实现多种功能。

用户可以通过本程序的applet运行界面来查找一整年某月的农历和阳历,可以查找用户所想了解的某一天具体为星期几,并且可以看到一些重大节日的具体时间。

要求:满足设计万年历系统的目的,即当用户查询年份与月份时,系统就要将这一年的某一月份的阴历与阳历全部显示出来,并且附带这一月份的重大节日。

当用户随意改动年份或月份时系统自动显示与星期对应的日期。

大一c语言万年历简单

大一c语言万年历简单

大一c语言万年历简单今天,我们要介绍的是使用C语言编写的一个简单的万年历程序。

万年历是一个用于查询某个年份的日历的工具,它可以根据年份和月份显示出相应的日历。

通过学习这个简单的万年历程序,我们可以深入了解C语言的基本语法和逻辑运算。

首先,我们先来了解一下万年历的需求。

程序应该具备以下功能:1. 用户可以输入年份和月份。

程序会根据用户输入的年份和月份生成相应的日历。

2. 程序会自动判断用户输入的年份是否为闰年,并在输出的日历中标识出来。

3. 用户输入的月份应该在有效范围内(1-12),如果不在范围内,程序会提示用户重新输入。

4. 程序应该能够正确显示每个月的日期,并在每个月的第一天之前和最后一天之后的空位上留空。

现在我们可以开始编写程序了。

```c#include <stdio.h>int isLeapYear(int year) {// 判断是否为闰年的函数}int getDays(int year, int month) {// 获取每个月的天数的函数}void printCalendar(int year, int month) {// 打印日历的函数}int main() {int year, month;printf("请输入年份和月份:");scanf("%d%d", &year, &month);if (year < 0 || month < 1 || month > 12) {printf("输入无效,请重新输入年份和月份。

\n"); return 0;}printCalendar(year, month);return 0;}```在上面的代码中,我们定义了几个函数用于实现各种功能。

首先是`isLeapYear`函数,它用于判断是否为闰年。

根据闰年的定义,我们可以通过以下的逻辑来判断是否为闰年:```cint isLeapYear(int year) {if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {return 1; // 是闰年} else {return 0; // 不是闰年}}```接下来是`getDays`函数,它用于获取每个月的天数。

(2023)C语言万年历设计报告(一)

(2023)C语言万年历设计报告(一)

(2023)C语言万年历设计报告(一)C语言万年历设计报告这份报告是针对 2023 年度 C 语言万年历设计而准备的。

设计目的该万年历的设计目的是为了让用户能够快速地查看任意公历年份的日历,同时还能够显示节气、万年历和日历信息。

设计思路该万年历的主要思路是通过用户输入任意公历年份,在程序中计算并显示该年的日历信息。

具体实现思路如下:1.用户输入年份信息。

2.程序判断该年份是否为闰年,并计算该年的总天数。

3.根据该年第一天是星期几,排列该年每个月的天数。

4.标记国历节日,如元旦、劳动节等。

5.计算并标记该年的节气,如立春、清明等。

6.计算并标记该年的重要万年历信息,如“三伏”、“四季”等。

设计要点在实现该万年历的过程中需要注意以下几个要点:1.为了代码的可维护性,尽量将每个功能模块拆分成函数的形式。

2.程序中需要处理日期的加减运算,可以使用标准库中的<time.h>。

3.节气和万年历的计算应该基于一些公式而不是硬编码。

设计结果经过实现,该万年历已经能够正常运行,并能够正确地显示各种信息。

用户输入任意公历年份后,程序可以迅速计算并展示该年的万年历、节气和重要节日信息。

结论通过本次 C 语言万年历的设计,我们不仅深入地了解了日期处理等相关知识,还提升了编码的能力。

在日常开发中,我们也可以根据这些基础知识,设计更为实用的应用程序。

可改进之处尽管该万年历已经能够满足基本的需求,但仍有一些改进空间。

例如:1.目前仅支持公历,可以添加其他历法的支持,如农历、阴阳历等。

2.界面可以进一步美化,增加更多交互性的组件,如按钮、下拉菜单等。

3.可以添加更多的功能,如查询特定日期的天气、星座运势等。

总结本次 C 语言万年历设计,使我们更好地理解了日期处理的相关知识,提高了我们的编码水平。

同时,我们也意识到在实际项目中,需要更多的功能和优化,才能更好地服务于用户的需求。

通过持续不断的学习和实践,我们可以不断提升自己的编程技能。

c语言课程设计万年历系统

#include<stdio.h>#include<time.h>#include<math.h>#include<windows.h>#include<conio.h>#define KEYNUMUp 0x48#define KEYNUMDown 0x50#define KEYNUMLeft 0x4b#define KEYNUMRight 0x4d#define KEYNUMPageUp 0x49#define KEYNUMPageDown 0x51int year,month,day; // 全局变量记录时间int daysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31, 30,31}};int runYear(int year) // 判断是否是闰年{int flag=0;if(year@0==0||(year%4==0&&year0!=0))flag=1;return flag;}struct tm* getDay()// 从系统取得当前时间{time_t timer;struct tm* gmt;time(&timer);gmt=localtime(&timer);return gmt;}int dayExame(int year,int month,int day)// 检查日期是否正确{if(year<0||month<1||month>12||day<1||day>31)return 0;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(day>31)return 0;break;case 4:case 6:case 9:case 11:if(day>30)return 0;break;default:if(runYear(year)&&day>29)return 0;else if(runYear(year)==0&&day>28)return 0;}return 1;}int getwDay(int year,int month,int day)// 取得星期{int nday=0,nDay,i,w;for(i=0;i<month-1;i++)nday+=daysOfMonth[runYear(year)][i];nday+=day;nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday;w=nDay%7;return w;}void printCalender(int year,int month,int day);void setDay(int &year,int &month,int &day)// 调节日期{printf("%c:上一年%0下一年\n",24,25);printf("%c:上个月%c下个月\n",27,26);printf("PageUp: 昨天PageDown: 明天\n");printf(" 其他:返回主菜单\n");char k;getch();k=getch();switch(k) // 通过方向键和PageUp 、PageDown 键来调整日期{case KEYNUMUp: year--;if(dayExame(year,month,day)==0){year++; printf("%c",7);} // 检查日期的合法性,保持// 若错误,日期不变,并警告system("cls");printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMDown: year++;if(dayExame(year,month,day)==0){year--;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break; case KEYNUMLeft: month--;if(dayExame(year,month,day)==0){month++;printf("%c",7);}system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMRight: month++; if(dayExame(year,month,day)==0){month--;printf("%c",7);} system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMPageUp: day--; if(dayExame(year,month,day)==0){day++;printf("%c",7);} system("cls");printCalender(year,month,day);setDay(year,month,day);break;case KEYNUMPageDown: day++; if(dayExame(year,month,day)==0){day--;printf("%c",7);} system("cls");printCalender(year,month,day);setDay(year,month,day);break; default: ;}}void printCalender(int year,int month,int day)// 打印月历int i;char wday[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};printf(”%4年%d月%d 日\n",year,month,day);printf(**\n");for(i=0;i<7;i++)printf("%5s",wday[i]);printf("\n");int w;int nowDay=1;w=getwDay(year,month,nowDay);// 找到第一天的星期int n;n=daysOfMonth[runYear(year)][month-1];switch(w) // 放置第一天{case 0:printf("]",nowDay);break;case 1:printf("d",nowDay);break;case 2:printf("d",nowDay);break;case 3:printf(" d",nowDay);break;case 4:printf("%d",nowDay);break;case 5:printf("0d",nowDay);break;default:printf("5d\n",nowDay);}nowDay++;for(i=1;i<n;i++){w=getwDay(year,month,nowDay);printf("]",nowDay);if(w==6) // 如果是星期六则换行打印puts("\n");nowDay++;printf("\n ********************************* **\n\n");void checkCalender()// 查询日历{system("cls");int year,month,day;printf(" 请输入你要查询的日期(格式为年月日,如2009 11 3) :"); scanf("%d%d%d",&year,&month,&day);while(!dayExame(year,month,day)) // 如果日期输入不正确,则重新输入{ printf("%c 你输入的日期错误,请重新输入:",7);scanf("%d%d%d",&year,&month,&day);}system("cls");if(runYear(year))printf("\n 闰年\n\n");else printf("\n 平年\n\n");printCalender(year,month,day);}void inline backMenu(){printf(" 请按任意字符键返回主菜单:");getch();system("cls");void mainMenu(int &year,int &month,int &day)// 主菜单printf(" ************ 主菜单**********printf(" * 1 、日历显示*\n"); printf("* 2 、日历查询*\n"); printf(" * 3 、修改日期*\n"); printf(" * 4 、帮助*\n");printf(" * 5 、退出*\n");printf(" );char menu[100];int flag=0;do{do{f=0;printf("\n 请输入相应数字:");scanf("%s",menu);if(strlen(menu)>2)f=1;}while(f==1);switch(*menu){case '1':system("cls"); // 清屏printCalender(year,month,day); backMenu(); // 实现任意键返回主菜单mainMenu(year,month,day);break;case '2':system("cls"); checkCalender();backMenu(); mainMenu(year,month,day);break;case '3':system("cls");printCalender(year,month,day); setDay(year,month,day);printf(" 请按任意字符键返回主菜单:");getch(); system("cls");mainMenu(year,month,day);break;case '4':system("cls");printf(" 在主菜单中输入相应的数字就可以完成以下功能:\n\n");printf("* 1 、显示今天所在月的月份\n\n");printf("* 2 、输入日期,判断该年是否是闰年,并显示所在月份的月历\n\n"); printf("* 3 、用%c %c %c %c PageUp PageDown 进行日期的调整\n\n",24,25,27,26); printf("* 4 、显示功能及操作方法\n\n");printf("* 5 、退出程序\n\n");backMenu();mainMenu(year,month,day);break;case '5':system("cls");printf(" 程序已退出!\n");exit(0);default:printf("%c 输入错误!\n",7);flag=1;}}while(flag);}{struct tm *gmt=getDay(); year=gmt->tm_year+1900;month=gmt->tm_mon+1;day=gmt->tm_mday;printCalender(year,month,day);// 用系统时间进行初始化,打印当前月历backMenu(); mainMenu(year,month,day);return 0;}。

万年历系统(c++实现)

* Name :P_calendar.cpp
* Author:彭天越
* Description: calendar类的设计,实现相关的功能
* Date:2012-06-17--2012-06-18
* Copyright: HNS University
*************************************************************************************************************************/
* Name : Date.h
* Author:彭天越
* Description: date类的设计,日期的相关信息,如备忘录等
* Date:2012-06-18--2012-06-20
* Copyright: HNS University
*************************************************************************************************************************/
}
for(int i=0;i<m;i++)/***************************************************************求1月到m-1月的天数,暂时不考虑闰年*/
{
Totalday=Totalday+MonthDays[i];
}
if(m>2)/***************************************************************************当月份小于2月是比用考虑是否为闰年*/

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。

万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。

本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。

二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。

2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。

3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。

4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。

(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。

然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。

2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。

3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。

三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。

(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。

数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。

(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。

单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。

万年历C语言设计

万年历的设计:要求:模仿现实生活中的挂历,能够显示年历、月历、日历,并具备退出功能。

当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。

当系统日期变到下一月时,系统自动翻页到下一月。

万年历的程序流程图:主要程序流程图:具体对于月份和年份的程序图如下:上图为计算星期方法 上图为打印日历程序图万年历的设计的程序源代码:#include <stdio.h>#include <stdlib.h>#include <ctype.h>void f(){int day,month,year,sum,leap,S;printf("\n请输入年月日\n");scanf("%d%d%d",&year,&month,&day);while(1){if((month>12||month<1)||(day>31||day<1)){printf("输入错误,重新输入");scanf("%d%d%d",&year,&month,&day);}else break;}switch(month){case 1:sum=0;break;case 2:sum=31;break;case 3:sum=59;break;case 4:sum=90;break;case 5:sum=120;break;case 6:sum=151;break;case 7:sum=181;break;case 8:sum=212;break;case 9:sum=243;break;case 10:sum=273;break;case 11:sum=304;break;case 12:sum=334;break;default:printf("data error");break;}sum=sum+day;if(year%400==0||(year%4==0&&year%100!=0))leap=1;else leap=0;if(leap==1&&month>2)sum++;S=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+sum)%7; switch(S){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 0:printf("星期日\n");break;}}void g(){int i,j=1,k=1,a,b,month,year;printf("\n输入年月:\n");scanf("%d%d",&year,&month);while(1){if(month>12||month<1){printf("输入错误,重新输入");scanf("%d%d",&year,&month);}else break;}b=days_month(month,year);a=firstday (month,year);printf("*************************************\n"); printf(" Sun Mon Tue Wed Thu Fri Sat \n");if(a==7){for(i=1;i<=b;i++){printf("%4d",i);if(i%7==0){printf("\n");}}}if(a!=7){while (j<=4*a){printf(" ");j++;}for(i=1;i<=b;i++){printf("%4d",i);if(i==7*k-a){printf("\n");k++;}}}printf("\n*************************************\n");printf("\n");}int leap (int year){if(year%4==0&&year%100!=0||year%400==0)return 1;else return 0;}int days_month (int month,int year){if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) return 31;if(month==4||month==6||month==9||month==11)return 30;if(month==2&&leap(year)==1) return 29;else return 28;}int firstday(int month,int year){int W;W=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;return W;}void h(){int i,j=1,k=1,a,b,month,year,g;printf("\n输入任意年:\n");scanf("%d",&year);for(g=0;g<=11;g++){month=g+1;b=days_month(month,year);a=firstday (month,year);printf("%d月\n",month);printf("*************************************\n");printf(" Sun Mon Tue Wed Thu Fri Sat \n");if(a==7){for(i=1;i<=b;i++){printf("%4d",i);if(i%7==0){printf("\n");}}}j=1;k=1;if(a!=7){while (j<=4*a){printf(" ");j++;}for(i=1;i<=b;i++){printf("%4d",i);if(i==7*k-a){printf("\n");k++;}}}printf("\n*************************************\n"); printf("\n");}}void main(){for(;;){switch(menu_select()){case 1:printf("输入年月日计算星期几\n");f();break;case 2:printf("打印任意日历\n");g();break;case 3:printf("打印任意年历\n");h();break;case 4:printf("谢谢使用!\n");exit(0);}}}int menu_select(){char S;int cn;printf("1.输入年月日计算星期几\n"); printf("2.打印任意月历\n");printf("3.打印任意年历\n");printf("4.谢谢使用! \n");printf("input 1-4:\n");do {S=getchar();cn=(int)S-48;}while(cn<0||cn>6);return cn;}万年历的运行结果截图万年历的日历功能的实现:月历功能的实现:年历功能的实现:..;.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课程设计的内容 要求: 模仿现实生活中的挂历. 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几). 当系统日期变到下一月时,系统自动翻页到下一月

二、课程设计的要求与数据 1、进一步掌握和利用C语言进行程设计的能力; 2、进一步理解和运用结构化程序设计的思想和方法; 3、初步掌握开发一个小型实用系统的基本方法; 4、学会调试一个较长程序的基本方法; 5、学会利用流程图或N-S图表示算法; 6、掌握书写程序设计开发文档的能力。

三、课程设计应完成的工作 1、编写完成相应题目的程序; 2、编写课程设计报告,课程设计报告的内容应包括以下6个部分: 1) 需求分析:包括设计题目、设计要求以及系统功能需求分析; 2) 总体设计:包括系统总体设计框架和系统功能模块图; 3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图; 4) 调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图); 5) 总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改进?课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议等内容; 6) 附录:主要源程序代码,含必要的注释。 3、答辩:在实验室建立程序运行的环境,并在指导教师的监督下,独立解 决问题、运行程序和回答教师提出的问题。

四、课程设计进程安排

序号 设计各阶段内容 地点 起止日期 1 下达任务书,说明设计要求;收集资料 实验3#517 6.18 2 总体方案设计、详细设计 实验3#517 6.19 3 编写程序,调试分析 实验3#517 6.20 4 撰写报告并上交,答辩 实验3#517 6.21 五、应收集的资料及主要参考文献 [1] 谭浩强.C程序设计(第三版)[M],北京:清华大学出版社,2005.9 [2] 谭浩强. C程序设计题解与上机指导(第三版)[M],北京:清华大学出版社,2005.7 [3] 刘振安 孙忱 刘燕君.C程序设计课程设计. 北京:机械工业出版社, 2004.9

发出任务书日期: 2007年 6 月 18 日 指导教师签名: 计划完成日期: 2007年 6 月 22 日 基层教学单位责任人签章: 主管院长签章:

目 录 1 设计目的与要求………………………………………………………………4 2 总体设计………………………………………………………………………4 3 详细设计………………………………………………………………………5-7 4调试分析 ……………………………………………………………………8-10 5 总结……………………………………………………………………………10 6 附录…………………………………………………………………………11-12 6 答辩记录(正文处请留出适当空白) ………………………………………12-13 7 指导教师意见(正文处请留出十行空白) …………………………………13

1 目的与要求 1. 课程设计的目的 课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际应用问题进行有机结合,锻炼学生分析、解决实际问题的能力,提高学生项目开发及程序调试能力。 2. 课程设计的内容及要求 利用学到的编程知识和编程技巧,通过设计编写一个万年历系统,帮助熟悉程序编写,及时查究错误,独立完成。 要求: 模仿现实生活中的挂历. 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几). 当系统日期变到下一月时,系统自动翻页到下一月

2 总体设计

3 详细设计 1.由于要以系统当前日期的月份为准显示当前月的每一天,所以用如下 ”获取系统当前日期”并分别赋值给变量 year,month,day: time_t today; struct tm *p; time(&today);

主程序 获取系统日期

换算出本月第1天是星期几 打印输出本月月历

计算出当天是星期几 p=localtime(&today); year=p->tm_year+1900; month=p->tm_mon+1; day=p->tm_mday; 注意1,由于返回的是1900到现在的秒数,所以year后面要加上1900,又起始是1月,所以mon要加1; 注意2,头文件 #include 不能忘了.

2.对得到的系统日期进行处理,算出当天是星期几 if(year>=0) //由于已知公元元年1月1日为星期一,所以以改日为基准计算 for(i=0;i{ if((i%4==0 && i%100!=0)||i%400==0) //判断是否为闰年 days=days+366; else days=days+365; } if((year%4==0 && year%100!=0)||year%400==0) //判断是否为闰年 for(j=0;j{days=days+m2[j]; m=m2[month]; //算出当月天数 } else for(j=0;j{days=days+m1[j]; m=m1[month]; //算出当月天数 } days=days+day-2; //元年1月1日为星期一,days得出与之前的那个星期天相差的天数 n=days%7; //余数n为0为星期天,1为星期一….. else printf(“日期错误\n”) 流程图: year>=0 打印日期错误 N 3.由当天是星期几换算成该月第一天是星期几: if(day>1) k=(7-(day-n+6)%7)%7; //此月第一天是星期几 else if(day==1) k=n; 流程图:

判断是否为闰年 days=days+366

days=days+365 i=i+1 i判断是否为闰年 days=days+m2[j] m=m2[month] j=j+1

j

nth-1

days=days+m1[j] m=m1[month]

j=j+1

jdays=days+day-2 n=days%7

Y Y N

N N

N N Y

Y

Y

Y day>1 k=n Y

N 4.打印输出本月当前月历: printf(" sun mon tue wen thu fri sat\n"); for(o=0;oprintf(" "); for(o=k;o{printf("%4d",o-k+1); if(o%7==6) printf("\n"); } 流程图

4 调试分析 1,在当天的系统时间(06年7月21号)运行后;

k=7-(day-n+6)%7 printf(" sun mon tue wen thu fri sat\n")

oprintf(" ") o=o+1

oprintf("%4d",o-k+1) o%7==6 printf("\n") o=o+1

结束

Y Y N N N Y 2,为了验证是否是日期跳到下个月是自动跳换的,我改了系统时间,设定为07年7月21号,运行结果如下:

3,由于上面两次试运行都成功了,所以我把系统时间设定为过去的06年6月,考察看是否还能正常运行: 可以看到,几次试运行都是成立的,而且根据设计,这个万年历可以显示的月历可以到公元元年!

当然调试过程中也遇到了一些问题,如:

发现这是k被赋予了7的结果,所以我就在k=7-(day-n+6)%7;的基础上做了修改:k=(7-(day-n+6)%7)%7; 所以遇到的问题就解决了! 还有一个想法就是定义了days是整型,理论上可能导致超出整型的范围,所以应该可以考虑使用long型,不过必要性不是很大所以忽略.

5 总 结 基本完成了设计的要求内容(模仿显示生活中的挂历,当前页以系统当前日期的月份为准显示当前月的没一天(显示出日期对应的星期几),当系统日期变到下一月时,系统自动翻页到下一月),不过显示页面有待改进,可以更加人性化一些。还有的问题就是现在的是获取系统时间自动换页显示日历,不过没有实现人工换页的功能,如果实现的话,应该要定义变量year,month,day;为可以直接赋值的,那样的话便可以随意查询任意一个月的日历了! 在本次课程设计中,我体会到了很多C语言学习中的心得,我深深体会到查找资料的重要性,因为本次设计需要比较全面的C语言知识,需要从书本查找大量的帮助资料,所以很考大家自我学习提高的能力。 在此设计前,我都不敢想象自己可以用学到的C语言做出这样的程序出来,总觉得自信不够,但通过这次设计,经过了几夜鏖战最后把程序运行出来时,内心的喜悦是难以言表的。这次的成功不仅给了我学号C语言用好C语言的动力,也给了我更加深入的学习C语言的动力,C语言确实是一门很实际的计算机语言! 通过这次设计也使自己对C语言的掌握提高到了一个新的水平,能够利用C语言编写出一个实用的程序,很大程度提高了程序综合设计能力、分析能力和编程能力,以及自我动手能力等等。这对以后学习和工作中遇到问题也是很有帮助的,毕竟我曾经战胜过它!

相关文档
最新文档