双机串行通信的设计与实现Word格式文档下载.docx
《双机串行通信的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《双机串行通信的设计与实现Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
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=字符
出口参数:
AL的值不变
AH的位7=0——操作成功,通信口状态,AH的位6~0是其状态位
(3)、功能02H:
从通信口读入字符
AH=02H
AL=接受的字符
(4)、功能03H
功能描述:
读取通信口状态
AH=03H
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针)插头连线方法:
发送
←→
接收
信号地
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
MOVDX,0x40001H;
设置计数值,此时的通讯速率为1M÷
52÷
16≈1200bps
MOVAL,52
MOVAX,300H;
向8251的命令端口写入3个0
II1:
CALLOCOMM
DECAH
JNZII1
MOVAL,40H;
复位8251
MOVAL,4EH;
设置1个停止位、8个数据位和16的波特率因子
MOVAL,37H;
允许8251发送和接收
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
MOVCX,40H;
MOVDX,0x50002H;
等待8251处于允许接收状态
M03:
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送初值
movdx,0x50001h;
初始化8251
xoral,al
movcx,03;
向8251控制端口送3个0
delay:
callout1
loopdelay
moval,40h;
向8251控制端口送40H,使其复位
moval,4eh;
设置为1个停止位,8个数据位,波特率因子为16
moval,27h;
向8251送控制字允许其发送和接收
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;
向外发送一字节的子程序
pushcx
movcx,400h
gg:
loopgg;
popcx
ret
out1endp
codeends
endstart
4.7外设部分。
key_led.sch
其实在PC机中应该是用8279来实现的。
四、软件方案
1.程序流程图
2.程序清单
nameserialcommunication
messagedb'
SerialCommunication'
0ah,0dh,
db'
AnykeypressissenttootherPC'
0ah,0dh
pressanykeytoexit'
'
$'
assumecs:
data
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;
如过有按键按下,读取出来
调用16号BIOS中断
cmpal,1bh;
比较一下是否是’ESC’键
jeexit;
如果是,直接退出通信
movah,1;
如果不是,把按下的字符发送到COM
选择COM0
调用BIOS中断
以下这部分代码,检查COM0端口,看看是否有字符接收,如果有,接收,并且把它在终端上显示出来
movah,3;
把COM口的状态读到AH
int14h;
解释同上
andah,1;
屏蔽除D0位的其它位
cmpah,1;
检查D0看是否有一个字符等待接收
jneagain;
没有,则转入到监视键盘模块
movah,2;
有的话,从COM0读出
int14h
movdl,al;
dl中存放要显示的字符
21号中断2号调用,显示字符
int21h;
调用DOS21号中断
jmpagain;
跳回到监视键盘模块
exit:
movah,4ch:
退出DOS
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.这次课程设计使我产生了一种很强烈的愿望,就是想把以往只在书纸上大动干戈操作的一些东西,实实在在的做出来,实现掉,因为只有这样它才有意义。