微机原理接口技术实验报告
---软中断和8255硬中断
杨忠学 0346031 电子信息工程
l 实验目的:
通过实验加深对中断系统、中断服务的理解;学会编写伴随中断发生的
主函数及中断服务子程序。
l 实验内容:
1、软中断,编写一个软中断,使PC机每中断一次,在屏幕上显示中断信息“这是第M次中断!”,M依中断次数改变。
2、硬中断,在中断没有发生时,计算机执行主程序,其主程序的功能特效(可以自己设计),用实验箱的单脉冲输出作为中断源,接至实验箱的IRQ插孔(系统内为IR7中断,N=0FH)。没按一下触发一次硬中断,当有中断发生时应转入中断服务,中断服务程序的运行特效是:在屏幕上显示中断信息“这是第M次中断!”,M依中断次数改变。
l 软中断的c语言实现
微机的中断包括软中断和硬中断。用c语言实现软中断的过程是:保存原来的中断向量、设置新的中断向量、中断函数的编写、用软件产生中断信号。中断函数里应该有一下几个过程:开中断、函数主体、中断返回;在设置新中断向量前应该关闭中断,设置成功后再开中断。在dos.h文件里,有很多关于中断的声明。综上所述,用c语言实现软中断的程序如下:
#include <dos.h>
#include <stdio.h>
#define INTR 0X11
void interrupt handler(void);
void interrupt (*oldhandler)(void);
void main(void){
int i=0;
oldhandler=getvect(INTR);
disable();
setvect(INTR,handler);
enable();
while(!kbhit()) {
geninterrupt(INTR);
for(i=0;i<=25;i++) { delay(3000); }
}
setvect(INTR,oldhandler);
}
void interrupt handler(void){
static int count=1;
printf("This is the %dth interrupt!/n",count);
count++;
}
l 硬中断的实现
1. 实验电路图(略)
2. 实验程序
#include "stdio.h"
#include "dos.h"
#define DATAPORT 0x280
#define INTPORT 0x20
#define READ 0x21
static int count=1;
void interrupt yzxint(void){
printf("this is the %dth interrupt....../n",count);
delay(1000);
outportb(INTPORT,0x20);
count++;
}
void main(){
unsigned char ledcode[]={0xfc,0x60,0xda,0xf2,0x66,
0xb6,0xbf,0xe0,0xfe,0xf6},intst;
int i;
clrscr();
intst=inportb(READ);
intst=intst&0x
7f
;
outportb(READ,intst);
outportb(INTPORT,0x27);
disable();
setvect(0x
0f
,yzxint);
enable();
while(!kbhit()){
if(count%2)
for(i=9;i>-1;i--){
outportb(DATAPORT,ledcode[i]);
delay(100000);
}
else
for(i=0;i<9;i++){
outportb(DATAPORT,ledcode[i]);
delay(100000);
}
}/*end while*/
}
实验结果:
在PCI总线的计算机上运行程序,LED并没有显示0~9,用万用表测数据总线上的电压,每根线的电压全为0.3,说明数据线没有数据,修改了数据端口的地址,数码管显示数字0~9。
没有按脉冲开关时,数码管动态显示0~9。第一次按脉冲按钮,屏幕输出这是第1次中断,说明CPU响应了中断。之后数码管动态显示9~0。再按一次脉冲开关,屏幕输出这是第2次中断。之后数码管动态显示9~0。
每按一次脉冲,屏幕输出这是第几次中断,之后数码管显示0~9或9~0。实验结果说明CPU响应了每次中断,而中断程序改变数码管显示数字的顺序和在屏幕输出这是第几次中断。
l 实验总结
通过这次实验,我彻底的理解了中断的概念,学会使用高级语言( C 语言)编写中断程序, C 语言写的中断比汇编写中断简单明了,而且移植性好。与此同时我也学会了编写可编程芯片的程序。