北京邮电大学 微机原理软件实验3

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

北京邮电大学

微机原理软件实验·第三次实验

题目一:

一、实验目的

1、初步掌握中断程序的设计方法;

2、初步掌握修改DOS 系统中断,以适应实际使用的方法。

二、实验内容

编一程序,在显示器上显示时、分、秒。借用计数器8253的Timer0作为中断源,通过8259A向CPU发中断,每10ms产生一次中断。在中断服务

程序中管理刷新时、分、秒。

要求:

1、输入文件名(如:CLK)后清屏后显示:

2、Current time is: xx:xx:xx(时分秒键盘输入)

3、打回车,时、分、秒开始计时。时钟不停的刷新。

4、当键入CTRL+C时,停止计时,返回系统,且系统正常运行不死机。

提示:

8253的初始化程序段可借用。口地址为40H、41H、42H、43H,控制字为36H=00110110B,时间常数TC=11932:1.1932MHz/11932=100Hz,

输出方波频率为100Hz,其周期为1000/100=10ms。

三、设计思路

1、程序流程图

开始

定义数据段和堆栈段

保存源中断向量

将timer子程序地址设

置为中断向量

设置8253工作状态,

使其输出方波100Hz

设置8259A工作状态

输出一条提示信息,

要求用户设定时间

判断设定时间是

否符合规范否

输出一条

错误信息

显示字符串:“Now

the time is:”

判断内存中的时

间是否被修改

重新在屏幕上打印时

判断键盘缓冲区有无

按键按下

回车是否按下是秒表功能

判断“S”是

否按下

判断Ctrl+C

是否按下

退出程序

2、中断子程序流程图

子程序开始

记下进入中断

的次数

判断次数

是否为100

计数清零,修

改内存中存储

的时间

查看是否

有进位

进位调整

结束

3、可能用到的指令

①STI 置中断允许位.

CLI 清中断允许位.

格式:CLI STI

功能:开关中断允许标志,用于在程序中防止中断嵌套,设置中断。

②STOS(STOre into String) 存入串指令

格式:STOS DST

STOSB //存放字节串( DI ) = AL

STOSW //存放字串( DI ) = AX

执行操作:把AL或AX中的内容存放由DI指定的附加段的字节或字

单元中,并根据DF值修改及数据类型修改DI的内容。

字节操作:((DT))←(AL),(DI)←(DI)±1

字操作:((DI))←(AX),(DI)←(DI)±2无条件转移指令

③IN输入指令

长格式为:IN AL,PORT(字节)

IN AX,PORT(字)

执行的操作:(AL)<-(PORT)(字节)

(AX)<-(wPORT+1,PORT)(字)

短格式为:IN AL,DX(字节)

IN AX,DX(字)

④OUT输出指令

长格式为:OUT PORT,AL(字节)

OUT PORT,AX(字)

执行的操作:(PORT)<-(AL)(字节)

(PORT+1,PORT)<-(AX)(字)

短格式为:OUT DX,AL(字节)

OUT DX,AX(字)

执行的操作:((DX))<-(AL)(字节)

((DX)+1,(DX))<-AX(字)

⑤设置中断向量

格式:

mov al,8

mov ah,25h

int 21h

DS:DX=中断向量

AL=中断类型号

⑥查看中断向量

格式:

mov al,8

mov ah,35h

AL=中断类型

ES:BX=中断向量

4、计数器芯片8253简介

①初始化

使用8253前,要进行初始化编程。初始化编程的步骤是:A向控制寄存器端口写入控制字对使用的计数器规定其使用方式等。

B 向使用的计数器端口写入计数初值。

②8253控制字

D7D6=00:使用0号计数器,D7D6=01:使用1号计数器

D7D6=10:使用2号计数器,D7D6=11:无效

D5D4=00:锁存当前计数值

D5D4=01:只写低8位(高8位为0),读出时只读低8位

D5D4=10:只写高8位(低8位为0),读出时只读高8位

D5D4=11:先读/写低8位,后读/写高8位计数值

D3D2D1=000:选择方式0,D3D2D1=001:选择方式1

D3D2D1=X10:选择方式2,D3D2D1=X11:选择方式3

D3D2D1=100:选择方式4,D3D2D1=101:选择方式5

D0=0:计数初值为二进制,D0=1:计数初值为BCD码数四、源程序

data segment

count100 db 100

;100个10ms=1s,此处count100起计数作用

msg1 db 'Please enter the current

time(XX:XX:XX)!(Press ENTER to use default time)$' msg2 db 'Sorry,your date entered

incorrectly ,please try again!$'

msg3 db 'Now, the time is:',0ah,'(Press Ctrl+C to EXIT.)',0ah,'(Press Enter to use as a Stopwatch.)',0ah,'(Press S or s to set current time again.)(XX:XX:XX)$'

msg4 db 0ah,'Program EXIT normally.$'

tenhour db '0';小时十位数

hour db '0',':';小时个位数

tenmin db '0';分钟十位数

minute db '0',':' ;分钟个位数

tensec db '0';秒十位数

second db '0’;秒个位数

data ends

stack segment stack 'stack'

db 256 dup(0)

stack ends

code segment

assume cs:code,ds:data,es:data

start: mov ax,seg data

mov es,ax

mov ds,ax

cli ;使中断标志IF=0

mov al,8;保存源中断向量

mov ah,35h

int 21h

push es

push bx mov ax,0

mov es,ax; es置零,这是准备中断向量的写入mov di,20h

mov ax,offset timer;中断子程序timer的偏移量stows

;字符串填充,将AX的内容

;(timer偏移量)存入di所指向的单元,

;di的增减取决于DF,默认段基址总是ES mov ax,cs

stosw;timer端基址

mov al,36h

out 43h,a;设置8253控制字为36H

mov bx,11932

;分频系数为11932,分频结

;果1.1932MHz/11932=100Hz,10ms变化一次mov al,bl;分两次设置分频系数

out 40h,al

mov al,bh

out 40h,al

mov al,0fch;主PIC端口设置为0fch

out 21h,al

sti;开中断,允许外部中断

mov ax,seg data

mov es,ax

mov ds,ax

mov dx,offset msg1;打印提示信息1

mov ah,09h

int 21h

mov dl,0ah

mov ah,02h

相关文档
最新文档