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

该实验详细介绍了如何使用8255A芯片进行二极管控制和构建电子秒表。实验中,8255的PA口被配置为开关量输入,PC口为输出,用于显示PA口的状态。电子秒表功能包括开始、停止和清零,通过8255的端口控制实现。实验代码展示了读取PA口数据并反向输出至PC口,以及秒表的计时和按键控制逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验要求

  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各个口的不同工作方式。

### 西安建筑科技大学微机原理实验报告指导教程 #### 一、实验目的与意义 在西安建筑科技大学开设的《微型计算机原理》课程中,实验部分旨在帮助学生掌握微型计算机系统的组成及其工作原理。通过实际操作加深对理论知识的理解,培养动手能力和解决实际问题的能力[^1]。 #### 二、实验环境搭建 为了顺利完成这些实验,通常需要准备如下设备和工具: - PC一台(安装有Windows/Linux操作系统) - Proteus仿真软件或其他类似的电路设计平台用于模拟硬件连接情况 - Keil C51编译器用来编写并调试程序代码 对于初学者来说,可以从简单的输入输出接口编程开始尝试,在掌握了基本技能后再逐步深入到中断处理机制、定时计数功能等方面的学习[^2]。 #### 三、典型实验案例分析 以下是几个常见的实验题目以及相应的实现思路: ##### (一)LED灯控制实验 目标是利用单片机来驱动外部LED发光器件按照预定模式闪烁。这不仅能够检验I/O端口的操作方法是否正确无误,而且还可以作为后续复杂项目的入门练习。 ```c #include <reg52.h> sbit LED=P1^0; // 定义P1.0引脚接LED正极 void delay(unsigned int i){ while(i--); } void main(){ P1=0xFF; while(1){ LED=~LED; delay(60000); } } ``` 上述C语言源码实现了最基础版本的手动开关切换效果;如果想要进一步提高难度,则可以考虑加入按键检测逻辑使得灯光变化规律由用户自定义设置。 ##### (二)数码管显示温度传感器数据读取 此项目涉及到AD转换模块的应用场景——实时监测周围环境温湿度并将数值呈现在四位七段显示器上。期间会用到SPI/IIC总线协议完成两者之间的通信交互过程。 ```assembly ORG 0H LJMP START ;跳转至START处执行 ORG 30H START: MOV TMOD,#01H ;设定T0为方式1 SETB TR0 ;启动T0运行 HERE:SJMP HERE ;等待溢出标志位置‘1’ ``` 以上汇编指令片段仅展示了初始化阶段的部分内容,完整的工程还需要配合其他外设资源共同协作才能达到预期的功能表现。 #### 四、撰写高质量实验报告要点提示 当完成了指定任务之后就要着手整理成果形成书面文档提交给老师审阅了。一份优秀的实验报告应当具备以下几个要素: - **摘要**:概括整个研究工作的主要内容及结论; - **前言**:介绍背景信息说明选题依据阐述个人见解; - **正文**:详尽记录每一步骤的具体做法遇到困难时如何克服最终取得了哪些进展; - **总结**:提炼精华之处反思不足之处展望未来改进方向。 特别提醒各位同学注意保持文字表述清晰流畅图表排版整齐美观以便于他人阅读理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值