当前位置:首页 > 职场法规 > 微机考试实验报告1

微机考试实验报告1

时间:2023-05-18 23:00:13

  昆明理工大学(微机原理与接口技术)实验报告

  实验名称 秒表设计实验 实验时间2009 年12 月22日

  专业 电信 教师评语:

  姓名 郝召君 (同组人:刘云美200711102133) 学号200711102101成绩 教师签名

  一、 实验目的

  1、 使用8259中断控制器和8279的显示电路设计一个秒表,该秒表最高精确到0.1秒,具有暂停/开始和复位功能;

  2、 掌握初始化中断向量的方法和编写中断服务程序的方法;

  二、 实验内容

  使用8253C-2(NEC)作为中断源,8259作为中断控制器,通过8279驱动七段数码管显示,从而实现一个秒表的设计。其中通过控制8253的GATE信号实现秒表的暂停和开始功能,使用脉冲开关作为另一个中断源,实现秒表的复位功能。

  三、 实验原理

  中断控制器8259模块:8086的中断系统是向量中断方式。内存中特定位置有一中断向量表,表内存有不同中断类型的中断向量(中断入口地址)。不同中断类型的中断向量在表内有对应的偏移地址,其计算方法是:中断类型码*4。中断类型由8259通过数据总线送给8086,8086内部电路会将该类型值自动乘4,而后赋给指令指针,从而转向中断向量表的相应单元取得中断入口地址,之后就进入中断服务程序。中断类型的高5位由8259寄存器ICW2决定,低3位由中断源IRx的编码自动填入。本实验中所用中断类型码为80h-87h。 ICW1控制初始化命令字格式(写入偶地址端口):

  D7

  D0

  LMIT:中断请求方式,0为边沿触发方式,1为电平触发方式;

  SNGL:是否级联,1为只有一片8259A,0为有多片8259A;

  1

  IC4:是否设置ICW4,1为需要ICW4,0为不需要。

  ICW2设置中断类型码(写入奇地址端口),其中高五位为用户设置,低三位由8259A自

  动设置。

  ICW4方式控制初始化命令字格式(写入奇地址端口):

  D7

  D0

  000为其标识码;

  SFNM:为1,则为特殊全嵌套;

  BUF:为1,则为缓冲方式,此实验中,8259A不通过总线驱动器与数据总线相连,应为0;

  AEOI:如为1,则设置中断自动结束。

  8279七段LED显示模块:在8279的内部有16个字节的显示数据缓冲器。CPU

  向8279的显示数据缓冲器写入数据后,8279即自动地将此数据用动态显示的方式显示出来。

  8279的写显示器命令格式为:

  D7

  D0

  100为此命令的特征位。AI、AAAA分别为地址自动加1标记及显示器RAM的地址。 实验中所用的LED为共阴极,其七段LED的段选码为:

  四、 实验步骤

  实验连线为:CS0-CS8259,CS1-CS8253,OUT0-IR1,INT(8259)-INT(CPU),

  INTA(8259)-INTA(CPU),脉冲开关-IR0,GATE0-K8,CLK4-8253CLK0。

  实验箱上的脉冲开关连接IR0,作为复位开关,触发后执行相应的中断子程序,对LED

  进行复位;实验中使用8253C-2(NEC)的OUT0作为中断源,连接8259的IR1; 8253的GATE0接一个置位开关K8,通过计数器0的GATE0信号来控制OUT0的输出,从而达到控制中断源的目的,实现秒表的暂停/开始功能,即当GATE0=1时,8253的OUT0才输出,进行计数,否则计数停止。

  该秒表最高计时到99.9秒,精确到0.1秒,中断源控制最低位的输出,即每隔0.1秒触发一次,其余个位和十位的计数通过软件实现。

  五、 实验结果

  全速运行程序后,K8置1,LED数码管开始计数,格式为XX.X,K8置0,计数停止;按下脉冲开关,则LED重新从00.0开始计数。

  六、 实验总结

  实验中,8253CLK0接CLK4,CLK4为对6M频率经16分频后得到,在8253的实验中测得,6M晶振的实际频率为6.664M,即CLK4为0.4165M,要使OUT0为10Hz(即周期0.1s),则应设置计数器零的初值应设置为41650(即0A2B2h)。

  附:调试运行后的程序代码如下

  con8279 equ 0492h dat8279 equ 0490h assume cs:code code segment public org 100h start: jmp start1 segcod db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;---------------------------以下为8259初始化程序--------------------------------- start1: cli mov dx,04a0h mov ax,13h out dx,ax ;设置ICW1,边沿触发,无级联,需设置ICW4 mov dx,04a2h mov ax,80h out dx,ax ;设置ICW1,中断类型码为80h mov ax,03h out dx,ax ;设置ICW4,0000 0011B,设置中断自动结束 mov ax,00h out dx,ax ;设置OCW1,0000 0000B,中断全部允许 nop ;-------------------------以下为初始化中断向量表------------------------------ mov ax,0h mov ds,ax mov di,200h ;初始化中断向量表,80h*4=200h mov ax,offset int0 ;取int0的入口地址 mov ds:[di],ax add di,2 mov ds:[di],100h ;设置CS段地址 add di,2 mov ax,offset int1 mov ds:[di],ax add di,2 mov ds:[di],100h

  ;--------------------------以下为8253的设置--------------------------------- mov dx,04b6h ;8253控制寄存器端口 mov ax,36h ;计数器0,工作在方式3(方波) out dx,ax mov dx,04b0h mov ax,0b2h out dx,ax mov ax,0a2h out dx,ax ;设置计数值0A2B2h ;------------------------以下为8279控制LED的显示程序------------------------ sti mov si,offset segcod ;将段选码首地址放入SI mov bx,0h mov cx,0h waiting: mov ax,0h a0: cmp ax,0h ;是否有中断出现 je a0 mov ax,08h ;设置8279工作方式,左边输入 mov dx,con8279 out dx,ax mov ax,85h ;设置RAM5地址,10000101B mov dx,con8279 out dx,ax ;写显示RAM5命令 ;----------------以下为RAM5,即右起第一个数码管的显示程序------------------ mov dx,dat8279 mov al,cs:[si] mov ah,0 out dx,ax ;写RAM5 nop nop inc si cmp ax,3fh ;判断是否该进位 je RAM4 cmp ax,6fh ;判断是否计数完一个循环,即从0-9 je reset0 ;若完成一个循环,则重新从0计数 jmp waiting ;---------------------以下RAM4、RAM3程序设置与RAM5类似-------------------------- ;----------------以下为RAM4,即右起第二个数码管的显示程序------------------ RAM4: push di mov di,offset segcod mov ax,84h mov dx,con8279 out dx,ax add di,bx mov al,cs:[di] add al,80h ;段选码的最高位是对小数点的设置,为1小数点

  mov ah,0 mov dx,dat8279 out dx,ax inc bx nop nop pop di cmp ax,0bfh je RAM3 cmp ax,0efh je a1 jmp waiting ;亮,此处加08h,即把个位的小数点点亮 ;----------------以下为RAM3,即右起第三个数码管的显示程序------------------ RAM3: push di mov di,offset segcod mov ax,83h mov dx,con8279

  reset0: mov si,offset segcod ;十分位计数到9后,再从0开始 jmp waiting a1: mov bx,0 ;个位计数到9后,再从0开始 jmp waiting a2: mov cx,0 ;十位计数到9后,再从0开始 jmp waiting ;------------------------以下为中断服务子程序------------------------------- int0: cli ;实现复位的中断子程序 nop mov si,offset segcod mov bx,0 mov cx,0 nop nop nop nop iret int1: cli ;进行跑秒计数的中断子程序 nop mov ax,01h ;将ax置01h,则开始执行8279的显示程序 iret code ends end start out dx,ax add di,cx mov al,cs:[di] mov ah,0 mov dx,dat8279 out dx,ax inc cx nop nop pop di cmp ax,3fh je waiting cmp ax,6fh je a2 jmp waiting