双机并行通讯程序设计.docx
- 文档编号:5806804
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:15
- 大小:48.33KB
双机并行通讯程序设计.docx
《双机并行通讯程序设计.docx》由会员分享,可在线阅读,更多相关《双机并行通讯程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
双机并行通讯程序设计
双机并行通讯程序设计
1问题的描述与分析
题目要求由甲乙两台微机之间并行传送1K字节数据。
先甲机发送,乙机接收,后乙机发送,甲机接收。
甲乙双方的8255A均采用方式2工作。
8255A控制口地址为303。
本题属于双机并行通讯问题,应分为发送和接收两方面分别来进行研究。
由于程序需要对地址进行直接操作,所以选择汇编语言来编写较为简单方便。
在写程序的过程中,由于要用8255A芯片作为并行传输芯片,所以要熟练掌握8255A的控制方法;此外,程序多处还要用到DOS功能调用,所以还要对DOS的各种功能进行系统的学习。
两台PC各与一个8255A芯片相连,程序分为两部分,分别运行与两台PC机上以实现并行传输。
连接图如下:
图1-1双机通讯的连接图
程序分为两个部分,分别在甲机和乙机上面运行。
甲机运行的程序是先发送后接收,乙机上运行的程序时先接收后发送,实现先从甲机到乙机传输1KB的数据,后从乙机到甲机传输1KB的数据的功能。
我们在两台微机的内存中各开辟一个1KB的字符区BUF1,象征性的输入少许字符,来模拟要传输的1KB的数据。
再各开辟一个1KB的字符区BUF2用来存储接收到的1KB数据。
28255A芯片的介绍
2.18255A的引脚功能
8255A的芯片引脚图见图2-1:
图2-18255A的芯片引脚图
RESET:
复位输入线,当该输入端外于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
PA0~PA7:
端口A输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入锁存器。
PB0~PB7:
端口B输入输出线,一个8位的I/O锁存器,一个8位的输入输出缓冲器。
PC0~PC7:
端口C输入输出线,一个8位的数据输出锁存器/缓冲器,一个8位的数据输入缓冲器。
端口C可以通过工作方式设定而分成2个4位的端口,每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。
CS:
片选信号线,当这个输入引脚为低电平时,表示芯片被选中,允许8255A与CPU进行通讯。
RD:
读信号线,当这个输入引脚为低电平时,允许8255A通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:
写入信号,当这个输入引脚为低电平时,允许CPU将数据或控制字写入8255A。
D0~D7:
三态双向数据总线,8255A与CPU数据传送的通道,当CPU执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。
A1、A0:
端口地址总线,8255A中有端口A、B、C和一个内部控制字寄存器,共4个端口,由A0、A1输入地址信号来寻址。
2.28255A的编程
8255A是将所有端口分为两组来控制的,因此方式控制字也分为了两部分:
A组控制D6~D3和B组控制D2~D0。
其具体格式见表2-1。
表2-18255A的方式控制字
D7
D6
D5
D4
D3
D2
D1
D0
1
A口方式
A口方向
PC上口方向
B口方式
B口方向
PC下口方向
方式控制字
00:
方式0
01:
方式1
1X:
方式2
0:
输出
1:
输入
0:
输出
1:
输入
0:
方式0
1:
方式1
0:
输出
1:
输入
0:
输出
1:
输入
此外,8255A还有一个特殊的功能,即对C口直接进行置“1”或清“0”操作,这种方法使C口的控制变得更加简单、方便。
其具体格式见表2-2。
表2-28255A的C口控制字
D7
D6
D5
D4
D3
D2
D1
D0
0
无效
引脚选择
置位、复位选择
C口控制字
000:
PC0
001:
PC1
010:
PC2
…………
111:
PC7
0:
复位
1:
置位
2.38255A的工作方式
8255A有三种工作方式:
●方式0——基本输入/输出方式
●方式1——选通输入/输出方式
●方式2——双向传输方式
其中只有A口可以工作在方式2,由于本题要求工作在方式2,所以这里只重点介绍方式2的工作原理。
方式2的双向传输方式是指在同一端口内分时进行输入/输出的操作,它需要5个控制信号进行“联络”,这5个控制信号由C口提供。
由于方式2的A口既能发送,也能接收数据,所以A口的引脚在“空闲”状态下是三态的。
A口在某一时刻下,输入或输出是由相应“联络”线确定的。
工作时可用软件查询方式,也可用中断方式。
A口工作在方式2时,C口的“联络”线既要提供A口的输入“联络”线
和
,又要提供A口的输出“联络”线
和
,同时还要有一个处理A口中断的中断申请线
,具体端口分配见表2-3。
表2-38255A的方式控制字
D7
D6
D5
D4
D3
D2
D1
D0
A组
B组或I/O口
●
——A口的中断请求信号。
当其有效时,8255A的A口向CUP申请中断。
●
——A口的选通信号(外设发出,低电平有效)。
当其有效时,外设把数据输入A口的输入缓冲器。
●
——A口的输入缓冲器“满”信号。
当其有效时,表示A口的输入缓冲器已经暂存一个有效数据。
●
——外设应答信号。
由外设发出,低电平时有效。
当其有效时,表示外设已经接收数据。
●
——A口的输出缓冲器“满”信号。
当其有效时表示A口的输出缓冲器已经暂存一个有效数据。
3DOS常用功能的介绍
DOS系统启动时,DOS层功能模块从系统盘被装入内存。
调用这些功能模块称为DOS功能调用。
DOS功能调用可以完成文件管理、存储管理、作业管理和设备管理等。
表3-1列出了一些常用的DOS功能调用。
表3-1常用DOS功能调用
AH
功能
调用参数
返回参数
01
键盘输入并回显
AL=输入字符
02
显示输出
DL=输出字符
06
直接控制台I/O
DL=FF(输入)
DL=字符(输出)
AL=输入字符
07
键盘输入(无回显)
AL=输入字符
08
键盘输入(无回显)
检测Ctrl-Break
AL=输入字符
09
显示字符串
DS:
DX=串地址
'$'结束字符串
0A
键盘输入到缓冲区
DS:
DX=缓冲区首地址
(DS:
DX)=缓冲区最大字符数
(DS:
DX+1)=实际输入的字符数
0C
清除输入缓冲区并
请求指定的输入功能
AL=输入功能号
(1,6,7,8,A)
4C
带返回码结束
AL=返回码
4系统方框图
编写的程序有两种类型:
甲机是先发送后接收类型,乙机是先接收后发送类型。
这两种类型程序非常相似,只是在调用发送、接收子函数时,顺序有所不同。
甲机程序的系统方框图如图4-1所示。
图4-1甲机程序的系统方框图
5各部分程序设计
5.1发送子程序
OUT1PROC
MOVDX,303H;对控制端口进行初始化
MOVAL,0C9H
OUTDX,AL
MOVAL,0FH;将OBFA置1
OUTDX,AL
MOVCX,1024;设置循环次数
L1:
MOVDX,300H;开始传输字符
MOVAL,[SI]
OUTDX,AL
INCSI
L11:
MOVDX,302H
INAL,DX
ANDAL,80H;测试OBFA
JZL11;OBFA有效,说明前一个数还未传送完,则继续等待,否则传送下一个数
LOOPL1
RET
OUT1ENDP
5.2接收子程序
IN1PROC
MOVDX,303H;对控制端口进行初始化
MOVAL,0F9H
OUTDX,AL
MOVAL,0AH;将IBFA置0
OUTDX,AL
MOVCX,1024;设置循环次数
L2:
MOVDX,302H
INAL,DX
ANDAL,10H;测试IBFA,看是否收到数
JZL2
MOVDX,300H;读一个数
INAL,DX
MOV[DI],AL
INCDI
K2:
MOVDX,302H
INAL,DX
ANDAL,10H;测试IBFA,看是已存好数
JNZK2
LOOPL2
RET
IN1ENDP
6小结与体会
本次课程设计中,有一些知识是我们在课堂上所没有讲过的,因此就需要我们查阅各种资料。
通过这短短两周的实践,我感觉到自己学到了很多有用的理论和实践知识。
从程序的设计到调试、运行,任何一个步骤都是对自己的考验。
通过本次课程设计,我熟练的掌握了8255A芯片的使用方法,了解了双机并行通讯的原理,还学会了程序编写的一般步骤以及汇编语言的使用,更重要的时,本次课设很好的锻炼了我的思维严谨性,因为任何一个错误都会导致程序运行失败。
总之,通过本次课设,我感觉自己受益匪浅。
致谢
此次课程设计中得到了老师的悉心指导,感谢学校、老师给我这次学习的机会。
感谢老师对我们的密切关心和帮助,同时给我们的设计提供了一些意见和建议,让我们很多疑难问题都迎刃而解。
另外,感谢我的同学们的帮助和支持。
参考文献
[1]邵玉祥.汇编语言程序设计.北京:
科学出版社.2005
[2]阳平.汇编语言与微机原理.北京:
中国水利水电出版社.2006
[3]胡蔷.微机原理及应用.北京:
机械工业出版社.2006
[4]钱晓捷 .新版汇编语言程序设计.北京:
电子工业出版社.2007
[5]周佩玲.微机原理与接口技术.北京:
电子工业出版社.2007
附录1:
甲机原程序代码
;***********************************************************************
;主程序:
由甲乙两台微机之间并行传送1K字节数据。
甲机发送,乙机接收。
*
;甲乙双方的8255A均采用方式2工作。
*
;8255A控制口地址为303*
;***********************************************************************
DATASEGMENT
BUFDB100;表示1KB的数据缓冲区
DB?
DB100dup
(1)
BUF1DB1024DUP(0);表示甲PC要传输的1KB数据
BUF2DB1024DUP(0);表示甲PC接收的1KB数据
PUT1DB0ah,0dh,'ifyouwanttoquit,pleasepressQ/q!
'
DB0ah,0dh,'pressotherkeytostart',0ah,0dh,'$'
PUT2DB0aH,0dH,'inputsomewordsfortransfer:
'
DB0ah,0dh,'$'
DATAENDS
STACK1SEGMENTSTACK
DB1024DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK1,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
T1:
leadx,PUT1;输入提示信息PUT1
movah,9
int21h
movah,08h;从键盘输入单个字符
int21h
cmpal,'Q';输入字符与Q进行比较
JEexit
cmpal,'q';输入字符与q进行比较
jeexit
T2:
leadx,PUT2;输入提示信息PUT2
movah,9
int21h
leadx,BUF;输入一串字符到缓冲区以供传输到乙pc机
movah,10
int21h
leadi,BUF+2;将缓冲区中字符串的偏移地址赋予di
leasi,BUF1
next1:
movdl,[di];将缓冲区的字符移到寄存器dl
incdi
cmpdl,0dh;检测寄存器中的字符是否为回车
jneaa1;不是回车就跳转到aa2
jmpT;是回车就跳转到T
aa1:
mov[si],dl
incsi
jmpnext1
T:
LEASI,BUF1;甲机开始传输数据
CALLOUT1
LEADI,BUF2;甲机开始接收数据
CALLIN1
JMPT1
exit:
MOVAH,4CH;退出程序
INT21H
OUT1PROC
MOVDX,303H;对控制端口进行初始化
MOVAL,0C9H
OUTDX,AL
MOVAL,0FH;将OBFA置1
OUTDX,AL
MOVCX,1024;设置循环次数
L1:
MOVDX,300H;开始传输字符
MOVAL,[SI]
OUTDX,AL
INCSI
L11:
MOVDX,302H
INAL,DX
ANDAL,80H;测试OBFA
JZL11;OBFA有效,说明前一个数还未传送完,则继续等待,否则传送下一个数
LOOPL1
RET
OUT1ENDP
IN1PROC
MOVDX,303H;对控制端口进行初始化
MOVAL,0F9H
OUTDX,AL
MOVAL,0AH;将IBFA置0
OUTDX,AL
MOVCX,1024;设置循环次数
L2:
MOVDX,302H
INAL,DX
ANDAL,10H;测试IBFA,看是否收到数
JZL2
MOVDX,300H;读一个数
INAL,DX
MOV[DI],AL
INCDI
K2:
MOVDX,302H
INAL,DX
ANDAL,10H;测试IBFA,看是已存好数
JNZK2
LOOPL2
RET
IN1ENDP
CODEENDS
ENDSTART
附录2:
乙机原程序代码
;***********************************************************************
;主程序:
由甲乙两台微机之间并行传送1K字节数据。
乙机发送,甲机接收。
*
;甲乙双方的8255A均采用方式2工作。
*
;8255A控制口地址为303*
;***********************************************************************
DATASEGMENT
BUFDB100;表示1KB的数据缓冲区
DB?
DB100dup
(1)
BUF1DB1024DUP(0);表示乙PC要传输的1KB数据
BUF2DB1024DUP(0);表示乙PC接收的1KB数据
PUT1DB0ah,0dh,'ifyouwanttoquit,pleasepressQ/q!
'
DB0ah,0dh,'pressotherkeytostart',0ah,0dh,'$'
PUT2DB0aH,0dH,'inputsomewordsfortransfer:
'
DB0ah,0dh,'$'
DATAENDS
STACK1SEGMENTSTACK
DB1024DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMEDS:
DATA,SS:
STACK1,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
T1:
leadx,PUT1;输入提示信息PUT1
movah,9
int21h
movah,08h;从键盘输入单个字符
int21h
cmpal,'Q';输入字符与Q进行比较
JEexit
cmpal,'q';输入字符与q进行比较
jeexit
T2:
leadx,PUT2;输入提示信息PUT2
movah,9
int21h
leadx,BUF;输入一串字符到缓冲区以供传输到甲pc机
movah,10
int21h
leadi,BUF+2;将缓冲区中字符串的偏移地址赋予di
leasi,BUF1
next1:
movdl,[di];将缓冲区的字符移到寄存器dl
incdi
cmpdl,0dh;检测寄存器中的字符是否为回车
jneaa1;不是回车就跳转到aa2
jmpT;是回车就跳转到T
aa1:
mov[si],dl
incsi
jmpnext1
T:
LEADI,BUF2;乙机开始接收数据
CALLIN1
LEASI,BUF1;乙机开始传输数据
CALLOUT
JMPT1
exit:
MOVAH,4CH;退出程序
INT21H
OUT1PROC
MOVDX,303H;对控制端口进行初始化
MOVAL,0C9H
OUTDX,AL
MOVAL,0FH;将OBFA置1
OUTDX,AL
MOVCX,1024;设置循环次数
L1:
MOVDX,300H;开始传输字符
MOVAL,[SI]
OUTDX,AL
INCSI
L11:
MOVDX,302H
INAL,DX
ANDAL,80H;测试OBFA
JZL11;OBFA有效,说明前一个数还未传送完,则继续等待,否则传送下一个数
LOOPL1
RET
OUT1ENDP
IN1PROC
MOVDX,303H;对控制端口进行初始化
MOVAL,0F9H
OUTDX,AL
MOVAL,0AH;将IBFA置0
OUTDX,AL
MOVCX,1024;设置循环次数
L2:
MOVDX,302H
INAL,DX
ANDAL,10H;测试IBFA,看是否收到数
JZL2
MOVDX,300H;读一个数
INAL,DX
MOV[DI],AL
INCDI
K2:
MOVDX,302H
INAL,DX
ANDAL,10H;测试IBFA,看是已存好数
JNZK2
LOOPL2
RET
IN1ENDP
CODEENDS
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双机 并行 通讯 程序设计