【微机原理】8086处理机的设计与仿真(Proteus-汇编语言)

本文详细描述了一项关于8086微处理器及其相关外设(8259A,8253,8255A)的实验,涉及汇编语言编程,如中断服务程序编写,以及如何利用8253进行定时和计数。实验中还使用了Proteus工具设计电路并实现功能,如秒表计时和数码管显示。
摘要由CSDN通过智能技术生成

一、实验目的

  1. 掌握8086最小工作模式
  2. 掌握可编程中断控制器8259A工作方式及应用编程
  3. 掌握可编程定时/计数器8253/8254工作方式及应用编程
  4. 掌握可编程并行接口8255A控制字和工作方式
  5. 熟悉汇编语言,能够编写中断服务程序
  6. 能够构建8086模型机

二、实验环境

  • Proteus

三、实验内容

编写汇编程序,完成以下功能:

  1. 8253通道0输入2KHz时钟信号,经过分频产生1Hz的时钟信号
  2. 产生的1Hz的时钟信号,作为8259的中断源控制产生中断信号
  3. 中断发生后,十进制显示的2位数码管作为00~99秒表加一
  4. 在程序开始,从8255的A口读入二进制学号最低两位作为秒表初值

使用 Proteus 工具完成电路图的设计,编写相应的汇编语言程序,完成从 A 口读入两位的二进制数,以十进制显示到与 B 口连接的 2 位数码管上,该 2 位数码管为一个 00  99 秒表,即把读入的学号作为秒表的初值,然后开始跳秒。

四、实验步骤及实验分析

整体结构分析:

首先硬件上对整体电路进行搭建。把8086连接使其工作在最小模式下,把其数据线和地址线进行分离。

其次根据实验指导书给的端口,进行译码电路设计。然后进行825382538255的设计。

8253编程的时候,要把A口设成输入,B口位输出进行数码管的显示。此外,因为初始要显示学号后两位,需要增加PROTA口的输入电路。

8253设计,使用计数器0进行分频。2KHz分成1Hz2000<65535,所以计数器0可以完成任务。

8259使用边沿触发,每当信号来,触发中断服务函数进行工作。

1. 首先对8086设置位最小工作模式:

READY和MN/MX接高电平。

2. 使用74LS373和74LS245把8086复用的地址线和数据线进行分离:

3. 进行端口译码:

A7

A6

A5

A4

A3

A2

A1

A0

8259

0

0

1

0

0

0

X

0

8253

0

1

0

0

0

X

X

0

8255

0

1

1

0

0

X

X

0

由表可知,三个设备A6、A5不同,所以在译码的时候,应在地址选择段即A、B、C三个端口的一个,A7、A4、A3、A0应为低电平使能。

如图所示,A7为0,接E3低电平使能,A3、A0接或非门,当都为低电平的时候,E1为高电平。

当A4=0,A6=0,A5=1的时候,即是接8259,在138译码器上是,Y1

当A4=0,A6=1,A5=0的时候,即是接8253,在138译码器上是,Y2

当A4=0,A6=1,A5=1的时候,即是接8255,在138译码器上是,Y3

4. 8259连接

D[0..7]数据端口;

8259接CS使能信号,由138译码器发出使能信号;

WR、RD、INT、INTA连接8086处理器端口;

A0进行地址选择;

SP/EN接正电源;

自由选定数字2,模8的结果为2,所以中断源接IR2,OUT0是8253A分频后的信号;

5. 8253A连接:

D[0..7]数据端口;

RD、WR接8086端口;

A1、A2为地址端口,进行端口选择;

CS_8253片选使能信号由138译码器给出;

使用通道0,CLK0接2KHz的时钟信号

GATE0进行门控输入;

OUT0作为中断源输出,连接到8259;

6. 8255可编程并行接口连接

D[0..7]数据端口;

RD、WR连接到8086处理器响应的端口

A1、A2地址端口选择信号

CS_255由138译码器给出片选信号

PA、PB、PC通道进行总线连接

7.两位数字输入

输入数字为42,换成2进制为0010_1010B,即图中:

PA7==0,PA6==0,PA5==1,PA4==0,PA3==1,PA2==0,PA1==1,PA0==0;

是系统开始的从A口读入的数据。

8. BCD数码管显示输出

由B口控制数码管显示输出。如图所示,是系统初始化后显示的数字。

汇编代码设计分析

8255端口定义,由表可知,8255A口,60H,B口62H,C口64H,控制口66H

因为连接8259A0端口的是地址线是A1,所以:

    8259的ICW1地址定义是A0==0,所以ICW0==20H, 8259的ICW2地址定义是A0==1,所以ICW0==22H

    8259的ICW3地址定义是A0==1,所以ICW3==22H,8259的ICW4地址定义是A0==0,所以ICW0==22H

8259的OCW1地址定义是A0==1,所以ICW0==22H,8259的OCW1地址定义是A0==0,所以ICW0==20H

8259的OCW1地址定义是A0==0,所以ICW0==20H.

由表可知,计数器0是40H,计数器1是42H,计数器2是44H,控制口是46H.

CNT定义作为暂存计数变量,可以确保秒表可以从00~99;

DIS是最后显示BCD数码管显示输出,从00H到99H,由AL为偏移量,在DIS中进行查表获得显示输出的数据。

82554 A口把电平值输入进去,选择方式0,即D6,D5==0,0;

A口方向为输入,D4==1;

C口高四位不用,可以设为输出,D3==0;

B口为无条件输出,选择方式0,D2==0;

B口方向是输出,D1==0;

C口低四位不用,可设为输出,D0==0;

所以8255控制字为 1001_0000B

初始化命令字1(ICW1)

初始化命令字2(ICW2)

初始化命令字4(ICW4)

操作命令字1(OCW1)

ICW1控制字:16位机无效000,特征位1,边沿触发0,地址间距位8所以为0,单片使用,1,需要设置结束中断的方式,所以需要设置ICW4,所以,ICW1==00010011B;

ICW2控制字:由表,端口号08H~0FH,所以设置为ICW2==08H;

ICW4控制字:000,完全嵌套,不用特殊嵌套为0,不用缓冲为00,手动结束,不是自动结束中断为0,8086模式,为1,所以ICW4==00000001B;

OCW1控制字:屏蔽其他中断,只保留IR2所以OCW2==11111011B

接下来把中断向量表进行赋值。

中断向量表在0000H,把他赋值给欸ES,因为中断向量是08H~0FH,代表IR0~IR7,因为使用的是,IR2,所以向量号为0AH,因为一个向量占4个字节,所以地址是0AH*4,COUNT是中断服务函数,把中断服务函数的地址告诉中断向量。

进行计时器的初始化。

选择计数器0,00,先读低电平11。选择工作方式3,11,方波发生器。二进制选择0.所以控制字为00110110B

因为输入2KHz,输出1Hz,分频2000<65535,所以不用级联。直接赋值可以进行分频。示波器图象如图所示。

程序开始进行初始化显示数字。

从PORTA端口读入数据,把数据存到CNT中,用于后面读秒增加。然后从DIS中读取显示数据,把数据送到BCD数码管。

如图为初始化显示。

中断服务程序:

当时钟边沿型号来临,读取暂存的CNT的值,判断是否超过99,如果超过,就设置为0,没有超过,就进行加一。然后,把加一或置0的数字传给CNT,从DIS中读取AL的偏移量,进行输出。

因为不是自动结束中断,需要手动结束中断,所以要进行结束中断的操作。

操作命令字2(OCW2)

因为未指定EOI,所以001;00特征位;只有一个中断,无中断优先级。所以000.

所以OCW2==00100000B

运行情况

完整工程图

全部代码

DATA SEGMENT
  
   ORG 0100H
   
   ;define 8255 port
   PORTA EQU 60H
   PORTB EQU 62H
   PORTC EQU 64H
   CTRL_8255 EQU  66H
   
   ;define 8259 port
   ICW1 EQU 20H
   ICW2 EQU 22H
   ICW3 EQU 22H
   ICW4 EQU 22H
   OCW1 EQU 22H
   OCW2 EQU 20H
   OCW3 EQU 20H
   
   ;define 8253 port
   COUNT0 EQU 40H
   COUNT1 EQU 42H
   COUNT2 EQU 44H
   CTRL_8253 EQU 46H
   
   ;Count value temporary storage
   CNT DB 00H
   
   ;7SEG-BCD display out
   DIS   DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
	 DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H,30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
	 DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H,50H,51H,52H,53H,54H,55H,56H,57H,58H,59H
	 DB 60H,61H,62H,63H,64H,65H,66H,67H,68H,69H,70H,71H,72H,73H,74H,75H,76H,77H,78H,79H
	 DB 80H,81H,82H,83H,84H,85H,86H,87H,88H,89H,90H,91H,92H,93H,94H,95H,96H,97H,98H,99H	 
	  
DATA ENDS

EXTRA SEGMENT
EXTRA ENDS

CODE   SEGMENT 
MAIN PROC FAR
        ASSUME CS:CODE,DS:DATA,ES:EXTRA
START:
        MOV AX,DATA
	MOV DS,AX
	
	MOV AX,EXTRA
	MOV ES,AX
	
	;8255 INITIAL
	MOV DX,CTRL_8255
	MOV AL,10010000B
	OUT DX,AL
		
	;8259 INITIAL
	CLI
	MOV AL,00010011B ;ICW1
	MOV DX,ICW1
	OUT DX,AL
	
	MOV AL,08H;ICW2   Interrupt number 08H
	MOV DX,ICW2
	OUT DX,AL
	
	MOV AL,00000001B ;ICW4
	MOV DX,ICW4
	OUT DX,AL
	
	MOV AL,11111011B ;OCW1
	MOV DX,OCW1
	OUT DX,AL
	
	;INTERRUPT DIS
	MOV AX,0000H           ;IR2
	MOV ES,AX
	
	MOV BX,0AH*4
	MOV AX,OFFSET COUNT
	MOV ES:[BX],AX	
	
	MOV AX,CS
	MOV ES:[BX+2],AX
	
		
	;8255 COUNT0
	MOV DX,CTRL_8253
	MOV AL,00110110B
	OUT DX,AL
	MOV DX,COUNT0
	MOV AX,2000
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL	
	
	STI
	
	;Initialize display
	MOV DX,PORTA
	IN AL,DX
	MOV CNT,AL	 
	MOV BX,OFFSET DIS
        XLAT 
	MOV DX,PORTB
	OUT DX,AL
	
	
L1:
   JMP L1
	
	
	
	RET
MAIN ENDP


COUNT PROC
   CLI
   MOV AL,CNT
   CMP AL,63H   ;63H==99
   JE SET0
   INC AL
   JMP LED
SET0:MOV AL,00H

LED:
   MOV CNT,AL
   MOV BX,OFFSET DIS
   XLAT
	
   MOV DX,PORTB
   OUT DX,AL
   
   MOV DX,OCW2       ;end interrupt
   MOV AL,00100000B
   OUT DX,AL
   STI


   IRET
COUNT ENDP
   
CODE    ENDS
        END MAIN

  • 24
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Proteus 8.6是一个综合性电路设计软件,可以用于模拟和验证电路设计,包括使用汇编语言进行仿真。下面是使用Proteus 8.6进行汇编语言仿真的步骤: 第一步,打开Proteus 8.6软件。然后单击“新建”按钮,选择“新建电路设计”。 第二步,从左侧的工具栏中选择“器件”选项卡,找到你要使用的微控制器。 第三步,将微控制器拖放到工作区。接着,从工具栏的“器件”选项卡中选择需要使用的器件,例如时钟、LED指示灯等,调整它们的位置和连接方式。 第四步,打开仿真面板。在仿真面板中选择“汇编语言编写器”,打开一个新的汇编文件。 第五步,输入汇编代码,然后单击“编译”按钮进行编译。编译成功后,双击代码窗口右侧的“指令”来确认汇编指令的大小和地址信息。 第六步,回到主面板,单击“仿真”选项卡,启动仿真。你将看到仿真器在主面板右下角运行。 第七步,为仿真程序设置断点。在主面板中,右键单击代码中的某一行,选择“插入断点”。然后,单击“运行”按钮开始仿真仿真将会在设置断点处停止,等待你手动单步执行代码。 第八步,检查仿真结果。在手动单步执行代码后,你将能够查看仿真的结果和逐步分析代码的运行过程。 以上是Proteus 8.6使用汇编语言进行仿真的步骤。通过这种方法,你可以快速验证和测试汇编程序,确保微控制器在实际电路中的正确运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值