双机并口通信

海轰Pro

共 11234字,需浏览 23分钟

 · 2021-09-21

一、设计内容及要求

a)通过8255芯片进行双机通信

b)通过一个机器的键盘输入,另一个机器的数码管进行输出,每次传输一个数字,可以连续传输

二、设计思想

双机均使用8255实现数据的读入和输出。

发送端使用A端口方式0输入来接收键盘上的值,C口高四位输入,B口方式1输出(B口通过数据线与接收端的B口相连,实现两个机器之间的通信)

接收端使用B端口方式1输入,接收来自发送端的数据,然后通过A端口方式0输出到数码管,控制数码管显示传输来的数字,C口高四位输出。

三、所用芯片的工作原理

8255A并行接口芯片

8255A 是 Intel 公司生产的通用并行 I/O 接口芯片,它具有 A、B、C 三个并行接口,用+5V 单电源供电,能在以下三种方式下工作:

  • 方式 0—基本输入输出
  • 方式 1—选通输入输出
  • 方式 2—双向选通工作方式

8255A 的引脚图,工作方式控制字和 C 口按位置位复位控制字格式如下所示

四、系统接线图

发送端接线图
接收端接线图

五、软件设计

总体设计分为「发送端」「接收端」两个程序;

「发送端:」

  • SEND:发送子程序,通过B口读取键盘值,然后通过C口检测接收端是否目前是否空闲,空闲则可以发送数据,然后跳转回初始状态;
  • CCSCAN:键盘扫描子程序,不停的进行键盘扫描,如果有输入则暂停,发送到8255中;
  • 主程序:当键盘扫描子程序检测到按键按下时,将数据通过B口进来,放进3000-3003缓冲区,然后判断按键值为多少,判断完成后调用SEND子程序将缓存区中的数据发送出去。

「接收端:」

  • RECEIVE:接收子程序,首先读取C口数据,当输入缓冲区有数据时就讲数据送往B口,调用显示子程序,并向发送端发送回应信号,表示数据已经送往外设。
  • DIS:显示子程序,将接收到的数据显示到数码管上。

六、运行结果及分析

发送端键盘输入1,接收端数码管显示
发送端输入4,接收端数码管输出4

七、心得体会

通过本次课程设计,我们实际动手设计了双机并口通信和计算器,深入理解了微机原理与接口这门课程的使用性,实践出真知,在这次课程设计中,我们出现了很多问题,遇到了很多困难,在不断的失败不断的尝试中,我们终于成功完成了这两个设计。

通过这学期的学习和实践,我们对汇编语言,各种芯片的作用有了比较深入的理解,对计算机的运行机制有了更加深入的认识,我们将继续努力学习相关知识,希望可以在专业领域更上一层楼!

八、程序源代码

Send

IOY0         EQU   0600H          ;片选IOY0对应的端口始地址
MY8255_A     EQU   IOY0+00H*2     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*2     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*2     ;8255的C口地址
MY8255_CON   EQU   IOY0+03H*2     ;8255的控制寄存器地址

SSTACK SEGMENT
DW   256 DUP(?)
SSTACK ENDS

DATA   SEGMENT
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
  DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA   ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: 
 MOV AX,DATA
 MOV DS,AX
 MOV DX,MY8255_CON 
 MOV AL,8DH                  ;使A端口方式0辥“‡º,C高四位输入,B口方式1输出
 OUT DX,AL
 MOV DX,MY8255_CON 
 MOV AL,05H                  ;使ACK置1,数据未送外设,即PC2=1
 OUT DX,AL
BEGIN:
 CALL DALLY
 CALL CCSCAN      ;扫描
 JNZ  INK1
 JMP  BEGIN
INK1:
 CALL DALLY
 CALL CCSCAN
 JNZ  INK2      ;有键按下,转到INK2
 JMP  BEGIN
;确定按下键的位置
INK2: 
 MOV CH,0FEH
 MOV CL,00H
COLUM: 
 MOV AL,CH
 MOV DX,MY8255_A 
 OUT DX,AL
 MOV DX,MY8255_C 
 IN  AL,DX
 and al,0f0h
L1: 
 TEST AL,10H            ;is L1?
 JNZ L2
 MOV AL,00H             ;L1
 JMP KCODE
L2:  
 TEST AL,20H            ;is L2?
 JNZ  L3
 MOV  AL,04H             ;L2
 JMP  KCODE
L3:  
 TEST AL,40H            ;is L3?
 JNZ  L4
 MOV  AL,08H             ;L3
 JMP  KCODE
L4:  
 TEST AL,80H            ;is L4?
 JNZ  NEXT
 MOV  AL,0CH             ;L4
KCODE: 
 ADD  AL,CL
 CALL SEND                       ;键盘值发送
KRET:
 PUSH AX
KON: 
 CALL CCSCAN
 JNZ  KON
 POP  AX
NEXT: 
 INC  CL
 MOV  AL,CH
 TEST AL,80H
 JZ   KERR
 ROL  AL,1
 MOV  CH,AL
 JMP  COLUM
KERR: 
 JMP BEGIN
;发送子程序:将3000-3005缓冲区的内容发送给接收机
SEND:
 MOV DX,MY8255_B  
 OUT DX,AL                   ;把键盘值送端口B
 MOV DX,MY8255_C  
 IN  AL,DX                 ;读端口C中的数据
 AND AL,04H                 ;测试ACK=0
 JZ  KRET                   ;ACK为0跳转,表示数据已送到外设,可以再次输入
 MOV DX,MY8255_A
 MOV AL,00H                 ;将OBF置0,表明已向指定的端口输出了数据,
 OUT DX,AL                   ;等待外设取走数据
 CALL DALLY
 ret                   ;无条件跳转到BEGIN
 
CCSCAN:
 MOV AL,00H     ;键盘扫描子程序
 MOV DX,MY8255_A  
 OUT DX,AL
 MOV DX,MY8255_C 
 IN  AL,DX
 NOT AL
 AND AL,0F0H
 RET
DALLY: 
 PUSH CX      ;延时子程序
 MOV  CX,0006H
T1: 
 MOV  AX,009FH
T2: 
 DEC  AX
 JNZ  T2
 LOOP T1
 POP  CX
 RET

CODE ENDS
END START 

RECEIVE

IOY0         EQU   0600H          ;片选IOY0对应的端口始地址
MY8255_A     EQU   IOY0+00H*2     ;8255的A口地址
MY8255_B     EQU   IOY0+01H*2     ;8255的B口地址
MY8255_C     EQU   IOY0+02H*2     ;8255的C口地址
MY8255_CON   EQU   IOY0+03H*2     ;8255的控制寄存器地址

SSTACK SEGMENT
DW   256 DUP(?)
SSTACK ENDS

DATA   SEGMENT
DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
  DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
DATA   ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: 
 MOV AX,DATA
 MOV DS,AX
 MOV SI,3000H
 MOV AL,00H
 MOV [SI],AL      ;清显示缓冲
 ;MOV [SI+1],AL
 ;MOV DI,3001H
 MOV DX,MY8255_CON 
 MOV AL,8EH                  ;使A端口方式0输出,C高四位输出,B口方式1输入
 OUT DX,AL
 MOV DX,MY8255_C
 MOV AL,40H                  ;使STB为1,输入缓冲器为空
 OUT DX, AL
 CALL CLEAR 
RECEIVE: 
 MOV  DX,MY8255_C                ;读C口数据
 IN   AL,DX
 AND  AL,40H                     ;测试STB=0
 JNZ  RECEIVE                   ;STB为1则跳转,表明输入缓冲器为空
 MOV  DX,MY8255_B
 IN   AL,DX                      ;接收到的数据保存在端口B,读B口的数据 
 CALL PUTBUF                     ;数据保存到指定缓冲中
 CALL DIS                        ;调用显示子程庍
 MOV  DX,MY8255_CON
 MOV  AL,01H                     ;将IBF置1,向发送端发送回应信号,表明数据已送到外设,但尚未取走
 OUT  DX,AL
 CALL DELAY                      ;延时
 MOV  AL,00H                     ;将IBF重新置0,等待接收新的数据被送到外设
 OUT  DX,AL
 JMP  RECEIVE
 
CLEAR:
 MOV DX,MY8255_A       ;清屏子程序
 MOV AL,00H
 OUT DX,AL
 RET
DIS:
 CALL CLEAR 
 PUSH AX         ;显示子程序
 MOV  SI,3000H
 ;MOV  DL,0F7H
 ;MOV  AL,DL
;AGAIN:
 PUSH DX
 ;MOV  DX,MY8255_C               ;控制显示在哪个数码管,x4-x1
 ;OUT  DX,AL
 ;MOV  SI,DI
 MOV  AL,[SI]
 MOV  BX,OFFSET DTABLE
 AND  AX,00FFH
 ADD  BX,AX
 MOV  AL,[BX]
 MOV  DX,MY8255_A               ;A口输出,显示在数码管 
 OUT  DX,AL
 
 CALL DELAY
 ;INC  SI
 POP  DX
 ;MOV  AL,DL
 ;TEST AL,04H                    ;²⊔µڶλ£¬Ő¶ϊǷ񒑵½׮º󒻎»
 ;JZ   OUT1
 ;ROR  AL,1
 ;MOV  DL,AL
 ;JMP  AGAIN
;OUT1:
 POP  AX
 RET
PUTBUF:
 ;MOV SI,DI      ;存键盘值到相应位的缓冲中
 MOV [SI],AL
 ;DEC DI
 ;CMP DI,2FFFH
 ;JNZ GOBACK
 ;MOV DI,3001H
;GOBACK:
 RET
DELAY: 
 PUSH CX       ;延时子程序
 MOV  CX,0006H
T1: 
 MOV  AX,009FH
T2: 
 DEC  AX
 JNZ  T2
 LOOP T1
 POP  CX
 RET
CODE ENDS
END START

结语

代码均为原创

版权归原作者所有

仅供小伙伴们学习参考使用

请勿用作其余用途!

创作不易

如果您觉得写得不错的话

「点赞+在看+收藏」 ❤️

写留言

浏览 77
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报