微机原理课程设计--8253定时中断时钟.docx

上传人:wj 文档编号:111371 上传时间:2022-10-03 格式:DOCX 页数:19 大小:41.67KB
下载 相关 举报
微机原理课程设计--8253定时中断时钟.docx_第1页
第1页 / 共19页
微机原理课程设计--8253定时中断时钟.docx_第2页
第2页 / 共19页
微机原理课程设计--8253定时中断时钟.docx_第3页
第3页 / 共19页
微机原理课程设计--8253定时中断时钟.docx_第4页
第4页 / 共19页
微机原理课程设计--8253定时中断时钟.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

微机原理课程设计--8253定时中断时钟.docx

《微机原理课程设计--8253定时中断时钟.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计--8253定时中断时钟.docx(19页珍藏版)》请在冰豆网上搜索。

微机原理课程设计--8253定时中断时钟.docx

课程设计报告

(2013—2014年度第一学期)

名 称:

微机原理及应用题 目:

8253定时中断时钟院 系:

控计学院

班 级:

学号:

学生姓名:

指导教师:

设计周数:

1周

成绩:

日期:

2013年12月30日

word文档可自由复制编辑

课程

课程设计(综合实验)报告

目录

一、课程设计的目的与要求 2

1.课程设计的题目 2

2.课程设计的要求 2

二、设计正文 2

1.基本原理 2

2.代码示例 2

三、课程设计总结 6

四、参考文献 7

附录 7

1.程序源码 7

2.程序流程图 13

word文档可自由复制编辑

一、课程设计的目的与要求

1.课程设计的题目

题目:

用8253定时器实现屏幕上的日历时钟,带有年月日时分秒(1人)在DOS屏幕上右上角动态显示日期、时间,要求格式:

年-月-日时:

分:

秒。

要求采用8253定时器中断方式实现定时及显示刷新。

2.课程设计的要求

通过对微机系统分析和具体设计,使学生对所学课程的理解。

培养分析能问题,解决问题的能力。

要求学生掌握汇编语言程序设计的基本方法,学会典型接口的基本设计方法

二、设计正文

1.基本原理

获取系统时间与日期的方式有两种,比较简单的途径是直接用DOS时间与日期功能调。

比如:

向量号为21,功能号为2A,可以调出系统的时间,分别存放在DX和CX之中;向量号为21,功能号为2C可以调出系统的日期,年月日信息存储在DX和CX中;向量号为1A,功能号为02,也可以调用系统时间,同样存放在DX和CX中,不过是以压缩BCD码的形式存放的;向量号为1A,功能号为04可以调出

系统的日期,以BCD码的形式存放在DX和CX中。

编程的时候就会发现,后者比前者使用起来方便很多,因为显示的时候要用到ASC码,压缩BCD码可以通过与30H相加,便可以得到相应的ASC码。

而前者存储方式十六进制的,所以必须先转换成BCD码,在转换成ASC码,而十六进制与BCD码之间的转换比较复杂。

2.代码示例

用1A向量实现,程序代码如下:

MOVAH,02HINT1AHPUSHDXPUSHCXMOVAH,04HINT1AHPUSHDX

PUSHCX

这段代码执行后,查看堆栈得:

1420020117170752,时间为:

2014年1月2日17点17分52秒

用21号向量实现,程序代码如下:

MOVAH,2CHINT21HPUSHDXPUSHCXMOVAH,2AHINT21HPUSHDXPUSHCX

代码执行后,查看堆栈得:

DE07020117114016,当前系统时间用16进制表示的,换算之后,可

以得到:

2014年1月2日17点23分22秒

另一种方式就是题目所要求的,利用8253的55MS中断产生定时,不过仍然需要读一次系统的时间,作为计时开始的基准。

8253每过50MS,就会申请一次中断,向量号为1C。

通过修改这个中断向量,使其指向自己编写的中断服务程序入口。

通过计算中断的次数,便可以得到从计时开始到当前时刻的时间。

程序的数据段定义如下:

DATASSEGMENTCOUNTDB0TEMPDB3DUP(0)

TIMEDW0,':

',0,':

',0,'$'

DATEDW0,0,'-',0,'-',0,'$'INT_SEGDW?

INT_OFFDW?

DATASENDS

每次进入中断服务程序,COUNT加一,加到18的时候,便可以计为一秒。

TEMP用来存放当前时刻的压缩BCD码,比如:

18:

37:

50,则TEMP中存放18H,37H,50H。

由于显示的时候,必须用ASC码,所以TEMP中的数据不能直接用于显示,需通过下面的TRANSPROC进行转换:

TRANSPROC ;BCD-ASC码转化,入口AL,出口AXPUSHCX

PUSHDXMOVBL,ALMOVBH,ALMOVCL,4SHRBL,CL

ADDBL,30HANDBH,0FHADDBH,30HMOVAX,BXPOPDX

POPCXRET

TRANSENDP

此过程的入口参数为AL,用来存放时刻的压缩BCD码,出口为AX,存放的是转化后的ASC码形式。

比如:

压缩BCD码18H,转换之后为3138H,就可以直接用来显示。

转换思想为:

取前四位=01H,加上30H,得到31H,同样取出后四位=08H,加上30H,得到38H。

转化之后的结果存入TIME中,用来显示,转换过程的代码如下:

MOVSI,OFFSETTEMPMOVDI,OFFSETTIMEMOVAL,[SI]

CALLTRANSMOV[DI],AXMOVAL,[SI+1]CALLTRANSMOV[DI+4],AXMOVAL,[SI+2]CALLTRANS

MOV[DI+8],AX ;将时间的ASC码送入TIME

中断向量的修改通过下面代码实现:

MOVAX,351CHINT21H

MOVAX,ES

MOVINT_SEG,AX

MOVINT_OFF,BX ;保存原中断向量CLI

MOVAX,251CH

MOVDX,SEGINT_PROMOVDS,DX

MOVDX,OFFSETINT_PRO

INT21H ;设置新中断向量STI

在修改之前需把原本的中断向量保存起来,以便程序运行结束后进行还原。

下面是中断服务程序:

INT_PROPROCFAR ;时间产生程序PUSHAX

PUSHSICLI

MOVAX,DATAS

MOVDS,AX

MOVSI,OFFSETTEMPINCCOUNT

CMPCOUNT,12H

JNZKKMOVAL,0

MOVCOUNT,ALMOVAL,[SI+2]ADDAL,1

DAA

MOV[SI+2],AL ;修改秒CMPAL,60H

JNZKKMOVAL,0

MOV[SI+2],ALMOVAL,[SI+1]ADDAL,1DAA

MOV[SI+1],AL ;修改分CMPAX,60H

JNZKKMOVAL,0

MOV[SI+1],ALMOVAL,[SI]ADDAL,1DAA

MOV[SI],AL ;修改小时CMPAX,24H

JNZKKMOVAX,0MOV[SI],AL

KK:

POPSIPOPAXSTIIRET

INT_PROENDP

中断服务程序最开始对COUNT加一,当加到18时清零并且秒加一,如果秒数变为60,清零并且分加一,当分计满60的时候,时加一,时满24时,清零。

最后用IRET返回。

程序的退出通过检测键盘是否输入ESC键,代码如下:

MOVAH,0BHINT21H

CMPAL,00

JNEAA ;看一看是否有按键输入JMPGO

AA:

MOVAH,08HINT21H

CMPAL,1BH

JEQUIT ;如果有按键按下,检查是不是ESC,是的话就退出JMPGO ;不是的话,继续执行

三、课程设计总结

通过3天的奋战,完成了课设,最大的感觉:

好幸福!

这些程序是我一步一步的查课本,查资料,还有不断的实验调试得出来的,当显示出稳定并且正确的时刻时,前所未有的成就感涌上心头!

最初,为了将16位的二进制表示的年份转换成BCD码,头疼了一天,一步一步的执行,一个一个的查看寄存器、查堆栈,最终惊奇的发现另一个中断向量1AH竟然可以调用出BCD码形式的日期,别提多兴奋!

以及,在之后建立过程的时候,由于忘了在末尾加上RET,发现程序总是莫名其妙的跳来跳去。

感慨:

有些东西想起来简单,做起来的时候很多细节是能够决定成败的!

后来呢,程序有了雏形,可以正确显示,却发现画面异常不稳,闪来闪去,于是有绞尽脑汁,想起来之前自己在编液晶显示驱动的时候,由于不停地刷屏导致闪屏的状况,发现这个程序的显示部分也有相同的状况,改变了一下GO的位置,画面终于稳定了!

所有的奋战凝结成一句话:

我爱微机!

四、参考文献

《新编16/32位微型计算机原理及应用(第四版)》,清华大学出版社,李继灿主编

附录

1.程序源码

DATASSEGMENT

COUNTDB0

TEMPDB3DUP(0)

TIMEDW0,':

',0,':

',0,'$'

DATEDW0,0,'-',0,'-',0,'$'

INT_SEGDW?

INT_OFFDW?

DATASENDSSTACKSSEGMENT

FDDB50DUP(0)STACKSENDSCODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

CALLCLEAR

MOVAX,351CH

INT21H

MOVAX,ES

MOVINT_SEG,AX

MOVINT_OFF,BX; 保存原中断向量

CLI

MOVAX,251CH

MOVDX,SEGINT_PRO

MOVDS,DX

MOVDX,OFFSETINT_PRO

INT21H; 设置新中断向量

STI

CALLMAIN; 进入主函数main

MOVAH,4CH

INT21H

MAINPROC;主函数

PUSHAX

PUSHSI

PUSHDX

PUSHBX

PUSHDS

MOVAX,DATAS

MOVDS,AX

MOVAH,02H

INT1AH; 读取系统时间

MOVSI,OFFSETTEMP

MOV[SI],CH

MOV[SI+1],CL

MOV[SI+2],DH

MOVAH,04H

INT1AH; 读取系统日期

MOVSI,OFFSETDATE

MOVAL,CH

CALLT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1