一、实验目的及要求:
1.利用定时器0的定时中断和动态显示,实现电子钟的走时及校正。
2.时间及日期显示实验台上的四个数码管分别显示时.分及显时的低位的右下脚的点闪烁表示秒的显示和月、日。显示格式如下:
⑴.时间显示 ,前两格显示时而第二格有下脚的小点作秒显示。(闪烁状态)。后两格显示分钟。
⑵.日期显示 ,前两格显示而与秒显示的相对点不闪烁停于常亮状态表示月与日的相隔点,后两格表示日的显示。
3.时间走时准确,每天误差不超过5秒。
4.仿照电子表的校时功能,校时(日期)修改时,被改位能闪烁显示以表示正被修改。
5.若高位为0,则高位可灭零显示。
二、实验效果
1.常态以时间显示
2.编程使该电子钟有4个键,分别为校正键,“十”键,切换键及显示键。
3.正常显示的状态下,“+”键和显示键无效,校正状态下切换键无效。
4.四个键的作用分别为:①校正键,在正常的状态下,第一次按下校正键表示校正月发功能,此时显示当日的日期及月显示闪烁。第二次按下此键表示校日的功能,显示当前日期并且日闪烁显示。第三次按下此键表示校时的功能,此时显示当前时间并且时闪烁显示。第四次按下校正键表示校分功能,显示当前时间并且分闪烁显示。②“+”键,功能为当前校正的内容在每按一下此键的情况下不进位的在该闪烁的内容上加“1”。③确定键,使校正的内容生效并且返回正常显示时间的状态下。④切换键,表示切换当前显示的模式,如:当前显示的是时间,则按一下切换键则切换到日期的显示状态,反之亦成立。如在按下切换键的状态下,5秒后没任何操作则返回到正常显示时间的状态。
三.实验思路(原理)
由以上分析可知要使日期及时间显示出来, 首先想到的是要将它们存放起来,然后再将其送往数码管显示出来,这里又牵涉到一个问题,怎样将它们存放起来又要存到哪儿去?这就要我们给它们分配存储单元以备送往显示,例如准备四个存储单元30H~33H分别存储月、日、时和分,送往显示时要为其准备显示缓冲存储区,如3AH、3BH,月、时送3AH缓存,日、分送3BH缓存备送显示,接下来就是相关方式初始化为内容显示作准备,其中包括时间/日期(T/D)标志的置位,校正标志的清除及定时期/计数期工作方式及初始化。选好工作方式及计算出初值,打开中断申请标志位允许显示及校正中断服务程序的调用,然后,设计程序将显示缓存区的内容分解成BCD码送入43H~40H并以备显示,在该状态下要检查当前状态是否处于校正状态,若不是则将其静态显示出来,若是处于校正状态下,查看2FH.3是否为0,若是则送往静态显示,若不是的话,将对应的校正内容的BCD码单元送入DAH再显示出校正状态。
校正中断服务程序设计的思路:首先判断其是否处于校正状态,若不是处于校正状态,再检查是否有按下时间/日期显示切换键。如果已按下该键则取反T/D显示标志位,在该情况下又要判断其标志位的状态,T/D若为1则将时间内容送入显示缓冲区以待显示,若其值为0则将日期内容送入显示缓冲区以待显示。在没有按下显示切换键的情况下,确认是否要按下校正键,若不按下,则同样判断时间/日期显示的标志位值,若为“1”则显示时间,为“0”则显示日期。若按下校正键,则此时切换键无效,在该情况下,若按一下校正键则校正指针SP的值相应的做加“1”操作,指向下一个要校正的内容,此后判断21H.0的值,若为0则将日期内容送入显示缓存区,若为1则将时间内容送入显示缓存区以待显示。显示后返回先前状态,若在校正状态下按下“+”键,则校正指针相对应的校正内容单元加1,值满不进位的加1,而后同样判断20H.0的值,情况与上面相同,而在校正状态下按确定键,则清楚校正标志而置位时间/日期显示标志,将时间显示的内容送入显示缓存区以备显示。返回到正常状态下(显示时间状态)。
4.实验流程图
(1).时间中断服务程序
5.实验程序
ORG 0000H ;程序入口地址
LJMP MAIN
ORG 000BH
SJMP ITOP
ORG 0030H
MAIN:CLR A
MOV 30H,A ;程序初始化,计数单元设初值
MOV 32H,#59
MOV 34H,#23
MOV 36H,#01H
MOV 38H,#01H
MOV 66H,#03H
MOV 67H,#03H
MOV 40H,#00H
MOV 2FH,#0AH
CLR 20H.1
CLR 20H.2
CLR 20H.3
CLR 20H.4
MOV TMOD,#01H ;设置计数器的计数方式
MOV TL0,#0B0H ;给计数器装初值
MOV TH0,#3CH
CLR PT0 ;中断允许设置
SETB TR0
SETB ET0
SETB EA
HERE: SJMP HERE
ITOP: MOV TL0,#0B0H
MOV TH0,#3CH
LCALL DISP ;调用显示子程序
DJNZ 2FH,LOOP
MOV 2FH,#0AH ;秒计时初值设置
CPL 20H.1
JB 20H.1,LOOP1
MOV 40H,#0FFH
AJMP LOOP2
LOOP2: INC 30H ;计时程序
MOV A,#78H
CJNE A,30H,LOOP ;判断秒是否已到
MOV 30H,#00H
INC 32H
MOV A,#3CH
CJNE A,32H,LOOP ;判断分是否已到
MOV 32H,#00H
INC 34H
MOV A,#18H
CJNE A,34H,LOOP ;判断时是否已到
MOV 34H,#00H
INC 30H
MOV A,#32
CJNE A,30H,LOOP ;判断月是否已到
MOV 30H,#01H
INC 37H
MOV A,#DDH
CJNE A,38H,LOOP ;判断年是否已到
MOV 38H,#01H
LOOP: RETI
DISP: JB 20H.2,LOOP3 ;显示子程序
MOV 62H,32H ;显示内容送显示缓冲单元,如下类似
MOV H,34H
SJMP LOOP4
LOOP3: MOV 40H,#0FFH
MOV 62H,32H
MOV H,34H
SJMP LOOP4
LOOP4: MOV A,62H
MOV B,#0AH
DIV AB
MOV 63H,A
MOV 62H,B
MOV A,H
MOV B,#0AH
DIV AB ;使进制调整,备显示
MOV 65H,A
MOV H,B
MOV R4,#H
MOV R0,#65H
MOV SCON,#00H
SEND: MOV A,@R0
JNE MIE00
MOV A,#10H
MIE00:JNB 20H.4,MIE0
JNB 20H.3,MIE0
JNB 20H.3,MIE0
MOV A,#10H
MIE0:MOV DPTR,#TAB ;查找显示内容程序,用于显示
MOVC A,@A+DPTR
MOV SUBF,A
JNB TI,$
CLR TI
DEC R0
MOV A,@R0
JNB 20H.4,MIE1 ;判断显示内容
JNB 20H.3,MIE1
JNB 2FH.3,MIE1
MOV A,#10H
MIE1:MOV DPTR
MOVC A,@A+DPTR
ADD A,40H
MOV SBUF,A
JNB TI,$
CLR TI
DEC R0
MOV A,@R0
JNE MIE11
MOV A,#10H
MIE11:JNB 20H.4,MIE2
JNB 20H.3,MIE2
JNB 2FH.3,MIE2
MOV A,#10H
MIE2:MOV DPTR,#TAB
MOVC A,A+@DPTR
MOV SBUF,A
JNB TI,$
CLR TI
DEC R0
MOV A,@R0
JNB 20H.4,MIE3
JNB 20H.3,MIE3
JNB 2FH.3MIE3
MOV A,#10H
MIE3:MOV DPTR,#TAB
MOVC A,@A+DPTR
JNB SBUF,A
JNB TI,$
CLR TI
RET
KEY:MOV A,P1 ;判键按下.子程序
CJNE A,#0FFH,KEYIN
LJMP EXIT
KEYIN: LCALL DEL10MS ;.调用延时程序
MOV A,P1
CJNE A,#FFH,KEY00
LJMP EXIT
KEY00:JNB ACC.4,KEY1 ;.判断哪个键按下
JNB ACC.5,KEY2
JNB ACC.6,KEY3
JNB ACC.7,KEY4
KEY1:MOV A,P1 ;确定哪个键按下。如下类似
CJNE A,#0FFH,KEY1
CPL 20H.2
LJMP EXIT
KEY2:MOV A,P1
CJNE A,#0FFH,KEY2
SETB 20H.4
INC 66H
ANL 66H,#03H
MOV A,66H
ONE:CJNE A,#00H,TWO ;调式程序,判断该调试的内容。如下类似
CPL 20H.2
CPL 20H.3
SJMP EXIT
TWO:CJNE A,#01H,THR
CPL 20H.3
SJMP EXIT
THR:CJNE A,#02H,FOR
CPL 20H.3
CPL 20H.2
SJMP EXIT
FOR:CJNE A,#03H,ONE
CPL 20H.3
SJMP EXIT
KEY3: MOV A,P1
CJNE A,#0FFH,KEY3
JNB 20H。4,EXIT
MOV A,66H
YUE:CJNE A,#00H,RISHU ;月调试程序
INC 38H
MOV A,#13
CJNE A,38H,EXIT
MOV 38H,#01H
SJMP EXIT
RISHU:CJNE A,#01H,SHI ;日期调试子程序
INC 36H
MOV A,#32H
CJNE A,36H,EXIT
MOV 36H,#01H
SJMP EXIT
SHI:CJNE A,,#02H,FEN ;时调试子程序
INC 34H
MOV A,#18H
CJNE A,#34H,EXIT
MOV 34H,#00H
SJMP EXIT
FEN:CJNE A,#03H,YUE
INC 32H
MOV A,#3CH
CJNE A,3H,EXIT
MOV 32H,#00H
SJMP EXIT
KEY4:MOV A,P1
CJNE A,#0FFH,KEY4
CLR 20H.4
CLR 20H.2
MOV 66H,#03H
SJMP EXIT
EXIT:RET
DEL10MS:MOV R7,#0AH ;延时10MS子程序
DL:MOV R6,#077H
DL1:DJNZ R6,#0FFH
DJNZ R7,DL
RET
TAB:DB 09H 7DH 07H 15H 71H 91H 81H
DB 3DH 01H 11H 21H 09H 8BH
DB 45H 83H 0A3H 0FFH 0F7H
六.实验心得
通过本次实验发现自己很多的不足,也就在这次实验中学到了很多东西,包括一些基本的编程,比如延时,显示等等,也更加熟悉了程序的基本结构,子程序的调用和中断程序的使用,在本次实验中实验还是有一点误差,主要原因是在设计程序时,在计时过程中,没有考虑到指令执行所用的时间造成计时的误差。下载本文