《万历课程设计.doc》由会员分享,可在线阅读,更多相关《万历课程设计.doc(56页珍藏版)》请在三一办公上搜索。
1、1 设计任务和方案1.1设计任务(一)设计题目:万年历(二)设计目的与任务:学生通过理论设计和实物制作解决相应的实际问题,巩固和运用在单片机技术中所学的理论知识和实验技能,掌握单片机应用系统的一般设计方法,提高设计能力和实践动手能力,为以后从事电子电路设计、研发电子产品打下良好的基础。本次设计要能够显示年、月、日、时、分、秒、星期;其次,能对年、月、日、时、分、秒、星期进行修改。1.2功能要求说明这次项目共设定了十五个功能键,其中S1GN键至S8GN键分别进入相应的功能模块;S10GN键可以显示此日是否有节日,是什么节日;S11GN键对选中的时间变量进行减一;S12GN键对选中的时间变量进行加
2、一;S13GN键为退出键;S14GN键对所要修改的时间变量进行移位选择;S15GN键按下,即可对要修改的时间变量进行修改,同时在要修改的地方用游标显示;S16GN键为确认键。只有当修改键按下时才能对时间进行修改,当时间修改完成后,按下节日键即可显示此日是什么节日,再按下确认键即可以显示时间。1.3设计总体方案及工作原理说明1.3.1主控制器的选择与比较方案(1):采用CPLD作为主控制器, 由于CPLD具有强大的资源,使用方便灵活,易于进行功能扩展,特别是结合了EDA,可以达到很高的效率。此方案逻辑电路复杂,且灵活性不高,不利于各种功能的扩展。方案(2):基于AT89S52单片机来实现系统的控
3、制, 控制外围电路进行时钟显示,键盘控制和液晶显示,此系统控制灵活,能很好地满足本题的基本要求。由于本学期我们开设了单片机这门课程,并且我在暑假期间参加单片机培训时使用的也是AT89S52单片机这块芯片,因此对这块芯片还是比较了解,故在此采用这块芯片作为主控制器。1.3.2时钟方案的选择与比较方案(1):AT89S52单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便
4、。方案(2):DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。综合上述两种方案,宜采用方案(2)实现实时计时功能。1.3.3按键模块方案的选择与比较方案(
5、1): 矩阵式键盘,行线的一端通过上拉电阻与单片机的P1口线的高四位相连,列线的一端也通过上拉电阻与单片机的P1口线低四位相连。矩阵式键盘结构性好,使用于按键较多时的情况。方案(2):独立式键盘, 每个按键的电路是独立的,都有单独一根数据线输出键的通断状态。单片机一条I / O口线对应一个按键。独立式键盘结构简单,易于编程,适用本实验按键较少的情况。由于这次设计中,使用的功能键比较多,若采用独立式键盘占有的I/O口比较多,所以在这里采用行列式键盘。1.3.4显示模块方案的选择与比较方案(1):采用液晶显示,液晶显示是一种被动式的显示器,即液晶本身并不发光,而是利用液晶经过处理后能改变光线通过的
6、特性,而达到白底黑字的目的。液晶显示功耗低,抗干扰能力强,显示信息丰富等特点。方案(2):数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。 由于此次要显示的内容比较多,故采用液晶作为显示界面。总体的设计原理图如图1.1所示图1.1 原理框图2 万年历的硬件系统的设计2
7、.1 硬件系统各模块功能简要介绍 该万年历主要由单片机最小系统、行列式键盘模块、液晶显示电路模块、DS1302时钟电路模块和LED指示灯电路模块组成。各模块的功能如下:(1)单片机最小系统由AT89S52单片机、时钟电路和复位电路构成。AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。时钟电路由一个12MHz的石英晶体振荡器和两个33pF的的电容组成振荡电路和分频电路。复位电路采用上电复位和按键复位结合的方式对电路进行复位,主要是通过RST引脚送入单片机。单片机最小系统为整个电路的核心。(2)矩阵式键盘模块在键盘中按键数量较多时,为了减少I/O口的占
8、用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。 矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按
9、下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。(3)液晶显示电路模块这次使用的是12864液晶芯片,接在单片机P0口。通常所说的12864LCD显示块是所说的点阵液晶显示模块,就是由128*64个液晶显示点组成的一个128列*64行的阵列,所以也就叫成了12864。每个显示点都对应着有一位二进制数,0表示灭,1表示亮。存储这些点阵信息的RAM被称为显示数据存储器。如果要显示某个图形或汉字就是将相应的点阵信息写入到对应的存储单元中。图形或汉字的点阵信息是由自己设计,这时候问题的关键是显示点在液晶屏上的位置与其在存储器中的地址之间的关系。
10、显示点在64*64液晶屏上的位置由列号(line,063)与行号(line,063)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,07)和列地址(Yaddress,063)确定。每个存储单元存储8个液晶点的显示信息。(4)DS1302电路模块DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电
11、(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。各引脚的功能为:Vcc1:备用电池端;Vcc2:5V电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2 Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入; I/O:数据输入输出口;CE/RST:复位脚、X1、X2 是外接晶振脚 (32.768KHz的晶振)地(GND)图2.1DS1302引脚图(5)LED指示灯电路模块单片机P3.2口线上经过一个470的电阻与LED灯的阴极相连接,LED灯的阳极接正五伏电压。470的电阻起限流的作用。LED指示灯电路模块主要用来指
12、示用违规操作发生。2.2 电路原理图、PCB图和元器件布局图Protel原理图、PCB图以及元器件布局图分别见附录1附录2与附录3。 2.3 元器件清单 元器件清单见附录4。3 万年历软件系统的设计3.1 使用的单片机资源的情况万年历用到了单片机的定时器的功能,定时器1采用工作方式1并以中断方式工作;在数据的显示时采用的是查表的方法,因此需要将表格、数据存到单片机的程序存储器中去;用到了波特率发生器与DS1302相连本设计采用矩阵式键盘,键盘直接接在P1口上且按键的结果存贮在单片机的内部数据存储器里面。用到的液晶显示器接到了单片机的P0口线上和P3口线上。DS1302接在单片机P3口线上。 3
13、.2 各模块功能简要介绍 该抢答器所用的软件模块有定时器模块、按键模块、液晶显示模块、时钟芯片模块。(1)定时器模块选择定时器1,设置定时器定时方式为方式1以中断方式工作,设置定时时间为50mS。(2)按键模块采用矩阵式键盘,共用15个按键对电路进行控制和操作,分别为S1GN至S8GN来控制选择相应功能模块。S10GN显示相应的节日;S11GN、S12GN、分别对时间变量进行减与加法处理;S13GN退出键、S14GN为移动修改变量键、S15GN为修改键S16GN为退出键。(3)液晶显示模块液晶初始时显示1.万年历2.点阵屏3.频率计4.密码锁5.信号源6.电压表7.温度计8.计算器;进入万年历
14、界面后显示初始时间2008年2月19日12时20分10秒星期四。(3)时钟模块DS1302有自带的时间且比较精确。因此只要学会如何去读取,以及如何向其写入数据,即可利用其内部时钟。3.3 程序的流程框图(1)主程序流程框图如图3.1所示。图3.1 主程序流程框图(2)万年历功能流程框图 万年历流程框图如图3.2所示。图3.2 万年历功能流程框图(3)万年历修改函数程序流程框图万年历修改程序流程框图如图3.3所示。图3.3 修改函数程序流程框图(4)修改天数程序流程框图修改天数程序流程框图如图3.4所示。图3.4 修改天数程序流程框图(5)显示节日程序流程框图显示节日程序流程框图如图3.5所示。
15、图3.5 显示节日程序流程框图3.4程序清单见附录5。4 万年历设计结论、仿真结果和教学建议4.1 设计结论和使用说明(1)设计结论通过对单片机进行外接键盘和液晶显示器及DS1302时钟芯片的操作以及加上硬件电路和软件设计相结合,实现了对万年历的年、月、日、时、分、秒、星期的显示,并能人为的对年、月、日、时、分、秒、星期进行修改,同时还可以显示出相应的节日。但其上电时显示 湖南 工学院 , 自本0801 ,Made in China , 文 亮 ,闪烁三次后显示1.万年历2.点阵屏3.频率计4.密码锁5.信号源6.电压表7.温度计8.计算器;进入万年历界面后显示初始时间2008年2月19日12
16、时20分10秒星期四。4.2 仿真结果在仿真时用要两个软件,第一个是Keil,第二个是Proteus,本次仿真是将两个软件结合起来进行的。运用Keil软件用来编译和调试程序,运用Ptoteus软件来仿真。这次设计已在Keil中调试成功并运行无误,但在Ptoteus仿真软件中没有找到合适的仿真模型,因此没有仿真运行结果。但是在实物上运行结果完全正常无误,特此用手机将运行结果拍摄下来,如下图所示图4.1 万年历界面图图4.2 万年历初始时间图图4.3 节日显示结果图图4.4 节日显示结果图4.3设计体会本次我设计的万年历已经能够完成任务,达到了设计要求。这次设计的巧妙之处就在于我编写了许多函数,把
17、每一个功能分块做成一个一个的子函数,再去调用这些子函数,因此使读者很容易读懂,且为今后在做类似方面课程设计提供了方便之处。其次我编写的显示节日的功能也比较新颖,这个想法是我在网上查找如何将阳历转换为阴历时无意中发现的,这是在一份C语言的课程设计中看到这个想法的,我在结合自己对硬件的了解成功的实现了这一功能,觉得无比的欣慰。我所用的实物板子的电路虽然不是自己设计的,是在暑假培训时按照老师给我的原理图自己制作的PCB板,在暑期的两个月培训过程中我已经基本掌握了其硬件设计原理,并懂得了如何去使用这些功能模块,我的硬件设计与软件设计能力也得到了一定程度的提高。在这次课程设计中我本来还想加上闹铃功能,但
18、由于时间的关系未能完成,以后我会更加努力完善其功能。4.4教学建议在我的印象中王老师总是对我们严格的要求,好像片刻也不能让我们放下学习的脚步,虽然我们觉得很累,正是在您这种严格的要求下我们才能真正的学到知识。王老师你一直在向我们灌输勤实践的思想对我们的学习带来了很大的帮助,我们用我们辛勤的奋斗学到了许多书本上没有的但很实用的知识,我觉得王老师应该继续向下一届学生灌输这种思想参考文献1马忠梅,籍顺心,张凯,马岩.单片机的C语言应用程序设计M.北京:北京航空航天大学出版社,2006Ma Zhongmei,J, Zhang Kai, MaYan. MCU C language program des
19、ign M .beijing: Beijing aerospace university press, 20062李广弟,朱月秀,冷祖祁.单片机基础M.北京:北京航空航天大学出版社,2007 Li Guangdi, ZhuYuexiu, Leng Zuqi. Microcontroller M .beijing: Beijing university of aeronautics and press, 2007 致 谢在这里我要感谢王老师这段时间对我的悉心教诲,这段时间我确实学到了很多实用的知识,同时经过不断的实践操作,我也加深了对理论的理解。正是在这学期的单片机学习过程中我的硬件设计能力与软
20、件设计能力有了相当大程度提高,在这里我感觉学到了正真的知识,我对今后就业也充满了信心,真心的感谢王老师对我的帮助!附 录1图1原理图图2矩阵式键盘附 录2 图1加液晶最小系统PCB顶层图图2加液晶最小系统PCB底层图图3矩阵式键盘PCB图附 录3图1布局图附 录4 表4.1 元器件清单元件名称型号数量/个用途单片机AT89S521控制核心时钟芯片DS13021实时时钟晶振12MHz1晶振电路晶振32.768kHz1时钟电路电容33pF2晶振电路电解电容10uF/25V1复位电路矩阵式键盘4*416按键/复位电路电阻1K1电源指示电路电阻5.1K1复位电路电阻2202限流/复位电路滑动变阻器50
21、K1LCD12864背光调节三极管90121蜂鸣器电路发光二极管红色1电源指示电路蜂鸣器有源蜂鸣器1蜂鸣器电路纽扣电池CR2025/3V1时钟电路纽扣电池座CR20251时钟电路排座间距2.54mm16显示电路LCDLCD128641显示电路排针间距2.54mm2电源接口电容1041电源接口电源插座1提供+5V电源附 录5 /* 描述: * AT89S52液晶演示 数据p0,控制p1 * 功能: * 万年历 * 技术支持: * 湖南工学院 * * * */#include #include #define uchar unsigned char#define uint unsigned int
22、/*引脚定义区*/#define LCD_data P0 /*数据口*/sbit LCD_RS = P30; /*寄存器选择输入*/ sbit LCD_RW = P31; /*液晶读/写控制*/sbit LCD_EN = P35; /*液晶使能控制*/sbit LCD_PSB = P32; /*串/并方式控制*/sbit LCD_RST = P37; /*液晶复位引脚*/sbit LE=P36; /*373引脚*/sbit L1 =P37;/*DS1302引脚*/sbit SCK=P32;/*DS1302引脚*/sbit SCL= P33;/*DS1302引脚*/sbit RST=P34; /
23、*DS1302引脚*/*变量定义区*/uchar key;uchar keyy;uchar keyx=0;uchar q=0;uchar i;uchar f_50ms;uchar f_x=0;uchar tmp;uchar tmp2;char p;uchar ar;uchar ar0;uchar leap=1;/*/bit ReadRTC_Flag;bit timer;/*/#define delayNOP(); _nop_();_nop_();_nop_();_nop_();/*字符数组定义区*/* *开机界面显示字符*/uchar code DIS1 = 湖南 工学院 ;uchar cod
24、e DIS2 = 自本0801 ;uchar code DIS3 = Made in China ;uchar code DIS4 = 文 亮 ;/*菜单显示字符*/uchar code DIS5 = 1.万年历2.点阵屏;uchar code DIS6 = 3.频率计4.密码锁;uchar code DIS7 = 5.信号源6.电压表;uchar code DIS8 = 7.温度计8.计算器;/*/uchar code DIS19 = 今天无节日 ;uchar code DIS20 = 元旦快了 ;uchar code DIS21 = 世界麻风日 ;uchar code DIS22 = 春节
25、快乐 ;uchar code DIS23 = 元宵节快乐 ;uchar code DIS24 = 青龙节 ;uchar code DIS25 = 世界湿地日 ;uchar code DIS26 = 明天情人节了 ;uchar code DIS27 = 情人节快乐了 ;uchar code DIS28 = 国际海豹日 ;uchar code DIS29 = 全国爱耳日 ;uchar code DIS30 = 明天是结婚纪念日;uchar code DIS31 = 3.8 结婚纪念日 ;uchar code DIS32 = 植树节 ;uchar code DIS33 = 国际警察日 ;uchar
26、code DIS34 = 消费者权益日 ;uchar code DIS35 = 国际航海日 ;uchar code DIS36 = 世界森林日 ;uchar code DIS37 = 世界水日 ;uchar code DIS38 = 世界气象日 ;uchar code DIS39 = 世界防治结核病日;uchar code DIS40 = 愚人节 小心上当;uchar code DIS41 = 世界卫生日 ;uchar code DIS42 = 复活节 ;uchar code DIS43 = 黑色星期五 ;uchar code DIS44 = 端午节快乐 ;uchar code DIS45 =
27、 劳动节快了 ;uchar code DIS46 = 五四青年节 ;uchar code DIS47 = 世界红十字日 ;uchar code DIS48 = 国际护士节 ;uchar code DIS49 = 近日注意母亲节 ;uchar code DIS50 = 国际家庭日 ;uchar code DIS51 = 世界无烟日 ;uchar code DIS52 = 国际儿童节 ;uchar code DIS53 = 世界环境日 ;uchar code DIS54 = 国际禁毒日 ;uchar code DIS55 = 全国爱眼日 ;uchar code DIS56 = 近日注意父亲节 ;u
28、char code DIS57 = 近日注意父亲节 ;uchar code DIS58 = 乞巧节中国情人节;uchar code DIS59 = 中元节快乐 ;uchar code DIS60 = 香港回归记念日 ;uchar code DIS61 = 抗日战争记念日 ;uchar code DIS62 = 世界人口日 ;uchar code DIS63 = 中秋节快乐 ;uchar code DIS64 = 八一建军节 ;uchar code DIS65 = 中国男子节 ;uchar code DIS66 = 抗战胜利记念日 ;uchar code DIS67 = 今日重阳节 ;uchar
29、 code DIS68 = 中国教师节 ;uchar code DIS69 = 九一八事变记念;uchar code DIS70 = 国际爱牙日 ;uchar code DIS71 = 世界旅游日 ;uchar code DIS72 = 中国国庆节 ;uchar code DIS73 = 世界动物日 ;uchar code DIS74 = 联合国日 ;uchar code DIS75 = 明天国际教师节 ;uchar code DIS76 = 国际教师节 ;uchar code DIS77 = 世界青年节 ;uchar code DIS78 = 世界学生节 ;uchar code DIS79
30、= 世界艾滋病日 ;uchar code DIS80 = 明晚平安夜 ;uchar code DIS81 = 今晚平安夜 ;uchar code DIS82 = 圣诞快乐 ;uchar code DIS83 = 明日新年 ;uchar code DIS84 = 凌晨 ;uchar code DIS85 = 早晨 ;uchar code DIS86 = 上午 ;uchar code DIS87 = 中午 ;uchar code DIS88 = 下午 ;uchar code DIS89 = 晚上 ;uchar code DIS90 = 夜晚 ;uchar code DIS91 = 深夜 ;/*万年
31、历显示字符*/uchar code yejingtable = 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39/*,0x03,0x2d*/;/0-9uchar l_tmpdate7 = 10, 20, 12, 19, 2, 4, 8;/秒分时日月周年08-05-15 12:00:00/ 0 1 2 3 4 5 6/ 秒,分,时,日,月 ,周, 年uchar l_tmpdisplay14;code uchar write_rtc_address7 = 0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低
32、位读写位code uchar read_rtc_address7 = 0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; uchar code DIS11 = (时分秒年月日星期);uchar code DIS121 = (修改);uchar code DIS12 = (一二三四五六七);uchar code DIS122 = (确认);uchar code DIS423 = 退出;uchar code DIS123 = 闹钟;uchar code DIS124 = 闹钟设定;/*/uchar panduan(year)if(l_tmpdate6%4=0&l_tmpdate
33、6%100!=0)|year%400=0)leap=1;elseleap=0;return(leap);/*/* */* 延时函数 */* */*/void delay(int ms) while(ms-) uchar i; for(i=0;i150;i+) _nop_(); _nop_();_nop_();_nop_(); /*/* */*检查LCD忙状态 */*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */* */*/bit lcd_busy()bit result=0;LCD_RS =0;LCD_RW =1; LCD_EN =1; delayNOP(
34、);result = (bit)(P0&0x80); LCD_EN = 0; return(result); /*/* */*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */* */*/void writecommand(uchar cmd)/*写指令数据到LCD*/ while(lcd_busy();/*只有不忙的时候才能写指令*/ LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd;/*cmd代表指令*/ delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0;