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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

双机串行通信的设计与实现
一、设计要求
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串口和设备间点对点的通信。

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


例行程序。

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

14号中断的功能总结如下:
串行口服务(Serial Port Service——INT 14H)
00H —初始化通信口03H —读取通信口状态
01H —向通信口输出字符04H —扩充初始化通信口
02H —从通信口读入字符
(1)、功能00H:初始化通信口
入口参数:AH=00H
DX=初始化通信口号(0=COM1,1=COM2,……)
AL=初始化参数,参数的说明如下:波特率奇偶位停止位字的位数76543210
000 = 110X0 = None0 = 1 bit10 = 7 bits
001 = 15001 = Odd1 = 2 bits11 = 8 bits
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.工作原理
IBM PC 及其兼容机间经过RS -232-C 口串行通信是在实际系统中用的最广泛的。

上述框图只是串口通信的的一个内部的原理图,由于,本次设计是直接配置的PC 机中的RS232适配卡,上述过程并不能看到,不过在,原理图的分析中会做详尽的解释
本次实验的外部来看实际的电路图
CPU
总线
定时器
8253
8251
1488
1489
9针串口
PC机上的串行口是9 针公插座,引脚定义为:
Pin Name Dir Description
1CD Carrier Detect
2RXD Receive Data
3TXD Transmit Data
4DTR Data Terminal Ready
5GND System Ground
6DSR Data Set Ready
7RTS Request to Send
8CTS Clear to Send
9RI Ring Indicator
所以本设计所采用的串口为双端母插头。

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

EIA RS-232-C接口(9针)插头连线方法:
发送RXD 2 ←→ 3 TXD 接收
接收TXD 3 ←→ 2 RXD 发送
信号地GND 5 ←→ 5 GND 信号地4.电路原理图
4.1顶层的模块图,top.pri
此原理图的主要参考资料是protel 99 se中Z80 Microprocessor的例子。

整个串行通信系统包括六大部分:CPU部分、复位和时钟电路部分、电源部分、存储器部分、串口通信接口部分和外设部分。

下就各部分座简要介绍。

4.2 CPU部分。

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电源部分。

Power Supply.sch
4.5存储器部分。

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

4.6 串口通信接口部分。

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

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

STACK SEGMENT PARA STACK 'STACK'
DB 128 DUP(?)
STACK ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,SS:STACK,DS:CODE
START: JMP MAIN
SBUF DB 1,2,3,4,5,6,7,8,9,10 ;定义保存“发送信息”
RBUF DB 10 DUP(?) ;和“接收信息”的存储器区域
OCOMM PROC ;将(AL)写入8251的命令口
PUSH CX ;保存所用寄存器
PUSH DX
MOV DX,209H ;执行端口写入操作
OUT DX,AL
MOV CX,400H ;延时
LOOP $
POP DX ;恢复所用寄存器
POP CX
RET ;返回主调程序
OCOMM ENDP
INIT PROC ;初始化子程序
MOV DX,0x40003H ;设置8253的1#通道为方式3、只读写低8位数据和2进制计数方式
MOV AL,56H
OUT DX,AL
MOV DX, 0x40001H ;设置计数值,此时的通讯速率为1M÷52÷16≈1200 bps
MOV AL,52
OUT DX,AL
MOV AX,300H ;向8251的命令端口写入3个0
II1: CALL OCOMM
DEC AH
JNZ II1
MOV AL,40H ;复位8251
CALL OCOMM
MOV AL,4EH ;设置1个停止位、8个数据位和16的波特率因子
CALL OCOMM
MOV AL,37H ;允许8251发送和接收
CALL OCOMM
RET ;返回主调程序
INIT ENDP
MAIN:
MOV AX,CS ;初始化数据段寄存器
MOV DS,AX
LEA SI,SBUF ;和发送
LEA DI,RBUF ;与接收指针
call init
M01:
MOV DX,0x50002H ;等待8251处于允许发送状态
M02:
IN AL,DX
TEST AL,1
JZ M02
MOV AL,[SI] ;发送1个数据
INC SI
MOV DX,0x50001H
OUT DX,AL
MOV CX,40H ;延时
LOOP $
MOV DX,0x50002H ;等待8251处于允许接收状态
M03:
IN AL,DX
TEST AL,2
JZ M03
MOV DX,0x50001H ;接收
IN AL,DX
MOV [DI],AL ;并保存一个数据
INC DI
CMP SI,OFFSET SBUF+10 ;判断是否处理完了全部数据?
JB M01 ;未完,再处理下一个
HLT ;完了,执行停机动作
CODE ENDS
END START
下面是一段基于本设计的连接图的通过8251实现串行通信的程序。

stack segment stack
stack ends
data segment
data ends
code segment
assume cs:code,ds:data,ss:stack
start:
push cs
pop ds
mov dx,0x0003h ;设置8253计数1工作方式 3
mov al,56h
out dx,al
mov al,52
mov dx,0x0001h 给8253计数器1送初值
out dx,al
mov dx,0x50001h ;初始化8251
xor al,al
mov cx,03 ;向8251控制端口送3个0
delay:
call out1
loop delay
mov al,40h ;向8251控制端口送40H,使其复位
call out1
mov al,4eh ;设置为1个停止位,8个数据位,波特率因子为16 call out1
mov al,27h ;向8251送控制字允许其发送和接收
call out1
next: mov dx,0x50001h
in al,dx
test al,02 ;检查接收是否准备好
jz next ;没有,等待
mov dx,0x50000h
in al,dx ;准备好,接收
push ax
mov cx,40h
s51:
loop s51 ;延时
waiti:
mov dx,0x50001h
in al,dx
test al,01 ;发送是否准备好
jz waiti
mov dx,0x50000h
pop ax
out dx,al
jmp next
out1 proc near ;向外发送一字节的子程序
out dx,al
push cx
mov cx,400h
gg:
loop gg ;延时
pop cx
ret
out1 endp
code ends
end start
4.7 外设部分。

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

四、软件方案
1.程序流程图
程序流程图
N
Y
Y
退出N
开始
显示提示信息
配置串口0为4800波特,无
校验,1位停止位,一帧8位
检查键盘状态
是否有键按下? 读取此键
是否是‘ESC ’?
把此字符送到COM 端口
读取COM0的状态到AH
发送
获取状态位
是否有字符?
从COM0读出
显示到DOS 端口
N
2.程序清单
name serialcommunication
data segment
message db 'Serial Communication',0ah,0dh, db 'Any key press is sent to other PC',0ah,0dh db 'press any key to exit','$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ah,09;显示字符串
mov dx,offset message
int 21h
;初始化串口
mov ah,0
mov dx,0 ;初始化COM0
mov al,0c3h ;11000011,4800,n,1,8 int 14h ;调用BIOS 14号中断again:
mov ah,01 ;获取键盘状态
int 16h ;检查键盘是否按下
jz next ;如果没有则转入到接收模式
mov ah,0 ;如过有按键按下,读取出来
int 16h ;调用16号BIOS中断
cmp a l,1bh ;比较一下是否是’ESC’键
je exit ;如果是,直接退出通信
mov ah,1 ;如果不是,把按下的字符发送到COM
mov dx,0 ;选择COM0
int 14h ;调用BIOS中断
;以下这部分代码,检查COM0端口,看看是否有字符接收,如果有,接收,并且把它在终端上显示出来
next:
mov ah,3 ;把COM口的状态读到AH
mov dx,0 ;选择COM0
int 14h ;解释同上
and ah,1 ;屏蔽除D0位的其它位
cmp a h,1 ;检查D0看是否有一个字符等待接收
jne again ;没有,则转入到监视键盘模块
mov ah,2 ;有的话,从COM0读出
mov dx,0 ;
int 14h
mov dl,al ;dl中存放要显示的字符
mov ah,2 ;21号中断2号调用,显示字符
int 21h ;调用DOS 21号中断
jmp again ;跳回到监视键盘模块
exit:
mov ah,4ch :退出DOS
int 21h
code ends
end start
以上是全双工双机通信的程序代码,自发自收也可以用同样的代码,只需
改变连线,把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.这次课程设计使我产生了一种很强烈的愿望,就是想把以往只在书纸上大动干戈操作的一些东西,实实在在的做出来,实现掉,因为只有这样它才
山东科技大学信息学院微机原理课程设计
有意义。

第21页。

相关文档
最新文档