. . .. . . 单片机应用系统设计课题:基于AT89C51单片机的多功能电子万年历的设计姓名:班级:学号:指导老师:日期:.. .专目录一.绪言 (3)二.系统总体方案设计 (3)三.硬件系统设计: (4)四.系统软件设计 (5)五.设计总结 (8)六.参考文献 (8)七.附录 (9)一.绪论随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。
万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。
因此,研究万年历及扩大其应用,有着非常现实的意义。
本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。
二.系统总体方案设计1.系统设计硬件框图2.实现的基本原理在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给2.硬件原理图四.系统软件设计仿真过程1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。
3、检查所画电路运行图,确保没有错误以后,加载源程序。
4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。
调节开关进行时间的调节。
当秒的显示间隔快与或慢与实际间隔时,调节石英晶体震荡器的频率参数,从而使秒的间隔达到标准。
然后检查电路其它问题,并对其的各参数进行调整,使之正确。
仿真结果通过对源程序的编译,改正了其中的很多错误,然后运行,保证源程序的正确性。
然后按原理图选择正确合理的电器元件,画出正确的电路图,加载源程序运行,顺利实现了单片机数字电子钟的“小时”、“分钟”、“秒”的显示。
1主程序流程图设计2显示模块流程图基本显示模块设计的重点是由显示代码取得相应的段码、显示段码数据的串行发送,程序流程如图1-11所示。
其中时个位的段码必须加上小数点,即带小数点显示时个位,目的是以小数点符代替时间分割符“-”。
软件秒脉冲发生器其实质是利用了定时器0的定时溢出中断,将它设定为100ms溢出中断,则10次中断的时间正好为1s。
将时间参数设计为100ms的原因有两个:1)根据系统时钟主频为6M的特点,16位定时器最大定时时间为65536×2M(M 为机器周期,这里是2μS),即131ms,取整数100便于计次数;2)如取的太短,如10ms,则定时器频繁中断,干扰系统正常运行效果。
有了秒脉冲发生器,10次中断为1s,秒指示灯闪亮1次,秒变量单元加1,60后分变量单元加1,如果为60分则时变量单元加1。
任何一个变量的变化,则显示刷新一次(更新)。
上述思想的实现均集成在定时器0的中断子程序中。
该设计显示模块流程图如图运行结果学无止境,我们现在所做的一切都还只是一个开始。
主要参考资料:[1] 林志琦.基于Proteus的单片机可视化软硬件仿真[M].:航空航天大学,2006.9[2] 周润景,丽娜.基于PROTEUS的电路及单片机系统设计与仿真[M].:航空航天大学,2006.5[3] 靖武,周灵彬.单片机系统的PROTEUS设计与仿真[M].:电子工业,2007.4[4] 周润景,丽娜.PROTEUS入门实用教程[M].:机械工业,2007.9[5] 戴俊峰.嵌入式系统大屏幕LED点阵显示器[J].现代电子技术,2004,27(19):68-89,72.[6] 寿鹏.基于嵌入式系统的LED信息显示技术研究[J].现代电子技术,2005(1):15-47.[7] 楼然苗,光飞.51系列单片机设计实例[M].:航空航天大学,2003.3[8] 楼然苗,光飞.单片机课程设计指导[M].:航空航天大学,2007.7[9] 贾东耀,汪仁煌. 数字温度传感器在仓库温度检测系统的应用[J]. 传感器世界,2001.[10] DALLAS DS18B20数据手册[Z]..maximic.[11]付旭,方康玲.利用VB6.0实现PC机与单片口通讯[J].微计算机信息,2002,18(10):30-31[12] 江全,丽,岑红蕾.Visual Basic串口通信与测控应用技术实战详解[M].:人民邮电,2007.[13] 法国Humirel公司.HS1101使用说明手册.[14] 太阳人电子.SMC1602A LCM使用说明手册.附录:;*****************************;* 万年历程序*;*****************************;67H(高两位年)66H(低两位年)65H(月)64H(星期);63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日);显示缓冲单元CH~7BH(4CH~4BH)年低位,AH~79H(4AH~49H)月,;78H(48H)星期,H~76H(47H~46H)日,H~74H(45H~44H)时,;73H72H(43H~42H)分,H~70H(41H~40H)秒,EH~5DH(55H~54H)农历年;5CH~5BH(53H~52H)农历月,AH~59H(51H~50H)农历日;闰年标志为F0,定时器T1为调整时候闪烁用; LCALL GETWEEK; MOV 78H,WEEkSCLK BIT P3.2IO BIT P3.3RST BIT P3.4TIME_YEAR DATA 66HTIME_MONTH DATA 65HWEEK DATA 64HTIME_DAY DATA 63HHOUR DATA 62HMINTUE DATA 61HSECOND DATA 60HDS1302_ADDR DATA 32HDS1302_DATA DATA 31Hstart_year EQU 01; 定义查询表起始年份,01--199 表示1901-2099 年week_byte1 DATA 3AHWEEK_BYTE2 DATA 3BHWEEK_BYTE3 DATA 3CHWEEK_BYTE4 DATA 3DHWEEK_BYTE5 DATA 3EHCONvert_year DATA 6dhCONvert_month DATA 6eh ;BIT7 为1 表示闰月CONvert_date DATA 6fhtemp_Byte1 DATA 68htemp_Byte2 DATA 69htemp_Byte3 DATA 6Ahtemp_Byte4 DATA 6Bhtemp_Byte5 DATA 6Ch; RS EQU P3.0; RW EQU P3.1; E EQU P3.5ORG 0000HAJMP STARTORG 0003HRETIORG 000BHLJMP INTT2ORG 001BHLJMP INTT1ORG 30H;************************************;* 主程序*;************************************start:mov R1,#254h ;清RAM 128单元mov r0,#2mov a,#0clear:mov r0,ainc r0djnz r1,clearmov r0,AMOV R1,AMOV R7,#10 ;计数器初始计数值..SETB EA ;打开总中断; MOV T2CON,#0;MOV T2MOD,#0; MOV TH2,#0;MOV TL2,#0;SETB TR2MOV SCON,#00H ;串行输出,方式MOV TMOD,#11H ;计数器,方式;计数器,方式MOV TL1,#00H ;计数器初值65.5MS中断一次MOV TH1,#00HMOV TH0,#3CH ;计数器50MS中断一次MOV TL0,#0B0HCLR P0.6MOV DS1302_ADDR,#8EHMOV DS1302_DATA,#00H ;允许协LCALL WRITEMOV DS1302_ADDR,#90HMOV DS1302_DATA,#0A6H ;1302充电,充电电流.1mAlcall writeSETB ET0 ;打开秒闪定时器SETB TR0main1: MOV DS1302_ADDR,#8DH ;READ OUT YEARLCALL READMOV TIME_YEAR,DS1302_DATAMOV DS1302_ADDR,#8BH ;READ OUT WEEKLCALL READMOV WEEK,DS1302_DATAMOV DS1302_ADDR,#89H ;READ OUT MONTHLCALL READMOV TIME_MONTH,DS1302_DATAMOV DS1302_ADDR,#87H ;READ OUT DAYLCALL READMOV TIME_DAY,DS1302_DATAMOV DS1302_ADDR,#85H ;READ OUT HOURLCALL READMOV HOUR,DS1302_DATA.. MOV DS1302_ADDR,#83H ;READ OUT MINTUE LCALL READMOV MINTUE,DS1302_DATAMOV DS1302_ADDR,#81H ;READ OUTSECONDLCALL READMOV SECOND,DS1302_DATAMOV R0,TIME_YEAR ;年分离,送显示缓存LCALL DIVIDEMOV 7BH,R1MOV 4BH,R1MOV 7CH,R2MOV 4CH,R2MOV 78H,WEEKMOV 48H,WEEKMOV R0,TIME_MONTH ;月分离,送显示缓存LCALL DIVIDEMOV 79H,R1MOV 49H,R1MOV 7AH,R2MOV 4AH,R2MOV R0,TIME_DAY ;日分离,送显示缓存LCALL DIVIDEMOV 76H,R1MOV 46H,R1MOV 77H,R2MOV 47H,R2MOV R0,HOUR ;小时分离,送显示缓存LCALL DIVIDEMOV 74H,R1MOV 44H,R1MOV 75H,R2MOV 45H,R2MOV R0,MINTUE ;分分离,送显示缓存LCALL DIVIDEMOV 72H,R1MOV 42H,R1MOV 73H,R2MOV 43H,R2MOV R0,SECOND ;秒分离,送显示缓.存LCALL DIVIDEMOV 70H,R1MOV 40H,R1MOV 71H,R2MOV 41H,R2LCALL GENGXIN ;更新农历程序MOV R0,CONVERT_MONTH ;农历月分离,送显示缓存LCALL DIVIDEMOV 5BH,R1MOV 52H,R1MOV 5CH,R2MOV 53H,R2MOV R0,CONVERT_DATELCALL DIVIDEMOV 59H,R1MOV 50H,R1MOV 5AH,R2MOV 51H,R2LCALL GETWEEKMOV 78H,WEEKLCALL DISPLAYGOON:JNB P1.1,SETGG ;调整日历;JNB P1.4,QIDONG ;启动秒钟指示灯; LCALL QIDONGAAA: JNB F0,SSSCLR P1.0 ;闰月,则p1.0清,指示灯亮LJMP MAIN1SSS: SETB P1.0 ;非闰月,则p1.0置位,指示灯灭LJMP MAIN1SETGG: LJMP SETGQIDONG: LCALL DISPLAY ;秒钟指示灯开启/关闭;JNB P1.4,QIDONG; LCALL QIDONGCPL 30H ;30JB 30H,ONCLR TR0CLR ET0AJMP QDOUTON: SETB TR0SETB ET0QDOUT: AJMP AAA;*****************************...;* 秒灯闪烁程序*;*****************************INTT2: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低位初值修正MOV TL0,A ;重装初值(低位修正值)MOV A,#3CH ;高位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高位修正值)SETB TR0 ;开启定时器T0CLR PSW.4DJNZ R7,INTT2OUTMOV R7,#10CPL 20HJB 20H,S1SETB P0.7 ; 秒指示灯闪烁AJMP INTT2OUTS1:CLR P0.7INTT2OUT: POP PSW ;出栈POP ACCSETB ET0RETI;*********************************;* 写程序*;*********************************WRITE: CLR SCLKNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8WRITE1: RRC A ;送地址给NOPNOPCLR SCLKNOPNOPNOPMOV IO,CSETB SCLK ;送入地址在时钟上升沿有效..NOPNOPNOPNOPDJNZ R4,WRITE1CLR SCLKNOPMOV A,DS1302_DATAMOV R4,#8WRITE2: RRC ANOP ;送数据给,时钟上升沿,数据输入CLR SCLKNOPNOPMOV IO,CNOPNOPNOPSETB SCLKNOPNOPDJNZ R4,WRITE2CLR RSTRET;*******************************;* 读程序*;*******************************READ: CLR SCLKNOPNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8READ1: RRC ANOPMOV IO,CNOPNOPNOPSETB SCLK ;送入地址在时钟上升沿有效NOPNOPNOP..;CLR SCLKCLR SCLKNOPNOPDJNZ R4,READ1MOV R4,#8READ2: CLR SCLKNOPNOPNOPMOV C,IONOPNOPNOPNOPNOP ;从ds1302中读取数据,时钟下降沿有效RRC ANOPNOPNOPNOPSETB SCLKNOPDJNZ R4,READ2MOV DS1302_DATA,ACLR RSTRET;*******************************;* 公历设置程序*;*******************************SETG: CLR TR0CLR ET0SETB TR1SETB ET1CLR 08HCLR 09HCLR 0AHCLR 0BHCLR 0CHCLR 0DHCLR 0EHCLR 0FHMOV DS1302_ADDR,#8EHMOV DS1302_DATA,#00H ;允许写..LCALL WRITEMOV DS1302_ADDR,#80HMOV DS1302_DATA,#80H ;1302停止振荡LCALL WRITEGWAIT: LCALL DISPLAYJNB P1.1,GWAITSETG1: LCALL DISPLAYJNB P1.1,SETGMONJNB P1.3,GADDYEARJNB P1.4,GDECYEARJNB F0,SSSYEARCLR P1.0 ;闰月,则p1.1清,指示灯亮LJMP SETG1SSSYEAR: SETB P1.0AJMP SETG1SETGMON: AJMP SETG2GADDYEAR: MOV R7,66H ;年加LCALL ADD1MOV 66H,AGADDYEAR1: LCALL GETWEEK ;年加同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#8CH ;年值送MOV DS1302_DATA,66HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,66HLCALL DIVIDE ;年分离送显示缓冲MOV 4BH,R1MOV 7BH,R1MOV 4CH,R2MOV 7CH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT1: LCALL DISPLAYJNB P1.3,WAIT1AJMP SETG1.. GDECYEAR: MOV R7,66H ;年减LCALL DEC1MOV 66H,ALCALL GETWEEK ;年减同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#8CH ;年值送MOV DS1302_DATA,66HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,66HLCALL DIVIDE ;年分离送显示缓冲MOV 4BH,R1MOV 7BH,R1MOV 4CH,R2MOV 7CH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT2: LCALL DISPLAYJNB P1.4,WAIT2AJMP SETG1SETG2: SETB 0AH ;调月时闪标志GWAIT3: LCALL DISPLAYJNB P1.1,GWAIT3SETG3: LCALL DISPLAYJNB P1.1,SETGDAYJNB P1.3,GADDMONTHJNB P1.4,GDECMONTHJNB P1.2,JUMPYEARJNB F0,SSSMONTHCLR P1.0 ;闰月,则p1.1清,指示灯亮LJMP SETG3SSSMONTH: SETB P1.0AJMP SETG3JUMPYEAR: LCALL DISPLAYCLR 0AHJNB P1.2,JUMPYEARAJMP SETG1..SETGDAY: AJMP SETG4GADDMONTH: MOV R7,65H ;月加LCALL ADD1MOV 65H,ACJNE A,#13H,GADDMONTH1MOV 65H,#01HGADDMONTH1: LCALL GETWEEK ;月加同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#88H ;月值送MOV DS1302_DATA,65HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,65HLCALL DIVIDE ;月分离送显示缓冲MOV 79H,R1MOV 49H,R1MOV 7AH,R2MOV 4AH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT4: LCALL DISPLAYJNB P1.3,WAIT4AJMP SETG3GDECMONTH:MOV R7,65H ;月减LCALL DEC1MOV 65H,ACJNE A,#00H,GDECMONTH1MOV 65H,#12HGDECMONTH1: LCALL GETWEEK ;月减同时换算出星期LCALL YMD ;转换农历月日MOV DS1302_ADDR,#88H ;月值送MOV DS1302_DATA,65HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITE..MOV R0,65HLCALL DIVIDE ;月分离送显示缓冲MOV 79H,R1MOV 49H,R1MOV 7AH,R2MOV 4AH,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT5: LCALL DISPLAYJNB P1.4,WAIT5AJMP SETG3SETG4: SETB 0BH ;调日时闪标志GWAIT6: LCALL DISPLAYJNB P1.1,GWAIT6SETG5: LCALL DISPLAYJNB P1.1,SETGHOURJNB P1.3,GADDDAYJNB P1.4,SETGDDAYJNB P1.2,JUMPMONTHJNB F0,SSSDATECLR P1.0 ;闰月,则p1.1清,指示灯亮LJMP SETG5SSSDATE: SETB P1.0AJMP SETG5JUMPMONTH: LCALL DISPLAYCLR 0BHJNB P1.2,JUMPMONTHAJMP SETG3SETGHOUR: AJMP SETG6SETGDDAY: AJMP GDECDAYGADDDAY: MOV A,65HCJNE A,#01H,FEBLCALL MMONTH ;一月日加AJMP GADDDAY1FEB: CJNE A,#02H,MARCHMOV R3,66H ;二月日加LCALL ZH ;BCD码转换成HEXMOV A,R3..JZ RFEBMOV R7,63H ;平年二月有天LCALL ADD1MOV 63H,ACJNE A,#29H,FEB1MOV 63H,#01FEB1: AJMP GADDDAY1RFEB: MOV R7,63H ;闰年二月有天LCALL ADD1MOV 63H,ACJNE A,#30H,FEB2MOV 63H,#01FEB2: AJMP GADDDAY1MARCH: CJNE A,#03H,APRILLCALL MMONTH ;三月加AJMP GADDDAY1APRIL: CJNE A,#04H,MAYLCALL LMONTH ;四月加AJMP GADDDAY1MAY: CJNE A,#05H,JUNELCALL MMONTH ;五月加AJMP GADDDAY1JUNE: CJNE A,#06H,JULYLCALL LMONTH ;六月加AJMP GADDDAY1JULY: CJNE A,#07H,AUGUSTLCALL MMONTH ;七月加AJMP GADDDAY1AUGUST: CJNE A,#08H,SEPTEMBERLCALL MMONTH ;八月加AJMP GADDDAY1SEPTEMBER:CJNE A,#09H,OCTOBERLCALL LMONTH ;九月加AJMP GADDDAY1OCTOBER: CJNE A,#10H,NOVEMBERLCALL MMONTH ;十月加AJMP GADDDAY1NOVEMBER: CJNE A,#11H,DECEMBERLCALL LMONTH ;十一月加AJMP GADDDAY1DECEMBER: CJNE A,#12H,ERRORLCALL MMONTH ;十二月加AJMP GADDDAY1..ERROR: AJMP WAIT7GADDDAY1: LCALL GETWEEKLCALL YMD ;转换农历月日MOV DS1302_ADDR,#86H ;日值送MOV DS1302_DATA,63HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,63HLCALL DIVIDE ;日分离送显示缓冲MOV 76H,R1MOV 46H,R1MOV 77H,R2MOV 47H,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT7: LCALL DISPLAYJNB P1.3,WAIT7AJMP SETG5;*****************************************************************************************GDECDAY: mov A,65HCJNE A,#01H,DFEBLCALL DMMONTH ;一月日减AJMP GDECDAY1DFEB: CJNE A,#02H,DMARCHMOV R3,66H ;二月日减LCALL ZH ;BCD码转换成HEXMOV A,R3JZ DRFEBMOV R7,63H ;平年二月有天LCALL DEC1MOV 63H,ACJNE A,#00H,DFEB1MOV 63H,#28HDFEB1: AJMP GDECDAY1DRFEB: MOV R7,63H ;闰年二月有天LCALL DEC1MOV 63H,ACJNE A,#00H,DFEB2..MOV 63H,#29HDFEB2: AJMP GDECDAY1DMARCH: CJNE A,#03H,DAPRILLCALL DMMONTH ;三月减AJMP GDECDAY1DAPRIL: CJNE A,#04H,DMAYLCALL DLMONTH ;四月减AJMP GDECDAY1DMAY: CJNE A,#05H,DJUNELCALL DMMONTH ;五月减AJMP GDECDAY1DJUNE: CJNE A,#06H,DJULYLCALL DLMONTH ;六月减AJMP GDECDAY1DJULY: CJNE A,#07H,DAUGUSTLCALL DMMONTH ;七月减AJMP GDECDAY1DAUGUST:CJNE A,#08H,DSEPTEMBERLCALL DMMONTH ;八月减AJMP GDECDAY1DSEPTEMBER:CJNE A,#09H,DOCTOBERLCALL DLMONTH ;九月减AJMP GDECDAY1DOCTOBER:CJNE A,#10H,DNOVEMBERLCALL DMMONTH ;十月减AJMP GDECDAY1DNOVEMBER:CJNE A,#11H,DDECEMBERLCALL DLMONTH ;十一减加AJMP GDECDAY1DDECEMBER: CJNE A,#12H,DERRORLCALL DMMONTH ;十二月减AJMP GDECDAY1DERROR: AJMP WAIT8GDECDAY1: LCALL GETWEEK..LCALL YMD ;转换农历月日MOV DS1302_ADDR,#86H ;日值送MOV DS1302_DATA,63HLCALL WRITEMOV DS1302_ADDR,#8AH ;星期值送MOV DS1302_DATA,64HLCALL WRITEMOV R0,63HLCALL DIVIDE ;日分离送显示缓冲MOV 76H,R1MOV 46H,R1MOV 77H,R2MOV 47H,R2MOV R0,64HLCALL DIVIDE ;星期分离送显示缓冲MOV 48H,weekMOV 78H,weekWAIT8: LCALL DISPLAYJNB P1.4,WAIT8AJMP SETG5SETG6: SETB 0CH ;调小时时闪标志GWAIT9: LCALL DISPLAYJNB P1.1,GWAIT9SETG9: LCALL DISPLAYJNB P1.1,SETG10JNB P1.3,GADDHOURJNB P1.4,GDECHOURJNB P1.2,JUMPDATEAJMP SETG9JUMPDATE: LCALL DISPLAYCLR 0CHJNB P1.2,JUMPDATEAJMP SETG5GADDHOUR: MOV R7,62H ;小时加LCALL ADD1MOV 62H,ACJNE A,#24H,GADDHOUR1MOV 62H,#00HGADDHOUR1: MOV DS1302_ADDR,#84H ;小时值送MOV DS1302_DATA,62HLCALL WRITEMOV R0,62HLCALL DIVIDE ;小时分离送显示缓冲..MOV 74H,R1MOV 44H,R1MOV 75H,R2MOV 45H,R2WAIT10: LCALL DISPLAYJNB P1.3,WAIT10AJMP SETG9GDECHOUR: MOV R7,62H ;小时减LCALL DEC1MOV 62H,ACJNE A,#99H,GDECHOUR1MOV 62H,#23HGDECHOUR1: MOV DS1302_ADDR,#84H ;小时值送MOV DS1302_DATA,62HLCALL WRITEMOV R0,62HLCALL DIVIDE ;小时分离送显示缓冲MOV 74H,R1MOV 44H,R1MOV 75H,R2MOV 45H,R2WAIT11: LCALL DISPLAYJNB P1.4,WAIT11AJMP SETG9SETG10: SETB 0DH ;调分时闪标志GWAIT12: LCALL DISPLAYJNB P1.1,GWAIT12SETG11: LCALL DISPLAYJNB P1.1,SETGOUTJNB P1.3,GADDMINTUEJNB P1.4,GDECMINTUEJNB P1.2,JUMPHOURAJMP SETG11JUMPHOUR: LCALL DISPLAYCLR 0DHJNB P1.2,JUMPHOURAJMP SETG9GADDMINTUE: MOV R7,61H ;分加LCALL ADD1MOV 61H,ACJNE A,#60H,GADDMINTUE1MOV 61H,#00HGADDMINTUE1: MOV DS1302_ADDR,#82H ;分值送..MOV DS1302_DATA,61HLCALL WRITEMOV R0,61HLCALL DIVIDE ;分分离送显示缓冲MOV 72H,R1MOV 42H,R1MOV 73H,R2MOV 43H,R2WAIT13: LCALL DISPLAYJNB P1.3,WAIT13AJMP SETG11GDECMINTUE: MOV R7,61H ;分减LCALL DEC1MOV 61H,ACJNE A,#99H,GDECMINTUE1MOV 61H,#59HGDECMINTUE1: MOV DS1302_ADDR,#82H ;分值送MOV DS1302_DATA,61HLCALL WRITEMOV R0,61HLCALL DIVIDE ;分分离送显示缓冲MOV 72H,R1MOV 42H,R1MOV 73H,R2MOV 43H,R2WAIT14: LCALL DISPLAYJNB P1.4,WAIT14AJMP SETG11SETGOUT: LCALL DISPLAYJNB P1.1,SETGOUTLCALL GENGXINMOV DS1302_ADDR,#80HMOV DS1302_DATA,#00H ;1302晶振开始振荡LCALL WRITEMOV DS1302_ADDR,#8EHMOV DS1302_DATA,#80H ;禁止写入LCALL WRITECLR 08HCLR 09HCLR 0AHCLR 0BHCLR 0CH..CLR 0DHCLR ET1CLR TR1 ;关闭定时器SETB ET0SETB TR0LJMP MAIN1;***********************************;* 闪动调时程序*;***********************************INTT1: PUSH ACCPUSH PSWGFLASH: CPL 0FHJB 0FH,GFLASH1MOV 7CH,4CH ;全部显示MOV 7BH,4BH;MOV A,4AH;CJNE A,#0,TMONTH;MOV 4AH,#0BHTMONTH:MOV 7AH,4AHMOV 79H,49HMOV 78H,WEEK;MOV A,47H;CJNE A,#0,TDATE;MOV 47H,#0BHTDATE: MOV 77H,47HMOV 76H,46H;MOV A,45H;CJNE A,#0,THOUR;MOV 45H,#0AHTHOUR:MOV 75H,45HMOV 74H,44HMOV 73H,43HMOV 72H,42HMOV 71H,41HMOV 70H,40H; MOV 50H,59H ;农历月日; MOV A,5AH; CJNE A,#0,TNDATE; MOV 5AH,#0BH; TNDATE:MOV 51H,5AH..; MOV 52H,5BH; MOV A,5CH; CJNE A,#0,TNMONTH; MOV 5CH,#0BH; TNMONTH:; MOV 53H,5CHGFLASHOUT: POP PSWPOP ACCRETIGFLASH1: JB 0AH,GFLASH2 ;调年闪MOV 7CH,#0AHMOV 7BH,#0AH;MOV 78H,#0AH ;调年时星期闪;MOV 50H,#0AH ;农历月日闪烁; MOV 51H,#0AH; MOV 52H,#0AH; MOV 53H,#0AHAJMP GFLASHOUTGFLASH2: JB 0BH,GFLASH3 ;调月闪MOV 7AH,#0AHMOV 79H,#0AH;MOV 78H,#0AH ;调月时星期闪;MOV 50H,#0AH ;农历月日闪烁;MOV 51H,#0AH;MOV 52H,#0AH; MOV 53H,#0AHLJMP GFLASHOUTGFLASH3: JB 0CH,GFLASH4 ;调日闪MOV 77H,#0AHMOV 76H,#0AH;MOV 78H,#0AH ;调日时星期闪;MOV 50H,#0AH ;农历月日闪烁;MOV 51H,#0AH;MOV 52H,#0AH;MOV 53H,#0AHLJMP GFLASHOUTGFLASH4: JB 0DH,GFLASH5 ;调小时闪MOV 75H,#0AH..MOV 74H,#0AHLJMP GFLASHOUTGFLASH5: ;调分钟闪MOV 73H,#0AHMOV 72H,#0AHLJMP GFLASHOUT;*********************************;* 加程序*;*********************************ADD1: MOV A,R7ADD A,#01HDA ARET;*********************************;* 减程序*;*********************************DEC1: MOV A,R7ADD A,#99HDA ARET;*********************************;* 大小月加调整程序*;*********************************MMONTH: MOV R7,63H ;大月日加LCALL ADD1MOV 63H,ACJNE A,#32H,MGOOUTMOV 63H,#01HMGOOUT: RETLMONTH:MOV R7,63H ;小月日加LCALL ADD1MOV 63H,ACJNE A,#31H,LGOOUTMOV 63H,#01HLGOOUT:RET;*********************************;* 大小月减调整程序*;*********************************DMMONTH:MOV R7,63H ;大月日减LCALL DEC1..MOV 63H,ACJNE A,#00H,DMGOOUTMOV 63H,#31HDMGOOUT: RETDLMONTH:MOV R7,63H ;小月日减LCALL DEC1MOV 63H,ACJNE A,#00H,DLGOOUTMOV 63H,#30HDLGOOUT:RET; ***************************; * 公历年月日推算星期*; ***************************; 以下子程序用于从当前公历日期, 推算星期,; 入口:time_yeAr,time_month ,time_date , 定义公历年月日,BCD 码, 其中月的;BIT7 表示世纪,0 表示20 世纪,1 表示19 世纪, 与PCF8563 一致; 出口time_week, 0-6 表示星期日- 星期六, 与PCF8563 一致, 程序不改变入口数据; 使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3GetWeek: MOV A,time_yearMOV B,#16DIV ABMOV week_Byte1,BMOV B,#10MUL ABADD A,week_Byte1MOV week_Byte1,A ;temp_Byte1= 年MOV A,time_monthJB ACC.7,getw02MOV A,#100ADD A,week_Byte1MOV week_Byte1,A ;20 世纪年+100MOV A,time_monthCLR ACC.7getw02: JNB ACC.4,getw04ADD A,#10CLR ACC.4getw04: MOV week_Byte2,A ;temp_Byte2= 月MOV A,time_dayMOV B,#16DIV ABMOV week_Byte3,BMOV B,#10.MUL ABADD A,week_Byte3MOV week_Byte3,A ;temp_Byte3= 日MOV A,week_Byte1;ANL A,#03hJNZ getw10 ; 非闰年转移MOV A,week_Byte2CJNE A,#3,getw06getw06: JNC getw10 ; 月大于2 转移DEC week_Byte3 ; 份小于等于2, 又是闰年, 日减1 getw10: MOV A,week_Byte2;LCALL get_CorreCt ; 取月校正表数据ADD A,week_Byte1MOV B,#7DIV AB ;B 放年加校正日数之和后除7 的余数不先做这一步; 有可能数据溢出MOV A,week_Byte1ANL A,#0fChRR ARR A ; 以上年除4 即闰年数ADD A,BADD A,week_Byte3MOV B,#7DIV ABMOV week,BMOV A,WEEKCJNE A,#0,GOBACKMOV B,#07HGOBACK:MOV WEEK,BRETget_COrreCt:MOVC A,A+PCRETDB 0,3,3,6,1,4,6,2,5,0,3,5.。