双机串行通信的设计与实现.docx

上传人:b****6 文档编号:4560995 上传时间:2022-12-06 格式:DOCX 页数:18 大小:981.08KB
下载 相关 举报
双机串行通信的设计与实现.docx_第1页
第1页 / 共18页
双机串行通信的设计与实现.docx_第2页
第2页 / 共18页
双机串行通信的设计与实现.docx_第3页
第3页 / 共18页
双机串行通信的设计与实现.docx_第4页
第4页 / 共18页
双机串行通信的设计与实现.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

双机串行通信的设计与实现.docx

《双机串行通信的设计与实现.docx》由会员分享,可在线阅读,更多相关《双机串行通信的设计与实现.docx(18页珍藏版)》请在冰豆网上搜索。

双机串行通信的设计与实现.docx

双机串行通信的设计与实现

双机串行通信的设计与实现

一、设计要求

1.单机自发自收串行通信。

接收键入字符,从8251A的发送端发送,与同一个8251A的接收端接收,然后在屏幕上显示出来。

2。

双机串行通信,在一台PC机键入字符,从8251A的发送端发送给另一台PC机,另一台PC机的8251A的接收端接收,然后在屏幕上显示出来。

二、所用设备

IBM—PC机两台(串行通信接口8251A两片,串行发送器MC1488和串行接收器MC1489各两片,定时器/计数器8253,终端控制器8259等),串口线一根

串行直连电缆用于两台台电脑通过串行口直接相连,电缆两端的插头都是9针的母插头:

三、硬件方案

1.设计思想

计算机传输数据有并行和串行两种模式。

在并行数据传输方式中,使用8条或更多的导线来传送数据,虽然并行传送方式的速度很快,但由于信号的衰减或失真等原因,并行传输的距离不能太长,在串行通信方式中,通信接口每次由CPU得到8位的数据,然后串行的通过一条线路,每次发送一位将该数据放送出去。

串行通信采用两种方式:

同步方式和异步方式.同步传输数据时,一次传送一个字节,而异步传输数据是一次传送一个数据块。

串口是计算机上一种非常通用设备串行通信的协议.大多数计算机包含两个基于RS232的串口。

串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

典型地,串口用于ASCII码字符的传输。

通信使用3根线完成:

(1)地线,

(2)发送,(3)接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但是不是必须的.串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通行的端口,这些参数必须匹配:

RS-232(ANSI/EIA—232标准)是IBM-PC及其兼容机上的串行连接标准.可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表.用于驱动和连线的改进,RS-232只限于PC串口和设备间点对点的通信。

IBMPC及其兼容机提供了一种有较强的硬件依赖性,但却比较灵活的串行口I/O的方法,即通过INT14调用ROMBIOS串行通信口的例行程序。

该例行程序。

该例行程序包括将串行口初始化为指定的字节结构和传输速率,检查控制器的状态,读写字符等功能.

14号中断的功能总结如下:

串行口服务(SerialPortService-—INT14H)

00H—初始化通信口03H-读取通信口状态

01H-向通信口输出字符04H—扩充初始化通信口

02H—从通信口读入字符

(1)、功能00H:

初始化通信口

入口参数:

AH=00H

DX=初始化通信口号(0=COM1,1=COM2,……)

AL=初始化参数,参数的说明如下:

波特率奇偶位停止位字的位数

76543210

000=110X0=None0=1bit10=7bits

001=15001=Odd1=2bits11=8bits

010=30011=Even

011=600

100=1200

101=2400

110=4800

111=9600

(2)、功能01H:

向通信口输出字符

入口参数:

AH=01H

AL=字符

DX=初始化通信口号(0=COM1,1=COM2,……)

出口参数:

AL的值不变

AH的位7=0——操作成功,通信口状态,AH的位6~0是其状态位

(3)、功能02H:

从通信口读入字符

入口参数:

AH=02H

DX=初始化通信口号(0=COM1,1=COM2,……)

出口参数:

AL=接受的字符

AH的位7=0——操作成功,通信口状态,AH的位6~0是其状态位

(4)、功能03H

功能描述:

读取通信口状态

入口参数:

AH=03H

DX=初始化通信口号(0=COM1,1=COM2,……)

出口参数:

AH=通信口状态,AL=Modem状态,参见功能号00H中的说明

(5)、功能04H

功能描述:

扩充初始化通信口,仅在PS/2中有效

本设计正是利用14号配置串口,实现双机的双工通信及单机的自发自收通信.并画出了比较完整的原理图与写出了比较详细的程序

2。

原理框图

 

3。

工作原理

IBMPC及其兼容机间经过RS-232-C口串行通信是在实际系统中用的最广泛的。

上述框图只是串口通信的的一个内部的原理图,由于,本次设计是直接配置的PC机中的RS232适配卡,上述过程并不能看到,不过在,原理图的分析中会做详尽的解释

本次实验的外部来看实际的电路图

 

PC机上的串行口是9针公插座,引脚定义为:

Pin

Name

Dir

Description

1

CD

CarrierDetect

2

RXD

ReceiveData

3

TXD

TransmitData

4

DTR

DataTerminalReady

5

GND

SystemGround

6

DSR

DataSetReady

7

RTS

RequesttoSend

8

CTS

CleartoSend

9

RI

RingIndicator

所以本设计所采用的串口为双端母插头。

串口为交叉线,2,3号针脚交叉相连,5号针接公共地。

EIARS-232—C接口(9针)插头连线方法:

发送

RXD

2

←→

3

TXD

接收

接收

TXD

3

←→

2

RXD

发送

信号地

GND

5

←→

5

GND

信号地

4。

电路原理图

 

4.1顶层的模块图,top.pri

此原理图的主要参考资料是protel99se中Z80Microprocessor的例子。

整个串行通信系统包括六大部分:

CPU部分、复位和时钟电路部分、电源部分、存储器部分、串口通信接口部分和外设部分。

下就各部分座简要介绍。

4。

2CPU部分.CPU。

sch

CPU部分本来是用8086来做的,但考虑到,8086的寻址比较复杂,数据线分高八位和低八位,所以就改成了8088。

IO/M,RD,WR几个控制引脚的译码通过简单的组合逻辑电路来实现.对RAM存储器、ROM存储器、各IO芯片的寻址译码,是通过一片3—8译码器74LS138来实现的.地址线的低13位代码,在芯片选择的时候,不起作用,只有A13~A15三位地址线负责译码。

为了便于记忆,可把芯片选择时的低13位地址线设为零,来代表它的片选地址。

如本设计中,RAM地址位0x00000来表示,而ROM的地址为0x20000,相应地,55,53,51的地址分别为:

0x30000,0x40000,0x50000。

低13位地址线只在选择存储器中的某一存储单元时使用。

4。

3复位和时钟电路。

CPU_Clock.sch

微机电路在工作中受到干扰后,容易出现CPU程序“跑飞”而盲目运行甚至出现死机现象。

此时复位信号有效,使微机系统重新恢复正常运行。

本设计采用的是比较简单的一种手动的复位电路。

它是通用的吧,是直接从protel的一个例子中拷过来的。

关于处理器的时钟电路确实有研究头

8284除了提供频率恒定的时钟信号外,还对准备好(ready)信号,和复位(reset)信号进行同步。

外界的准备好信号输入到8284的RDY,同步的准备好信号READY从8284输出。

同样,外界的复位信号输入到8284的RES,同步的复位信号RESET从8284输出。

这样,从外部来说,可以在任何时候发出这两个信号,但是,8284的内部逻辑电路设计成在时钟下降沿处使READY和RESET有效。

根据不同的振荡器,8284和振荡器之间,用两种不同的连接方式。

通过F/\C来实现:

此电路图是按同步通信的方式画的,READY信号在以后的设计中,也没有用到,便把它的连接去掉了

4.4电源部分.PowerSupply.sch

4.5存储器部分。

serial_memory.sch

2764只可读,6264可读可写,由于处理器用的是8088,便无需考虑A0的问题了,这种便利也体现在,后面的设计中,IO芯片的端口地址的设置上。

4.6串口通信接口部分。

serial51。

sch

8253为8251提供波特率,8253只用它的第0个计数器,工作在方式3。

下面是一段基于本设计的连接图的通过8251实现自发自收串行通信的程序,内包含了8253,8251的初始化.

STACKSEGMENTPARASTACK'STACK’

DB128DUP(?

STACKENDS

CODESEGMENTPARAPUBLIC'CODE'

ASSUMECS:

CODE,SS:

STACK,DS:

CODE

START:

JMPMAIN

SBUFDB1,2,3,4,5,6,7,8,9,10;定义保存“发送信息"

RBUFDB10DUP(?

);和“接收信息”的存储器区域

OCOMMPROC;将(AL)写入8251的命令口

PUSHCX;保存所用寄存器

PUSHDX

MOVDX,209H;执行端口写入操作

OUTDX,AL

MOVCX,400H;延时

LOOP$

POPDX;恢复所用寄存器

POPCX

RET;返回主调程序

OCOMMENDP

INITPROC;初始化子程序

MOVDX,0x40003H;设置8253的1#通道为方式3、只读写低8位数据和2进制计数方式

MOVAL,56H

OUTDX,AL

MOVDX,0x40001H;设置计数值,此时的通讯速率为1M÷52÷16≈1200bps

MOVAL,52

OUTDX,AL

MOVAX,300H;向8251的命令端口写入3个0

II1:

CALLOCOMM

DECAH

JNZII1

MOVAL,40H;复位8251

CALLOCOMM

MOVAL,4EH;设置1个停止位、8个数据位和16的波特率因子

CALLOCOMM

MOVAL,37H;允许8251发送和接收

CALLOCOMM

RET;返回主调程序

INITENDP

MAIN:

MOVAX,CS;初始化数据段寄存器

MOVDS,AX

LEASI,SBUF;和发送

LEADI,RBUF;与接收指针

callinit

M01:

MOVDX,0x50002H;等待8251处于允许发送状态

M02:

INAL,DX

TESTAL,1

JZM02

MOVAL,[SI];发送1个数据

INCSI

MOVDX,0x50001H

OUTDX,AL

MOVCX,40H;延时

LOOP$

MOVDX,0x50002H;等待8251处于允许接收状态

M03:

INAL,DX

TESTAL,2

JZM03

MOVDX,0x50001H;接收

INAL,DX

MOV[DI],AL;并保存一个数据

INCDI

CMPSI,OFFSETSBUF+10;判断是否处理完了全部数据?

JBM01;未完,再处理下一个

HLT;完了,执行停机动作

CODEENDS

ENDSTART

下面是一段基于本设计的连接图的通过8251实现串行通信的程序。

stacksegmentstack

stackends

datasegment

dataends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

pushcs

popds

movdx,0x0003h;设置8253计数1工作方式3

moval,56h

outdx,al

moval,52

movdx,0x0001h给8253计数器1送初值

outdx,al

movdx,0x50001h;初始化8251

xoral,al

movcx,03;向8251控制端口送3个0

delay:

callout1

loopdelay

moval,40h;向8251控制端口送40H,使其复位

callout1

moval,4eh;设置为1个停止位,8个数据位,波特率因子为16

callout1

moval,27h;向8251送控制字允许其发送和接收

callout1

next:

movdx,0x50001h

inal,dx

testal,02;检查接收是否准备好

jznext;没有,等待

movdx,0x50000h

inal,dx;准备好,接收

pushax

movcx,40h

s51:

loops51;延时

waiti:

movdx,0x50001h

inal,dx

testal,01;发送是否准备好

jzwaiti

movdx,0x50000h

popax

outdx,al

jmpnext

out1procnear;向外发送一字节的子程序

outdx,al

pushcx

movcx,400h

gg:

loopgg;延时

popcx

ret

out1endp

codeends

endstart

4.7外设部分。

key_led。

sch

其实在PC机中应该是用8279来实现的。

四、软件方案

1.程序流程图

 

2。

程序清单

nameserialcommunication

datasegment

messagedb’SerialCommunication’,0ah,0dh,

db'AnykeypressissenttootherPC’,0ah,0dh

db'pressanykeytoexit',’$’

dataends

codesegment

assumecs:

code,ds:

data

start:

movax,data

movds,ax

movah,09;显示字符串

movdx,offsetmessage

int21h

;初始化串口

movah,0

movdx,0;初始化COM0

moval,0c3h;11000011,4800,n,1,8

int14h;调用BIOS14号中断

again:

movah,01;获取键盘状态

int16h;检查键盘是否按下

jznext;如果没有则转入到接收模式

movah,0;如过有按键按下,读取出来

int16h;调用16号BIOS中断

cmpal,1bh;比较一下是否是’ESC’键

jeexit;如果是,直接退出通信

movah,1;如果不是,把按下的字符发送到COM

movdx,0;选择COM0

int14h;调用BIOS中断

;以下这部分代码,检查COM0端口,看看是否有字符接收,如果有,接收,并且把它在终端上显示出来

next:

movah,3;把COM口的状态读到AH

movdx,0;选择COM0

int14h;解释同上

andah,1;屏蔽除D0位的其它位

cmpah,1;检查D0看是否有一个字符等待接收

jneagain;没有,则转入到监视键盘模块

movah,2;有的话,从COM0读出

movdx,0;

int14h

movdl,al;dl中存放要显示的字符

movah,2;21号中断2号调用,显示字符

int21h;调用DOS21号中断

jmpagain;跳回到监视键盘模块

exit:

movah,4ch:

退出DOS

int21h

codeends

endstart

以上是全双工双机通信的程序代码,自发自收也可以用同样的代码,只需改变连线,把9针插座的2,3引脚用导线交叉互联即可.

五、方案论证

按设计题目实现双机通信可有三种方法:

第一种方法:

通过配置PC机中固有的RS232适配卡,通过调用BIOS的14号中断,及DOS中断的16号、21号中断里的功能,实现双机的通信.

第二种方案:

在微机中通过配置可编程芯片8250来实现串行通信。

第三种方案:

由芯片级做起,查资料,画原理图,版图,制版,调试,实现串口通信.

总地来说,第三种方案不符合现实情况,在时间上,资源上不允许,但毋庸置疑的是,它确实是最吸引我们的一种方案。

第二种方案是最合情合理的,既不像第三种方案那样遥远,也不像第一种方案那样简单。

但在实际做的工程中,发现按实验资料所设计的程序并没有实现,可能有一些未知的原因.最后选择了第三种方案,可惜的是,这种程序更加偏向于软件。

为弥补这种不足,只能把实验原理图画得详细一点了。

六、调试过程

1.首先把软件调试通过,本设计采用的是tasm,tlink,td这一套精巧的汇编开工具发。

2.在PC双机上通信必需得把PC双机的串口连起来,但PC机上的插槽都是公的,若要连接,必需是双端都是母插头的串口线,但实验室的串口线都是一公一母的,不能用,后来,无意中发现一位同学买的单片机开发板上的串口线是双母插头的,解决了这个问题。

3。

第二种方案没有成功,可能是对8250了解的比较少,再一方面,8250里有比较多的寄存器,在通信的过程中,有一些未认识到的错误在里面,就继续选择用第一种方案来做。

4.在网上下载了一个串口测试的程序,对调试过程,产生了很大的帮助。

七、运行结果

1.在发送端的程序显示结果

输入的字符没有显示,因为程序没有回显功能

2.在接收端的程序显示结果

注:

其实“接收端"与“发送端"描述,只是在一次的通信中相对而言的,并没有绝对的接收端与发送端,因为此程序是双工的.

八、收获体会

1.对微机原理有了更深一步的认识,当时学习时,很多迷惑不解的部分都迎刃而解了,比如说,8259的中断机制,8086的编址方法等。

2。

巩固了对PROTEL工具使用,虽然还不如当时熟练,但也去掉了不少生疏。

3.这次课程设计使我产生了一种很强烈的愿望,就是想把以往只在书纸上大动干戈操作的一些东西,实实在在的做出来,实现掉,因为只有这样它才有意义。

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

当前位置:首页 > 高中教育 > 高中教育

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

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