微机原理串口通信课程设计.docx
《微机原理串口通信课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理串口通信课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
![微机原理串口通信课程设计.docx](https://file1.bdocx.com/fileroot1/2022-12/13/806d71c3-5b63-434c-a119-f41781946043/806d71c3-5b63-434c-a119-f417819460431.gif)
微机原理串口通信课程设计
1基础理论知识
1.1通信的方式
通信的基本方式可以分为并行通信和串行通信两种。
串行通信时数据用一根传输线逐为顺序传送。
并行通信和串行通信是CPU与外部设备之间进行信息交换的基本方法。
采用并行通信时,构成一个字符或数据的各位同时传送,每一位都占用一条通信线,另外还需要联络以保证和外围设备协调地工作,它具有较高的传输速度。
但由于在长线上驱动和接收信号较困难,驱动和接收电路较复杂,因此并行通信的传输距离受到限制,这种通信方式多用于计算机内部,或者作为计算机与近距离外围设备传输信息用。
1.2串行通信
串行通信分为两种类型:
串行异步通信和串行同步通信。
串行异步通信是指通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。
同步通信时指在约定的数据通信数率下,发送方和接收方的时钟信号频率和相位始终保持一致,通信双方发送数据和接收数据具有完全一致的定时关系。
串行通信的数据传输方式分为单工传送,半双工传送,全双工传送。
单工传送:
单工传送时指在通信时只能由一方发送数据,另一方接收数据的通信方式。
半双工传送:
指在通信时双方都能够接收或者发送,但是不能够同时接收和发送的通信方式。
全双工传送:
通信双方之间有两条通路,发送信息和接收信息可以同时进行。
2串口通信芯片8250
2.18250的内部结构
INS8250是通用异步收发器UART,用作异步通信接口电路。
INS8250的引脚信号基本上可以分为两大类:
与CPU系统总线相连的信号线和与通信设备MODEM连接的信号线
2.28251的内部寄存器及其编程方法
在微机中用可编程芯片8250来实现串行通信。
由于8250的引脚较多,在此就不列出了,仅列出它的几个寄存器,因为在编写串行通信程序时要使用这些寄存器。
2.2.1波特率因子寄存器(DLL/DLH)
8250芯片规定当线路控制寄存器写入D7=1时,接着对口地址3F8H、3F9H可分别写入波特率因子的低字节和高字节,即写入除数寄存器(L)和除数寄存器(H)中。
而波特率为1.8432MHZ/(波特率因子╳16),波特率和除数对照表见下表:
十进制
十六进制
波特率
1047
417
110
768
300
100
384
180
300
192
C0
600
96
60
1200
48
30
2400
24
18
4800
12
C
9600
2.2.2通信线路控制寄存器(LCR)(3FBH)
该寄存器规定了异步串行通信的数据格式。
各位含义如下:
D7
D6
D5
D4
D3
D2
D1
D0
DLAB
SB
SP
EPS
PEN
STB
WLS1
WLS0
其中:
D1~D0是字长。
它们的取值和对应的字长如下表:
00
5位
01
6位
10
7位
11
8位
D2是停止位。
它的取值和对应的停止位如下表:
0
1位
1
15位(数据位5位)
2位(数据位6、7、8位)
D3说明是否允许奇偶校验。
如果为0无奇偶校验,如果为1允许奇偶校验。
D4说明是奇校验还是偶校验。
如果为0是奇校验,如果为1是偶校验。
这一位起作用的前题是D3为1。
D5说明是否有附加奇偶校验位。
如果为0无附加奇偶校验位,如果为1有附加奇偶校验位。
D6如果为0正常,如果为1发空缺位。
D7如果为0允许访问接收、发送数据寄存器或中断允许寄存器。
如果为0允许访问波特率因子寄存器。
通信线路控制寄存器LCR主要用来指定异步通信数据格式,即字符长度、停止位位数、奇偶校验。
LCR的控制字如下
2.2.3通信线路状态寄存器(3FDH)
该寄存器向CPU提供有关数据传输的状态信息,各位含义如下:
D7
D6
D5
D4
D3
D2
D1
D0
0
TSRE
THRE
BT
FE
PE
OE
DR
D0:
DR,接收数据就绪D1:
OE,数据重叠错D2:
PE,数据奇偶错
D3:
FE,缺少正确停止位D4:
BI,接收空缺位D5:
THRE,发送保持器空
D6:
TSRE,发送移位寄存器空
读入时各数据位等于1有效,读入操作后各位均复位。
除D6位外,其它位还可被CPU写入,同样可产生中断请求。
2.2.4中断允许寄存器(3F9H)
该寄存器允许8250四种类型中断(相应位置1)并通过IRQ4向8088CPU发中断请求。
各位含义如下:
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
EMSI
ELSI
ETBEI
ERBFI
D0:
为1允许接收缓冲区满中断
D1:
为1允许发送保持器空中断
D2:
为1允许接收数据出错中断
D3:
为1允许Modem状态改变中断
2.2.5中断识别寄存器(3FAH)
为了具体识别时哪种事件引起的中断,直到该中断请求被CPU响应并服务之后,才能接收其他的中断请求。
该寄存器为只读寄存器,内容格式为
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
ID2
ID1
IP
2.2.6调制解调控制寄存器(3FCH)
MODEM控制寄存器用来设置对MODEM的联络控制信号和芯片自检,寄存器的各位定义
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
LOOP
OUT2
OUT1
RTS
DTR
D0:
DTR=1,数据终端就绪,输出端DTR为低电平
D1:
RTS=1,请求发送,输出端RTS为低电平
D2:
OUT1=1,用户指令输出,输出端OUT1为低电平
D3:
OUT2=1,输出端OUT2为低电平,允许发送IRQ4中断请求
D4:
循环(自诊断用)=1,发送数据立即被接收,可用于自检
2.2.7MODEM状态寄存器(3FEH)
Modem状态寄存器用来检测和记录来自Modem的联络信号及其状态变化。
此寄存器的各位定义为:
D7
D6
D5
D4
D3
D2
D1
D0
RLSD
RI
DSR
CTS
△RLSD
△RI
△DSR
△CTS
2.2.8发送保持寄存器和接收缓冲寄存器(3F8H)
发送时,CPU首先将待发送的字符写到8250的发送保持寄存器THR中,然后进入发送移位寄存器,在发送始终的作用下,从SOUT引脚输出。
一旦THR的内容送到发送移位寄存器TSR后,THR就变空,同时将LSR的THRE位置“1”,产生中断请求,要求CPU发送下一个字符。
CPU向THR写入下一个字符后,THRE位自动清“0”。
如此重复,直到全部数据发送完毕。
接收时,串行数据在接收时钟的作用下,从SIN引脚先输入到移位寄存器RSR,然后由RSR并行输入到接收缓冲寄存器RBR,一旦RBR变满,将LSR的DR位置“1”,产生中断请求,要求CPU读取数据字符。
CPU从RBR读取该字符后,DR位自动清“0”。
如此重复,直到所有的数据接收完毕。
2.38250的各寄存器的地址
寄存器
COM1端口下的地址
COM2端口下的地址
发送保持寄存器(THR)
3F8H
2F8H
接收数据寄存器(RBR)
3F8H
2F8H
低字节波特率因子(设置工作方式控制字D7=1)(LSB)
3F8H
2F8H
高字节波特率因子(设置工作方式控制字D7=1)(MSB)
3F9H1
2F9H1
中断允许寄存器(IER)
3F9H
2F9H
中断识别寄存器(IIR)
3FAH
2FAH
线路控制寄存器(LCR)
3FBH
2FBH
MODEM控制寄存器(MCR)
3FCH
2FCH
线路状态寄存器(LSR)
3FDH
2FDH
MODEM状态寄存器(MSR)
3FEH
2FEH
3程序设计
3.1程序设计思路
根据设计要求,要实现通过串口进行通信,就必须有一个发送端和一个接收端,因此要编写两个程序,在发送端编写发送程序,在接受端编写接收程序。
发送PC机和接收PC机通过RS-232C的3根信号线(TXD、RXD、GND)进行相连。
我决定采用查询方式编写发送程序和接收程序。
编写发送程序的时候,首先要初始化段寄存器,设置发送缓冲区指针。
然后初始化8250,通过初始化8250来设置串口的参数。
再根据线路状态寄存器的内容,测试发送保持寄存器是否为空,如果不为空,继续读线状态寄存器的内容,判断发送保持寄存器是否为空,如果为空的话,读取按键字符并显示和发送它。
我事先规定当输入某一个字符的时候发送结束,这时候我就要判断按键是否为该字符,是该字符的时候结束程序。
编写接收程序的时候首先要设置接收缓冲区,设置接收错信息,初始段寄存器,设置接收缓冲寄存器地址指针然后初始化8250,初始设置和接收端的保持一置。
以上完成后开始接收,在屏幕上显示接收开始。
然后读线状态寄存器,判断是否接收错,在屏幕上显示接收错误,继续读线状态寄存器,如果接收无误,则测试接收数据是否准备好了,为准备好则循环测试,准备好了则接收字符。
判断接收的字符是否为规定的结束字符,如果是结束程序,如果不是显示字符。
两台机器的连接图如下。
3.2程序流程图
3.2.1发送端程序流程图
开始
初始段寄存器,设置发送缓冲区指针
初始8250:
1200波特、7位数据、奇校验、1位停止位、禁止中断
屏幕显示:
发送开始
读线状态寄存器
发送保持寄存器空?
发送字符
屏幕上显示字符
是‘P’?
结束
N
N
Y
Y
3.2.2接收端的程序流程图
3.3具体的程序
3.3.1发送端的程序代码
STACKSEGMENTPARASTACK'STACK'
DB200DUP(0)
STACKENDS
DATASEGMENT
DISPDB'TRANSMISSIONSTART:
',0AH,0DH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVDX,3FBH;置DLAB=1
MOVAL,80H
OUTDX,AL
MOVDX,3F8H;置波特率因子寄存器
MOVAL,0CH;波特率因子低字节
OUTDX,AL
MOVDX,3F9H
MOVAL,0;波特率因子高字节
OUTDX,AL
MOVDX,3FBH;置线路控制寄存器
MOVAL,03H;数据位8位,停止位1位、无校验
OUTDX,AL
MOVDX,3FCH;置MODEM控制寄存器
MOVAL,02H;禁止中断
OUTDX,AL
MOVDX,3F9H;置中断允许寄存器
MOVAL,0;屏蔽所有中断
OUTDX,AL
MOVDX,OFFSETDISP;显示发送提示信息
MOVAH,9
INT21H
LO0P:
MOVDX,3FDH;读线路状态寄存器
INAL,DX
TESTAL,20H;测试发送保持寄存器
JZL0OP;不空,则循环测试
MOVAH,1;读取按键字符并显示
INT21H
MOVDX,3F8H;发送该字符
OUTDX,AL
CMPAL,’P’;判断按下的字符是否为P
JZOVER;是,则结束
JMPLOP;不是继续循环
OVER:
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
3.3.2接收端的程序源代码
STACKSEGMENTPARASTACK'STACK'
DB200DUP(0)
STACKENDS
DATASEGMENT
RBUFDB30DUP(0)
DISPDB'RECEIVESTART:
',0AH,0DH,'$'
ERRORDB'RECEIVEERRO!
',0AH,0DH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
LEASI,RBUF;置接收缓冲区地址指针
MOVDX,3FBH;置DLAB=1
MOVAL,80H
OUTDX,AL
MOVDX,3F8H;置波特率因子寄存器
MOVAL,0CH;波特率因子低字节
OUTDX,AL
MOVDX,3F9H
MOVAL,0;波特率因子高字节
OUTDX,AL
MOVDX,3FBH;置通信线路控制寄存器
MOVAL,0AH;数据位8位,停止位1位、无校验
OUTDX,AL
MOVDX,3FCH;置MODEM控制寄存器
MOVAL,02;禁止中断
OUTDX,AL
MOVDX,3F9H;置中断允许寄存器
MOVAL,0;屏蔽所有中断
OUTDX,AL
MOVDX,OFFSETDISP;显示接收提示信息
MOVAH,9
INT21H
MOVDX,3F8H;读接收缓冲器内容,不处理
INAL,DX
LOP:
MOVDX,3FDH;读线路状态寄存器
INAL,DX
TESTAL,1EH;测试接收错误?
JNZER;有,转错误显示
TESTAL,01H;无,则测试接收数据准备好
JZLOP;未准备好则循环测试
MOVDX,3F8H
INAL,DX
ANDAL,7FH
CMPAL,’P’;判断接收结束吗?
JZOVER;结束转OVER
MOV[SI],AL;未结束则存入缓冲区
INCSI
MOVDL,AL;显示该字符
MOVAH,02
INT21H
JMPLOP
ER:
MOVDX,3F8H;清标志位
INAL,DX
MOVDX,OFFSETERROR;显示错误信息
MOVAH,9
INT21H
JMPLOP
OVER:
MOVDL,AL
MOVAH,2
INT21H
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
4.心得体会
这次微机原理课程里我学到了很多在书本上所没有学到过的知识。
以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。
但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。
因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。
其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在曾老师的辛勤指导下,终于迎刃而解。
同时,在曾老师的身上我学得到很多实用的知识,在此我表示感谢!
同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
[1]姚燕男,薛钧义编著.微型计算机原理与接口技术.北京:
高等教育出版社.2004
[2]刘永华,王成端编著.微型机原理与接口技术.北京:
清华大学出版社.2006
[3]杨立等编著.微型计算机原理与接口技术.北京:
中国水利水电出版社.2005
[4]张荣标等编著.微型计算机原理与接口技术.北京:
机械工业出版社.2005
[5]古辉主编.微型计算机接口技术.北京:
科学出版社.2006