【汇编与接口技术】Proteus仿真实验-8255&8259-实验报告

强烈推荐:感谢b站一位上传教学视频的老师

1实验目的

  1. 学习使用Proteus仿真接口实验;
  2. 掌握CPU、接口芯片和外设的连接;
  3. 掌握汇编语言的编写和调试方法。

2实验内容

  1. PA口接8个拨动开关K1-K8,PB口接8个LED。初始由开关K1-K8设定8位不同的值,当执行程序后LED按K1-K8初始设定的值点亮,并向右流动。8255工作在0方式。
  2. 手动产生单脉冲作为中断请求信号连接到MIRQ3上和SIRT10上。每按一次开关产生一次中断,使LED交替点亮和熄灭。
  3. 8255的PC6作为中断源连接到MIRQ3上,每向8259A发出中断请求,使LED指示等交替点亮和熄灭。中断5次后程序退出。

3实验过程及结果

3.1 8255实验

  1. 选择元器件
    CPU:8086
    接口芯片:8255A
    译码电路:74LS138 用于选择接口芯片端口
    由于proteus中有AD0–AD15部分总线是地址/数据分时复用的,因此需要使用74LS373地址锁存,74LS138作数据驱动,进行地址/数据线的分割。
    另外还需要LED灯(LED-YELLOW)、开关(SWITCH)、电阻(RES)
  2. 连线
    a) 8086相关连线
    8086总线标号;将两片74LS373和两片74LS245连接到总线;转换为16位地址线和16位数据线;使能端连线.

图 1 8086连线
图 2 8086连线
b)连接片选线和8255面向8086的连线

片选连线

c) 连接开关
8个开关连接到A口,同时连接电阻和电源。注意接线美观。

在这里插入图片描述
d) 连接LED灯
注意接线美观;
注意电阻值不宜太大。
在这里插入图片描述
e) 完成接线;电路图见附录。
3. 写源程序
右击 8086 芯片,点击EDIT SOURSE CODE,粘贴常规实验中完成的实验源代码。
在这里插入图片描述
流水灯连线
运行信息
4. 运行程序,发现达到预期效果。

3.2 8259 主片/从片控制中断

由于Proteus不具备dos中断功能,因此无法完成“在屏幕上显示字符”的任务。因此我将实验内容改为:由单脉冲控制中断,每中断一次,LED灯改变状态。

  1. 连线
    a) 连接CPU。连线方式与8255相同。
    b) 连接片选线,需要连接三片芯片。不能漏接。
    在这里插入图片描述
    在这里插入图片描述

端口地址分别为:PORTA -0F0H ;PORTB EQU 0F2H;PORTC EQU 0F4H;CTRL EQU 0F6H ;主片0E0H、0E2H;从片: 0E8H、0EAH
c) 连接8255,用于LED灯的显示。其中PA0,PA1由主片IRQ3控制,PB0,PB1由从片IRQ3控制
在这里插入图片描述
d)连接8259,分为主片和从片,主片IRQ3控制中断,IRQ2连接从片,从片的IRQ3也连接到一个脉冲信号产生装置button。

在这里插入图片描述
2. 编写源程序
最关键的地方在于,Proteus仿真需要编写中断初始化程序:

 ; 8259 初始化
        CLI
          
        ; icw1      边缘,多片使用
        MOV AL, 00010001B
        MOV DX,ICW1
        OUT DX,AL
    
        MOV AL, 00010001B   ;从片要定义多片?
        MOV DX,ICWF1
        OUT DX,AL
        
        ; ICW2  中断号
        MOV AL, 50H
        MOV DX,ICW2
        OUT DX,AL 
    
        MOV AL, 40H
        MOV DX,ICWF2
        OUT DX,AL
    
	    ;ICW3
	    MOV AL,00000100B
	    MOV DX,ICW3
	    OUT DX,AL
	    
	    MOV AL,00000010B
	    MOV DX,ICWF3
	    OUT DX,AL
    
        ; ICW4
        MOV AL, 00000001B
        MOV DX,ICW4
        OUT DX,AL
    
    	MOV AL, 00000101B
        MOV DX,ICWF4
        OUT DX,AL
        
        ; OCW1
    	MOV AL,11110011B 
        MOV DX,OCW1
        OUT DX,AL
    
        MOV AL,11110111B 
        MOV DX,OCWF1
        OUT DX,AL

这其实是实验中最关键的部分,特别注意从片的定义方法。 在定义中断向量表时,需要注意到第三位为IRQi。在书写中断服务程序时,需要注意关闭中断的方式。
  1. 调试修改
    代码通常需要经过很多次调试才能不出错。
  2. 实验结果
    观察输出信息和LED状态,发现达到了预期效果。
    在这里插入图片描述
    在这里插入图片描述

3.3 8255控制8259

这个实验应当在上个实验的基础上进行。通过8255的PC6输出高低电平控制中断,每中断一次LED灯变换一次。

  1. 连线
    8086、片选、LED接法不再赘述,只要将8259的IR3接到PC6即可。
    在这里插入图片描述
  2. 编码
    编码关键仍是初始化和一些细节。详细代码和注释见附录
  3. 运行结果
    可以观察到小灯闪烁5次。
    在这里插入图片描述
    在这里插入图片描述

实验中碰到的问题

  1. 如何装载程序?
    一开始采用的是先用dosbox编译生成.exe文件再装载到8086中,这种方法比较繁琐,我不知道编译了多少exe…;
    也可以直接载Proteus中编写程序,但是要安装编译器(系统-编译设置-安装)
  2. 如何连接CPU和8255完成片选?
    应用74LS138完成片选。经过多次实验发现,如果选择0FFH以上的端口,即便采用与非门也始终无法成功片选,不知何故。同时如果采用连续端口,流水灯不会流动,不知何故。
  3. 为什么“流水灯”胡乱点亮,一点都不流水?
    因为延时时间设置得比较短(200),所以视觉上流水灯没有按顺序点亮。一开始还以为程序写错了。
  4. 为什么会出现如下报错?在这里插入图片描述延时时间设置得太大。
  5. 为什么出现了这种报错?在这里插入图片描述可能是堆栈段定义错误,也可能是没能编译执行程序。
    在8259第一个实验中,碰到的主要问题有:
  6. 从片的ICW1如何设置?
    应设置为00010001B。表示边沿出发,多片使用,要写ICW4。
  7. 结束中断顺序对运行结果有影响吗?
    有影响。应该先结束主片再结束从片。
  8. 为什么8259的A0要连接A1地址线?
    否则就是无法片选成功。似乎和奇偶有关。
  9. 报错后如何排查错误?
    首先检查电路图,确保没有问题之后,大多数报错都是由于代码有问题。比如:[GENERAL] CAS[0…2] disabled [U11] 这个报错,看似是CAS没有连接正确,实则为从片初始化有问题。
    其次可以通过运行程序,观察运行信息的办法排错。Proteus运行信息界面忠实记录操作的内容和时间,可以排查程序错误出现在哪个部分。
    最后需要注意一些细节错误。比如,子程序要push 和pop用到的寄存器,屏蔽字的定义,数据段定义类型,函数结尾应当RET,正确定义延时函数等等。
    在8259-8255实验中,碰到的主要问题有:
  10. 中断正常,但是灯泡不亮。
    原因是没有进行第二次初始化!注意8255控制端口既要负责给出PC6信号,也要对PB控制,因此点亮灯泡前必须再次初始化。被这个问题困扰了几个小时。
    由此总结另一种排错技巧:可以将点亮LED的代码插入代码段的不同位置,如果运行程序成功点亮,那么点亮之前的代码基本正确。
  11. 为什么主程序最后必须写上一个无穷循环?
    无解,否则程序会出错

5 主要参考资料

  1. 《微型计算机接口技术及应用》 刘乐善
  2. 课程ppt
  3. https://www.bilibili.com/video/BV1fu411r7x1/?spm_id_from=333.788&vd_source=8f5b28d9992a394432507eea910b9456

6 源码和电路图

8255实验
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 ICW1  EQU 0E0H
    ICW2  EQU 0E2H
    ICW3  EQU 0E2H
    ICW4  EQU 0E2H
       
    OCW1  EQU 0E2H
    OCW2  EQU 0E0H
    OCW3  EQU 0E0H
       
    LED   DB  01011010B
    T     DW  0AH
DATAS ENDS

EXTRA SEGMENT        ;  ;附加段
  
EXTRA ENDS

STACK SEGMENT  PARA  STACK  'STACK'        ;堆栈段
    STAPN DB  800H DUP (00H)    ;定义100字节空间
    TOP   EQU LENGTH  STAPN
STACK ENDS
           
           
CODE SEGMENT
MAIN PROC   FAR                                         ;过程定义语句
    ;说明4个段寄存器分别与哪些段有关
          ASSUME CS:CODE, DS:DATAS,ES:EXTRA,SS:STACK

    START:MOV    AX,DATAS
          MOV    DS,AX
        
          MOV    AX, EXTRA
          MOV    ES,AX
        
          MOV    AX,STACK
          MOV    SS,AX
      
    ; 8255 初始化===========================================
          MOV    DX,CTRL
          MOV    AL,90H
          OUT    DX,AL
           
    ; 8259 初始化===========================================
          CLI
          
    ; icw1
          MOV    AL, 00010011B
          MOV    DX,ICW1
          OUT    DX,AL
        
    ; ICW2  中断号
          MOV    AL, 40H
          MOV    DX,ICW2
          OUT    DX,AL
        
    ; ICW4
          MOV    AL, 00000001B
          MOV    DX,ICW4
          OUT    DX,AL
        
    ; OCW1
          MOV    AL,11110111B
          MOV    DX,OCW1
          OUT    DX,AL
        
    ; 设置中断向量表========================================
    ; IR0
          MOV    AX,0000H
          MOV    ES,AX
        
          MOV    BX,43H*4
          MOV    AX,OFFSET IR0
          MOV    ES:[BX],AX
        
          MOV    AX,CS
          MOV    ES:[BX+2],AX
    ; 置PC6低位===============================================    
          MOV    DX,CTRL
          MOV    AL,00001100B
          OUT    DX,AL
          CALL   DELAY
    
          MOV    CX,T                   ;中断次数

    LLL:  STI
    
          MOV    DX,CTRL
          MOV    AL,00001101B           ;高电平,触发中断
          OUT    DX,AL
          CALL   DELAY
    ;此处应有中断
          MOV    DX,CTRL
          MOV    AL,00001100B
          OUT    DX,AL
          CALL   DELAY
    
          DEC    CX
          CMP    CX,0
          JNZ    LLL
    
    L1:       
          JMP    L1                                     ;咱也不知道为啥,反正不加就报错    
          RET
MAIN ENDP                                               ;MAIN过程结束

;延时子程序===================================
DELAY PROC
    
          PUSH   CX
    
          MOV    CX,5555H
    LP:   DEC    CX
          CMP    CX,0
          JNZ    LP
          POP    CX
    
          RET
DELAY ENDP       

;中断服务程序=================================================         
IR0 PROC
          CLI
          PUSH   DX
          PUSH   AX
     
    ;重要,,重新给命令字点亮灯泡
          MOV    DX,CTRL
          MOV    AL,90H
          OUT    DX,AL

          MOV    AL,LED
          NOT    AL
          MOV    LED,AL
          MOV    DX,PORTB
          OUT    DX,AL

          CALL   DELAY
     
    ; 写OCW2 结束中断
          MOV    DX,OCW2
          MOV    AL, 00100000B
          OUT    DX,AL
      
          POP    AX
          POP    DX    
          STI
          IRET
IR0 ENDP
CODE ENDS                                               ;代码段结束
    END   MAIN  ;整个源代码结束

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值