一、实验目的
- 掌握8086最小工作模式
- 掌握可编程中断控制器8259A工作方式及应用编程
- 掌握可编程定时/计数器8253/8254工作方式及应用编程
- 掌握可编程并行接口8255A控制字和工作方式
- 熟悉汇编语言,能够编写中断服务程序
- 能够构建8086模型机
二、实验环境
- Proteus
三、实验内容
编写汇编程序,完成以下功能:
- 8253通道0输入2KHz时钟信号,经过分频产生1Hz的时钟信号
- 产生的1Hz的时钟信号,作为8259的中断源控制产生中断信号
- 中断发生后,十进制显示的2位数码管作为00~99秒表加一
- 在程序开始,从8255的A口读入二进制学号最低两位作为秒表初值
使用 Proteus 工具完成电路图的设计,编写相应的汇编语言程序,完成从 A 口读入两位的二进制数,以十进制显示到与 B 口连接的 2 位数码管上,该 2 位数码管为一个 00 99 秒表,即把读入的学号作为秒表的初值,然后开始跳秒。
四、实验步骤及实验分析
整体结构分析:
首先硬件上对整体电路进行搭建。把8086连接使其工作在最小模式下,把其数据线和地址线进行分离。
其次根据实验指导书给的端口,进行译码电路设计。然后进行8253、8253、8255的设计。
8253编程的时候,要把A口设成输入,B口位输出进行数码管的显示。此外,因为初始要显示学号后两位,需要增加PROTA口的输入电路。
8253设计,使用计数器0进行分频。2KHz分成1Hz,2000<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