多功能数字电子表总结报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子技术综合设计
总结报告
设计题目:多功能电子表
组长姓名:王家琪学号: 16115746
专业与班级:孙越崎学院越崎专业11级-3班
姓名:李建学号: 16115806 专业与班级:孙越崎学院越崎专业11级-3班
姓名:董向辉学号: 09114090 专业与班级:孙越崎学院越崎专业11级-1班
时间: 2013 ~ 2014 学年第(1)学期
指导教师:成绩:日期:2013.12.17
一、设计任务与要求:
设计任务:多功能数字电子表
基本要求:计时功能:显示时、分、秒,定闹功能,秒表功能,倒计时功能。
提高要求:增加“语音报时”功能,增加“电子日历”功能。
二、方案比较
方案一:
按照系统设计的功能的要求,初步确定系统由主控模块、时钟模块、显示模块各键盘接口模块、功能指示模块共5 个模块组成,电路系统构成框图如图1所示。
主控芯片使用52 系列STC89C52RC 单片机,时钟芯片使用美国DALLAS 公司推出的一款高性能、低功耗、带RAM 的实时时钟DS1302。
采用DS1302 作为计时芯片,可以做到计时准确。
更重要的是,DS1302 可以在很小电流的后备电源(2.5V--5.5V 电源,在2。
5V 时耗电小于300nA)下继续计时,而且DS1302 可以编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本功不耗电。
显示模块采用普通的共阳LED 数码管,键输入采用查询法实现功能调整。
按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块,LCD 显示模块,电源电路、复位电路、晶振电路几个模块,系统框图如图2 所示。
主控模块采用STC89C52RC 单片机,按键模块用四个按键,用于调整时间和设定闹钟,显示模块采用LCD1602,时钟电路模块采用DS1302 实时时钟实现对时间,日期的操作。
方案三:
按照系统设计的要求和功能,将系统分为主控制器模块、显示模块、按键开
关模块、蜂鸣器电路模块。
系统框图如图3 所示,主控制模块采用STC89C52RC
单片机为控制中心,显示模块采用液晶LCD1602 显示,计时使用STC89C52RC 单
片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、
日期的调整。
图3 基于STC89C52RC 单片机的数字钟总体设计框图
上面提到的三个方案中,在电路原理方面大致相同,都能够达到设计任务与要求,在方案一款方案二中使用外部的时钟芯片DS1302 来实现日期和时间的操作,方案三中则利用了单片机自身的定时器功能;方案二和方案三在显示模块上都使用液晶显示屏LCD1602 作为显示,方案一则使用LED 数码管作为显示,采用LED 数码管动态扫描,数码管的价格适中,对于显示数字较好,而且使用单片机的端口也较少;采用LCD1602 液晶显示屏,液晶显示屏的显示功能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED 数码管贵得多,为控制成本,此处选择普通LED数码管。
DS1302 是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,同时可以对秒、时、分、日、月、年以及润年补偿的年进行计数,而且在掉电时能够在外部纽扣电池的供电下继续工作,不会因为掉电后,其时间就要重新设置,方案三中使用定时器的功能,当在掉电的时候就会使时间和日期回到原来设定的初始值,同时直接采用单片机定时计数提供秒信号,使用程序实现年时间和日期,采用此种方案,节约成本,但是实现的时间误差较大,所以不采用这种方案。
综合上述三个方案,我们最终决定各取所长,采用STC89C52RC 作为主控制系统,DS1302 提供时钟,为控制成本,我们选用普通LED数码管作为显示模块。
三、硬件单元电路设计
1.主控制系统
单片机中央处理系统的方案设计,我们选用具有STC 公司的STC89C52 单片机作为中央处理器,如图4 所示。
该单片机除了拥有MCS-51 系列单片机的所有优点外,内部还具有8K 的在系统可编程FLASH 存储器,低功耗的空闲和掉电模式,极大的降低了电路的功耗,还包含了定时器、程序存储器、数据存储器等硬件,其硬件能符合整个控制系统的要求,不需要外接其他存储器芯片和定时器件,方便地构成一个最小系统。
整个系统结构紧凑,抗干扰能力强,性价比高。
是比较合适的方案。
图4 STC89C52RC 主控制系统
2、时钟振荡电路
时钟振荡电路图5 所示,时钟振荡电路用于产生单片机正常工作时所需要的时钟信号,电路由两个30pF 的瓷片电容和一个20MHz 的晶振组成,并接入到单片机的XTAL1 和XTAL2 引脚处,使单片机工作于内部振荡模式。
此电路在加电后延迟大约10ms 振荡器起振,在XTAL2 引脚产生幅度为3V 左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率决定。
电路中两个电容C1、C2 的作用使电路快速起振,提高电路的运行速度,对于STC89C52RC 其工作频率为0 至33MHz,在这个范围内单片机能够正常的工作。
图5 STC89C52RC 时钟振荡电路
3、复位电路
复位电路由电阻和极性电容组成,如图6 所示,通过高电平使单片机复位,在时钟电路开始工作后,当高电平的时间超过大约2us 时,即可实现复位。
此复位电路同时具备了上电复位和手动复位的功能,上电复位发生在开机加电时,由系统自动完成,手动复位通过一个按键来实现,在程序运行时,若遇到死机,死循环或程序“跑飞”等情况,通过手动复位就可以实现重新启动的操作。
手动按钮复位需要人为在复位输入端RST 上加入高电平。
一般采用的办法是在RST 端和正电源Vcc 之间接一个按钮和一个电阻,如图所示,当人为按下按钮时,则Vcc 的+5V 电平就会直接加到RST 端,由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
上电复位的工作过程是在加电时,复位电路通过电容加给RST 端一个短暂的高电平信号,此高电平信号随着Vcc 对电容的充电过程而逐渐回落,即RST 端的高电平持续时间取决于电容的充电时间,由图可知充电时间为:
T=2.3RC=2.3*10*10-6*5.1*103=0.1173s ,保证系统能够可靠地复位。
图6 手动复位电路
4、DS1302 时钟电路
时钟电路主要由时钟芯片DS1302、晶振等几部分组成,如图7 所示。
DS1302采用3 线串行接口,占用引脚少,内部集成了可编程日历时钟,用户可以根据需要通过单片机的控制来自行设置,支持双电源供电,可以使用外部主电源和备用电源,备份电源能够使时钟芯片继续工作,但因为空间问题没有采用备用电源。
图7 DS1302时钟电路
5、按键电路
按键电路由5个轻触开关组成,如图8 所示。
按键用来调整时间和设定闹钟,
以及功能选择,其一端直接接到单片机的端口,另一端接地,当按下按键时,相
应的端口变为低电平,通过检测这一低电平就可以判断是哪个键按下,从而作相
应的操作。
图8 按键电路
6、显示电路
显示电路采用数码管显示,如图9 所示。
图9 LED数码管接口电路
7、蜂鸣器电路
蜂鸣器电路由一个220 欧的电阻,三极管8550,及蜂鸣器组成,如图10 所示。
通过控制三极管的导通和截止来实现蜂鸣器的响与不响。
图10 蜂鸣器电路
8、元件清单
表1 基于STC89C52RC 单片机的数字钟元件清单
规格名称数量组件
------------------------------------------------------------------------------
3MM_1 10 D1, D2, D3, D4, D5, DS1, DS2,DS3,J1
10uF BCY-W2/D3.1 1 C3 12M XTAL_DIP 1 X1 1K AXIAL-0.4 8 R1, R2, R3, R4, R5, R6, R7,R8,R19
30P RAD-0.1 2 C1, C2 32.768K XTAL4 1 X2 3V CR2032 new 1 BT1 4.7K AXIAL-0.4 7 R9, R10, R11, R12, R13, R14,R15
AT89S5*/STC89C5* DIP-40 1 U1 BELL 蜂鸣器 1 BEEP DS1302 zcvzP8C 1 U3 K1 SWHAHA - duplicate 1 K1 K2 SWHAHA - duplicate 1 K2 K3 SWHAHA - duplicate 1 K3 K4 SWHAHA - duplicate 1 K4 K5 SWHAHA - duplicate 1 K5 POWER POWER-3A 1 POWER S8550 三极管 7 Q1, Q2, Q3, Q4, Q5, Q6, Q7。
四、程序软件设计
1.程序流程图
图11 主程序流程图
图12 按键处理流程图
2.程序附后
五、系统仿真与测试
用PROTUES软件,根据数字电子钟的原理图,画出仿真图,得到的图如下所示。
图13电子钟的PROTES仿真
仿真与软件测试成功,接下来我们便开始购买电焊笔、元器件并自行焊接,由于条件有限,我们委托网上某家电子元件商根据我们提供的pcb图制板。
六、实物制作与调试
1.制作过程
图14 实物完成图(正面)
图15 实物完成图(背面)
在拿到电路板后,我们首先检查加工质量,并确保没有任何方面的错误,如短路和断路,尤其要避免电源短路;并且在安装前逐一检查元器件,用万用表测其数值,看是否与所用相同,在检查发现元器件一切正常后我们开始焊接。
在焊接中,由于我们委托制作的pcb板尺寸较小,我们遇到了很多麻烦,如虚焊,焊点空间太小造成的短路等等,这些问题的确令我们头疼。
再耐心的考验下,好在最终了完成焊接。
焊接完成后,我们先空载上电(芯片座上不插芯片),并检查各引脚的电位是否正确。
在确定若一切正常后,方在断电的情况下将芯片插入,并再次检查各引脚的电位及其逻辑关系。
2.成品上电测试(具体功能详见说明书)
在一切检查确认无误,激动人心的时刻终于到来,这也是检验我们一切努力的最终一刻。
图16 电子钟上电走时图(时间显示 13/12/16 12:06:47)
走时功能完美实现,但在接下来的调试中,我们发现闹钟功能可以设置,但蜂鸣器不响,经过一系列排查,我们认为蜂鸣器在焊接过程中出现了损坏,而取下已焊好的蜂鸣器费时费力,我们最终决定不更换蜂鸣器,非常令人遗憾,不过,制作过程令我们受益匪浅。
七、总结
此次电子设计历时半个月完成,虽然方案简单,但在真正完成后我们还是觉得如释重负。
经历了选题时的犹豫不决;方案选择时的精挑细选;程序编写,软件仿真中层出不穷的问题,错误;电路板焊接时我们轮流焊接,其中两人的手上还烫了好几个水泡。
凡此种种,都令我们影响深刻,所以,在真正做完本次设计的时候,我们丝毫不觉得自己的作品有多么简陋,反而觉得敝帚自珍,当成一件宝贝珍藏着。
当然,除了感情收获,友谊收获以外。
在本次电子设计中,我们深刻体会到了工科在于实践的真理。
有好几次,我们明明觉得自己的想法和教科书中完全一致,按理说不应有差错,但是在仿真及实物制作中,就是出不来我们想要的结果。
事后才发现理论没有错误,出错的是接线,编程时的格式问题,焊接中出现了虚焊,焊点偏移等等。
本次的设计对于我们的理论基础也是一次考验,让我们又重新拿起书本,复习了一遍过去学过的内容,如模电、数电、电路、信号等等,我们也发现自己许多不足的地方,深深后悔过去在听课时没有认真,一个知识点的遗漏在实践中就是一整个模块的错误。
最后,我们要感谢老师给了我们一个自己动手实践的机会,虽然我们完成的不是很好,但我们觉得这次难得的经历确确实实让我们受益匪浅,再次感谢老师的谆谆教导,辛勤耕耘。
附录:源程序
HOU_S BIT P2.0;第一个数码管
HOU_G BIT P2.1;第二个数码管
MIN_S BIT P2.2;第三个数码管
MIN_G BIT P2.3;第四个数码管
SEC_S BIT P2.4;第五个数码管
SEC_G BIT P2.5;第六个数码管
T_RST BIT P0.3
T_CLK BIT P0.4
T_IO BIT P0.5
DAY EQU 39H;日期
MONTH EQU 3AH;月份
YEAR EQU 3BH;年份
SECOND EQU 30H;秒
MINUTE EQU 31H;分
HOUR EQU 32H;时
TIM_1 EQU 33H;
TIM_2 EQU 34H;
ORG 0000H
LJMP CHUSHI
ORG 000BH
LJMP TIMER0
ORG 30H
CHUSHI: ;初始化
CLR T_RST
CLR T_CLK
MOV SP ,#60H
MOV MINUTE,#0;
MOV HOUR,#0;时间的初值为000000
MOV DAY,#1;
MOV MONTH,#1;
MOV YEAR,#1;日期的初值为010101
SETB HOU_S;
SETB HOU_G;
SETB MIN_S;
SETB MIN_G;
SETB SEC_S;
SETB SEC_G;初始状态为1,都不显示
MOV R0,#0;
MOV R1,#12;闹铃初始化
MOV R3,#0;
MOV R4,#1;存储定时时间,点击定时开始后,从所存时间开始倒计时MOV R5,#0;
MOV R6,#0;设定定时时间所用寄存器
MOV 38H,#12;
MOV 37H,#0;存储所定闹铃,以便判断是否闹铃时间到
CLR P0.7;
MOV TIM_1,#10;执行完后经历0.5秒
MOV TIM_2,#2;执行完后经历1秒
LCALL SETDS1302
LCALL GET1302
LCALL DISPLAY
MOVE40H,#25
ANL TMOD,#0F0H
ORL TMOD,#01H;定时器0为模式1
MOV TL0,#0B0H;装入初值
SETB ET0;
SETB TR0;
SETB EA;允许中断
LP1:
JBC TF0, LP2
SJMP LP1
LP2:
MOV TH0,#03CH
MOV TL0,#0B0H
LCALL DISPLAY
DJNZ 40H,LP1
LCALL GET1302
MOV 40H,#25
SJMPLP1
MAIN:
JNB P3.0,DATETZ;按下0键时,显示日期并可对日期进行调整
JNB P3.1,ZSTZ1;按下1键时,显示时间,并可调时
JNB P3.2,NLTZ1;按下2键进行闹铃设置
JNB P3.3,DSTZ;按下3键进行定时设置
ACALL DISP;调用显示程序
FMQPD:;判断定时是否到零、闹铃时间是否已到
MOV A,HOUR;
SUBB A,38H;
JZ FEN;判断时是否到闹铃所定时间,若到,则对分进行判断,若不到,则对定时进行判断
AJMP DSPDKQ
MOV A,MINUTE;
SUBB A,37H;
JZ SHENGYIN1;时和分都到闹铃时间则蜂鸣器响
DSPDKQ:;判断是否应该进行定时时间的判断
MOV A,3CH;3CH是引入的判断因子,当其为0时不对定时时间是否到0进行判断,从而不开启蜂鸣器
JNZ DSPD2;当3CH不是0时,跳转到定时判断程序
AJMP MAIN
DSPD2:
MOV A,R4;
JZ S_PD;
AJMP MAIN;
S_PD:
MOV A,R3;
JZ SHENGYIN1;
AJMP MAIN;
DSTZ:
AJMP DSTZ1;
DATETZ:
AJMP DATETZ1;
SHENGYIN1:
MOV 3CH,#1
SETB P0.7
AJMP MAIN
MOV 35H,#60;
MOV 36H,#10;
ZSTZ2:
ACALL DISP;
DJNZ 35H,ZSTZ2;
JNB P3.0,DATETZ;按下0键时,显示日期并可对日期进行调整JNB P3.1,ZSTZ1;按下1键时,显示时间,并可调时
JNB P3.2,NLTZ1;按下2键进行闹铃设置
JNB P3.3,DSTZ;按下3键进行定时设置
JNB P3.4,H_T;
JNB P3.5,M_T;
DJNZ 36H,ZSTZ2;
AJMP MAIN;
H_T:
ACALL DISP;
INC HOUR;
MOV A,HOUR;
CJNE A,#24,ZSTZ1;
MOV HOUR,#0;
AJMP ZSTZ1;
M_T:
ACALL DISP;
INC MINUTE;
MOV A,MINUTE;
CJNE A,#60,ZSTZ1;
MOV MINUTE,#0;
AJMP ZSTZ1;。
NLTZ1:
CLR P0.7;
DEC 38H
MOV 35H,#100;
MOV 36H,#10;
NLTZ2:
ACALL ONE;
ACALL TWO;
DJNZ 35H,NLTZ2;
JNB P3.0,DATETZ;按下0键时,显示日期并可对日期进行调整JNB P3.1,ZSTZ1;按下1键时,显示时间,并可调时
JNB P3.2,NLTZ1;按下2键进行闹铃设置
JNB P3.3,DSTZ;按下3键进行定时设置
JNB P3.4,NLXS2;
JNB P3.5,NLXS1;
DJNZ 36H,NLTZ2;
AJMP MAIN;
NLXS1:
MOV DPTR,#LEDTAB;
MOV 35H,#100;
MOV 36H,#10;
INC R0;
MOV 37H,R0;
CJNE R0,#60,NLTZ2;
MOV R0,#0;
MOV 37H,R0;
AJMP NLTZ2;
ONE:
MOV DPTR,#LEDTAB;。
MOV A,R0;
MOV B,#10;
DIV AB;
MOVC A,@A+DPTR;
MOV P1,A;
CLR MIN_S;
ACALL D_1MS;
SETB MIN_S;
MOV A,B;
MOVC A,@A+DPTR;
MOV P1,A;
CLR MIN_G;
ACALL D_1MS;
SETB MIN_G;
RET;
NLXS2:
MOV DPTR,#LEDTAB;
MOV 35H,#60;
MOV 36H,#10;
INC R1;
MOV 38H,R1;
CJNE R1,#24,NLTZ2;
MOV R1,#0;
MOV 38H,R1;
AJMP NLTZ2;
TWO:
MOV DPTR,#LEDTAB;
MOV A,R1;
MOV B,#10;。
DIV AB;
MOVC A,@A+DPTR;
MOV P1,A;
CLR HOU_S;
ACALL D_1MS;
SETB HOU_S;
MOV DPTR,#LEDTAB;
MOV A,B;
MOVC A,@A+DPTR;
MOV P1,A;
CLR HOU_G;
ACALL D_1MS;
SETB HOU_G;
RET;
DSTZ1:
MOV 3CH,#0
CLR P0.7;
MOV 35H,#100;
MOV 36H,#10;
JNB P3.3,DSTZ1;
DSTZ2:
ACALL DS_S;
ACALL DS_M;
DJNZ 35H,DSTZ2;
JNB P3.0,DATETZ3;按下0键时,显示日期并可对日期进行调整JNB P3.1,ZSTZ;按下1键时,显示时间,并可调时
JNB P3.2,NLTZ;按下2键进行闹铃设置
JNB P3.4,DSXS1;。
JNB P3.5,DSXS2;
JNB P3.3,DSKS1;
DJNZ 36H,DSTZ2;
AJMP MAIN;
DATETZ3:
AJMP DATETZ
ZSTZ:
AJMP ZSTZ1
NLTZ:
AJMP NLTZ1
DSXS1:
MOV 35H,#100;
MOV 36H,#10;
INC R6;
CJNE R6,#60,DSTZ2;
MOV R6,#0;
AJMP DSTZ2;
DS_M:;
MOV DPTR,#LEDTAB;
MOV A,R6;
MOV B,#10;
DIV AB;
MOVC A,@A+DPTR;
MOV P1,A;
CLR MIN_S;
ACALL D_1MS;
SETB MIN_S;
MOV A,B;
MOVC A,@A+DPTR;。
MOV P1,A;
CLR MIN_G;
ACALL D_1MS;
SETB MIN_G;
RET;
DSXS2:
MOV 35H,#100;
MOV 36H,#10;
INC R5;
CJNE R5,#60,DSTZ2;
MOV R5,#0;
AJMP DSTZ2;
DS_S:
MOV DPTR,#LEDTAB;
MOV A,R5;
MOV B,#10;
DIV AB;
MOVC A,@A+DPTR;
MOV P1,A;
CLR SEC_S;
ACALL D_1MS;
SETB SEC_S;
MOV A,B;
MOVC A,@A+DPTR;
MOV P1,A;
CLR SEC_G;
ACALL D_1MS;
SETB SEC_G;
RET;。
DSKS1:
MOV 3CH,#1
MOV A,R5;
MOV R3,A;
MOV A,R6;
MOV R4,A;
DSKS2:
MOV DPTR,#LEDTAB;
MOV A,R3;
MOV B,#10;
DIV AB;
MOVC A,@A+DPTR;
MOV P1,A;
CLR SEC_S;
ACALL D_1MS;
SETB SEC_S;
MOV A,B;
MOVC A,@A+DPTR;
MOV P1,A;
CLR SEC_G;
ACALL D_1MS;
SETB SEC_G;
MOV A,R4;
MOV B,#10;
DIV AB;
MOVC A,@A+DPTR;
MOV P1,A;
CLR MIN_S;
ACALL D_1MS;。
SETB MIN_S;
MOV A,B;
MOVC A,@A+DPTR;
MOV P1,A;
CLR MIN_G;
ACALL D_1MS;
SETB MIN_G;
JNB P3.0,MAIN2;
JNB P3.1,MAIN2;
DSPD:;
MOV A,R4;
JZ PANDUAN_S;
AJMP DSKS2;
PANDUAN_S:;
MOV A,R3;
JZ SHENGYIN;
AJMP DSKS2;
MAIN2:
LJMP MAIN;
SHENGYIN:
MOV 3CH,#1
SETB P0.7
AJMP MAIN
RETI_11:;由于程序较长,此处加一个返回程序,避免跳转距离过长POP PSW;
POP ACC;。
RETI;
;中断服务程序
TIMER0:
PUSH ACC;
PUSH PSW;
MOV A,#0B0H;
ADD A,TL0;
MOV TL0,A;
MOV TH0,#03CH;
DJNZ TIM_1,RETI_11;
MOV TIM_1,#10;
DJNZ TIM_2,RETI_11;
MOV TIM_2,#2;
INC SECOND;
MOV A,SECOND;
CJNE R3,#0,RETI_2;
MOV R3,#60;
DEC R4;
RETI_2:
DEC R3;
CJNE A,#60,RETI_11;
MOV SECOND,#0;
INC MINUTE;
MOV A,MINUTE;
RETI_3:
CJNE A,#60,RETI_11;
MOV MINUTE,#0;
MOV SECOND,#0;
INC HOUR;
MOV A,HOUR;
CJNE A,#24,RETI_11;
MOV HOUR,#0;
MOV MINUTE,#0;
MOV SECOND,#0;
T_YEARPD:
MOV A,YEAR;
MOV B,#100;
DIV AB;
MOV A,B;
JZ T_YEARPD2;看年份是否能被100整除,若能,再进行额外判断MOV A,YEAR;不能被100整除,则判断是否能被4整除
MOV B,#4;
DIV AB;
MOV A,B;
JZ T_RUNYEAR;若年份能被4整除则跳转到闰年部分
T_PINGYEAR:;年份不能被4整除则为平年
MOV A,MONTH;
CJNE A,#2,T_PINGMONTH;若不是2月,则跳转到平时的月份进行判断INC DAY;
MOV A,DAY;
CJNE A,#29,RETI_11;
MOV DAY,#1;
INC MONTH;
MOV A,MONTH;
CJNE A,#13,RETI_11;
MOV MONTH,#1;
INC YEAR;
AJMP RETI_1;返回
T_YEARPD2:;能被100整除的情况下,的额外判断MOV A,YEAR;
MOV B,#100;
DIV AB;
MOV B,#4
DIV AB
JNZ T_PINGYEAR;若不能被400整除则为平年
T_RUNYEAR:;闰年的情况
MOV A,MONTH;
CJNE A,#2,T_PINGMONTH;看是不是2月
INC DAY;
MOV A,DAY;
CJNE A,#30,RETI_1;
MOV DAY,#1;
INC MONTH;
MOV A,MONTH;
CJNE A,#13,RETI_1;
MOV MONTH,#1;
INC YEAR;
AJMP RETI_1;
T_PINGMONTH:
MOV A,MONTH
ADD A,#2
SUBB A,#3;判断是不是一月
JZ T_DAY31;若是一月调用一个月31天的程序段MOV A,MONTH;
SUBB A,#3;
JZ T_DAY31;。
MOV A,MONTH;
SUBB A,#4;
JZ T_DAY30;调用一个月30天的程序段MOV A,MONTH
SUBB A,#5
JZ T_DAY31
MOV A,MONTH
SUBB A,#6
JZ T_DAY30
MOV A,MONTH
SUBB A,#7
JZ T_DAY31
MOV A,MONTH
SUBB A,#8
JZ T_DAY31
MOV A,MONTH
SUBB A,#9
JZ T_DAY30
MOV A,MONTH
SUBB A,#10
JZ T_DAY31
MOV A,MONTH
SUBB A,#11
JZ T_DAY30
MOV A,MONTH
SUBB A,#12
JZ T_DAY31
RETI_1:
POP PSW。
POP ACC
RETI;中断返回
T_DAY31:;当一个月为31天时的日期计算方法INC DAY
MOV A,DAY
CJNE A,#32,RETI_1
MOV DAY,#1
INC MONTH
MOV A,MONTH
CJNE A,#13,RETI_1
MOV MONTH,#1
INC YEAR
AJMP RETI_1
T_DAY30:;当一个月为30天时的日期计算方法INC DAY
MOV A,DAY
CJNE A,#31,RETI_1
MOV DAY,#1
INC MONTH
MOV A,MONTH
CJNE A,#13,RETI_1
MOV MONTH,#1
INC YEAR
AJMP RETI_1
DISP:;走时的显示程序,包括调时时的显示MOV DPTR,#LEDTAB
MOV A,SECOND
MOV B,#10。
DIV AB;A存十位B存个位
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_S
ACALL D_1MS;显示秒十位
SETB SEC_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_G
ACALL D_1MS;显示秒个位
SETB SEC_G
MOV A,MINUTE
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR MIN_S
ACALL D_1MS
SETB MIN_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR MIN_G
ACALL D_1MS
SETB MIN_G
MOV A,HOUR
MOV B,#10
DIV AB。
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
MOV P1,A
CLR HOU_S
ACALL D_1MS
SETB HOU_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR HOU_G
ACALL D_1MS
SETB HOU_G
RET
DATEDISP:;日期的显示程序,包括日期调整时的显示MOV DPTR,#LEDTAB
MOV A,DAY
MOV B,#10
DIV AB;A存十位B存个位
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_S
ACALL D_1MS
SETB SEC_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR SEC_G
ACALL D_1MS。
SETB SEC_G
MOV A,MONTH
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR MIN_S
ACALL D_1MS
SETB MIN_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR MIN_G
ACALL D_1MS
SETB MIN_G
MOV A,YEAR
MOV B,#100
DIV AB
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
CLR HOU_S
ACALL D_1MS
SETB HOU_S
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
CLR HOU_G
ACALL D_1MS
SETB HOU_G
RET
DATETZ1:;日期调整程序
MOV 35H,#100
DATETZ2:
ACALL DATEDISP
DJNZ 35H,DATETZ2
JNB P3.3,YEAR_T
JNB P3.4,MONTH_T
JNB P3.5,DAY_T
JNB P3.1,MAIN3
AJMP DATETZ1
MAIN3:
AJMP MAIN
YEAR_T:;年的调整很容易;直接加1
ACALL DATEDISP
INC YEAR
AJMP DATETZ1
MONTH_T:;月的调整也很容易,加到13时月变为1 ACALL DATEDISP
INC MONTH
MOV A,MONTH
CJNE A,#13,DATETZ1
MOV MONTH,#1
AJMP DATETZ1
DAY_T:;日期的调整需要判断是不是闰年,还要判断当月具体是哪个月YEARPD:
MOV A,YEAR
MOV B,#100
DIV AB
MOV A,B
JZ YEARPD2;看年份是否能被100整除,若能,再进行额外判断
MOV A,YEAR;不能被100整除,则判断是否能被4整除
MOV B,#4
DIV AB
MOV A,B
JZ RUNYEAR;若年份能被4整除则跳转到闰年部分
PINGYEAR:;年份不能被4整除则为平年
MOV A,MONTH
CJNE A,#2,PINGMONTH;若不是2月,则跳转到平时的月份进行判断INC DAY
MOV A,DAY
CLR C
SUBB A,#29
JC DATETZ1
MOV DAY,#1
AJMP DATETZ1;返回扫描
YEARPD2:;能被100整除的情况下,的额外判断
MOV A,YEAR
MOV B,#100
DIV AB
MOV B,#4
DIV AB
JNZ PINGYEAR;若不能被400整除则为平年RUNYEAR:;闰年的情况
MOV A,MONTH
CJNE A,#2,PINGMONTH;看是不是2月
INC DAY
MOV A,DAY
CLR C
SUBB A,#30
JC DATETZ1
MOV DAY,#1
AJMP DATETZ1
PINGMONTH:MOV A,MONTH
ADD A,#2
SUBB A,#3;判断是不是一月
JZ DAY31;若是一月调用一个月31天的程序段MOV A,MONTH
SUBB A,#3
JZ DAY31
MOV A,MONTH
SUBB A,#4
JZ DAY30;调用一个月30天的程序段
MOV A,MONTH
SUBB A,#5
JZ DAY31
MOV A,MONTH
SUBB A,#6
JZ DAY30
MOV A,MONTH
SUBB A,#7。
JZ DAY31
MOV A,MONTH
SUBB A,#8
JZ DAY31
MOV A,MONTH
SUBB A,#9
JZ DAY30
MOV A,MONTH
SUBB A,#10
JZ DAY31
MOV A,MONTH
SUBB A,#11
JZ DAY30
MOV A,MONTH
SUBB A,#12
JZ DAY31
DAY30:
INC DAY
MOV A,DAY
CLR C
SUBB A,#31
JC DATETZ11
MOV DAY,#1
AJMP DATETZ1
DAY31:
INC DAY
MOV A,DAY
CLR C
SUBB A,#32。
JC DATETZ11
MOV DAY,#1
AJMP DATETZ1
DATETZ11:
AJMP DATETZ1
D_1MS:
MOV R7,#2
D_5:
MOV R2,#250
DJNZ R2,$
DJNZ R7,D_5
RET
SETDS1302:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH ;写控制命令字
LCALL INPUTBYTE
MOV B,#00H ;写保护关闭
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
MOV R0,#SECOND ;内存中的时间首地址 MOV R1,#80H ;DS1302中的时间首地址
MOV R7,#7 ;字节数SETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1 ;写命令字
LCALL INPUTBYTE
MOV A,@R0 ;设置时间
MOV B,A
LCALL INPUTBYTE
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,SETLOOP
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH
LCALL INPUTBYTE
MOV B,#80H ;开写保护
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
nop
RET
;从DS1302读取时间
GET1302:
MOV R0,#SECOND
MOV R1,#81H ;DS1302中读时间的首地址
MOV R7,#7
GETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE ;写命令字
LCALL OUTPUTBYTE ;读时间
MOV @R0,A ;将从DS1302中读取的时间从内存中保存
INC R0 ;修改地址指针
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,GETLOOP
RET
;向DS1302写一个字节
INPUTBYTE:
MOV R4,#8 INPUTLOOP:
MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
NOP
;NOP
;NOP
CLR T_CLK
DJNZ R4,INPUTLOOP
RET;从DS1302读一个字节OUTPUTBYTE:
clr a
clr c
MOV R4,#8 OUTPUTLOOP:
NOP
;NOP
MOV C,T_IO
RRC A
SETB T_CLK
NOP
;NOP
;NOP
CLR T_CLK
DJNZ R4,OUTPUTLOOP
RET
LEDTAB:
DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H,7FH,7BH END
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求。