PC机实时时钟的设计.docx_第1页
PC机实时时钟的设计.docx_第2页
PC机实时时钟的设计.docx_第3页
PC机实时时钟的设计.docx_第4页
PC机实时时钟的设计.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 PC机实时时钟的设计利用PC机现有的硬件和软件资源设计程序,以实现在显示器上显示XX(时):XX(分):XX(秒)。(1)设计思路PC机系统板上使用一片8253,其地址为40H43H,其通道0以方式3工作,每55ms向中断控制器8259A IRQ0端发一次中断请求。本设计题要求借用原有电路,重新设置8253的计数器0每10ms产生一次中断,100次中断后加1秒,然后调整时、分、秒并显示在屏幕上。 (2) 实时时钟的功能按下任意键开始显示数据区中存放的时间值,并且每秒更新一次,运行中按下空格键则停止运行并返回DOS。程序中应保护原系统的08H中断矢量以便退出时恢复原系统的设置。 (3) 题目的要求 PC机实时时钟的基本程序如附录一,请根据中断服务程序设计时钟时、分、秒调整的中断服务程序,然后调试实现时钟的基本功能 在原有程序基础上,增加键盘输入字符功能,可通过修改时、分、秒的数据,实现实时时钟可调整功能。 在原有程序基础上,设计美观的时钟显示方式及友好的操作方式。附录一STACK segment para stack stack db 256 dup (0)stack endsdata segment para public datacount db 100tenh db 1hour db 3,20htenm db 1minute db 0 db :tens db 5second db 0,0dh,$data endscode segment para public codestart 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,ax lodsw push ax;seg push bx;offset mov ax,data mov ds,ax assume ds:data mov ax,0000h 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,0fch stiforever: mov dl,0ffh mov ah,06 int 21h jz disp cmp al,20h jz exitdisp:mov dx,offset tenh mov ah,9 int 21h mov al,secondwaitcha: cmp al,second jz waitcha jmp foreverexit: cli cld pop ax out 21h,ax mov al,36h out 43h,al mov al,0 out 40h,al out 40h,al mov ax,0 mov es,ax mov di,4*8 pop ax stosw pop ax stosw sti retstart endptimer:push ax push cx 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,0fh 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,0fh 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,0fh 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,0fh or al,30h mov hour,al jmp int_retreseth: mov tenh,0 mov hour,0int_ret: mov al,second and al,0fh or al,30h mov second,al mov al,tens and al,0fh or al,30h mov tens,al mov al,tenm and al,0fh or al,30h mov tenm,al mov al,minute and al,0fh or al,30h mov minute,al cli mov al,20h out 20h,al pop cx pop ax iretcode ends end start附录一STACK segment para stack stackdb256dup(0)stackendsdata segmentparapublicdatacountdb100tenhdb1hourdb3,20htenmdb1minutedb0db:tensdb5seconddb0,0dh,$dataendscode segmentparapubliccodestartprocfar assumecs:codepushdsxorax,axpushaxmovah,01int21hclicld movax,0000hmovds,axmovsi,0020hlodswmovbx,axlodswpushax; segpushbx;offsetmovax,datamovds,axassumeds:datamovax,0000hmoves,axmovdi,0020hmovax,offsettimerstoswmovax,csstoswmoval,00110110bout43h,almovax,11932out40h,almoval,ahout40h,alinal,21hpushaxmoval,0fchstiforever:movdl,0ffhmovah,06int21hjzdispcmpal,20hjzexitdisp: movdx,offsettenhmovah,9int21hmoval,secondwaitcha:cmpal,secondjzwaitchajmpforeverexit: clicldpopaxout21h,axmoval,36hout43h,almoval,0out40h,alout40h,almovax,0moves,axmovdi,4*8popaxstoswpopaxstoswstiretstartendptimer: pushaxpushcxstimoval,countdecalmovcount,aljnzint_retmovcount,100moval,secondaddal,1aaamovsecond,aljncint_retmoval,tensadcal,0aaaandal,0fhmovtens,alcmpal,6jnzint_retmoval,0movtens,almoval,minuteaddal,1aaamovminute,aljncint_retmoval,tenmadcal,0aaaandal,0fhmovtenm,alcmpal,6jnzint_retmoval,0movtenm,almoval,tenhmovcl,4shlal,clmovcl,almoval,hourandal,0fhoral,claddal,1daacmpal,24hjzresethmovch,almovcl,4shral,cloral,30hmovtenh,almoval,chandal,0fhoral,30hmovhour,aljmpint_retreseth: movtenh,0movhour,0int_ret: moval,secondandal,0fhoral,30hmovsecond,almoval,tensandal,0fhoral,30hmovtens,almoval,tenmandal,0fhoral,30hmovtenm,almoval,minuteandal,0fhoral,30hmovminute,alclimoval,20hout20h,alpopcxpopaxiretcodeendsendstar在本次设计中使用了四个中断工作方式即T0、T1、/INT0、/INT1。其中 1 T0中断采用T0定时中断工作方式完成LED动态扫描。 2 T1中断采用T1定时中断工作方式产生100ms或50ms单位时间。 3 /INT0中断采用外部中断工作方式完成时间按调整功能。 4 /INT1中断采用外部中断工作方式完成闹钟时间输入功能。 同时还要对一些存储单元的进行初始化这些内容都需要在初始化程序ORG 0000H ;程序执行开始地址 LJMP MAIN ;跳转主程序执行 ORG 0003H ;外部中断0中断服务程序入口地址 LJMP INTA ;转外部中断0中断服务程序 ORG 000BH ;定时器T0中断服务程序入口地址 LJMP TO_SEV ;转T0定时中断服务程序执行 ORG 0013H ;外部中断1中断服务程序入口地址 LJMP INTB ;转外部中断1中断服务程序 ORG 001BH ;定时器T1中断服务程序入口地址 LJMP T1_SEV ;转T1定时中断服务程序 ORG 0030H ;设置主程序起始地址=0030H MAIN MOV SP, #60H ;设置堆栈指针 MOV A#00HMOV 30H, A MOV 31H, A MOV 32H, A MOV 33H, A MOV 34H, #0CH MOV 35H, A MOV 36H, A MOV 37H, A MOV 50H, #DFH MOV 51H, #EFH MOV 52H, #F7H MOV 53H, #FBH MOV 54H, #FDH MOV 55H, #FEHCLR RS0 CLR RS1 MOV R2, #0 MOV R3, #0 MOV R4, #0 MOV R5, #12 MOV TMOD, #11H MOV TH1, #3CH MOV TL1, #0B0H MOV TH0, #0ECH MOV TL0, #78H MOV IP, #08H MOV TCON, #50H MOV IE, #8FH LOP: MOV A, 34H ANL A, #F0H MOV 40H, A MOV A, 34HANL A, #0FH MOV 41H, A MOV A, 33H ANL A, #F0H MOV 42H, A MOV A, 33H ANL A, #0FH MOV 43H, A MOV A, 32H ANL A, #F0H MOV 44H, A MOV A, 32H ANL A, #0FHAA: MOV 45H, A SETB RS1 CLR RS0 A1: MOV R2, 37H ;判断是否有定时时间 CJNE R2, #0, NT MOV R2, 36H CJNE R2, #0, NT MOV R2, 35H CJNE R2, #0, NT SJMP BB NT: MOV A, 37H CJNE A, 34H, BB ;判断定时时间到否 MOV A, 36H CJNE A, 33H,BBMOV A, 35H CJNE A, 32H, BB CLR P3.6 ;时间到发出报警 SJMP LOP BB: SETB P3.6 SJMP LOP程序清单如下 TO_SEV: PUSH A ;LED定时扫描程序 PUSH PSW ;保护现场 SETB RS1 ;RS1、RS0=11H SETB RS0 ;选择3组工作寄存器 CLR TR0 ;停止T0定时器 MOV R2, #06H ;设置显示器位数 MOV R0, #40H ;设置段码首地址 MOV R1, #50H ;设置位码首地址GO_ON: MOV A, R2 ;送显示位数到A CJNE A, 31H, NO_FLASH ;判断是闪烁位否 NO_FLASH:MOV A, R1 ;送位码地址到A累加器 MOV P3, A ;输出位码数据到P3口 MOV A, R0 ;送段码地址到A累加器 MOV P0, A ;输出段码数据到P0口 LCALL DELAY1 ;调延时子程序延时1ms FLASH: INC R0 ;段码地址+1 INC R1 ;位码地址+1 DJNZ R2, GO_ON ;判断6为都显示完否没完继续显示下一位 MOV TH0,#0D8H MOV TL0,#F1H ;重置T0计数初值 POP A ;恢复现场 SETB ET0 ;允许T0中断 SETB TR0 ;启动T0开始定时 SETB EA ;开中断 RETI ;中断返回 DELAY1: MOV R3, #0FAH ;延时1ms子程序 AGAIN: MOV R4, #03H DELAY DJNZ R4, DELAY DJNZ R3, AGAIN RET 说明在TO中断服务程序中又调用了延时1ms子程序因此T0中断服务程序又是延时1ms子程序的主程序5.3.1 24h时间的产生 选择定时器T1工作方式1定时50msT1定时50ms中断一次利用R2寄存器加1R2寄存器的值等于20时时间正好为1s再利用R3寄存器计数60s一次类推累计24h的时间值并需要设置以下几个寄存器 R2累计1s时间寄存器。T1每中断一次R2=R2+1计数二十次向R3进位并将R2清零。 R3累计60s时间寄存器当R3=60s向R4进位然后将R3清零。 R4累计60min时间寄存器。当R4=60min正好是1h的时间向R5进位然后R4清零。 R5累计24h时间寄存器。当R5=24h正好是昼夜的时间并使R5清零。5.3.2 计算定时器T1的技术初值 当时钟频率=12MHZ时 计数值= 机器周期时间定时时间 =s1ms50=50000 计数初值=65537-50000=15537=3CB0H 初值寄存器的初值为TH1=3CH; TL1=B0H 工作方式计数器TMOD=0001XXXXB=1*H(T1、T0的工作方式控制字应该一次性写入即TMOD=11H) 5.3.3 程序设计框图及程序清单 程序设计框图如图12所示。程序清单 T1定时器每50ms中断一次中断20次为1s。 T1_SEV: MOV TH1 , #3CH ;重置T1计数初值 MOV TL1, #0B0H CLR EA ;关中断 PUSH A ;保护现场 PUSH B PUSH PSW CLR RS1CLR RS0 ;选择0区工作寄存器 INC R2 ;中断次数加1 CJNE R2, #14H ,EN ;判断中断20次否否转EN标号地址 MOV R2, #0 ;T1中断20次的累计时间1s计数寄存器R2清零 INC R3 ;秒计时单元R3+1 MOV 32HR3 ;秒值送32H单元 CJNE R3, #3CH,EN ;判R3=60秒否转EN标号地址 MOV R3#0 ;60s时间到R3清零 MOV 32HR3 ;秒值送32H单元 INC R4 ;分计时单元R4+1 MOV 33HR4 ;分值送33H单元 CJNE R4, #3CH,EN ;判R4=60min否转EN标号地址 MOV R4, #0 ;60min时间到R4清零 MOV 33H, R4 ;分值送33单元CJNE R4, #3CH,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单元 EN: POP PSW POP B POP A SETB EA ;开中断 RETI ;中断返回5.4.2设置当前时间程序清单 INTA: SETB P3.4 ;输入键值前先将P3.4 P3.5置1 SETB P3.5 CLR TR1 ;T1停止定时 CLR ET1 ;T1禁止中断 CLR EX0 ;/INT0禁止中断CLR EX1 ;/INT1禁止中断 SETB EA ;开中断 SETB ET0 ;允许T0中断 SETB PT0 PUSH A ;保护现场 PUSH B PUSH PSW MOV 31H, #06H ;31H=06HLED的位数 MOV 29H, #00H ;29H=00H LP0 JB P3.4, NEXT0 ;判断P3.4键按下否无键按下转NEXT0 LCALL DELAY1 ;有键按下延迟1ms JB P3.4,LP0 ;判断是否松开否转LPO LP1: JNB P3.4,LP1 ;等待键松开 INC 29H ;键松开后29H+1 MOV 3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论