本次实训任务是“基于软件的实时日历时钟设计”,可以显示年月日时分秒信息,具有可调整日期和时间功能。实时日历和时钟显示的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,LED显示电路,以及HD7279A等组成,系统通过LED显示数据,所以具有人性化的操作和直观的显示效果。软件方面主要包括时钟程序、键盘程序,显示程序等。本系统以单片机的汇编语言进行软件设计,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了,以便更简单地实现调整时间及日期显示功能。所有程序编写完成后,在keil软件中进行调试,确定没有问题后,在Keil软件中嵌入单片机内进行仿真。1.任务书(1)实现功能利用单片机内部定时器工作于方式2产生精确的时钟节拍,累加时钟节拍获取秒时标,借助软件实现秒、分、小时、日、月、年的运行。利用试验台上7279芯片及附属的16个按键、8位LED数码管实现分屏显示年、月、日或时、分、秒参数;能利用试验台的按键与数码管设置当前的日期、时间参数。(2)硬件设计根据试验台上具有的硬件电路组成整机硬件电路,利用熟悉的CAD软件画出硬件电路原理图。根据任务需要配置单片机内部资源,包括I/O接口、RAM、CTC等资源。(3)软件设计①整机软件框图;②功能子程序设计,包括:初始化、数据显示、数据输入、秒处理、分处理、小时处理、日处理、月处理、年处理、按键驱动、中断服务等子程序设计;③任务调度、整机监控软件设计;④各功能子程序调试及整机软件调试。(4)预习透彻掌握硬件原理,在此基础上进行软件设计。阅读THMEMU-1实验指导书、HD7279A说明书等硬件资料。2.硬件设计实时日历和时钟显示的设计的硬件部分主要由AT89C52单片机,LED显示电路,以及HD7279A等组成,系统通过LED显示数据,所以具有人性化的操作和直观的显示效果。主电路功能是完成年、月、日、星期、时、分、秒之间的转换,再送往LED显示,并且接受键盘操作,对日期和时间进行校正。设计采用动态显示,轮流扫描各个LED使之显示相应的数型码,当扫描频率大于人眼所能识别的频率时就看不到闪烁现象。动态显示的亮度不如静态显示,但静态显示占用的I/O口资源较多,往往用移位寄存器74LS164等来扩充其I/O口不足的情况,当显示位数较多时,这样势必增加硬件开销,增大成本,不利于开阔市场。本设计的突出之处在于硬件电路简单,大大减少了硬件开销,这样又势必增加了软件开发的难度,但降低了成本有利于市场的开阔。其电路图如图3所示。键盘控制采用了HD7279A智能控制芯片,该芯片是一片具有串行接口的,可同时驱动8位共阴式数码管的智能显示驱动芯片,可同时连接多达64键的键盘矩阵,单片即可完成LED显示。键盘接口的全部功能。此芯片内部含有译码,可直接接受BCD码或16进制码,并同时具有2种译码方式,此外还具有多种控制命令。其电路图如图2所示设计主电路才用AT89C52单片机控制,此单片机具有多个I/O接口模块。本次设计中需要用到P1.3,P1.6,P1.7,P2.7,此单片机完全可以适用于本次设计。主机电路图如图1所示图1.主机电路图2.7279接口电路图3.数码管电路1.硬件资源配置本次设计中7279资源配置根据7279说明书将其复位指令定义到A4H单元,选用7279下载数据但不译码方式,将其闪烁指令定义到88H单元,消隐控制指令定义到98H单元,读取键盘数据指令15H。其具体代码如下:RST_CMDDATA0A4HDISM2_CMDDATA90HFLASH_CMDDATA88HNODIS_CMDDATA98HRKEY_CMDDATA15H内部RAM配置将30H定义为显示缓冲区,38H定义为小数点显示缓冲区。39H定义为闪烁显示缓冲区,采用3AH和3BH作为统计中断次数,3CH、3DH、3EH、3FH、40H和41H分别用于寄放秒、分、时、天、月与年的数据,采用42H单元来记录当前显示的是时间还是日期。其具体代码如下:DIS_BUFDATA30HPOINT_BITDATA38HFLASH_BITDATA39HMS50_BUFEQU3AHS1_BUFEQU3BHSEC_BUFEQU3CHMIN_BUFEQU3DHHOU_BUFEQU3EHDAY_BUFEQU3FHMON_BUFEQU40HYEA_BUFEQU41HDIS_NOEQU42HI/O口配置将727的KEY接P1.3,CLK接P1.6,DATA接P1.7,CS接P2.7;并将00H位定义为判断一秒是都到达的标志位,其具体代码如下:KEYBITP1.3CLKBITP1.6DATBITP1.7CSBITP2.7S1_LABBIT00H4.软件设计(1)软件主程序采用模块化设计,其流程图如图4所示图4.主程序流程图其中判断是否到达一秒采用12MHZ晶振的定时器T0使用工作模式一,给定其TH0初值06H累计循环4000次来达到其目的,其具体代码如下:T0_ISR:PUSHPSWPUSHACCDJNZMS50_BUF,T0_ISR1MOVA,#0CJNEA,S1_BUF,T0_ISR2SETBS1_LABMOVMS50_BUF,#200MOVS1_BUF,#20JMPT0_ISR1T0_ISR2:DECS1_BUFMOVMS50_BUF,#200T0_ISR1:POPACCPOPPSWRETI;****************************************INIT:MOVR6,#50;INITIAL7279CALLDELAYMOVA,#RST_CMDCALLSENDSETBCSMOV0AH,#0;1BANKR2MOV0BH,#0;1BANKR3MOVDIS_NO,#0LCALLDIS_TIMEMOVTMOD,#12HMOVTH0,#06HSETBTR0SETBTR1SETBET0SETBEAmovms50_buf,#200movs1_buf,#20RET时间处理则是调用时间处理的子程序;显示时间也是通过调用时间显示子程序;判断是否有按键按下则是通过判断KEY是否为高电平,若KEY为高电平则没有按键按下,若为低电平则有按键按下,按键处理通过调用按键处理子程序;其中判断是否有按键按下具体代码如下M1:JBKEY,M0MOVA,#RKEY_CMDLCALLSENDLCALLRECEIVE(2)时间处理子程序流程图如图5所示图5.时间处理子程序流程图其中秒处理具体代码如下:T_SEC:MOVA,SEC_BUFADDA,#1DAACJNEA,#60H,T_SEC1T_SEC2:MOVSEC_BUF,#0SETBF0RETT_SEC1:JNCT_SEC2MOVSEC_BUF,ACLRF0RET其分、时、月的处理都依次类推;由于本次设计年的处理只需显示两位数所以年只需月满足十二时加一即可;而天的处理比较复杂,需要先判断当前月份是否为二月,继而通过当前年份除以四来判断是否为闰年,如果都是则天需要到达二十九月才可加一;如果月份为二月、年份不为闰年则天到达二十八是月加一;如果都不是则需要判断月份是大月或小月,大月则天到达三十一月加一,小月则天到达三十月加一。(3)按键处理子程序流程图如图6所示图6.按键处理子程序按键处理时根据KEY是否为高电平判断是否有按键按下,当A键按下时数码管显示当前时间,B键按下显示当前日期,C键按下时数码管最高位闪烁进入数据输入状态。其程序代码如下:M1:JBKEY,M0MOVA,#RKEY_CMDLCALLSENDLCALLRECEIVECJNEA,#0AH,M11;PUTA,DISPLAYTIMELCALLDIS_TIMEM11:CJNEA,#0BH,M12;PUTB,DISPLAYDATELCALLDIS_DATEM12:CJNEA,#0CH,M0;PUTC,INPUTDATALCALLDIS_TIMELCALLINPUT_DATALCALLSTORE_TIMELCALLDIS_DATELCALLINPUT_DATALCALLSTORE_DATEJMPM0(4)按键处理中数据输入子程序流程图如图7所示图7.按键处理时数据输入子程序数据输入时继续判断是否有按键按下,此时需要判断KEY是否恢复到高电平;若有按键按下判断是什么按键按下,A键按下则数码管闪烁位左移一位,B键按下则退出数据输入状态,0-9键其中一个按键按下则在数码管闪烁位输入相应数字。其中数字0-9键中的一键按下的具体代码如下:INPUT_D2:CJNEA,#9,INPUT_D21JMPINPUT_D22INPUT_D21:JCINPUT_D22JNBKEY,$JMPINPUT_D0INPUT_D22:MOVB,AMOVA,R1ADDA,FLASH_BITMOVR0,AMOV@R0,BMOVA,DISM2_CMDORLA,FLASH_BITCALLSENDMOVA,BMOVDPTR,#SEG_TABMOVCA,@A+DPTRLCALLSENDSETBCSJMPINPUT_D0A键按下时的具体代码如下:INPUT_DATA:movFLASH_BIT,#7LCALLDIS_FLASHMOVR1,#DIS_BUFINPUT_D0:JBKEY,$MOVA,#RKEY_CMDLCALLSENDLCALLRECEIVESETBCSCJNEA,#0AH,INPUT_D1LCALLDEC_FLASHLCALLDIS_FLASHJNBKEY,$JMPINPUT_D05.简述经过调试后的整机功能在keil软件中进行编写程序,编写完成后直接在keil软件中连接单片机仿真系统进行仿真。在这次设计中选用的AT89C52最好选用12NHZ晶振。经过测试编译完成后的电子日历时钟能够实现时钟日历所具有的功能,可以显示年、月、日。时、分、秒,其中闰年二月、非闰年二月、大小月的天数也可以正确显示,但是每过60秒都约有7秒的延时。设计中软件应该是没有什么太大的问题,所以7秒的延时应该是硬件部分有待修正,但是由于硬件部分是选用学校机房的硬件系统,所以进一步的修正工作无法完成。6.总结与展望历经三周的课程设计很快就结束额,不得不感叹时间的飞逝!通过这次的课程设计我学到了很多的东西:1、当面对一个毫无头绪题目是,我学会了如何着手以及慢慢找到解决的方法!2、通过这次设计我加强了自己的思考以及动手能了,最主要的就是对一个整体解体,对每一个模块进行思考理解,今儿对整体理解!3、这次设计也让我对课本的只是进行了巩固,尤其是一条条繁琐的指令,平时背背忘忘,这次的实践使其深深扎根于我的脑海中。同时,对keil软件运用的更加熟练,相信在今后的实验设计中操作上不会再出现问题了。4、再次体会到细节问题有多么的重要,这次设计,很多次都是一个小小的错误使得整体运行错误,而这些错误却是一些字母符号的输错、少输。除了上述之外,我的耐心及毅力也得到了很大的锻炼,这次不仅对我的学业,而且对我的整个人生也会产生巨大的作用,相信在以后的学习工作中对于单片机方面的东西我都能狗容易上手。