8253和8259来实现的简单的时钟,硬件中断时钟设计
利用8253和8259实现简单时钟
一、内容
利用PC系列微机现有的硬件和软件资源编写程序,以便在显示器屏幕上显示XX
(分):XX(秒),并且每秒钟更新一次显示。 (时):XX
二、设计目的
掌握8253、8259A芯片。
三、设计思路
IBM PC/XT系统板上使用了一片8253-5,其地址为40H ~ 43H,其中0通道在方式3下工作,初值设置23小时59分50秒,每隔55ms向中断控制器8259A的IRQ0端发一次中断请求。此定时中断的用途之一是系统报时。现在借用原有电路,重新设置定时器、编写中断服务程序来做硬件时钟实验,为此程序开始应首先保护原系统的08H中断的中断矢量(中断服务程序入口地址),以便程序退出时恢复原系统的设置。保护原系统的08H中断的中断矢量可用DOS 35H功能调用读出,并加以适当保存,也可以用以下指令将中断矢量压入堆栈保存。
具体过程:等待按键按下,调用DOS的显示字符串功能,并对中断进行压栈操作后,建立数据段的可寻址性,通过装载现行的中断服务程序,使用8253初始化的0通道,3方式,二进制计数进行方式3的10ms方波,即每10ms中断一次,通过保护原有的8259A的中断屏蔽寄存器IMR的内存,进行下一步的IMR的重写,只开放始终和键盘的中断处理。进而开中断,运行TIMER模块的时间调用及DOS显示系统时间的功能,待TIMER模块运行结束之后,关闭中断返回DOS,程序结束。
CLI ;关中断
CLD ;DF=0
MOV AX ,0000H
MOV DS ,AX ;DS:SI指向08H中断矢量表中的位置
MOV SI ,0020H
LODSW
MOV BX ,AX ;BX:原中断服务程序入口偏移地址
LODSW ;AX:原中断服务程序入口的段地址
PUSH AX ;压栈保护
PUSH BX
四、硬件原理图及相关说明
1、8253
这是8253的相关图形,一般8253要实现定时、计数控制大致可采用三种方法:
?设计数字逻辑电路来实现定时或计数的要求。即由硬件电路实现的定时器/ 计数器。
?用软件来实现定时和计数的要求。即采用循环方式执行若干条指令,使程 序段执行时占用一定的延时时间。
?采用可编程定时器/计数器。其定时与计数功能可由程序灵活设定,设定后 于CPU并行工作,不占用CPU的时间,可以很好地解决以上两种定时存在的不足,这种方式广泛应用于各种定时或计数场合。
8253的工作方式三是方波发生器,方式三的输出为方波,具有“初始化自动重装”功能。向8253写入控制字后,OUT输出变为高电平,在写完计数初值后计数器自动开始对输入时钟CLK计数,OUT输出保持高电平。当计数到一半时,输出变为低电平,直至计数到0,在重装计数初值,OUT端变高开始新一轮计数。
1
2、8259A
8259A常用于中断优先级管理电路,它的功能有三种:
?它可以接受多个外部中断源的中断请求,并进行优先级别判断,选中当前 优先级别最高的中断请求,再将此请求送到微处理器的中断输入端。 具有提供中断向量、屏蔽中断输入等功能。
?8259A使用单+5V电源供电,有多种中断管理方式,自动提供中断服务程序 入口地址,使用灵活方便。
2
五、软件流程图及其说明
开始
等待键按下(DOS7号调用)
取原8H中断的中断矢量并压栈保护
建立数据段的可寻址性
装载现在的中断服务程序
8253初始化产生10ms方波,10ms中断一次
保护原8259A的IMR(中断屏蔽寄存器)内容
重写IMR,只开放时钟和键盘中断
开中断
检测键盘(DOS6号调用)
N有键按下,
YY是空格键,
N关中断显示时间值(DOS9号调用)
恢复IMR取消秒
重新设置8253,N55ms中断一次秒值变否,
Y恢复原中断矢量
开中断
返回DOS
结束
图1.0 硬件中断时钟设计流程图
硬件中断时钟设计算法具体描述,等待建按下调用DOS的7号功能键,并将中断的中断矢量进行压栈保护,建立数据段的可寻址性,通过装载现行的中断服务程序,使用8253初始化产生10ms方波,每10ms中断一次,保护原有的8259A的中断屏蔽寄存器IMR的内存,进行下一步的IMR的重写。进而开中断,然后调用DOS的6好功能键,通过判断是否有键按下和是否按下的是空格键实现显示时间和关闭中断返回DOS,程序结束。
3
六、功能模快设计说明
1、模块1
是空格键,
关中断
恢复IMR
重新设置8253,
55ms中断一次
恢复原中断矢量
开中断
返回DOS
结束
这部分模块是实现当按下空格键时程序关中断,恢复IMR,重新设置8253中断时
间,恢复中断矢量以及开中断。
2、模块2
有键按下,
N
显示时间值(DOS9号调用)
取消秒
4
N秒值变否,3、模块3
这个模块是实现的等待功能
4、模块4
检测键盘(DOS6号调用)
Y
秒值变否,
根据秒值是否相同来执行循环,但秒值变化了就返回继续执行程序。
七、源程序
STACK SEGMENT
DB 256 DUP(0) STACK ENDS
DATA SEGMENT
COUNT DB 100
TENH DB ‘2’
HOUR DB ‘3:’
TENM DB ‘5’
MINUTE DB ‘9’
DB ‘:’
TENS DB ‘5’
SECOND DB ‘0’,0DH,’$’
DATA ENDS
CODE SEGMENT
START PROC FAR
ASSUME CS:CODE
PUSH DS
5
MOV AX,0
PUSH AX
MOV AH, 08H ;等待键按下,AL=字符的ASCII码
INT 21H ;将中断矢量压入堆栈保存
CLI ;清中断允许位
CLD ;清方向标志位
MOV AX, 0000H
MOV DS, AX
MOV SI, 0020H ;DS:SI指向08H中断向量
LODSW ;取08中断入口的偏移地址
MOV BX,AX
LODSW ;取08中断入口段地址
PUSH AX ;压栈保护
PUSH BX
;将中断矢量压入堆栈保存
MOV AX,DATA ;建立数据段的可寻址性
MOV DS, AX
ASSUME DS:DATA
;将向中断矢量写入新地址
MOV AX, 0000H
MOV ES, AX
MOV DI, 0020H ;ES:DS指向08中断向量存放地址
MOV AX,OFFSET TIMER
STOSW ;写入偏移地址
MOV AX,CS
STOSW ;写入段地址
;将向中断矢量写入新地址
MOV AL,00110110B ;8253初始化,0通道,3方式,二进制计数
OUT 43H,AL
MOV AX,11932 ;初值,11932
OUT 40H, AL
MOV AL ,AH
OUT 40H, AL
IN AL,21H ;读8259的中段屏蔽寄存器IMR
6
PUSH AX ;压栈保护
;MOV AL, 0FCH
STI ;开中断
FOREVER:
MOV DL,0FFH ;有键按下吗?
MOV AH, 06H
INT 21H
JZ DISP ;无键按下则转显示DISP
CMP AL, 20H ;是空格键吗?
JZ EXIT ;是则退出
DISP:
MOV DX, OFFSET TENH ;不是则显示时间
MOV AH, 09H
INT 21H
MOV AL, SECOND ;取秒单元值
WAITCHA:
CMP AL,SECOND ;改变否?
JZ WAITCHA ;没变则等待
JMP FOREVER ;变则转FOREVER
EXIT:
CLI ;有空格键按下退出 关中断
CLD ;清方向标志位
POP AX
OUT 21H,AL ;恢复IMR
MOV AL, 36H ;8253初始化,55ms
OUT 43H,AL
MOV AL, 0
OUT 40H,AL
OUT 40H,AL
;恢复中断矢量
MOV AX,0 ;恢复08H中断中断向量
MOV ES, AX
MOV DI, 4*8
POP AX
STOSW
7
POP AX
STOSW
STI
;恢复中断矢量
RET
START ENDP
CODE ENDS
END START
八、程序调试
本次实验采用的是MASM FOR WINDOWS集成实验环境2010软件,只需要用记事本将程序保存成.asm文件,然后直接用其打开然后运行即可自动编译连接并出结果。如程序有问题可直接在MASM FOR WINDOWS集成实验环境2010软件中调试并运行直到结果正确。
1、 程序调试界面
8
2、运行过程
?打开运行窗口
?按下任意键显示时间
?按下空格键停止计时
?按下任意键退出窗口
9
九、心得体会
在设计过程中虽然遇到了不少困难,但当我通过自己查资料、或是向向同学请教在网上询问,在克服了一个又一个难点之后,我的设计正是进入具体操作阶段: 1、 设计思路的分析阶段 。我根据一些经典的算法再加上我的自我分析,写出了符合这次设计要求的算法,并就此画出相应的流程图;2 、源代码的编写阶段。这一过程我还是参考了不少经典例子,再结合实际需要,运用从课堂上掌握的基本汇编语言知识,终于完成了初步的源代码 ;3 、代码的调试过程。这算是本次课设的重点过程之一,因为发现错误并改正错误就靠这一过程来完成,经过多次调试,我终于得到了一个正确的程序,使得设计方案中发现的问题得到解决并成功实现系统所需功能,那种成就感和满足感足以让我忘记了这些天来的辛苦。
这次课程设计给了我们一次应用自己所学知识的机会,使我对这门课程有更深层次的理解,让我们深刻体会到了:一个人的力量是有限的,多请教别人,虚心求问是我在以后学习中应该多多发扬的。
总之,珍惜每一次课程设计的机会,好好锻炼自己提高自己,才真正达到课程设计这门课的目的。
10