微机原理与接口技术 实验报告

微机原理与接口技术

实验报告

          

实验一 8259中断控制器应用实验

一、实验目的

    1.掌握PC机中断处理系统的基本原理。

    2. 掌握可编程中断控制器8259的应用编程方法。

二、实验内容  

    1.PC机内中断实验。使用单次脉冲模拟中断产生。验证中断处理程序,在显示器屏幕上显示一行预设定的字符串。

    2.PC机内中断嵌套实验。使用单次脉冲模拟两个中断源的中断产生,填写中断处理程序,体会中断嵌套的过程。

3.扩展多中断源查询方式应用实验。利用实验平台上8259控制器作为中断扩展源,编写程序对8259控制器的中断请求进行处理。

三、实验步骤

1.实验1-1:PC机内中断应用实验

(1)按接线图连好接线,调用程序源代码8259-1.asm,观察实验现象,屏幕显示结果截图如下:

(2)自设计实验。改变接线方式,将单次脉冲连到USB核心板上的IRQ10插孔上,参考本实验代码,编程实现IRQ10中断。(注意:考虑PC机内中断级联的方式,参看前面的原理说明),代码如下:

DATA SEGMENT

     MESS DB  'IRQ10 ',0DH,0AH, '$'

DATA ENDS

CODE SEGMENT

     ASSUME CS:CODE, DS:DATA

START: MOV AX, CS

             MOV DS, AX

       MOV DX,OFFSET INT10    

       MOV AX,2572H               ;设置IRQ10对应的中断向量

       INT 21H     

       IN AL,21H                                   ;读取中断屏蔽寄存器

       AND AL,0F3H                 ;开放IRQ3中断和从片

       OUT 21H,AL

       IN AL,0A1H                       ;从片的中断屏蔽寄存器

       AND AL,0FBH                 ;开放IRQ10中断

       OUT 0A1H,AL

       MOV CX,10

       STI

WAIT:    JMP WAIT

INT10:    MOV AX, DATA            ;中断服务程序

        MOV DS, AX

        MOV DX, OFFSET MESS

        MOV AH, 09                           ;在屏幕上显示每次中断的提示信息

        INT 21H

        MOV AL, 20H                   ; 发出EOI结束中断到PC内主片的地址20H

        OUT 20H, AL         

        LOOP NEXT

        IN AL, 21H                      ;读中断屏蔽寄存器,获取中断屏蔽字

        OR AL, 08H                     ;关闭IRQ3中断

        OUT 21H, AL                    ;将中断屏蔽字送到中断屏蔽寄存器

        STI                             ;置中断标志位

        MOV AH, 4CH                   ;返回DOS

        INT 21H

NEXT:   IRET                       ;中断返回

CODE ENDS

       END START

调用程序代码,观察实验现象,屏幕显示截图如下:

    2.实验1-2:PC机内中断嵌套实验

实验要求:

(1)按接线图连好接线,调用程序源代码8259-2.asm,做如下操作,观察屏幕显示结果并分析产生该现象的原因:

A. 按下连接IRQ的单次脉冲按键,屏幕上会显示10个3,在屏幕上10次显示未结束之前,按下连接IRQ10的单次脉冲按键,观察现象;

按下IRQ时屏幕上会显示10个3,此时按下IRQ10,会直接在屏幕上显示10个10,然后结束后再显示剩余的3B. 按下连接IRQ10的单次脉冲按键,屏幕上会显示10个10,在屏幕上10次显示未结束之前,按下连接IRQ3的单次脉冲按键,观察现象。

在屏幕上显示10个10的过程中按下IRQ无反应,等到10个10全部显示完毕后才再显示10个3

出现这种现象的原因是IRQ10的中断优先级高于IRQ3

屏幕截图:

(2)程序所有代码及注释:

DATA SEGMENT

DATA ENDS

CODE SEGMENT

       ASSUME CS:CODE ,DS:DATA

START: 

.386

       CLI

       MOV AX,CS

       MOV DS,AX

               

       MOV DX,OFFSET INT10     ;采用间接修改法,设置中断向量

       MOV AX,2572H                ;设置IRQ10对应的中断向量

       INT 21H

               

       MOV DX,OFFSET INT3      ;采用间接修改法,设置中断向量

       MOV AX,250BH               ;设置IRQ3对应的中断向量

       INT 21H

       IN AL,21H                    ;读中断屏蔽寄存器,21H是该寄存器的端口号

       AND AL,0F3H              ;开放中断,允许从片和IRQ3

       OUT 21H,AL

       IN AL,0A1H               ;读中断屏蔽寄存器,0A1H是该寄存器的端口

       AND AL,0FBH             ;开放中断IRQ10

       OUT 0A1H,AL

       MOV CX,10                  ;记中断循环次数为10次

       STI

WAIT:  JMP WAIT

INT10: CLI                          ;中断服务程序

       PUSHAD   

       PUSHFD   

       MOV CX,10                   ;记中断循环次数为10次

NEXT10_1:

       MOV DX,31H    

       MOV AH,02H               ;输出DL

       INT 21H

       MOV DX,30H   

       MOV AH,02H                ;输出DL

       INT 21H

       MOV DX,20H                 ;发出EOI结束中断到PC内主片的地址20H

       MOV AH,02H                ;输出DL,3

       INT 21H

                             

       CALL DELAY1                 ;等待

       LOOP NEXT10_1

                             

       MOV DX,0DH   

       MOV AH,02H               ;输出DL,‘ ’

       INT 21H

       MOV DX,0AH              ;发出EOI结束中断到PC内从片占用的是0A0H端口

       MOV AH,02H               ;输出DL,发生中断后输出10

       INT 21H

       MOV AL,20H               ;将中断屏蔽字送到中断屏蔽寄存器

       OUT 0A0H,AL               ;从片

       OUT 20H,AL                 ;主片

       POPFD                       ;关中断,出栈,返回

       POPAD

       STI

       IRET

INT3:  CLI                          ;中断服务程序

       PUSHAD

       PUSHFD

       MOV CX,10                     ;记中断循环次数为10次

NEXT3_1:               

       MOV DX,33H   

       MOV AH,02H                 ;输出DL

       INT 21H

       MOV DX,20H                 ;发出EOI结束中断到PC内主片的地址20H

       MOV AH,02H                 ;输出DL,3

       INT 21H

       CALL DELAY1                   ;等待

       LOOP NEXT3_1

                           

       MOV DX,0DH   

       MOV AH,02H                 ;输出DL,‘ ’

       INT 21H

       MOV DX,0AH                   ;发出EOI结束中断到PC内从片占用的是0A0H端口

       MOV AH,02H                 ;发生中断输出DL,10

       INT 21H

       MOV AL,20H

       OUT 20H,AL                   ;将中断屏蔽字送到中断屏蔽寄存器

       OUT 0A0H,AL

       POPFD                         ;出栈,关中断,返回

       POPAD

       STI

       IRET

DELAY1  PROC                      ;控制等待部分

       PUSHAD

       PUSHFD

       MOV CX,0FH

DELAY_LOOP1:

       MOV BX,0FFFFH

DELAY_LOOP2:

       DEC BX

       NOP

       JNZ DELAY_LOOP2

       LOOP DELAY_LOOP1

       POPFD

       POPAD

       RET

DELAY1  ENDP

CODE ENDS

       END START

    3.实验1-3:扩展多中断应用实验

调用程序源码文件8259-3.asm,在程序源代码中划横线的位置,请按照所学8259工作原理填写并验证,然后将所填内容写在实验报告中,并分析所填数据的形成原理。

屏幕截图:

程序代码及与案例说明:

;*****************************************************************

;       8259中断查询方式应用实验

;请根据所学原理推断横线处需填写的源代码

;*****************************************************************

I8259_1   EQU   2B0H       ; 8259的ICW1端口地址

I8259_2   EQU   2B1H       ; 8259的ICW2端口地址

I8259_3   EQU   2B1H       ; 8259的ICW3端口地址,ICW3,ICW4,OCW1都写入奇地址中

I8259_4   EQU   2B1H       ; 8259的ICW4端口地址

O8259_1   EQU   2B1H       ; 8259的OCW1端口地址

O8259_2   EQU   2B0H       ; 8259的OCW2端口地址,OCW2,OCW3写入偶地址

O8259_3   EQU   2B0H       ; 8259的OCW3端口地址

DATA SEGMENT

         MES1   DB   'YOU CAN PLAY A KEY ON THE KEYBOARD!',0DH, 0AH, 24H

 MES2   DD    MES1

         MESS1 DB 'HELLO! THIS IS INTERRUPT    *  0  *!',0DH,0AH,'$'

 MESS2 DB 'HELLO! THIS IS INTERRUPT    *  1  *!',0DH,0AH,'$'

 MESS3 DB 'HELLO! THIS IS INTERRUPT    *  2  *!',0DH,0AH,'$'

 MESS4 DB 'HELLO! THIS IS INTERRUPT    *  3  *!',0DH,0AH,'$'

 MESS5 DB 'HELLO! THIS IS INTERRUPT    *  4  *!',0DH,0AH,'$'

 MESS6 DB 'HELLO! THIS IS INTERRUPT    *  5  *!',0DH,0AH,'$'

 MESS7 DB 'HELLO! THIS IS INTERRUPT    *  6  *!',0DH,0AH,'$'

 MESS8 DB 'HELLO! THIS IS INTERRUPT    *  7  *!',0DH,0AH,'$'

DATA ENDS

STACKS SEGMENT

                 DB 100 DUP(?)

STACKS ENDS

STACK1 SEGMENT STACK

        DW 256 DUP(?)

STACK1 ENDS

CODE SEGMENT

        ASSUME CS:CODE, DS:DATA, SS:STACKS, ES:DATA

.386

START:  MOV AX,DATA

         MOV DS, AX

         MOV ES, AX

         MOV AX, STACKS

         MOV SS, AX

         MOV DX, I8259_1         ;初始化8259的ICW1

         MOV AL, 13H            ;边沿触发、单片8259、需要ICW4,查表得到控制字

         OUT DX,AL

         MOV DX,I8259_2         ;初始化8259的ICW2

         MOV AL,0B0H           

         OUT DX,AL

         MOV AL,03H

         OUT DX,AL

         MOV DX, O8259_1         ;初始化8259的中断屏蔽操作命令字

         MOV AL, 000H             ;打开屏蔽位,将全部屏蔽位打开

         OUT DX,AL

     

QUERY:  MOV AH,1               ;判断是否有按键按下

         INT 16H

         JNZ QUIT               ;有按键则退出

         MOV DX,O8259_3         ;向8259发送查询命令

         MOV AL,6CH             ;01101100

         OUT DX,AL

         IN AL,DX               ;读出查询字

         TEST AL,80H            ;判断中断是否已响应,响应后对应位置0

         JZ QUERY               ;没有响应则继续查询

         AND AL,07H

         CMP AL,00H

         JE IR0ISR              ;若为IR0请求,跳到IR0处理程序

         CMP AL,01H

         JE IR1ISR              ;若为IR1请求,跳到IR1处理程序

         CMP AL,02H

         JE IR2ISR              ;若为IR2请求,跳到IR2处理程序

         CMP AL,03H

         JE IR3ISR              ;若为IR3请求,跳到IR3处理程序

         CMP AL,04H

         JE IR4ISR              ;若为IR4请求,跳到IR4处理程序

         CMP AL,05H

         JE IR5ISR              ;若为IR5请求,跳到IR5处理程序

         CMP AL,06H

         JE IR6ISR              ;若为IR6请求,跳到IR6处理程序

         CMP AL,07H

         JE IR7ISR              ;若为IR7请求,跳到IR7处理程序

         JMP QUERY

IR0ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS1     ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR1ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS2     ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR2ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS3     ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR3ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS4     ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR4ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS5     ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR5ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS6    ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR6ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS7     ;显示提示信息

         MOV AH,09

         INT 21H

         JMP EOI

IR7ISR:  MOV AX,DATA

         MOV DS,AX

         MOV DX,OFFSET MESS8     ;显示提示信息

         MOV AH,09

         INT 21H

EOI: 

         MOV DX,O8259_2          ;向8259发送中断结束命令

         MOV AL, 20H              ;00100000

         OUT DX, AL

         JMP QUERY

QUIT:    MOV AX,4C00H            ;结束程序退出

         INT 21H

CODE ENDS

     END START

实验二 8254定时/计数器应用实验

一、实验目的

    1. 掌握 8254 的工作方式及应用编程。

    2. 掌握 8254 典型应用电路的接法。

二、实验内容

    1.计数应用实验。应用8254的计数功能,用开关模拟计数,使每当按照计数初值的次数按动单次脉冲后,观察LED的变化。

2. 自设计实验。参考实验一的程序, 编写程序,以1MHz为时钟源,应用8254的定时功能,将其分频为1Hz。以LED灯作为输出显示。

三、实验步骤

1.实验2-1:计数器应用实验

程序代码填补:

IO8254_MODE      EQU   283H     ;8254控制寄存器端口地址

IO8254_COUNT0     EQU   280H     ;8254计数器0端口地址

                           

STACK1 SEGMENT STACK

        DW 256 DUP(?)

STACK1 ENDS

CODE SEGMENT

        ASSUME CS:CODE

START: MOV DX, IO8254_MODE       ;初始化8254工作方式

       MOV AL,16H                ;计数器0,方式3,填入控制字:00010110

       OUT DX, AL

               

       MOV DX, IO8254_COUNT0         ;装入计数初值

       MOV AL,04H                 ;初值为4,04H

       OUT DX,AL

       MOV AX,4C00H               ;返回到DOS

       INT 21H

      

CODE ENDS

     END START

此时按两次后灯亮,再按两次后灯灭。

如果令计数器0工作在方式0,其实验现象为:按五次后灯变亮,之后不在熄灭。

    2.实验2-2:自设计实验

实验要求:

参考实验一的程序和接线,自行设计接线图以及程序代码,实现,以1MHz为时钟源,应用8254的定时功能,将其分频为1Hz。以LED灯作为输出显示。

使用计数器0和计数器1两个计数器,设置其均工作于方式3,计数初值为1000,通过两个计数器级联,1000*1000=10^6达到分频的目的。

程序代码如下:

IO8254_MODE     EQU   283H     ;8254控制寄存器端口地址

IO8254_COUNT0   EQU   280H     ;8254计数器0端口地址

IO8254_COUNT1   EQU   281H     ;8254计数器1端口地址

 

STACK1 SEGMENT STACK

        DW 256 DUP(?)

STACK1 ENDS

CODE SEGMENT

        ASSUME CS:CODE

START:  MOV DX, IO8254_MODE       ;初始化8254工作方式

        MOV AL,37H          ;计数器0,方式3   00110111 

        MOV DX,IO8254_COUNT0        ;装入计数初值

            MOV AX,03E8H    ;1000D=0000 0011 1110 1000B=03E8H

            MOV AL,03H

            OUT DX,AL

                MOV AL,AH

                OUT DX,AL

                MOV DX, IO8254_MODE       ;初始化8254工作方式

                MOV AL,76H          ;计数器1, 方式3   01110110

            OUT DX, AL        

                MOV DX,IO8254_COUNT1        ;装入计数初值

        MOV AX,03E8H        ;1000D=0000 0011 1110 1000B=03E8H

                MOV AL,03H

            OUT DX,AL

                MOV AL,AH

            OUT DX,AL

                MOV AX,4C00H               ;返回到DOS

            INT 21H

CODE ENDS

     END START

接线图如下:

实验三 8255并口控制器应用实验

一、实验目的

    1. 掌握 8255 的工作方式及应用编程。

2. 掌握 8255 典型应用电路的接法。

二、实验内容

    1. 基本输入输出实验。编写程序,自行设定A、B、C三个口中某一个口为输入,某一个为输出,完成拨动开关到数据灯的数据传输。要求只要开关拨动,数据灯的显示就改变。 

2. 自设计实验。自行设计能实现A口工作在方式一输入,B口工作在方式一输出的电路并完成程序的编制和在实验箱上的验证,要求,利用控制信号控制数据的输入。

三、实验步骤

1.实验3-1:可编程并行接口8255方式0应用实验

编写程序,自行设定A、B、C三个口中某一个口为输入,某一个为输出,完成拨动开关到数据灯的数据传输。要求只要开关拨动,数据灯的显示就改变。根据原理补全代码中缺失的部分,根据自己的设计,补全接线图,并将代码和对应的接线图写在实验报告中。

说明:运行源程序8255.asm,按接线图接线,实现并行数据传输功能。

设定B口为输入,接到开关上,A口为输出接到LED灯上。

程序源代码:

IO8255_MODE    EQU   28BH

IO8255_A       EQU   288H

IO8255_B       EQU   289H

IO8255_C       EQU   28AH

CODE SEGMENT

       ASSUME CS: CODE

START:  MOV DX, IO8255_MODE              ;8255初始化

         MOV AL, 90H                 ;B口输入,A口输出 10010000

         OUT DX, AL

INOUT:  MOV DX, IO8255_B         ;读入数据

       IN AL,DX

       MOV DX,IO8255_A         ;输出数据

      OUT DX,AL        

       MOV DL,0FFH            ;判断是否有按键

       MOV AH, 06H

       INT 21H

       JZ INOUT                    ;若无,则继续

       MOV AH,4CH             ;否则返回

       INT 21H

CODE ENDS

       END START

接线图如下:

2.实验3-2:自设计试验

自行设计完成本实验,要求,8255A口工作在方式一输入,B口工作在方式一输出,利用方式一的控制信号,使数据从输入到输出人为可控。在实验报告中画出接线图,并说明设计的原理,给出对应的程序代码。

实现方案:方式一的控制信号即为PC2和PC4,将PC2和PC4分别接到高低电平,控制A输入,观察B输出的改变。

程序源代码:

IO8255_MODE    EQU   28BH

IO8255_A       EQU   288H

IO8255_B       EQU   289H

IO8255_C       EQU   28AH

CODE SEGMENT

       ASSUME CS: CODE

START:  MOV DX, IO8255_MODE              ;8255初始化

         MOV AL, 0B4H               ;A口方式一输入,B口方式一输出,10110100

         OUT DX, AL

INOUT:  MOV DX, IO8255_A         ;读入数据

       IN AL,DX

       MOV DX,IO8255_B         ;输出数据

      OUT DX,AL     

       MOV DL,0FFH            ;判断是否有按键

       MOV AH, 06H

       INT 21H

       JZ INOUT                    ;若无,则继续

       MOV AH,4CH             ;否则返回

       INT 21H

CODE ENDS

       END START

实验结果:只有PC4和PC2均为低电平时,改变A的输入,B才会有变化。

实验四 8251串口控制器应用实验

一、实验目的

    (1)掌握8251的工作方式及应用。

    (2)学习PC机串口的操作方法。

二、实验内容

与PC串口通讯应用实验。编写程序完成PC机串口与实验装置串口的通讯,由PC机串口1发数,实验装置串口接收。

三、实验步骤

从键盘输入一个字符,将其ASCII码加 1 后发送出去,再接收回来在屏幕上显示,实现自发自收。

说明:

1)运行源程序8251.asm,按接线图接线,实现串行数据传输功能。

2)图示电路8251的控制口地址为2B9H,数据口地址为2B8H。

3)8254计数器的计数初值=时钟频率/(波特率×波特率因子),这里的时钟频率接1MHz,波特率若选1200,波特率因子若选16,则计数器初值为52。

4)收发采用查询方式。

屏幕显示结果截图:

实验六键盘扫描及显示实验(综合)

一、实验目的

    1. 学习按键扫描的原理及电路接法。

    2. 掌握利用8255完成按键扫描及显示。

二、实验内容

1.连接8255与键盘扫描单元,验证按键扫描功能,使得从4X4键盘上按下的键能够在数码管上一一对应显示。

三、实验步骤

验证程序,使得在小键盘上每按一个健,4位数码管上显示出相应字符,它

们的对应关系如下:

小键盘—显示 

0  —  0   C  —  C   1  —  1   D  — D    2  —  2   E  —  E   3  —  3

F  —  F   4  —  4   5  —  5   6  —  6   7  —  7    8  —  8    9  —  9

A  — A      B

说明:打开源程序keyscreen.asm,按接线图接线,运行源程序,实现键盘显示功能。

输入:A695FBB7DC8

截图如下:

当输入E时运行结束,截图如下:

相关推荐