373_3946052_第10章 综合实训.ppt
一、实训目的熟悉常用温度传感器AD590的特性及接口电路的设计方法;学会模块化程序设计方法二、课题要求制作一个水温自动控制系统,要求如下:温度设定范围4090,最小区分度1,标定误差1。用十进制数码显示水的实际温度。环境温度降低时,温度控制的静态误差1。,第10章 综合实训,课题一 水温控制系统设计,三、背景知识1、AD590温度传感器简介 AD590是美国AD公司生产的单片集成两端感温电流源。它的测温范围为-55+150,工作电压范围为4V30V,可以承受44V正向电压和20V反向电压,输出电阻为710M。它产生的电流与绝对温度成正比,非线性误差为0.3。图101为AD590的引脚图,表101为AD590温度与电流的关系表。(a)引脚(b)封装(c)图形符号 图101 AD590引脚、封装及图形符号,表101 各温度与电流、电压参考关系表,AD590是电流输出型器件,必须利用接口电路将AD590输出的电流信号转换成电压信号,再经A/D转换器转换成数字信号,提供给单片机处理。在,2、AD590接口电路,表101中,列出了在不同温度值下的AD590的输出电流,通过图102的放大电路可将输出电流转换成05V的模拟电压。,图102 温度采集电路,四、硬件电路 硬件电路由单片机、温度检测模块、加热控制模块、键盘设定模块及数据显示模块构成。,1、单片机选择 由于系统对控制精度的要求不高,所以选用内部具有程序存储器芯片的AT89C51就可以满足要求了。2、温度检测模块 温度检测模块由温度传感器、信号放大器及A/D转换器组成。由AD590将温度转换成电流信号再经信号放大器得到对应的模拟电压,再经ADC0809转换后接入单片机。如图103所示。,3、加热控制模块 加热控制信号经反相器反相后,驱动固态继电器(SSR)工作,从而接通或断开加热丝两端电源,实现对水的加热控制。加热控制电路如图103所示。为了使加热控制更加精确,系统采用了三组加热电炉丝组合实现,当温差小于5C时,仅A组加热丝工作;当温差在5C10C之间时,采用A、B两组加热控制;当温差大于10C时,采用A、B、C三组加热控制。4、键盘设定及数据显示模块 键盘扫描由11个按键及3位LED共阳极显示器组成。通过P1、P2口直接驱动键盘,为了简化显示接口,这里采用了串行口扩展LED显示器。如图103所示。,图103 水温控制系统硬件原理图,五、软件设计1、程序结构设计(1)主程序 用于进行初始化处理,包括各端口的初始化,定时/计数器的设定、中断允许的设定等。同时进行键盘的扫描输入。图104为主程序流程图。(2)定时中断服务程序 通过单片机内部的定时器T0进行50ms定时,再通过寄存器R6进行计数,以实现1s定时中断的要求。进入中断服务程序后,可进行当前温度的检测及显示,根据所测值与设定值比较进行温度控制等。图105为中断服务程序流程图。,图104 主程序流程图 图105 定时中断服务程序流程图,(3)温度检测程序 温度检测采用每1s定时采样的方式,为了实现温度的准确检测,采用了平均值滤波法抗干扰。即连续4次启动ADC0809进行A/D转换,求取转换结果的平均值,存入指定单元,以得到检测温度值。图106为温度检测程序流程图。(4)温度控制程序 通过比较键盘设定值与温度检测值的差别,按照一定的控制规律,控制输出口线的状态,实现三组加热丝的控制。图107为温度控制程序流程图。(5)温度显示程序 在每次温度检测后,进行一次温度显示刷新;在进行温度设定时,显示设定温度值。,2、主要程序模块清单主程序:,ORG 0000H AJMP MAIN ORG 000BH AJMP T0INT ORG 0030H MAIN:MOV SP,#60H MOV P1,#0FFH;关电炉,开显示 MOV SCON,#00H;设置串行口工作;方式0,发送 MOV TMOD,#01H;定时器初始化 MOV TH0,#3CH;50ms定时初值,MOV TL0,#0B0H MOV R6,#14H;1s定时用(50ms20次)MOV 5DH,#00H;显示缓冲区清零 MOV 5EH,#00H MOV 5FH,#00H ACALLDISP SETB ET0 SETB EA SETB TR0LM0:ACALL KEYSCAN;调用键盘扫描子程序(略),;用于设定温度值AJMP LM0,图106 温度检测程序流程图,图107 温度控制程序流程图,定时中断服务程序:T0INT:MOVTH0,#3CHMOVTL0,#0B0HDJNZ R6,T0END;1s未到,中断返回CLRTR0CLREA MOVR6,#14H;恢复R6初值ACALLTADC;调用温度检测子程序ACALLXSCL;调用标度转换子程序ACALLDISP;调用显示子程序ACALLTCONT;调用温度控制子程序SETBTR0SETBEAT0END:RETI,温度检测子程序:TADC:MOV50H,#00H;清存检测值单元MOVB,#00HMOVR7,#04H;设置转换次数MOVDPTR,#7FFFH;送ADC0809地址TT0:MOVX DPTR,A;启动A/D转换JBP3.2,$;等待转换结束MOVX A,DPTR;读A/D转换数据ADDA,50HMOV50H,AJNCTT1;是否超出8位二进制范围INCB,TT1:DJNZR7,TT0;4次转换是否完成CLRC;求4次A/D转换的平均值XCHA,BRRCAXCHA,BRRCACLRCXCHA,BRRCAXCHA,BRRCAMOV50H,A;平均值存50HRET,温度控制子程序:TCONT:MOVA,51HCLRCSUBBA,50H;设定值实测值MOVR0,AJNCCCPR;小于设定温度,接通相应加热器MOVP1,#0FFH;否则,关闭加热器AJMPCONENDCCPR:MOVA,R0SUBBA,#19HJCCCPR1,MOVP1,#0F8H;开三组加热器AJMP CONENDCCPR1:MOV A,R0SUBB A,#0CHJCCCPR2MOVP1,#0FCH;开两组加热器AJMP CONENDCCPR2:MOVP1,#0FEH;开一组加热器CONEND:RET,显示子程序:DISP:MOVR2,#03H;显示数据的个数MOVR1,#5DH;显示缓冲区首址SETBP1.3DL0:MOVA,R1;取要显示的数MOVDPTR,#TABMOVC A,A+DPTR;查字型码MOVSBUF,A;送出数据DL1:JNBTI,DL1;是否输完一个字节CLRTI;清发送完标志INCR1DJNZR2,DL0;三个数是否都显示完?RETTAB:DB0C0H,0F9H,0A4H,0B0H,99H;09字型码DB92H,82H,0F8H,80H,90H,六、总结与提高 设计、调试大型程序时,应该:先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;接着根据各模块性质和功能将各模块细化,设计出程序流程图;最后根据各模块流程图编制具体程序。,调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。,在这个课题中,采用了软件滤波方式提高检测环节的准确,并且采用了三组加热控制提高了温度变化的精度。在此基础上,还可以增加液面检测、缺水报警电路及打印电路等其它辅助电路的设计,使这个控制系统更完善。,课题二 用88点阵显示器制作电子显示屏,一、实训目的熟悉88点阵显示器与单片机的接口电路及其设计方法;学会模块化程序设计方法。二、课题要求 制作一个88点阵显示器。要求如下:1.显示“电子设计”四个文字;2.显示方式可由K1、K2和K3三个键选择:K1为逐字显示,K2为向上滚动显示,K3为向左滚动显示。,三、硬件电路 显示器采用AT89C51单片机作控制器,时钟频率为12MHz,88点阵显示器采用共阳极结构,其电路如图108所示。P0作为字符数据输出口,P2为字符显示扫描输出口,P1.0P1.2口分别接开关K1、K2、K3,通过改变电阻(270)的大小可改变显示字符的亮度,驱动用9012三极管。,图108 硬件电路图,四、软件设计1、程序结构设计(1)主程序 主程序用于对系统进行初始化,扫描按键开关状态,由按键标志位值(00H、01H、02H)决定显示的方式。主程序流程图如图109所示。,图109 主程序流程图,(2)初始化子程序 用于对端口进行复位操作,将显示用的字符数据从字符表中装入内存单元50H6FH中。字符表中的每个文字占用8个地址单元。(3)显示子程序 显示子程序由显示功能选择程序和显示控制程序组成。显示功能选择程序:负责每次显示时的显示地址首址(在B寄存器中)、每个字的显示时间(由30H中的数据决定)和下一个显示地址的间隔(31H中的数据决定)的处理。,显示子程序:负责对指定8个地址单元的数据进行输出显示。显示一个完整文字的时间约为8ms。在显示子程序中,1ms延时程序是用调用键扫描子程序的方法实现的。图1010为逐字显示及向上滚动显示方式时的显示控制程序流程图。(4)按键扫描程序 用于将按键的状态扫描至20H单元的低三位(20H.0、20H.1、20H.2)中。同时在程序中利用按键扫描程序代替显示程序中的1ms延时程序,既可以提高按键的快速响应,又可以提高动态显示的扫描频率,减少文字显示时的闪烁现象。,图1010 逐字显示及上移显示程序流程图,2、主要程序模块清单主程序:START:MOV 20H,#00H;20H内存单元清0 SETB 00H;20H.0位置1START1:LCALL CLEARMEN;调用上电初始化子;程序 JB 00H,FUN0;20H.0位为1,执行FUN0 JB01H,FUN1;20H.1位为1,执行FUN1 JB02H,FUN2;20H.2位为1,执行FUN2 AJMPSTART1,初始化程序:CLEARMEN:MOV A,#0FFH;四端口置1 MOVP1,A MOV P2,A MOVP3,A MOVP0,A MOVDPTR,#TAB;取“电子设计”字;符表首址 CLR A MOV21H,A;21H-24H内存单元清0 MOV 22H,A MOV 23H,A MOV 24H,A MOV R3,A;R3寄存器清0,MOV R1,#50H;设字符表移入内存;单元首址 MOV R2,#20H;设查表次数(32次)CLLOOP:MOVC A,A+DPTR;查表字符数据移入;内存单元 MOV R1,A MOV A,R3 INC A MOV R3,A INC R1 DJNZ R2,CLLOOP;是否已查表32;次,未完转CLLOOP RET,TAB:DB 0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H;电 DB 0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH;子 DB 0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H;设 DB 0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH;计,键扫描子程序:KEYWORK:MOV P1,#0FFH;置输入状态 JNBP1.0,KEY1;P1.0为0(键按下)转KEY1 JNBP1.1,KEY2;P1.1为0(键按下)转KEY2 JNBP1.2,KEY3;P1.2为0(键按下)转KEY3KEYRET:RET KEY1:LCALL DL10MS;按键1功能处理,延;时10ms削抖动 JB P1.0,KEYRET;是干扰转KEYRET结束 SETB 00H;置逐字显示方式标志;(20H.0=1)CLR 01H CLR 02H RET;子程序返回,KEY2:LCALL DL10MS;按键2功能处理 JB P1.1,KEYRET SETB 01H;置上移显示方式标志;(20H.1=1)CLR 00H CLR 02H RETKEY3:LCALL DL10MS;按键3功能处理 JBP1.2,KEYRET SETB 02H;置左移显示方式标志;(20H.2=1)CLR 01H CLR 00H RET,显示功能选择程序:FUN0:MOV 30H,#80H;逐字显示,1帧显示时间;(约1s)MOV 31H,#08H;换帧跳转步距为8 LJMP DISP1;转显示子程序DISP1FUN1:MOV 30H,#0AH;上移显示,1帧显示时间;(约80ms)MOV 31H,#01H;换帧跳转步距为1 LJMP DISP1;转显示子程序DISP1FUN2:LJMP DISP2;左移显示,显示控制程序:DISP1:MOV B,#50H;显示数据首址 MOV R4,30H;放入1帧显示时间控制数据MOV R5,31H;放入跳转步距控制数据LOOP:LCALL DISPLAY;调用显示子程序一次 DJNZ R4,LOOP;1帧显示时间未到再转;LOOP循环 MOV R4,30H;1帧显示时间到,重装初值 MOV A,B,CJNE A,#68H,CONT;不是末地址转CONT AJMP START1;是末地址,一次显示结束;跳回START1CONT:ADD A,R5;次帧扫描首址调整 MOV B,A AJMP LOOP;转LOOP进行次帧扫描,显示子程序:DISPLAY:MOV A,#0FFH MOV P0,A;关显示数据 MOV P2,A;关扫描 MOV R6,#0FEH;赋扫描字 MOV R0,B;赋显示数据首地址 MOV R7,#08H;一次扫描8行DISLOOP:MOV A,R0;取显示数据 MOV P0,A;放入P0口 MOV P2,R6;扫描输出(显示;某一行)LCALL DL1MS;亮1毫秒 INC R0;指向下一行数据地址 MOV A,R6;扫描字移入A,RL A;循环左移一位 MOV R6,A;放回R6 DJNZ R7,DISLOOP;8行扫描未完转 DISLOOP;继续 RET;8行扫描结束1毫秒延时子程序:DL1MS:MOVR3,#64H;100(10+2)sLOOPK:LCALL KEYWORK DJNZ R3,LOOPK RET,五、总结与提高 该课程设计中,可以看出LED点阵显示的控制是在七段LED数码管显示控制的基础上扩展实现的,二者都是采用动态扫描方式进行设计,从原理上是完全相同的。在这个课题的基础上,还可扩展多个LED点阵显示以实现更加复杂的分批显示模式及中文字幕的显示。,课题三 电子万年历的设计与制作一、实训目的熟悉DS12887时钟日历芯片的特性及设置方法,DS12887芯片与单片机的接口电路及其设计方法;学会模块化程序设计方法。,二、课题要求 制作一个可调万年历。要求如下:内定时间为2000年1月1日12点00分00秒,提供给新产品或换电池时使用。时间调整:开机时,光标停在“年”,移动光标依次修改年、月、日、时、分、秒。每按P1.0一次,光标依年、月、日、时、分、秒顺序移动。每按P1.1一次,光标所在位置的值加1。每按P1.2一次,光标所在位置的值减1。采用LCD液晶显示器显示。,三、背景资料时钟日历芯片DS12887:,能够自动产生年、月、日、时、分、秒等时间信息,芯片内部带有锂电池,外部掉电时,其内部时间信息能够保持10年之久;有12小时制和24小时制两种工作模式;时间的表示方法有两种:二进制数表示和BCD码表示。用户可对DS12887进行编程以实现多种方波输出,用户可对其内部的三路中断通过软件进行屏蔽。,1、引脚说明 Vcc:直流电源+5V输入,当Vcc的输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当Vcc的输入小于+3V时,DS12887会自动将电源切换到内部自带的锂电池上,以保证内部的电路能够正常工作。,图1011 DS12887引脚图,当Vcc输入为+5V时,用户可以访问DS12887内RAM中的数据,并可对其进行读、写操作;,GND:地MOT:总线模式选择 当MOT接Vcc时选用Motorola总线模式,当MOT接GND时选用Intel总线模式。SQW:方波输出 当供电电压Vcc大于4.25V时,SQW脚可进行方波输出,此时用户可以通过对控制寄存器编程来得到13种方波信号的输出。AD0AD7:双向地址/数据总线。AS:地址有效输入。DS/:数据选通/读允许 当MOT接Vcc时作为数据选通;当MOT接GND时,作为读允许输入。,R/:读/写允许输入。若MOT接Vcc,该引脚为高电平时读操作,为低电平时写操作;若MOT接GND,该引脚作为写允许输入。:片选输入。低电平有效。:中断请求输出。低电平有效。:复位端。低电平有效,复位操作不影响时钟日历工作。NC:空引脚。,2、存储器分配与设置 DS12887片内RAM与寄存器地址分配见图1012。DS12887带有128字节片内RAM:,10字节的时标寄存器:用来存储时间信息,地址00H09H CPU可以通过读取时标寄存器获得时间与日历值,也可以编程设置其初值,时标寄存器的值可以用二进制或BCD码表示。4字节的控制寄存器:用来存储控制信息,地址0AH0DH 用户可通过对控制寄存器编程实现从SQW引脚输出多种不同频率的方波,并可对其内部的三路中断通过软件进行屏蔽。114字节作为通用RAM供用户使用,地址为0EH7FH。,1012 片内RAM与寄存器地址分配,时标寄存器的数据格式,见下表所示。,控制寄存器的格式 寄存器A 用于选择时钟频率、中断周期和SQW输出频率,格式如下:,UIP:更新周期标志。当UIP=1时,表示芯片正处于或即将开始更新周期,在此期间不允许读写时标寄存器;当UIP=0时,表示没有更新周期,此时可读时标寄存器。DV2DV0:芯片内部振荡器RTC控制位。当芯片复位后500ms开始第一个更新周期。将这3位设置成010,可使芯片以内置的32.768kHz的振荡频率工作。RS3RS0:周期中断可编程方波输出速率选择位。这4位不同的组合可以产生不同的方波输出,程序可以通过设置寄存器B的SQWE和PIE位控制是否允许周期中断方波输出。RS3RS0与中断周期及SQW输出频率的对应关系如表103所示。,表103 时钟频率选择,寄存器B 主要用于设置芯片的工作状态,格式如下:,SET:允许更新周期位。可读/写,不受信号的影响。当SET=0时,芯片处于正常更新状态;当SET=1时,芯片正常更新被禁止。PIE、AIE、UIE:分别为周期中断、闹钟中断、更新周期结束中断允许位。各位分别为“1”时允许发出相应的中断,由端输出。其中,UIE位在复位或设置SET为1时清零。,SQWE:方波输出允许位。当SQWE=1,按寄存器A输出速率选择位所确定的频率输出方波;当SQWE=0,SQW脚保持低电平。DM:时标寄存器格式选择位。DM=0,为BCD码;DM=1,为二进制码。24/12:24小时或12小时模式设置位。24/12=1,选择24小时工作模式;24/12=0,选择12小时工作模式。DSE:夏令时允许标志位。,寄存器C 为中断标志位寄存器。特点:程序读寄存器C或复位后,该寄存器的内容将自动清零。格式如下:,IRQF:中断申请标志位。该位逻辑表达式为:IRQF=PF PIE+AF AIE+UF UIE。当IRQF=1时,IRQ引脚将输出低电平。,当DSE=1时,夏时制设置有效。在四月的第一个星期日的1:59:59 AM,调到3:00:00 AM;在十月的最后一个星期日的1:59:59 AM,调到1:00:00 AM。当DSE=0无效。,寄存器D 为状态标志寄存器,只有一个标志位VRT(D7),其余各位均为0。格式如下:,VRT:芯片内部RAM与寄存器内容有效标志位。该位为“1”时,表示芯片内部RAM和寄存器内容有效。读该寄存器后,该位将自动置“1”。,PF、AF、UF:这三位分别为周期中断、闹钟中断、更新周期结束中断标志位。只要满足各中断的条件,相应的中断标志位将置“1”。寄存器C的D3D0位为0,不使用。,四、硬件设计 硬件电路见图1013。采用AT89C51单片机作控制器,时钟频率为12MHz。显示器可采用LED显示,但由于LED数码显示所需的数码管较多,这里选用LCD显示器实现。P1.0P1.2口分别接开关K1、K2、K3,分别用于光标的移动及整定时间时的数字调整。,图1013 万年历硬件原理图,五、软件设计1、内部控制寄存器命令字设置(1)DS12887初始化:给寄存器A、B、C、D送控制字(片选有效)(0AH)=20H 设置DS12887时钟频率为32.768kHz,DV2DV0=010;(0BH)=82H 设置DS12887更新周期停止,可进行时钟设定,时间和日期采用BCD码,时间单元为24小时计时方式。(2)DS12887开始计时:设置(0BH)=12H 由UIE=1激活,实现时钟输出显示更新。(3)LCD液晶显示控制器设置(略),2、程序结构设计(1)主程序 用于实现初始化操作,包括中断设置、DS12887时钟芯片及LCD液晶显示控制器的初始化设置等。流程图见1014所示。(2)外部中断0服务程序 用于实现DS12887时钟芯片更新值的输出及显示操作。流程图见1015所示。(3)按键扫描子程序 用于将三个按键的输入状态扫描至89C51相应的寄存器中,进行光标移动、加1或减1的处理。,(4)显示子程序 用于将显示缓冲区数据依次输出到LCD显示器上。(5)加1处理子程序 将加1按键的输入状态转换为对相应存储单元的加1操作,并将BCD码转换成ASCII码送显示缓冲区。(6)减1处理子程序 将减1按键的输入状态转换为对相应存储单元的减1操作,并将BCD码转换成ASCII码送显示缓冲区。(7)内定时间写入子程序 用于将内定时间00年1月1日12点00分00秒输入DS12887相应的时标寄存器中。,图1014 主程序流程图图 1015 中断服务程序流程图,3、主要程序模块清单主程序:ORG0000H AJMPMAIN ORG0003 AJMPEX0INTMAIN:MOVSP,#60H;设置堆栈指针 ACALLBUSY;调用检测LCD是否忙;的子程序 MOVA,#01H;LCD清屏 MOV DPTR,#8100H;送LCD指令寄存地址 MOVXDPTR,A ACALLLCDFIRST;调用LCD初始化程序,MOV IE,#81H;外部中断0允许 MOVA,#20H;对DS12887的寄存;器A赋初值 MOVDPTR,#020AH;送DS12887的寄;存器A的地址 MOVXDPTR,A MOVA,#82H;对DS12887的寄存器B;赋初值 MOVDPTR,#020BH;送DS12887的寄;存器B的地址 MOVXDPTR,A MOV DPTR,#020EH;读DS12887寄存器0E;的内容 MOVXA,DPTR,CJNEA,#01H,LOOP;为0则未设内定;时间 SJMPLOOP1LOOP:ACALLRAMSTART;调用内定时间写入子;程序LOOP1:ACALLDISP;调用成组字符显示子程序 MOVA,#12H;启动DS12887开始计时 MOVDPTR,#020BH MOVXDPTR,ALOOP2:ACALLKEYSCAN;调用键盘扫描子程序 SJMPLOOP2,中断服务子程序:EX0INT:PUSH ACC;现场保护PUSH PSWMOVDPTR,#020CH;读C寄存器,;清除中断标志位IRQFMOVX A,DPTRMOVR2,#00H;光标位置偏移值EX01:MOVDPTR,#CUR;LCD光标位置表首地址MOVA,R2MOVC A,A+DPTR;读取光标地址值ACALLBUSY;检测LCD是否忙?MOVDPTR,#8100H;送LCD指令寄存器地址MOVXDPTR,AMOVDPTR,#TIM;DS12887内部时标寄存器;表首地址,MOVA,R2 MOVCA,A+DPTR;读时标寄存器的地址 MOVDPTR,#0200H;送时标寄存器首址 MOVDPL,A;指向相应时标寄存器地址 MOVXA,DPTR;读相应时标寄存器的内容 ACALLBCDACSII;调用BCD码转换ACSII码子程序 ACALLDISP1;调用单字符显示子程序 INCR2;指向下一时间单元的处理 CJNZR2,#06H,EX01 ACALLCURRET;调用光标复位子程序 POPPSW;恢复现场 POPACC RETI CUR:DB82H,85H,88H,8BH,8EH,91H;LCD“年月日时分秒”光标地址表 TIM:DB09H,08H,07H,04H,02H,00H;时;标寄存器“年月日时分秒”地址,内定时间写入子程序:RAMSTART:MOV A,#00H;写入00秒 MOV DPTR,#0200H MOVXDPTR,A INCDPTR INCDPTR MOVXDPTR,A;写入00分 MOV A,#12H MOVDPTR,#0204H MOVXDPTR,A;写入12时 MOV A,#01H MOV DPTR,#0207H,MOVXDPTR,A;写入1日 INCDPTR MOVXDPTR,A;写入1月 INCDPTR MOVA,#00H;写入00年 MOVXDPTR,A MOVDPTR,#020EH;设定已设置内定时;间标志 MOVA,#01H MOVXDPTR,A RET,六总结与提高 该课程设计中,为了正确地访问时间和日期信息,使用了更新结束中断(UIE=1)的方式实现时间和日期的读取。DS12887的使用非常灵活,读者也可用查询UIP位的方式或设定周期中断速率的方式来实现时间与日期的读取。为了使万年历的程序设计更加完善,还可在此基础上,增加闹钟定时程序等相关内容。,