单片机课设万年历报告29941.pdf

上传人:得****3 文档编号:83521033 上传时间:2023-03-31 格式:PDF 页数:15 大小:446.42KB
返回 下载 相关 举报
单片机课设万年历报告29941.pdf_第1页
第1页 / 共15页
单片机课设万年历报告29941.pdf_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《单片机课设万年历报告29941.pdf》由会员分享,可在线阅读,更多相关《单片机课设万年历报告29941.pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 单片机课程设置万年历报表 一、系统介绍:电子万年历是一种非常广泛的日常计时工具,在现代社会中越来越流行。可对年、月、日、时、分、秒等多种功能进行计时,DS1302 使用寿命长,误差小。数字电子万年历采用直观的数字显示,可同时显示年、月、日、时、分、秒等信息,还具有时间校准等功能。本设计是基于 51 系列单片机的电子万年历设计,可显示年、月、日、时、分、秒的信息,并具有日期和时间可调功能。在设计的同时,更全面地准备了单片机的理论基础和外围扩展知识。在软硬件设计上,没有良好编制依据知识和实践经验,会受到很大的限制。每个功能需要什么样的硬件来实现,程序怎么写,算法怎么实现等等,没有一定编制依据是不

2、可能很好的。实现。在编写程序的过程中,发现仅凭现有的相关知识很难单独完成编写任务。在老师和同学的帮助下,程序的编写完成了。万年历的设计过程在硬件和软件方面是同步设计的。硬件部分主要由 AT89C5 1单片机、LED 显示电路、定时按键电路组成。在单片机的选择上,我使用了 AT89C5 1 单片机,适用于很多复杂的控制应用。软件方面主要包括日历程序、时间调整程序、显示程序等。该程序是用高级语言 C 编写的,以便更容易调整时间。所有程序都写好后,确认没有问题后,将单片机嵌入到 Proteus 软件中进行仿真。在大部分后总在老师和同学的帮助下,电子万年历的设计都是自己努力完成的。二、系统功能说明 一

3、、设计要求:1.具有年、月、日、周、时、分、秒等功能;2.具有年、月、日、周、时、分、秒的调整和校准功能;2、单片机芯片的选型方案及演示:以 89C51 芯片为硬件核心,数码管显示,为了让用户更清晰易懂,万年历日期和时间分别显示,同时对应两个 74LS138 芯片控制数码管显示器,还有 74LS373解码芯片,74LS21 芯片用来控制键盘的功能。如图所示:74LS138 的 8 个输出管脚要么随时为高电平 1,即芯片处于非活动状态,要么只有一个为低电平 0,其余 7 个输出管脚全部为高电平 1。两个输出脚同时为 0,说明芯片已经损坏。74LS373 原理图 当 74LS373 用作地址锁存器

4、时,OE 应为低电平,当锁存使能端 G 为高电平时,输出 Q 1 Q 8 的状态与输入 D1D 8 的状态相同;当 G 发生负跳变时,输入端 D 1 D 8 的数据被锁存到 Q 1 Q 8 中。51 单片机的 ALE 信号可以直接接74LS373 的 G。在 MCS-51 单片机系统中,经常使用 74LS373 作为地址锁存器,其连接方法如上图所示。其中,输入端 1D8D 接单片机的 P0 口,输出端提供低 8位地址,G 端接单片机的地址锁存使能信号 ALE。输出使能端 OE 接地,表示输出三态门常开。显示模组选型方案:LED 数码管用于动态扫描。LED 数码管价格适中,最适合显示数字。并且,

5、采用动态扫描方式与单片机连接时,占用的单片机端口线较少。使用多个数码管显示 LED 数码管使用二极管显示数字和字母,具有亮度高、界面设计简单、价格相对便宜等优点,因此使用 LED 数码管作为显示器。数码管电路 3、键盘的选择 采用独立的按键电路。每个按键占用单独的 I/O 接口线,每个 I/O 口的工作状态互不影响。该款键盘采用端口直接扫描方式。而且这个实验课使用的键盘很少,所以使用独立键比较实用。4.实现定时:直接用单片机定时计数器提供秒信号,用程序计算年、月、日、时、分、秒。这种方案虽然减少了芯片的使用,节省了成本,但实现的时间误差比较大。5.电路设计的最终决定 综上所述,本工作的方案选择

6、:采用 AT89S51 作为主控系统;LED 数码管动态扫描显示。两个 74LS138 和一个 74LS21 芯片。图-5 LED 动态扫描显示 实验经验:经过两周的学习和实验,我终于完成了单片机万年历课程的设计。从开始接到课程设计要求,到万年历的实现,再到报告的完成,每一步对我来说都是一次新的尝试和挑战。这也是我在大学期间独立完成的最大项目。这段时间,我学到了很多知识,也有很多感悟。我开始了独立的学习和实验,查阅了相关的资料和书籍,逐渐把脑海中模糊的概念弄清楚了,一步步改进了自己很不成熟的作品。,每一次进步都是我学习的收获。这份报告的撰写也将使我受益终生。我觉得做报告是我必须用心去做的事情。

7、这是我自己学习和研究的真实过程。没有学习,就不可能有研究的能力。你自己的研究不会有突破。通过这次 MCU 课程,我获得了丰富的理论知识,大大提高了我的实践能力。在 MCU 领域,对我以后进一步学习计算机知识有很大的帮助。参考 1 建中.单片机原理与应用。中国电子科技大学,2006.02 2 君莫 MCU 中级课程。航空航天大学出版 2006.03 3 于发山单片机原理与应用技术。中国矿业大学,2003.12 4 凌霄微机原理与应用中国矿业大学,2004.08 5 何立民.选定的 MCU 应用技术。航空航天大学,2000.08 6 万广义.单片机实验和实用教程。航空航天大学,2005.01 7

8、周航慈.微控制器程序设计基础。航空航天大学,1991.11 8 黄遵熹单片机原理接口及应用西北工业大学,1997.05 9镇江,杜铁军,群.流行单片机实用子程序及应用实例M.:电子科技大学,2002 10紫文编微控制器原理与应用电子科技大学 2006 11 王发能单片机原理与应用科学 2004 附上源代码:#include 位 p1_0=P10;位 p1_1=P11;位 p1_2=P12;位 p1_3=P13;位 p1_4=P14;位 p3_2=P32;无符号字符码 zimal13=0X 3F,0X06,0X5B,0X 4F,0X66,0X6D,0X7D,0X07,0X 7F,0X 6F,0

9、x40,0 x80,0 x00,;/*共阴字号,显示 0-9 字号,后三位代表-,.off*/unsigned int year,month,day,hour,minute,second;/定义变量year,month,day,hour,minute,second;无效延迟();/延时函数;void xianshi(unsigned int h,min,s);/显示时间函数;void ymdxianshi(unsigned int year,month,day);/显示年月日;无效凤鸣();/蜂鸣器功能;int 飞跃(无符号整数年);/判断闰年函数;无符号整数 h,m,s=5;/记录计时时间;

10、无符号整数模式=1,td=0,yw=0;/地位;无效的主要()年=2010;月=5;日=20;小时=23;分钟=59;秒=0;/*初始化年月日时分秒*/TMOD=0 x10;/定时器 1;模式一;TL1=0 xb0;TH1=0 x 3c;时间为 50ms TR1=1;/开启定时器 1 ET1=1;/定时器 1 溢出中断使能位 EX0=1;/外部中断 0 使能 IT0=1;/外部中断 0 触发方式为边沿触发 EA=1;while(1)/主循环;if(hour=h&minute=m&second=s)fengming();/当定时器到时,蜂鸣器响起;if(mode%2=0)ymdxianshi(年

11、,月,日);/显示年月日 别的 if(td%3=2)闲时(h,m,s);/定时状态;else xianshi(时、分、秒);/正常显示时间状态;void delay()/延迟函数;无符号整数 i;for(i=0;i400;i+);void ymdxianshi(unsigned int year,month,day)/年月日的显示和调整 int i,j;我+;if(td%2=1&yw%8=0&i%2=0)/点亮年初一 P2=0 x 7f;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 x 7f;P0=zimal年/1000;延迟();if(td%2=1&yw%8=1&

12、i%2=0)/点亮第二年 P2=0 xbf;P0=zimal12;for(j=0;j1800;j+);别的 P2=0 xbf;P0=zimal年%1000/100;延迟();if(td%2=1&yw%8=2&i%2=0)/点亮第三年 P2=0 xdf;P0=zimal12;for(j=0;j1800;j+);别的 P2=0 xdf;P0=zimal年%100/10;延迟();if(td%2=1&yw%8=3&i%2=0)/点亮第四年 P2=0 xef;P0=zimal12;for(j=0;j1800;j+);else/显示年份 P2=0 xef;P0=zimal年%10;延迟();if(td%

13、2=1&yw%8=4&i%2=0)/显示月光 P2=0 xf7;P0=zimal12;P2=0 xfb;P0=zimal12;for(j=0;j1800;j+);别的 P2=0 xf7;P0=zimal月/10;延迟();P2=0 xfb;P0=zimal月%10;延迟();P2=0 xef;/显示点 P0=zimal11;for(j=0;j100;j+);P2=0 xfb;P0=zimal11;for(j=0;j100;j+);if(td%2=1&yw%8=5&i%2=0)/显示当天的第一天 P2=0 xfd;P0=zimal12;for(j=0;j1800;j+);别的 P2=0 xfd;

14、P0=zimal天/10;延迟();if(td%2=1&yw%8=6&i%2=0)/显示当天的第二天 P2=0 xfe;P0=zimal12;for(j=0;j1800;j+);别的 P2=0 xfe;P0=zimal天%10;延迟();void xianshi(unsigned int h,min,s)/显示时间函数;无符号整数 i,j;我+;如果(td%3!=0&yw%6=0&i%2=0)P2=0 x 7f;/第一个显示时;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 x 7f;P0=zimalh/10;延迟();if(td%3!=0&yw%6=1&i%2=0)

15、/显示时第二个 P2=0 xbf;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 xbf;P0=zimalh%10;延迟();/显示-_ P2=0 xdf;P0=zimal10;延迟();if(td%3!=0&yw%6=2&i%2=0)/显示第一个点;P2=0 xef;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 xef;/显示第二个点;P0=zimalmin/10;延迟();如果(td%3!=0&yw%6=3&i%2=0)P2=0 xf7;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 xf7;P0=zimalm

16、in%10;延迟();P2=0 xfb ;/显示-P0=zimal10;延迟();if(td%3!=0&yw%6=4&i%2=0)/显示第二个中的第一个;P2=0 xfd;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 xfd;;P0=zimals/10;延迟();if(td%3!=0&yw%6=5&i%2=0)/显示秒的秒 P2=0 xfe;P0=zimal12;for(j=0;j2000;j+);别的 P2=0 xfe;P0=zimals%10;延迟();void ex0()interrupt 0/外部中断零;无符号整数 i;如果(p1_3=0)延迟();如果(p

17、1_3=0)模式+;td=0;如果(p1_1=0)延迟();如果(p1_1=0)yw+;/移位;如果(p1_0=0)延迟();如果(p1_0=0)td+;/修改调整时间状态;if(mode%2=0)/调整日期;如果(td%2=1)for(i=0;i=2500)年=0;/年份小于 2500;如果(月12)月=1;/月小于 12;switch(month)/日期限制 案例 4:案例 6:案例 9:11 月 4,6,9,30 天;案例 2:if(leap(year)/闰年 2 月 29 日;而(天 29)天=1;别的 while(day28)day=1;/非闰年 28 天;休息;31)天=1;/12

18、 月的 1,3,5,7,8,10,31 天;/else if(td%3=1)/调整时间;否则如果(td%3=1)ET1=0;/时钟中断 对于(i=0;i 23)小时=0;如果(分钟 59)分钟=0;如果(秒59)秒=0;else/定时状态;ET1=1;如果(td%3=2)for(i=0;i23)h=0;如果(m59)m=0;如果(s59)s=0;void time1()interrupt 3/定时器 1 中断;无符号字符 i;TF0=0;TL0=0 xb0;TH0=0 x 3c;我+;if(i=20)/1 秒到;第二+;我=0;if(second=60)/1 分钟;秒=0;分钟+;if(min

19、ute=60)/1 小时;分钟=0;小时+;如果(小时=24)/1 天;小时=0;天+;switch(month)/1 月;案例 4:案例 6:案例 9:case 11:if(day30)month+;day=1;break;/4,6,9,11 月 30 天;案例 2:if(闰(年)if(day29)month+;day=1;/闰年 29 天;别的 if(day28)month+;day=1;/闰年 28 天;休息;31)month+;day=1;/12 月的 1,3,5,7,8,10,30 天;if(month12)/1 年;年+;月=1;void fengming()/蜂鸣器;诠释米,n;for(m=0;m=100;m+)p1_4=!p1_4;for(n=0;n380;n+);int jump(unsigned int year)/判断闰年函数;诠释飞跃;if(年%4=0&年%100!=0|(年%400=0)飞跃=1;否则飞跃=0;返回(飞跃);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁