【基于8255的开关状态显示电路】—— 微机原理实验

一、实验要求

  1. 二极管控制:设定8255的PA口为开关量输入,PC口为开关量输出,要求能随时将PA口的开关状态通过PC口的发光二极管显示出来。
  2. 电子秒表实现:用8255A实现一电子秒表,计时范围0-99.99秒,应具有“START”,“STOP”,“CLEAR”三个按键,分别完成开始,停止,清零功能。

二、实验目的

  • 学习使用8255各个口的不同工作方式。

三、实验电路

实验1

(1)原理分析:
8255芯片引脚图:
在这里插入图片描述
CPU对8255的读/写操作是通过CS,A1和A0三个引脚的状态来识别的,通过WR和RD信号控制的。

8255的寻址:
在这里插入图片描述
8255有三种基本工作方式,A组可采用方式0到方式2,而B组只能采用方式0和方式1,这是由8255的方式控制寄存器控制。

假设8255的端口地址为0200H(端口A),0202H(端口B),0204H(端口C),0206H(控制端口)。CPU地址线A2连接8255引脚A1,CPU地址线A1连接8255引脚A0。

  • 设置8255引脚A1=1,A0=1,当D0-D7输入为1001 0000B,即为90H时,控制方式为A组工作方式0,表示基本的输入/输出操作。A口表示输入,C口表示输出。
  • 设置8255引脚A1=0,A0=0,选中端口A,接受输入,D0-D7为A端口输入值。
  • 设置8255引脚A1=1,A0=0,选中端口C,D0—D7的值将在端口C输出。
    CPU不断改变输出的地址,以便达到将端口A读入数据输出到端口C的目的。由于发光二极管采用共阳极接法,故将端口A读入数据取反后输出到端口C

(2)电路连接图:

在这里插入图片描述

实验2

(1)原理分析:
在这里插入图片描述
假设8255的端口地址为0200H(端口A),0202H(端口B),0204H(端口C),0206H(控制端口)。CPU地址线A2连接8255引脚A1,CPU地址线A1连接8255引脚A0。
初始化:设置8255引脚A1=1,A0=1,当D0—D7输入为1000 1001B,即为89H时,控制方式为A组工作方式为方式0,B组为方式0,表示基本的输入/输出操作。A口表示输出,B口表示输出,C口表示输入。
设置端口地址为0202H,即选中端口B时,准备输出AL=40H,数字0。
START:在端口地址0200H,依次输出AL=0001B、0010B、0100B、1000B选中1,2,3,4数码管。在端口地址0202H,依次输出0到9的数字。每一次四个数码管显示结束,都需要判断是否出现进位。
判断按键状态:设置端口地址0204H,读入C端口的数据,从而判断此时按键的状态。
STOP:通过判断C端口的数据,当输入为 0000 0110 时,表示暂停。此时显示当前计时即可。当检测到C端口输入为 0000 0101 时,表示继续计时。
CLEAR:当C端口输入为0000 0011时,数码管上的数字全部清零,重新开始计时。
在这里插入图片描述
(2)程序流程图:
在这里插入图片描述
(3)电路连接图:

在这里插入图片描述

四、实验代码及实验结果

实验1

(1)实验代码:

CODE SEGMENT
   ASSUME CS:CODE
START:        
   MOV AL,90H ;控制A输入C输出
   MOV DX,206H
   OUT DX,AL   
RUN:   
   MOV AL, 0H
   MOV DX, 200H
   IN AL, DX ;端口A读入
   NOT AL   
   MOV DX, 204H
   OUT DX, AL ;端口C输出
   JMP RUN
CODE ENDS
END START

(2)实验结果:

在这里插入图片描述

实验2

(1)实验代码:

DATA SEGMENT
    NUMBER DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
    MIN1 DB 0
    MIN2 DB 0
    SEC1 DB 0
    SEC2 DB 0
    CIR DW 800
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX, DATA
    MOV DS, AX
    MOV AL, 89H
    MOV DX, 206H  ;初始化
    OUT DX, AL    ;A,B输出,C输入
    MOV BX, 0H  
    LEA SI, NUMBER
    
OUTPUT: 
    MOV AL, 00000001B
    MOV DX, 200H    ;选中第4个数码管
    OUT DX, AL    
    MOV BL, SEC2    ;输出SEC2
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S4:
    LOOP S4
    
    MOV AL, 00000010B
    MOV DX, 200H    ;选中第3个数码管
    OUT DX, AL              
    MOV BL, SEC1
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S3:
    LOOP S3
    
    MOV AL, 00000100B
    MOV DX, 200H    ;选中第2个数码管
    OUT DX, AL              
    MOV BL, MIN2
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S2:
    LOOP S2
    
    MOV AL, 00001000B
    MOV DX, 200H    ;选中第3个数码管
    OUT DX, AL              
    MOV BL, MIN1
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S1:
    LOOP S1      
    ;四个数码管显示结束,判断C端口状态
    MOV DX, 204H
    IN AL, DX
    CMP AL, 06H
    JE STOP    ;STOP暂停计时
    CMP AL, 03H 
    JE TAIL1   ;CLEAR清零计时
   
    ;没有按按键或者按了STRAT,增加秒数并判断是否进位
    INC SEC2                            
    CMP SEC2, 10
    JNZ OUTPUT
    
    ;SEC2 = 10,进位
    MOV SEC2, 0H
    INC SEC1
    CMP SEC1, 10
    JNZ OUTPUT
    
    ;SEC1 = 10,进位
    MOV SEC1, 0H
    INC MIN2
    CMP MIN2, 10
    JNZ OUTPUT
    
    ;MIN2 = 10, 进位
    MOV MIN2, 0H
    INC MIN1
    CMP MIN1, 10
    JNZ OUTPUT
    
    ;MIN1 = 10,清零
    MOV MIN1, 0H
    JMP OUTPUT
STOP:
    MOV AL, 00000001B
    MOV DX, 200H    ;选中第4个数码管
    OUT DX, AL          
    MOV BL, SEC2
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S8:
    LOOP S8
    
    MOV AL, 00000010B
    MOV DX, 200H    ;选中第3个数码管
    OUT DX, AL          
    MOV BL, SEC1
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S7:
    LOOP S7
    
    MOV AL, 00000100B
    MOV DX, 200H    ;选中第2个数码管
    OUT DX, AL          
    MOV BL, MIN2
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S6:
    LOOP S6
    
    MOV AL, 00001000B
    MOV DX, 200H    ;选中第1个数码管
    OUT DX, AL          
    MOV BL, MIN1
    MOV AL, [SI+BX]
    MOV DX, 202H
    OUT DX, AL
    MOV CX, CIR
S5:
    LOOP S5 
    ; 判断是继续计时、暂停还是清零
    MOV DX, 204H
    IN AL, DX
    CMP AL, 05H ;START按键按下
    JE  OUTPUT
    CMP AL, 03H ;CLEAR按键按下
    JE TAIL2
    JMP STOP
TAIL1:
    CALL ZERO
    JMP OUTPUT     
TAIL2:
    CALL ZERO
    JMP STOP    
ZERO PROC
    MOV SEC2, 0H
    MOV SEC1, 0H
    MOV MIN1, 0H
    MOV MIN2, 0H
    RET
ZERO ENDP
CODE ENDS
END START

(2)实验结果:

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

五、实验总结

通过本次实验,我对硬件电路设计有了更深一步的了解,也更加熟悉了Proteus的基本使用方法,掌握了8255各个口的不同工作方式。

猜你喜欢

转载自blog.csdn.net/m0_51913750/article/details/130127475