一、实验目的
1、掌握Proteus软件绘制原理图的方法和仿真过程。
2、掌握74LS273带清零的八位D型触发器地址译码器芯片和74LS154四-16线数据选择/多路复用器芯片的使用方法
3、掌握Proteus软件的MASM32编译器编写汇编程序和代码的调试。
4、掌握8086芯片的使用和汇编语言的编写。
二、实验内容和实验原理图
实验1:基于8086的外围电路的情况下,通过地址译码,在74LS273地址译码器芯片中,依次输出每一位灯的状态,在下面的16个灯中,实现流水灯的效果。
在8086芯片中编写汇编语言,注意将芯片开始的起始地址设置为10000H,此时代码才可以正常运行。
实验1原理图:
实验2:在基于实验1的基础上,使用8255A可编程接口芯片PA口作输入口,检测8个按键状态,PB口作输出口,显示按键状态。当按键按下时,有对应的灯泡状态输出,显示按键的情况。在8086芯片中编写汇编语言,注意将芯片开始的起始地址设置为10000H,此时代码才可以正常运行。
实验2原理图:
实验3:使用8255A可编程接口芯片的PA口作8位共阴极LED数码管的段码输出端口,PB口用作8位LED数码管的位控码输出端口,PC0用作独立式按键的输入检测端口。8位LED初始显示为76543210,每按下一次按键,LED数码管的数字向左循环移动一位。在8086芯片中编写汇编语言,注意将芯片开始的起始地址设置为10000H,此时代码才可以正常运行。
实验3原理图:
注意:实验2和实验3都是以实验1外围电路输出来控制后续的模块显示。
三、实验步骤:
1、对于实验1,需要首先布置8086芯片、74LS273、74LS154、74LS27,灯泡等等大型元器件。
2、按照实验讲义的原理图的连接,将各个元器件的引脚进行连接,注意不要连接错误。
3、之后,连接总线,将各个连接线进行网络标号,从总线中分出子线,进而完成整体的连接。
4、对于实验2,首先需要布置8255A芯片,注意要和8086在同一个工程文件里面。进而,连接总线,开关,灯泡,进行网络标号,完成设置即可。
5、对于实验3,首先需要布置8255A芯片,注意要和8086在同一个工程文件里面。之后,布置8段的共阴极数码管,进行网络标号,加上开关,便可以完成原理图的设计。
6、此后,进行代码的编写,分别针对实验1、2、3进行代码的设计,针对流水灯,按键利用灯泡来显示按键的状态,数码管移位的操作。
7、实验代码的仿真,进行具体的程序测试,完成实验的内容。
四、实验代码:
实验1流水灯代码:
.MODEL SMALL
.8086
.STACK
.CODE
.STARTUP
START: ;此处输入代码段代码
MOV DX,0200H ; 74LS273芯片的地址
MOV AX,0FFFFH ;高电平,此时16个LED全灭。
OUT DX,AX
MOV AX,0FFFEH ;首先控制11111110,后续进行0的左移
LOOP1:
ROL AX,1H ;AX里的数进行循环左移
OUT DX,AX ; 将AX的值输出到DX
LOOP $ ;延时
LOOP $
JMP LOOP1 ;无限循环
MOV AH,4CH
INT 21H
END
实验2按键状态利用灯显示 代码:
.MODEL SMALL
.8086
.STACK
.CODE
.STARTUP
START:
MOV DX,206H ;控制字寄存器端口
MOV AL,10011001B ;方式控制字1、A方式0基本输入和输出00、A输入1、
;PC7~4为输入1、B方式0基本输入和输出0、B输出0、PC3~0为输入1
OUT DX,AL ;初始化端口,设置输入和输出口
NEXT:
MOV DX, 200H ;A口读取
IN AL, DX ;读A口操作
MOV DX, 202H ; B口输出
OUT DX, AL ;写B口操作
JMP NEXT ;跳转,持续进行
MOV AX, 4CH
INT 21H
END
实验3数码管按键移位代码:
DATAS SEGMENT
BUF DB 007H,07DH,06DH,066H,04FH,05BH,006H,03FH
DATAS ENDS
.MODEL SMALL
.8086
.STACK
.CODE
.STARTUP
START:
MOV DX, 206H ;写入方式控制寄存器
MOV AL,089H ;设置工作方式,AB输出,C输入
OUT DX,AL
xunhuan0:
MOV CX,008H ;总共8个数字
MOV AH,07FH ;位选0111 1111
LEA BX,BUF ;指针指向数据表首址
xunhuan1:
MOV DX,202H ;指向端口B
MOV AL,AH ;第一个数字位控
OUT DX,AL
MOV DX,200H ;指向端口A
MOV AL,[BX] ;第一位数字段码
OUT DX,AL
MOV DX,CX ;延时
MOV CX,000FFH
LOOP $
MOV CX,DX
INC BX ;指针指向下一位
ROR AH,1 ;移位下一个数字位控
LOOP xunhuan1 ;循环显示,人眼看到八个数字
MOV DX,204H ;指向端口C
IN AL,DX ;读取按键状态
CMP AL,0FEH ;判断按键是否按下
JZ xunhuan2 ;按下就跳转
JMP xunhuan0 ;没按下则继续显示当前数字
xunhuan2:
MOV DX,204H ;按键消抖
IN AL,DX ;读入按键
CMP AL,0FEH ;判断按键是否释放
JZ xunhuan2 ;未释放就一直跳转
LEA BX,BUF ;指针指向数据表首地址
MOV CX,007H ;设置移位循环次数
MOV AL,[BX] ;保存初始地址
xunhuan3: MOV AH,[BX+1];取出下一位数字的值
MOV [BX],AH ;段码送出
INC BX ;地址+1
LOOP xunhuan3;
MOV [BX],AL ;一轮之后恢复初始
JMP xunhuan0 ;回到循环1再次检测按键
MOV AX,4CH ;结束
INT 21H
END
ENDLESS:
JMP ENDLESS
CODE ENDS
END START
五、实验结果:
根据端口地址译码电路,各I/O端口地址情况:
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 十六进制地址
IO0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000H
IO1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0200H
IO2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0400H
IO3 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0600H
IO4 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0800H
IO5 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0A00H
IO6 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0C00H
IO7 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0E00H
IO8 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1000H
IO9 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1200H
IO10 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1400H
IO11 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1600H
IO12 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1800H
IO13 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1A00H
IO14 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1C00H
IO15 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1E00H
实验1流水灯现象:
在程序启动之后,16个灯泡将会从上到下依次进行循环流动,进行闪亮。当执行完成一轮16个灯的循环之后,将会从最开始,重新进行循环点亮。
实验2按键状态灯的显示现象:
由于我在实验的过程中,芯片端口初始输出为高电平,灯采用共阴极接法,因此灯会首先全部亮起。之后,在对应的按键按下时,灯泡会熄灭,再按一下,灯会亮起,其他的七个灯现象相同。
实验3数码管移位的现象:
在初始程序运行时,可以看到,在数码管上面显示数字76543210,当按下按键之后,数码管上面的数字排列会变成65432107,数字整体向左边移位,数字7移位到最右边。此后,多次按下按键,数字按照同样逻辑变成43210765,10765432,最后变为76543210,再次开始新的一轮循环。