《单片机课程设计—万年历.doc》由会员分享,可在线阅读,更多相关《单片机课程设计—万年历.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流单片机课程设计万年历.精品文档.郑州轻工业学院软件学院单片机与接口技术课程设计总结报告设计题目: 电子万年历学生姓名: 系 别: 专 业:班 级: 学 号:指导教师: 2011年12月16日设计题目:电子万年历设计任务与要求:1、显示年月日时分秒及星期信息2、具有可调整日期和时间功能3、增加闰年计算功能方案比较:方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用AT89C52单片机为控制中心,显示模块采用普通的共阴LED数码管,键输入采用中断实现功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,
2、通过按键盘开关实现对时间、日期的调整。方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源电路、复位电路、晶振电路等模块。主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对时间、日期的操作。两个方案工作原理大致相同,只有显示模块和时钟电路不同。LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话
3、,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。单片机有定时器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。对比以上方案,结合设计技术指标与要求我们选择了方案二进行设计。逻辑总框图:该电子万年历的总体设计框图如图(1)所示。设计所需的元件:元件名称 型号 数量/个单片机 AT89C52 1
4、时钟芯片 DS1302 1晶振 12MHz 1晶振 32.768kHz 1电容 30pF 2电容 22uF 1按键开关 4电阻 10K 9滑动变阻器 1K 1电池 1.5V 4LCD LCD1602 1电源Vcc +5V 1导线 若干单元电路设计:1、主控制系统单片机中央处理系统的方案设计,选用AT89C52单片机作为中央处理器,如图(2)所示。该单片机除了拥有MCS-51系列单片机的所有优点外,内部还具有8K的在系统可编程FLASH存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定
5、时器件,方便地构成一个最小系统。整个系统结构紧凑,抗干扰能力强,性价比高。2、时钟振荡电路时钟振荡电路图(3)所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF的瓷片电容和一个12MHz的晶振组成,并接入到单片机的XTAL1和XTAL2引脚处,使单片机工作于内部振荡模式。此电路在加电后延迟大约10ms振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。电路中两个电容C1、C2的作用使电路快速起振,提高电路的运行速度。图(3) 时钟振荡电路图 图(4) 复位电路3、复位电路复位电路由电阻和极性电容组成,如图(4)所示,通
6、过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us时,即可实现复位。此复位电路为上电复位,较为简单。若改进可以添加手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。手动按钮复位需要人为在复位输入端RST上加入高电平。一般采用的办法是在RST端和正电源Vcc之间接一个按钮和一个电阻。 5、按键电路按键电路由四个轻触开关组成,如图(9)所示。按键用来调整时间,其一端直接接到单片机的端口,另一端接地,当按下按键时,相应的端口变为低电平,通过一个与门只要
7、这四个按键有一个按下就会在P3.2检测到一低电平就触发外部中断0进入按键调节程序中,通过与个各键相连的端口P3.4_P3.7可以判断是哪个键按下,从而作相应的操作。图(9) 按键电路6、显示电路1602液晶也叫1602字符型液晶 它是一种专门用来显示字母、数字、符号等的点阵型液晶模块 它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。显示电路采用LCD1602液晶显示,如图(10)所示,图中只画出了其相应的接口,3脚用于调节LCD1602的背光,4、5、6为LCD1602的控制口,用于控制其写入或是读出指令,7至14脚为LCD1602的数据口,将数传送到LCD16
8、02中。图(10) LCD1602显示电路LCD1602的特性+5V电压,对比度可调;内含复位电路;提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;有80字节显示数据存储器DDRAM;内建有160个5X7点阵的字型的字符发生器CGROM,8个可由用户自定义的5X7的字符发生器CGRAM;基本操作时序: 读状态:输入:RS=L,RW=H,E=H;输出:DB0DB7=状态字 ;写指令:输入:RS=L,RW=L,E=下降沿脉冲,DB0DB7=指令码 ;输出:无。读数据:输入:RS=H,RW=H,E=H;输出:DB0DB7=数据 ;写数据:输入:RS=H,RW=L,E=下降沿脉冲,
9、DB0DB7=数据 ;输出:无。LCD1602的各种指令不再一一说明。流程图与软件设计:1、程序流程图主程序首先初始化定时器、LCD1602及DS1302,然后就开始查询按键,有键按下则开始调整时间和日期,若没有按下,则执行下面的时间、日期的显示,最后依次循环这些相同的操作,相应流程图如图(11)所示:图(12)程序流程图按键的检测是通过中断的办法来实现,利用按键进行间调整。 K1按下则开始设置时间及日期,同时在第一行最右端显示被选择的对象,第一次按下K1时,设置年份,若按下K3,则是减1操作,按下K2是加1操作,设置好年后,第二次按下K1时,则是设置月份,按K3减,按K2则加1,依次循环下去
10、,则可以将时间和日期设置完毕,K4是确定键,设置好按下即可保存设置了。2、软件设计软件总设计:主程序首先对系统环境初始化,设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA,并对键盘端口置位,再对LCD1602初始化,DS1302初始化。接着扫描键盘,在键盘程序里面是对时间、日期及闹钟的调整,最下面是时间的显示。软件程序编写:软件程序编写的好坏直接影响着系统运行情况的良好。因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C51编写。具体程序见附件一:程序3、软件调试在软件调试过程中,当调节时间和日期
11、后,单片机上电后更新的是PC的时间,后来查找资料发现,是设置ds1302的问题, 对于开发板上的液晶一般RW都接的地,故不需要读液晶状态,也不需要读忙,但在仿真中还是加上了这一部分。还有一个问题,在按键操作时有时会出现功能不稳定,这是由于按键存在抖动,所以后来加个去抖动的延时后在判断,基本就可以解决问题,整体电路与仿真结果分析:电子万年历硬件电路图及仿真如图(13)所示,系统由AT89C52单片机,按键扫描电路、显示电路、时钟电路、晶振电路、复位电路及电源指示电路。仿真正确显示了时间,在LCD1602中正确显示了当前日期、时间,通过按按键K1,就可以开始设置时间,依次按K1依次在年、月、日、时
12、、分之间切换,按K2键用于加1操作,K3键用于减1操作,K4是确定按钮。仿真正确显示了时间和日期,符合设计的要求。图(13) 电子万年历硬件电路图结论与心得:在这学期的课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。而这是以后最实用的,真的是受益匪浅。要面 对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。通过自己的努力,做出了一个万年
13、历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。参考文献图书类:1 张毅坤 陈善久, 单片微型计算机原理及应用 西安电子科技大学出版社2 张毅刚,彭喜元,单片机原理与应用设计 电子工业出版社3 赵建领 薛园园 ,零基础学单片机C语言程序设计 机械工业出版社4 周向红 51单片机课程设计 华中科技大学出版社, 5 郭天祥 51单片机C语言教程-入门,提高,开发,拓展全攻略, 电子工业出版社6 赵亮 侯国锐. 单片机C语言编程与实例 人民邮电出版社程序如下:#include#define uchar unsigned char #define uint unsigned int
14、sbit rs=P26;sbit rw=P25;sbit lcden=P27;sbit s1=P30;sbit s2=P31;sbit s3=P32;uchar count,s1num;char shi,fen,miao,nian,yue,ri,xinqi;uchar code table= 2014-01-10-5 ;uchar code table1= 10:59:00;void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);bit lcd_busy() bit result; rs = 0; rw = 1; lcden =
15、 1; delay(5); result = (bit)(P0&0x80); lcden = 0; return result; void write_com(uchar com) while(lcd_busy(); rw=0;rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date) while(lcd_busy(); rw=0; rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0; void init() uchar num; l
16、cden=0;write_com(0x38);delay(1);write_com(0x0c);delay(1);write_com(0x06);delay(1);write_com(0x01);delay(1);write_com(0x80);for(num=0;num15;num+)write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num12;num+)write_date(table1num);delay(5);TMOD=0x01;TH0=(65536-50000)/256;/50msTL0=(65536-50000
17、)%256;EA=1;ET0=1;TR0=1; void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge); void write_nyr(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);void
18、 keyscan() if(s1=0)delay(5);if(s1=0)s1num+;while(!s1);if(s1num=1)TR0=0;write_com(0x80+0x40+10);write_com(0x0f);if(s1num=2)write_com(0x80+0x40+7);if(s1num=3)write_com(0x80+0x40+4);if(s1num=4)write_com(0x80+5);if(s1num=5)write_com(0x80+7);if(s1num=6)write_com(0x80+10);if(s1num=7)write_com(0x80+14);if(
19、s1num=8)s1num=0;write_com(0x0c);TR0=1; if(s1num!=0)if(s2=0)delay(5);if(s2=0)while(!s2);if(s1num=1)miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)fen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi+;if(shi=24)shi=0;write_sfm(4,shi);write_com(0x80
20、+0x40+4);if(s1num=4)nian+;if(nian=100)nian=0;write_nyr(4,nian);write_com(0x80+4);if(s1num=5)yue+;if(yue=13)yue=1;write_nyr(7,yue);write_com(0x80+7);if(s1num=6)ri+;if(ri=31)ri=1;write_nyr(10,ri);write_com(0x80+10);if(s1num=7)xinqi+;if(xinqi=8)xinqi=1;write_nyr(14,xinqi);write_com(0x80+14);if(s3=0)del
21、ay(5);if(s3=0)while(!s3);if(s1num=1)miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi-;if(shi=-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);if(s1num=4)nian-;if(nian=-1)nian=99;write_nyr(4,ni
22、an);write_com(0x80+4);if(s1num=5)yue-;if(yue=0)yue=12;write_nyr(7,yue);write_com(0x80+7);if(s1num=6)ri-;if(ri=0)ri=31;write_nyr(10,ri);write_com(0x80+10);if(s1num=7)xinqi-;if(xinqi=0)xinqi=7;write_nyr(14,xinqi);write_com(0x80+14); void main() init(); while(1) keyscan(); if(count=18) count=0;miao+;if(miao=60)miao=0;fen+;if(fen=60) fen=0; shi+; if(shi=24) shi=0; write_sfm(4,shi); write_sfm(7,fen); write_sfm(10,miao);/ while(1);void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;count+;