北京邮电大学 微机原理软件实验3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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