PC机实时时钟的设计剖析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1PC机实时时钟的设计
利用PC机现有的硬件和软件资源设计程序,以实现在显示器上显示XX(时):XX (分):XX (秒)。

(1)设计思路
PC机系统板上使用一片8253,英地址为40H-43H,英通道0以方式3工作,每55ms 向中断控制器8259A IRQO端发一次中断请求。

本设计题要求借用原有电路,重新设置8253 的计数器0每20ms产生一次中断,200次中断后加1秒,然后调整时、分、秒并显示在屏幕上。

(2)实时时钟的功能
按下任意键开始显示数据区中存放的时间值,并且每秒更新一次,运行中按下空格键则停止运行并返回DOSo程序中应保护原系统的08H中断矢量以便退岀时恢复原系统的设置。

(3)题目的要求
①PC机实时时钟的基本程序如附录一,请根据中断服务程序设计时钟时、分、秒调整的中断服务程序,然后调试实现时钟的基本功能
②在原有程序基础上,增加键盘输入字符功能,可通过修改时、分、秒的数据,实现实时时钟可调整功能。

③在原有程序基础上,设计美观的时钟显示方式及友好的操作方式。

附录一
STACK segment para stack ' stack'
db 256 dup (0)
stack ends
data segment para public 'data'
count db 100
tenh db T
hour db * 3', 20h
tenm db j
minute db ' 0'
db ':,
tens db ' 5’
second db ' O', Odh,' $'
data ends
code segment para public 'code'
start proc far
assume cs:code push ds xor ax, ax push ax mov ah, 01 int 21h cli cld
mov ax,OOOOh mov ds, ax mov si,0020h lodsw mov bx, ax lodsw push ax;seg push
bx;offset mov ax, data mov ds, ax assume ds:data mov ax,OOOOh mov es, ax mov
di,0020h mov ax, offset timer stosw
mov ax, cs stosw
mov al,00110110b out 43h,al mov ax,11932 out 40h,al mov al, ah out 40h,al in al, 21h push ax mov al,Ofch sti
forever: mov dl, Offh
mov ah, 06
int 21h jz disp cmp al,20h jz exit disp:mov dx, offset tenh mov ah, 9
int 21h
mov al,second waitcha: cmp al, second jz waitcha
jmp f orever
exit: cli
cld
pop a x
out21h, ax
mov a l, 36h
out43h, al
mov a l,0
out40h,al
out40h, al
mov a x, 0
mov e s, ax
mov d i, 4*8
pop a x
stosw
pop a x
stosw
sti
ret
start endp
timer:push ax
push ex
sti
mov al, count dec al
mov count, al jnz int_ret mov count, 100 mov al,second add al, 1
aaa
mov second, al jnc int_ret mov al,tens adc al, 0
aaa
and al, Ofh mov tens, al
cmp al, 6
jnz int_ret
mov al,0
mov tens, al
mov al, minute
add al, 1
aaa
mov minute, al
jnc int_ret
mov al,tenm
adc al,0
aaa
and al, Ofh
mov tenm, al
cmp al, 6
jnz int_ret
mov al,0
mov tenm, al
mov al, tenh
mov cl, 4
shl al, cl
mov cl, al
mov al, hour
and al, Ofh
or al, cl
add al, 1
daa
cmp al, 24h
jz reseth
mov ch, al
mov cl, 4
shr al, cl
or al,30h
mov tenh, al
mov al, ch
and al, Ofh
or al, 30h
mov hour, al
jmp int_ret
reseth: mov tenh,' O'
mov hour,' O' int_ret:
mov al,second and al, Ofh or al, 30h
mov second, al mov al, tens and al, Ofh or al, 30h mov tens,al mov al,tenm and al,Ofh or al, 30h mov tenm, al mov al, minute and al, Ofh or al, 30h
mov minute, al
cli
mov al,20h out 20h, al pop ex pop ax iret code ends
end start
附录一
STACK segment para stack stack1 db 256 dup (0)
stack ends
data segment para public 'data' count db 100
tenh db 'I1 hour db '3:20h tenm db '1' minute db O
db':1
tens db '5'
second db 'O^Odh/S'
data ends
code segment para public 'code' start proc far
assume cs:code
push ds
xor ax,ax push ax mov ah,01 int 21h cli cld
mov ax,0000h
mov ds,ax mov
si,0020h lodsw
mov bx z ax
lodsw
push ax; seg push bx;offset mov ax,data mov ds,ax
assume ds:data mov
ax,0000h
mov es z ax
mov di,0020h mov ax,offset timer stosw
mov ax,cs
stosw moval,00110110b out 43h,al mov ax z11932 out 40h,al mov al,ah out 40h,al in ab21h push ax mov al,Ofch sti
forever: mov dl z Offh mov ah,06 int 21h jz disp cmp al z20h jz exit disp: mov dx,offset tenh mov ah,9
int21h
mov al,second waitcha:
cmp al,second jz waitcha
jmp forever exit: cli
eld
pop ax out 21h z ax mov al,36h out 43h,al mov al,0 out 40h,al out 40h,al mov axQ
mov es,ax mov di,4*8
pop ax stosw
pop ax
stosw
sti
ret
start endp
timer: push ax
push ex
sti
mov al,cotint dec al mov coun t,al jnz int_ret mov count, 100 mov al,second add al,l
aaa
mov sec ond,al jnc int_ret mov al z tens adc al,0
aaa
and al,Ofh mov tens z al cmp al,6
jnz int^ret mov a 1,0 mov ten s,al mov al,minute add al,l
aaa
mov minute z al jnc int_ret mov al z tenm adc a\,0
aaa
and al,Ofh mov tenm.al
cmp al,6 jnz int_ret mov
al z0 mov tenm,al mov
al z tenh mov cl,4 shl al,cl
mov cl,al mov al z hour
and al,Ofh or al,cl add
al,l daa cmp al,24h jz
reseth mov ch,al mov
cl,4 shr al z cl or al,30h
mov tenh.al mov al,ch
and alQfh or al,30h mov
hour,al jmp int^ret
reseth: mov ten h/01
mov hour/O1 int_ret:
mov al,second and atOfh
or al,30h mov second,al mov aliens and al,Ofh or al,30h mov ten s,al mov al,tenm and alQfh or al,30h mov ten m,al mov a^minute and al,Ofh or al,30h mov minute,al
cli
mov al,2Oh out 2Oh z al pop ex pop ax iret code ends end star
在本次设计中使用了四个中断工作方式即TO、Tl、/INTO、/INTlo 其中
1TO中断采用TO定时中断工作方式完成LED动态扫描。

2T1中断采用T2泄时中断工作方式产生100ms或50ms单位时间。

3/INTO中断采用外部中断工作方式完成时间按调整功能。

4/INT1中断采用外部中断工作方式完成闹钟时间输入功能。

同时还要对一些存储单元的进行初始化这些内容都需要在初始化程序
ORG 0000H UMPMAIN ORG 0003H UMPINTA ORG OOOBH LJMPTO_SEV ORG 0013H UMPINTB
;程序执行开始地址
;跳转主程序执行
;外部中断0中断服务程序入口地址 ;转外部中断0中断服务程序
;立时器T0中断服务程序入口地址
;转T0泄时中断服务程序执行
;外部中断1中断服务程序入口地址
;转外部中断1中断服务程序
ORG OO1BH UMPTl^SEV ORG 0030H MAIN MOV
MOV
MOV
;立时器Ti中断服务程序入口地
址 ;转口定时中断服务程序
;设置主程序尼始地址=0030H
SP,#60H ;设垃堆栈指针
A #00H
30H z A
MOV 31H, A
MOV 32H Z A
MOV 33H, A
MOV 34H, #OCH
MOV 35H, A
MOV 36H, A
MOV 37H, A
MOV 50H, #DFH
MOV 51H,#EFH
MOV 52H, #F7H
MOV 53H Z#FBH
MOV 54H, #FDH
MOV 55H,#FEH
CLR RSO
CLR RSI
MOV R2, #0
MOV R3, #0
MOV R4, #0
MOV R5, #12
MOV TMOD, #11H
MOV TH1, #3CH
MOV TL1, #OBOH
MOV THO, #OECH
MOV TLO, #78H
MOV IP, #08H
MOV TCON, #50H
MOV IE, #8FH
LOP: MOV A, 34H
ANL A, #FOH
MOV 40H, A
MOV A, 34H
ANL A, #OFH
MOV 41H, A
MOV A, 33H
ANL A,#FOH
MOV 42 H, A
MOV A, 33H
ANL A, #OFH
MOV
43 H, A MOV
A, 32H ANL A, #FOH MOV
44H, A MOV A, 32H
ANL A, #OFH
AA: MOV 45H, A
SETB RSI
CLR RSO
Al: MOV R2,37H
;判断是否有迫时时间 CJNE R2, #0, NT
MOV
R2, 36H CJNE R2, #0z NT
MOV R2Z 35H CJNE R2, #0, NT
SJMP BB
NT: MOV A, 37H
CJNE A, 34H, BB
;判断泄时时间到否 MOV A, 36H
CJNE A, 33H,BB
MOV A, 35H
CJNE A, 32H, BB
CLR P3.6
;时间到发出报警 SJMP LOP
BB: SETB P3.6
SJMP LOP
程序淸单如下
;LED 左时扫描程序 ;保护现场 ;RSlx RSO=11H ;选择3组工作寄存器 ;停止TO 泄时器 ;设置显示器位数 ;设置段码首地址 ;设置位码首地址 ;送显示位数到A
CJNE A, 31H Z NO_FLASH ;判断是闪烁位否
NO_FLASH:MOV A, @R1 ;送位码地址到A 累加器
MOV
P3Z A ;输出位码数据到P3 口 MOV
A, @R0 ;送段码地址到A 累加器 MOV P0z A ;输出段码数据到P0 口
LCALL DELAY1 ;调延时子程序延时1ms
FLASH: INC R0 ;段码地址+1
TO_SEV: PUSH A
PUSH PSW
SETB RSI
SETB RSO
CLR TRO
MOV
R2, #06H MOV
RO, #40H MOV
Rl, #50H GO_ON: MOV A, R2
INC R1
DJNZ
;位码地址+1
R2, GO_ON ;判断6为都显示完否没完继续显示
下一位
MOV TH0,#0D8H
MOV TLO,#F1H ;重置T0计数初值
POP A ;恢复现场
SETB ETO ;允许T0中断
SETB TRO ;启动T0开始立时
SETB EA ;开中断
RETI ;中断返回
DELAY1: MOV R3, #OFAH ;延时1ms子程序
AGAIN: MOV R4, #03H
DELAY DJNZ R4, DELAY
DJNZ R3, AGAIN
RET
说明在TO中断服务程序中又调用了延时1ms子程序因此TO中断服务程序又是延时1ms子程序的主程序
5.3.124h时间的产生
选择世时器T1 工作方式1 上时50ms T1泄时50ms中断一次利用R2寄存器加2 R2寄存器的值等于20时时间正好为Is再利用R3寄存器汁数60s —次类推累Vi" 24h的时间值并需要设置以下几个寄存器
R2 累汁Is时间寄存器。

T1每中断一次R2=R2+1 计数二十次向R3进位并将R2淸零。

R3 累if' 60s时间寄存器当R3=60s向R4进位然后将R3淸零。

R4 累汁60min时间寄存器。

当R4=60min 正好是lh的时间向R5 进位然后R4淸零。

R5 累计24h时间寄存器。

当R5=24h 正好是昼夜的时间并使R5淸零。

5.3.2il•算左时器T1的技术初值
当时钟频率=12MHZ时
计数值二
机器周期时间左时时间
slms50
=50000
计数初值=65537-50000=15537=3CB0H
初值寄存器的初值为TH1=3CH; TL1=BOH
工作方式计数器TMOD=0001XXXXB=1*H(T1> TO的工作方式控制字应该一次性
写入即TMOD=11H)
53.3程序设计框图及程序淸单 程序设计框图如图22所示。

程序淸单
T1左时器 每50ms 中断一次 中断20次为Is 。

T1_SEV: MOV TH1, #3CH ;重置 T1 计数初值 MOV TL1, #OBOH
CLR EA
;关中断 PUSH A
;保护现场 PUSH B
PUSH PSW
CLR
RSI CLR RSO ;选择0区工作寄存器
INC R2 ;中断次数加1
CJNE R2, #14H Z EN
;判断中断20次否否转EN 标号地址
MOV R2, #0 ;T1中断20次的累计时间Is 计数寄存
POP
B POP A
542设宜当前时间程序淸单
INTA: SETB P3.4
;输入键值前 先将P3.4 P3.5置1 SETB P3.5 INC R3
;秒计时单元R3+1 MOV MOV 32H R3
;秒值送32H 单元 CJNE R3Z #3CH,EN ;判R3=60秒否转EN 标号地址 R3 #0 ;60s 时间到 R3淸零
MOV 32H R3 ;秒值送32H 单元
INC R4 ;分计时单元R4+1
MOV 33H R4 ;分值送33H 单元
CJNE R4, #3CH,EN ;判R4=60min 否转EN 标号地址
MOV R4, #0 ;60min 时间到 R4淸零
MOV 33H Z R4 ;分值送33单元
CJNE R4, #3CH Z EN ;判R4=60min 否转EN 标号地址
MOV R4, #0 ;60min 时间到 R4淸零
MOV 33H, R4 ;分值送33单元
INC R5 ;小时单元R5+1
MOV 34H, R5 ;小时值送34H 单元
CJNE R5, #18H,EN
;判R5=24h 否 转EN 标号地址 MOV
R5, #0 ;24h 时间到 R5淸零 MOV 34H, R5
;小时值送34H 单元 器R2淸零
POP PSW
SETB EA
RETI ;开中断 ;中断返
A ;保护现场
B PSW 31H, #06H ; 31H =06H LED 的位数 29H, #OOH ; 29H =OOH JB P3.4, NEXTO ;判断P3.4键按下否 无键按下转NEXTO DELAY1 ;有键按下延迟1ms
P3.4,LP0 ;判断是否松开否转LPO JNB P34LP1 ;等待键松开 29H ;键松开后 29H +1 3OH, #1H LO1 ;转LO1标号地址 JB P3.5,L1 ;判断P3.5是否按下 否转Li DELAY1 ;有键按下延迟1ms P35NEXTO ;是否松开 否 转NEXTO JNB P35LD1 ;是否松开否转LD1 29H, #0 30H, #1 31H,L01 LL MOV A,31H A,#06H,L02 ;是时针的十位嘛不转L02 A,29H A Z #O3H,LA1 29H z #00H MOV 40H,29H LI MOV A, 31H A,#03H 丄 03 A,40H A,#2,A2 A,29H A Z #4,LA2 29H,#0 LA2 MOV A,29H
CJNE A,#0AH,LA2 CLR
CLR
CLR
CLR
SETB
SETB
SETB
PUSH
PUSH
PUSH
MOV
MOV
LPO LCALL JB
LP1:
INC
MOV
SJMP NEXTO: LCALL JB
LD1:
MOV
MOV
DJNZ
SJMP
LO1:
CJNE
MOV
CJNE
MOV
LAI:
SJMP
LO2:
CJNE
MOV
CJNE
MOV
CJNE
MOV
SJMP
A2: TRI ;T1停止定时 ET1 ;T1禁止中断 EXO ;/INTO 禁止中断 EXI ;/INTl 禁止中断 EA ;开中断 ETO ;允许TO 中断 PTO
MOV 29H,#00H
LA2: MOV 41H,29H SJMP LI
L03: MOV A,31H CJNE A,#O2H 丄04 MOV A Z29H
CJNE A,#06H,LA3 MOV 29H,#00H
LA3: MOV 42H,29H
SJMP LI
L04: MOV A,29H CJNE A/#0AH/LA4
MOV 29H,#00H
LA4: MOV 43H,29H
SJMP LI
L05: MOV A Z31H CJNE A/#02H/L06
MOV A Z29H
CJNE A z#06H,LA5
MOV 29H,#00H LAS: MOV 44H,29H SJMP LI
L06: MOV A,29H CJNE A,#0AH 丄A6 MOV 29H/#00H
LA4: MOV 45H/29H LI: MOV A,31H CJNE A Z#OOH,LPO
LL:。

相关文档
最新文档