0000年~9999年星期算法 -------------------------------------------------------------------------------- ---------*/
unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,unsigned char d) {
unsigned char week, day; c &= 0x03;//百年%4
c = c | (c << 2);//百年%4*5 day = WeekTab[m - 1];//月表 week = day >> 5;//月星期数 day &= 0x1f;//月天数
if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0)))){//平年
if (m == 2) day--;//平年月天数 week++;//平年月表+1 }
y = y + (y >> 2);//年+年/4
week = (week + c + y + d + 2) % 7;//(星期=百年%4*5+年+年/4+月表+日+2)%7
return (week << 5) | day;//返回星期和月天数 }
unsigned char BcdToBin(unsigned char val) {
val = (val >> 4) * 10 + (val & 0x0f);//将BCD码转换为10进制数
return val;//返回10进制数 }
void main(void) {
unsigned char c, y, m, d;
21
unsigned char cx, yx, mx, dx; unsigned char WDay, Week, Day;
/*--------------------------------------------------------- 0001年1月1日 星期天
---------------------------------------------------------*/ c = 0x00; y = 0x01; m = 0x01; d = 0x01;
cx = BcdToBin(c);//百年 yx = BcdToBin(y);//年 mx = BcdToBin(m);//月 dx = BcdToBin(d);//日
WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数 Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
/*--------------------------------------------------------- 1918年1月21日 星期一
---------------------------------------------------------*/ c = 0x19; y = 0x18; m = 0x01; d = 0x21;
cx = BcdToBin(c);//百年 yx = BcdToBin(y);//年 mx = BcdToBin(m);//月 dx = BcdToBin(d);//日
WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数 Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
/*--------------------------------------------------------- 9999年12月31日 星期天
---------------------------------------------------------*/ c = 0x00;
22
y = 0x01; m = 0x01; d = 0x01;
cx = BcdToBin(c);//百年 yx = BcdToBin(y);//年 mx = BcdToBin(m);//月 dx = BcdToBin(d);//日
WDay = WeekDay(cx, yx, mx, dx);//取星期和月天数 Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
/*--------------------------------------------------------- 2004年6月18日 星期五
---------------------------------------------------------*/ c = 0x20; y = 0x04; m = 0x06; d = 0x18;
cx = BcdToBin(c);//百年 yx = BcdToBin(y);//年 mx = BcdToBin(m);//月 dx = BcdToBin(d);//日
WDay = WeekDay20(yx, mx, dx);//取星期和月天数 Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数
/*--------------------------------------------------------- 2018年3月8日 星期四
---------------------------------------------------------*/ c = 0x20; y = 0x18; m = 0x03; d = 0x08;
cx = BcdToBin(c);//百年 yx = BcdToBin(y);//年 mx = BcdToBin(m);//月
23
dx = BcdToBin(d);//日
WDay = WeekDay20(yx, mx, dx);//取星期和月天数 Week = WDay >> 5;//得到星期
Day = WDay & 0x1f;//得到最大月天数 while(1); }
5 心得与体会
回顾起此次单片机课程设计,我仍感慨颇多,从选题到定稿,从理论到实践,可以学到很多很多的的东西。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。但是整个系统只实现了一些最基本的功能,还有许多不足和可以扩展的地方。例如实现公历和农历的转换、闹钟报时等,这些有待以后来弥补,还望各位老师予以指正和修改。
6参考文献
【1】.张靖武.周灵彬.单片机原理、应用与PROTEUS仿真; 【2】.江志红.51单片机技术与应用系统开发案例精选; 【3】.周润景.基于PROTEUS的51单片机设计与仿真; 【4】.王守中.51单片机开发入门与典型实例; 【5】.张齐.朱宁西.单片机系统设计与开发; 【6】.周立功单片机开发网
24
答辩记录
1、例举设计过程中遇到的问题及其解决方法(至少两例)。 答:(1)问题说明:
解决方法:
(2)问题说明:
解决方法:
2、教师现场提的问题记录在此。 答:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3、问卷(对此次课程设计评价)
满意 ( ) 理由或建议: 一般 ( ) 不满意( )
25
26
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库单片机万年历(5)在线全文阅读。
相关推荐: