双机串行通信 微机课程设计说明书.docx
- 文档编号:17210525
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:32
- 大小:400.84KB
双机串行通信 微机课程设计说明书.docx
《双机串行通信 微机课程设计说明书.docx》由会员分享,可在线阅读,更多相关《双机串行通信 微机课程设计说明书.docx(32页珍藏版)》请在冰点文库上搜索。
双机串行通信微机课程设计说明书
福建工程学院
课程设计
设计题目:
串行通信系统
专业网络工程
设计时间2/6/7--2/6/13
目录
一、概述
1.1设计背景
1.2设计要求
1.3设计方案的讨论与选择
二、概要设计
2.1所用设备
2.2设计思想
2.3电路原理与主要心片功能
2.3.18251主要功能
2.3.28279主要功能
2.3.38253主要功能
3、详细设计
3.1显示模块的实现
3.2发送模块与接收模块
3.3发送/接收时钟
3.4主程序流程图
四、接口电路逻辑图
五、调试记录
六、课程设计记录日志
七、总结体会
八、附录(程序清单)
一、概述
1.1设计背景
1).计算机之间以及计算机与一些常用的外部设备之间的数据交换,往往需要采用串行通信的方式。
在计算机远程通信中,串行通信更是一种不可缺少的通信方式。
在并行通信中,数据有多少位就要有多少根传输线,而串行通信中只需要一条传输线,所以串行通信可以节省传送线,在位数较多,传输距离较长的情况下,这个优点更为突出,但串行通信的速度比并行通信低。
2).串行通信中数据的传送模式
在串行通信中,数据通常在两个站(如A和B)之间进行传送。
串行通信可分为单工通信模式、半双工通信模式和全双工通信模式。
(1)单工(Simplex)通信模式:
该模式仅能进行一个方向的数据传送,数据只能从发送器A发送到接收器B。
(2)半双工(HalfDuplex)通信模式:
该模式能够在设备A和设备B之间交替地进行双向数据传送。
即数据可以在一个时刻从设备A传送到设备B,而另一时刻可以从设备B传送到设备A,但不能同时进行。
(3)全双工(FullDuplex)通信模式:
该模式设备A或B均能在发送的同时接收数据。
1.2设计要求
利用8251或8250完成两台计算机之间的数据传送。
1.3设计方案的讨论与选择
方案一:
两台计算机通信时,接收结果只在计算机的屏幕上显示所接收到的数据。
方案二:
两台计算机通信时,接收结果可以在试验箱上显示所接收到的数据。
初步讨论结果:
在屏幕上显示比较简单,但是不直观,为了方便查看发送的数据,就选择方案二。
二、概要设计
2.1所用设备
(1)计算机两台
功能:
用于对程序的进行编译测试等,同时还需要对实验设备进行控制,提供整个程序的运行平台,并且收集和释放硬件信号,实现程序功能。
(2)实验箱两台
功能:
此设备必须能提供我们小组做的串行通信所需的8253、8279和8251三个芯片。
并且能通过接受PC机传来的信息,显示出相应的功能以实现通信。
(3)导线若干条
功能:
用于电路和芯片之间的连接。
2.2设计思想
这次的课程设计我们小组选用的是8251、8253、8279这三个芯片来实现,我们选用的是一个单工的异步串行通信,也就是说一方发送一方接收。
发送方:
先初始化8279、8251、8253芯片,检测是否发送数据,若TxRDY为1,则发送数据,用CX来控制要发送的个数,到CX为0时结束发送。
接收方:
先初始化8279、8251、8253芯片,检测是否接收数据,若RxRDY为1,则接收数据,用CX来控制要接收的个数,到CX为0时结束接收。
2.3电路原理与主要心片功能
8251A芯片
8251A是一种可编程的同步/异步串行通信接口芯片,具有独立的接收器和发送器,能实现单工、半双工、双工通信。
由于近距离传输,所以可以不用MODEM,而直接互连。
同时采用查询方式,故接收/发送程序中只需检查发送/接收的准备好状态是否置位,在准备好时就发送或接收一个字节。
(1)在实验过程中,数据通信的基本方式可分为并行通信与串行通行,而我们的实验正是采用了串行通行方式,这种方式通信线路简单,利用线路就可实现通信,这样实验易于实现并且降低了成本,而且适合远距离通信。
(2)实验中用到的8251A就是一个可编程的通用串行通信接口芯片,在使用时必须对它进行初始化编程。
编程的内容包括两大方面:
一是由CPU发出的控制字,即方式选择控制字和操作命令控制字;另一方面是由8251A向CPU送出的状态字。
①8251A的方式控制字和命令控制字
方式控制字确定8251A的通信方式(同步/异步)、校验方式(奇校/偶校/不校)、字符长度及波特率等,格式如下图5-16所示。
命令控制字使8251A处于规定的状态以准备收发数据,格式如下图。
方式控制字和命令控制字无独立的端口地址,8251A根据写入的次序来区分。
CPU对8251A初始化时先写方式控制字,后写命令控制字。
方式选择控制字的格式如图所示。
操作命令控制字的格式如下:
②状态寄存器
状态寄存器用于寄存8251A的状态信息,供CPU查询。
各位定义如下:
TXRDY位:
当数据缓冲器空时置位,而TXRDY引脚只有当条件(数据缓冲器空·/CTS·TXE)成立时才置位。
溢出错误:
CPU没读走前一个字符,下一个字符又接收到,称为溢出错误。
帧错误:
在字符结尾没检测到停止位,称为帧错误。
状态字的格式如下:
状态字的格式
8251A内部数据总线图
8279芯片
8279芯片是一种专用于键盘/显示器的接口器件,它能对显示器自动扫描,能识别键盘上闭合的键号,提高CPU的工作效率。
8279包括键盘输入和显示输出两个部分。
键盘部分提供的扫描方式可以和64个按键或传感器阵列相连;能自动消除开关抖动以及对N键同时按下采取保护。
显示部分按扫描方式工作,可以显示8或16位LED数码管显示器。
(1)8279的引脚功能
DB0-DB7:
双向数据总线,用于在CPU和8279之间传
送命令、数据和状态;
CLK:
时钏输入线,用于产生内部定时;
RESET:
复位输入线,复位后,8279被置为以下工作方式:
16显示左边输入,编码扫描键盘双键封锁,时钟系数为31;
CS:
选片信号输入线,低电平时CPU选中8279,允许对8279进行读写操作;
A0:
缓冲器地址输入线,高电平时数据线上传送的是命令或状态信息,低电平时数据线上传送的是数据信息;
RD:
读信号输入线,低电平有效,8279内部缓冲器信息送DB0-7;
WR:
写信号输入线,低电平有效,接收数据总线DB0-7上的信息写入内部缓冲器;
IRQ:
中断请示输出线,高电平有效。
在键盘工作方式中,FIFORAM中有键输入数据时,IRQ上升为高电平,向CPU请求中断,CPU每次读出FIFORAM数据时,IRQ上升为高电平,向CPU请求中断,CPU每次读出FIFORAM数据时,IRQ变为低电平,若RAM中还有数据,IRQ在读出后又返回高电平,直至FIFO中的所有数据被读完IRQ才保持低电平。
在传感器方式中,每当检查到传感器信号变化时IRQ上升为高电平;
SL0-SL3:
扫描输出线,用以对键盘/传感器矩阵和显示器进行扫描;
RL0-RL7:
数据输入线,键盘/传感器矩阵的行(或行号)数据输入线。
该输入线内部有提高电路,使之保持高电平,也可以由外部开关拉成低电平;
SHIFT:
换档输入线,在键扫描中,闭合键的位置信息(行和列号)与换档输入线的状态一起存入FIFO,使键盘上的每个键可以定义为上、下两档功能;
CNTL/STB:
控制/选通输入线,在键盘方式中,作为控制输入线,它的状态和键输入信息一起存储到FIFO中。
在选通工作方式中,作为数据送入FIFO的选通输入线。
OUTA0~OUTA3:
四位输出口;
OUTB0~OUTB3:
四位输出口;
BD:
显示消隐输出线,低电平有效,该输出线在数字切换过程中或使用显示器熄灭命令使显示器消隐;
Vcc:
电源;
Vss:
地。
(2)8279的内部结构与工作原理
8279的内部结构主要由I/O控制及数据缓冲器、控制与定时寄存器及定时控制、扫描计数器、输入缓冲器、键盘去抖及控制、FIFO/传感器及其状态寄存器、显示RAM和显示地址寄存器组成。
•I/O控制及数据缓冲器
双向的三态数据缓冲器将内部总线和外部系统的数据总线DB0-DB7相连,用于在CPU和8279之间传送命令、数据和状态信息。
I/O控制电路以CS、A0、RD、WR线上输入信号控制总线上信息的传送,即对内部不同的寄存器和缓冲器进行读或写。
CS为片选输入线,为低电平有效。
当该引脚上为低电平时允许CPU对其进行读写,一般接系统的地址译码器。
AO为信息属性选择线,用来指出所传送的信息是命令/状态,还是数据,A0为逻辑1时,CPU写入8279的信息是控制命令,从8279读出的状态字节;A0为逻辑0时,读出和定入的信息都是数据。
A0通常接系统的地址总线低位。
•时序控制逻辑
控制和时序寄存器用于存放键盘和显示器的工作方式和其他状态信息。
时序和控制部件包含了定时计数器,其中一个计数据是N分频器,分频系数可以编程为2-31之间的任何一个数,对CLK上输入的时钟脉冲信号进行N分频,以产生基本的100KHz的内部计数信号(此时扫描时间为5.1ms,去抖动时间为10.3ms),共它计数器将100KHz信号再分频,以提供适当的键盘矩阵扫描和显示器扫描的时间。
•扫描计数器
扫描计数器有两种工作方式,一种是编码工作方式,计数器以二进制方式计数,4位计数的状态直接从扫描线SL0-SL3上输出,必须由外部译码对SL0-SL3进行译码,以产生对键盘和显示器的扫描信号,另一种是译码工作方式,对计数器的低两位进行译码后从SL0-SL3上输出,作为4×8键盘和4位显示器的扫描信号,因此在译码方式中只有显示RAM的前4个字符被显示出来。
编码方或扫描出高电平有效,译码方式中扫描输出线低电平有效。
8253芯片
计算机系统中,实现定时或延时有三种方法:
软件定时、不可编程的硬件定时、可编程的硬件定时器。
8253为可编程的硬件定时/计数器。
1.主要功能
*具有3个独立的16位计数器通道;
*每个计数器均可按二进制或二—十进制计数;
*每个计数器的计数速率高达2MHz;
*每个通道有6种工作方式,可由程序设置和改变;
*所有的输入输出都与TTL兼容。
2、8253内部结构图
3、8253控制字
在8253的初始化编程中,由CPU向8253的控制字寄存器写入一个控制字来规定8253的工作方式。
4、8253还有5种工作方式
方式0——计数结束中
方式1——可重复触发的单稳态触发器
方式2——频率发生器
方式3——方波发生器
方式4(软件触发选通)
方式5(硬件触发选通)
三、详细设计
3.1显示模块的实现
使用8279控制,用数码管的显示功能来设计,显示部分用八只LED为显示管,这些LED发光二极管的阴极是互相连接在一起的,所以称为共阴极数码管。
通过在这八只发光二极管的阳极加+5V或0V的电压使不同的二极管发光,形成不同的字符和数字。
具体代码如下:
pushcx
movch,al
movcl,4
roral,cl
andal,0fh;将al的高4位,移动到低4位
pushax
movdx,z8279
moval,81h
outdx,al;将81h
popax
leabx,led
xlat
movdx,d8279;显示转换结果高4位
outdx,al
calldelay
moval,ch
andal,0fh
pushax
movdx,z8279
moval,80h
outdx,al
popax
leabx,led
xlat
movdx,d8279;显示转换结果低4位
outdx,al
calldelay
popcx
3.2发送与接收模块
该模块是用8251的芯片实现的,通过检测是否TxTDY和RxRDY是否为1,检测发送和接收数据,代码如下:
发送方:
movcx,13
next:
movdx,209h
inal,dx
testal,01h;TxRDY?
jznext
moval,[si]
outdx,al;逐个发送数据
incsi
Loopnext
接收方:
movdi,offsetdat2
xorcx,cx
movcx,15
next:
movdx,209h
inal,dx
testal,02h;RxRDY?
jznext
movdx,208h
inal,dx;逐个接收数据
mov[di],al
incdi
3.3发送/接收时钟
在异步串行通信中,发送端需要用一定的频率时钟来决定每一位数据发送所占的时间长度,接收端也要用一定的频率时钟来测定每一位输入数据的时间长度,TxCLK和RxCLK一起接在8253的OUT1的引脚,8253的CS接200H~207H,将其计数器1设置在计数方式3,使其对1MHz的输入脉冲52分频,这样OUT1会输出19.2KHz的脉冲,再取波特率因子为16,最后获得的串行通信波特率为1200bps。
3.4主程序流程图
四、接口电路逻辑图
电路逻辑图:
5、调试记录
1、为方便查看接收的数据将Rbufdb7dup(?
)改为Rbufdb7dup
(1),这样在代码的代码段窗口可以看到该区的7个1即可以判断在程序运行后Rbuf应该显示接收11,22,33,44,55,66,77,这7个数据。
2、按F8单步运行,先让接收端运行到允许部分,在运行发送端,先在发送端观察到了AX寄存器的值11,继续在发送端单步运行,在接收端可以观察到了相应接收的数据11,22,33,44,55,66,77。
3、在程序运行过程中经过单步运行,发现卡在了读取数据计数值CX处,movcx,count,而CX是由equ语句获得countequ$-dat。
就删了直接将cx赋值7,即为要发送的数据个数。
4、在优化程序时,发现先全速运行接收方,时间间隔不长的情况下,全速运行发送方可以观察到发送方发送的数据,而间隔比较长时间时就接收不到发送发送的数据。
接着就用F8单步运行,发现发送方卡在了测试接收数据的阶段,修改前的代码如下:
发送方:
leasi,dat
leadi,dat1
AA:
movdx,209h
inal,dx
testal,01h;TxRDY?
jznext
moval,[si]
outdx,al;发送1
movdx,209h
inal,dx
testal,02h
jzAA
movdx,208h
inal,dx
mov[di],al;接收1
xorbl,bl
movbl,[di]
cmpbl,1h
jneAA
movdx,209h
inal,dx
testal,01h;TxRDY?
jznext;发送1
moval,[si]
outdx,al
接收方:
leasi,dat
leadi,dat1
AA:
movdx,209h
inal,dx
testal,01h;TxRDY?
jznext
moval,[si]
outdx,al;发送1
movdx,209h
inal,dx
testal,02h
jzAA
movdx,208h
inal,dx
mov[di],al;接收1
xorbl,bl
movbl,[di]
cmpbl,1h
jneAA
movdx,209h
inal,dx
testal,01h;TxRDY?
jznext;发送1
moval,[si]
outdx,al
两处的代码都是一样的,运行发送方的话,在检测接收的情况下,又不断的发送数据,导致了接收方接收的数据不正确,先运行接收方也是一样的情况。
改进如下:
AA:
movdx,209h
inal,dx
testal,01h;TxRDY?
jznext
moval,[si]
outdx,al;发送1
BB:
movdx,209h
inal,dx
testal,02h
jzBB
将这里的检测接收代码段标为BB,状态还没准备好时跳到该阶段,而不是AA这个发送的阶段。
6、课程设计记录日志
2012/6/7:
由于该实验在之前做过类似的,在用自己编写的程序多次不成功的情况下,可能是实验箱的问题,也可能是程序问题,没有找到原因的情况下,然后决定用老师之前给的程序,做自发自收的,修改了一些相关数据之后用单步运行,具体如下:
Rbufdb7dup(?
)改为Rbufdb7dup
(1)
这样在代码的数据段窗口可以看到Rbuf区的7个1即可以判断在程序运行后Rbuf应该显示接收的11,22,33,44,55,66,77,,但是做了很多次,结果还是失败了,原因很多,得一步一步排除和分析。
2012/6/8:
继续第一天的程序,在进行很多次实验后,未果。
在下午的一次实验中,最开始时,进行的是全速运行,但是结果端还是没有发现接收到的数据11,22,33,44,55,66,77
分析:
通过单步运行,先让接收端运行到允许部分,在运行发送端
解决方法:
按F8单步运行
结果:
1.先在发送端观察到了AX寄存器的值11,继续在发送端单步运行,在接收端可以观察到了相应接收的数据11,22,33,44,55,66,77。
2.一般是实验箱的硬件问题,导致了实验过程中有时接收不到数据,从而得不到结论。
2012/6/11:
过了一个周末,继续实验,又发现了一些问题,不能得到结果。
在程序运行过程中经过单步运行,发现卡在了读取数据计数值CX处,movcx,count,而CX是由equ语句获得countequ$-dat。
问题分析:
由于该实验对于硬件要求比较高,所以考虑到了两方面的原因
1.硬件问题,读取不了数据;
2.程序初步分析不会有问题,所以可能是编译软件对于countequ$-dat的处理有编译问题,导致程序运行不了。
解决方法:
1.对于解决硬件问题,是通过自发自收的程序来测试试验箱是否没问题,在测试时对应的代码段窗口可以看到11,22,33,44,55,66,77,11,22,33,44,55,66,77的连续数据显示,在测试了十几个试验箱后,找到了相对较好的两个,花了将近一个小时的时间。
2.修改前是:
countequ$-dat
movcx,count
修改后:
直接将cx赋值7,要发送的数据个数。
在排除硬件问题的情况下,调试了程序,发现在接收端看到了接收的数据11,22,33,44,55,66,77,并让它在数码管上显示出来。
但是改程序不足的地方是,要先执行接收端,在执行发送端才可以接收到数据,发过来接收不到数据。
2012/6/11:
程序已经可以运行了,结果也成功的显示,但是不足的问题还有很多,小组一直在讨论解决。
在修改程序时也发现了一些问题,具体有:
1.在8251的先初始化命令控制字时,moval,40h,01000000b,可以看到D6为1,该位表示的是8251的内部复位,则方式控制字应该写在命令控制字之后。
2.关于6个数码管的初始清零问题,一共有6个数码管,所以清零循环CX为6,但是之前程序是设置为3,清零不完全,导致了后续的读写数据表有冲突,即数码管未清零又有取值,就导致了查表不符,于是出错。
在讨论后,未达成一致,在优化的思想上还是没有突破。
2012/6/12:
为了优化,并改进要先执行接收端,在执行发送端才可以接收到数据的问题,修改了程序。
小组讨论了将近1小时多,具体思想如下:
1.在发送端也加上了显示发送的数据。
即发送端上显示要发送的内容,这样可以比较直观的看到发送与接收是否一致。
2.在接收端和发送端上的程序初始化8251,8253,8279之后添加上发送01H的程序,接着就是接收检测,检测发送端是否发送了01H,如果检测到接收了01H,说明发送端已将开始运行;如果没有接收到01H则继续等待接收发送端发送的数据。
当接收了发送端发送的01H后,说明发送端开始工作,接收端在发送一次01H,确保发送端也接收到01H,这样发送端就不会进入无限等待接收的状态,确保了之后发送端发送的数据能让接收端接收到。
从而消除了接收方要先运行才能接收到数据的限制。
3.有了思路在程序的多次修改并不断调试的情况下,终于解决了这个问题,该实验也有了突破性的进展。
7、总结体会
11:
作为组长,很高兴能带领一个小组在这一周里在共同努力下作出了一些成效。
小组成员都很积极,每一次的讨论,都会有不少的收获。
比如在讨论如何让任意一台机箱先运行都能使数据传输问题时,自己之前也有学习过TCP/IP协议所以结合到当前问题就想到了TCP/IP协议的三次握手来保障通信的正常,在小组讨论觉得可行,经修改与调试后,证明可行。
有时候自己想的问题会遭遇瓶颈,但是集齐一个小组的智慧就不一样了,问题就会转变为答案,我觉得这是我最大的收获。
三个臭皮匠赛过一个诸葛亮。
22:
作为书记员,考勤和每天的工作记录我都有认真落实,我想在这样一个团队中,我们每个人都应该发挥一点自己的长处,不论是分析问题,还是处理问题上,大家都应该积极的参与,我觉得让我最有成就感的是,我调试出了,不用单步也可以查看到数据的变化问题,之前因为延时的问题每次在全速运行的时候不能看到数据的变化,而是从一开始的11瞬间变到77,就是计算机运行的速度太快了导致看不到结果,我修改了程序,让它在读取要发送的数据时用LED数码管上显示,这样就延迟了数据发送,让它在接收端的数码管上不会变化的那么快。
还有就是在最后优化阶段,要解决不要先运行接收端也可以接收到数据的时候,小组在一直讨论,并把想出的方案在程序上实现,当然由于粗心问题,错误很多,在编译器的提示和大家一起细心排错的情况下,终于解决了这个问题。
这期间让我感悟最深的是,大家积极讨论解决问题的精神,合作很愉快!
就像你的一个苹果跟我一个苹果交换了还是一个苹果,但是你的思想跟的我的思想交换了就是两个思想,不管是微机上的知识还是合作上的精神都收获甚多!
66:
通过这短短的一周的课程设计,感觉学到了很多的东西,特别是经过团队的相互配合,产生了许多好的思想,这是这次项目中最值得珍藏的东西,让我明白了团结的力量,也许如果没有几个人的共同努力想要完成这个课程设计,我想难度有多大是可想而知的。
说真的在还没有课程设计之前我对微机这门课的许多知识点还是有很多都是半懂的,可是经过这次加深了对其认识,一个个问题被我们攻破的那种喜悦,我想大家都是有共同体会的,真希望能有多几次这样的课程设计。
77:
一周的《微型计算机原理与接口技术》的专周一转眼就过去了,通过我们小组成员的努力,总算是完成了任务,其中的每一个环节,都留下了我们每一个人的欢笑与汗水。
开始时,我们都很迷茫,不知道从何入手。
我们知道,串行通信看起来简单,但是要实现起来也不是很容易。
我们分工明确,一部分人去查资料,一部分人去挑选机器,从20几台机器中总算是挑出了2台能实现通信的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双机串行通信 微机课程设计说明书 双机 串行 通信 微机 课程设计 说明书