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

其他范文 时间:2020-02-28 04:18:51 收藏本文下载本文
【www.daodoc.com - 其他范文】

北京邮电大学 微机原理软件实验3由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“北邮微机原理软件实验”。

北京邮电大学

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

题目一:

一、实验目的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子程序地址设置为中断向量显示字符串:“Now the time is:”是判断“S”是否按下否设置8253工作状态,使其输出方波100Hz判断设定时间是否符合规范否输出一条错误信息判断Ctrl+C是否按下是设置8259A工作状态输出一条提示信息,要求用户设定时间是退出程序

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

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

IN输入指令

长格式为:IN AL,PORT(字节)IN AX,PORT(字)执行的操作:(AL)

OUT输出指令

长格式为:OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作:(PORT)

设置中断向量 格式:

mov al,8 mov ah,25h int 21h DS:DX=中断向量 AL=中断类型号

查看中断向量 格式:

mov al,8

mov ah,35h AL=中断类型 ES:BX=中断向量

计数器芯片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)!(Pre ENTER to use default time)$' msg2 db 'Sorry,your date entered incorrectly ,please try again!$' msg3 db 'Now, the time is:',0ah,'(Pre Ctrl+C to EXIT.)',0ah,'(Pre Enter to use as a Stopwatch.)',0ah,'(Pre 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 aume 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 int 21h

settime:mov si,offset tenhour;设定时间 mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2;如果输入不合法,报错 cmp al,'3' jnc error2 mov [si],al inc si cmp al,'2' jz ershi

mov ah,01h;如果小时高位为1,;低位可以设置0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2 cmp al,'9'+1 jnc error2 mov [si],al inc si jmp fen

ershi: mov ah,01h;如果小时高位为2,低位可以设置0~4 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error2 cmp al,'4' jnc error2 mov [si],al inc si jmp fen

fen: mov ah,01h;分高位可设置0~5 int 21h cmp al,0dh jz forever1 cmp al,':' jnz error1 mov [si],al inc si

mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'6' jnc error1 mov [si],al inc si

zcy4: mov ah,01h;分低位0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'9'+1 jnc error1 mov [si],al inc si jmp zcy

settime2:jmp settime;用来跳转接力 error2: jmp error1 forever1:jmp next2

zcy: mov ah,01h;秒高位可设置0~5 int 21h cmp al,0dh jz forever1 cmp al,':' jnz error1 mov [si],al inc si

mov ah,01h int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'6' jnc error1 mov [si],al inc si

mov ah,01h;秒低位可设置0~9 int 21h cmp al,0dh jz forever1 cmp al,'0' jc error1 cmp al,'9'+1 jnc error1 mov [si],al inc si

jmp next2

error1: mov dl,0ah;用来报错:设置时间不合法 mov ah,02h int 21h

mov dx,offset msg2;打印提示信息2 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h

jmp settime

settime3: jmp settime2;跳转接力

next2: MOV AX,0003H;做时钟显示初始化 INT 10H;清屏显示 mov dl,0ah mov ah,02h int 21h mov dx,offset msg3;打印提示信息3 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h forever:mov bx,offset tenhour;这个程序段循环执行 mov cx,8 cmp tenhour,'2';如果超过24点,置为0点 jnz dispclk cmp hour,'4' jnz dispclk mov tenhour,'0' mov hour,'0' dispclk:mov dl,[bx];用来显示当前时间 call dispchar inc bx loop dispclk

;调用显示子程序,显示初始状态时间,;比如”11:11:11“

mov dl,0dh;输出一个换行 call dispchar

xor al,al;读键盘缓冲区 mov ah,0bh int 21h cmp al,0FFH jnz next3 mov ah,08h;取其字符 int 21h cmp al,03h;Ctrl+C退出 jz stop cmp al,'s';S/s设定时间 jz settime3 cmp al,'S' jz settime3 cmp al,0dh jnz next3 mov dl,0ah;回车则使用秒表功能 mov ah,02h int 21h jmp forever

next3: mov al,second

next: cmp al,second;判断second是否发生变化je next;如果没有,循环比较

jmp forever;如果有变化,刷新输出

stop: mov dx,offset msg4;打印提示信息4 mov ah,09h int 21h mov dl,0ah mov ah,02h int 21h

pop dx;恢复中断向量 pop ds mov al,8 mov ah,25h int 21h mov ah,4ch int 21h

timer proc far;中断程序timer push ax

dec count100;计数100次

jnz timerx;如果计数小于100,跳出中断 mov count100,100

;否则重置count100

inc second;加一秒 cmp second,'9'

;判断大小,用于进位,以下原理相同 jle timerx

mov second,'0' inc tensec cmp tensec,'6' jl timerx

mov tensec,'0' inc minute cmp minute,'9' jle timerx

mov minute,'0' inc tenmin cmp tenmin,'6' jl timerx

mov tenmin,'0' inc hour cmp hour,'9' ja adjhour cmp hour,'3' jnz timerx

cmp tenhour,'1' jnz timerx mov hour,'1' mov tenhour,'0'

jmp short timerx;段内短转移

adjhour:inc tenhour mov hour,'0' timerx: mov al,20h out 20h,al;主PIC口地址 pop ax;出栈恢复 iret;中断返回 timer endp

dispchar proc near;显示子函数 push bx mov bx,0 mov ah,02h

int 21h

;DOS功能调用,输出DL内容 pop bx ret

dispchar endp

code ends end start

五、实验结果(反色)

这幅图是运行程序之后,设定时间,输入的时间不合法的截图。当输入不合法的字符时,对弹出一条错误信息,然后要求重新输入时间。

这幅图是输入一个合法字符串后,时钟被设定为该值,并且正常计数的程序截图。

这幅图是在时钟运行的过程中,按下Enter键,进入秒表模式的截图。秒表模式,会将按下Enter的时间保存下来。

这幅图是在时钟运行的过程中,按下S键,进入设定模式的截图。该截图输入字符串不合法。当输入合法的字符串后,程序将清屏,这是截图和正常计时状态一样。

这幅图是按下Ctrl+C,程序正常退出的截图。程序正常退出后,与之前的运行情况完全一样,程序运行不死机。

六、实验总结:

这次微原实验是我设计比较大型的汇编程序,从如何使用8253/8255开始,到程序被完整调通为止,这个实验带给我的是对于课本第七章、第八章的知识更加清晰的认识与了解,和对于微机运行的原理的进一步认识。在这次实验中,我都要求自己先做整体思路规划,再去做代码实现,这样节省了我大量时间。也给我带来了很多收获。

整体的思路规划:我认识到,相比于直接闷头就上的编程方法,有一个好的整体思路规划,会节省很多后期的力气,对于任务的完成大有裨益。

严谨认真的代码风格:汇编语言的编译器不如C++等高级语言,当程序出错时,并不会给出错误。我们要有严谨的代码风格,才能保证效率。

学会调试:汇编语言的编译器较差,当程序出错时,我们要善用DEBUG工具,去认真地分析程序的每一部动向,找到问题所在。

回归课本基本概念:在编程的过程中,曾经出过一个bug,总是无法正常的进入计时中断Timer。经过我查阅课本,发现是8253的控制字设置有问题。这说明我对课本的内容掌握的还不够好,应该多多回归课本基本概念,才可以顺利的编程。

北京邮电大学微机原理与接口技术硬件实验报告

信息与通信工程学院微机原理与接口技术硬件实验报告班姓 学 序级:名:号:号: 日 期: 2015-10-30——2015-12-261 目录实验一 I/O地址译码 ...........................................

微机原理实验总结

微机原理实验总结不知不觉,微机原理与接口技术实验课程已经结束了。回想起来受益匪浅,主要是加深了对计算机的一些硬件情况和运行原理的理解和汇编语言的编写汇编语言,对于学习......

北京邮电大学通信原理复习计划

北邮通信原理复习计划一 考研数据分析北京邮电大学信息与通信工程学院每年得招生人数每年都在700人左右(其中保送生150人左右),2010年的招生人数可上北邮主页上查询。2005年初......

微机原理实验三子程序设计实验

实验三 子程序设计实验一、实验目的1.学习子程序的定义和调用方法。 2.掌握子程序的程序设计、编制及调用。 二、实验设备TDN86/88教学实验系统一台 三、实验内容及步骤1.求无......

北京科技大学微机原理实验报告

微机原理及应用实验报告学院: 班级: 学号: 姓名:微机实验报告书(Ⅰ) 学号:姓名:班级: 同组名单:实验日期:实验题目:8253可编程定时器\计数器实验目标:掌握8253的基本工作原理和编程方法......

下载北京邮电大学 微机原理软件实验3word格式文档
下载北京邮电大学 微机原理软件实验3.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文