【汇编与接口技术】Proteus仿真实验 您所在的位置:网站首页 汽车尾灯控制电路设计实验报告的引言怎么写 【汇编与接口技术】Proteus仿真实验

【汇编与接口技术】Proteus仿真实验

2023-06-06 14:31| 来源: 网络整理| 查看: 265

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

1实验目的 学习使用Proteus仿真接口实验;掌握CPU、接口芯片和外设的连接;掌握汇编语言的编写和调试方法。 2实验内容 PA口接8个拨动开关K1-K8,PB口接8个LED。初始由开关K1-K8设定8位不同的值,当执行程序后LED按K1-K8初始设定的值点亮,并向右流动。8255工作在0方式。手动产生单脉冲作为中断请求信号连接到MIRQ3上和SIRT10上。每按一次开关产生一次中断,使LED交替点亮和熄灭。8255的PC6作为中断源连接到MIRQ3上,每向8259A发出中断请求,使LED指示等交替点亮和熄灭。中断5次后程序退出。 3实验过程及结果 3.1 8255实验 选择元器件 CPU:8086 接口芯片:8255A 译码电路:74LS138 用于选择接口芯片端口 由于proteus中有AD0–AD15部分总线是地址/数据分时复用的,因此需要使用74LS373地址锁存,74LS138作数据驱动,进行地址/数据线的分割。 另外还需要LED灯(LED-YELLOW)、开关(SWITCH)、电阻(RES)连线 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灯改变状态。

连线 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。在书写中断服务程序时,需要注意关闭中断的方式。 调试修改 代码通常需要经过很多次调试才能不出错。实验结果 观察输出信息和LED状态,发现达到了预期效果。 在这里插入图片描述 在这里插入图片描述 3.3 8255控制8259

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

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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有