双机并行通讯程序设计.docx

上传人:b****6 文档编号:5806804 上传时间:2023-01-01 格式:DOCX 页数:15 大小:48.33KB
下载 相关 举报
双机并行通讯程序设计.docx_第1页
第1页 / 共15页
双机并行通讯程序设计.docx_第2页
第2页 / 共15页
双机并行通讯程序设计.docx_第3页
第3页 / 共15页
双机并行通讯程序设计.docx_第4页
第4页 / 共15页
双机并行通讯程序设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

双机并行通讯程序设计.docx

《双机并行通讯程序设计.docx》由会员分享,可在线阅读,更多相关《双机并行通讯程序设计.docx(15页珍藏版)》请在冰豆网上搜索。

双机并行通讯程序设计.docx

双机并行通讯程序设计

双机并行通讯程序设计

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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1