8051单片机的异步串行通信技术.docx

上传人:b****5 文档编号:3956734 上传时间:2022-11-26 格式:DOCX 页数:16 大小:24.27KB
下载 相关 举报
8051单片机的异步串行通信技术.docx_第1页
第1页 / 共16页
8051单片机的异步串行通信技术.docx_第2页
第2页 / 共16页
8051单片机的异步串行通信技术.docx_第3页
第3页 / 共16页
8051单片机的异步串行通信技术.docx_第4页
第4页 / 共16页
8051单片机的异步串行通信技术.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

8051单片机的异步串行通信技术.docx

《8051单片机的异步串行通信技术.docx》由会员分享,可在线阅读,更多相关《8051单片机的异步串行通信技术.docx(16页珍藏版)》请在冰豆网上搜索。

8051单片机的异步串行通信技术.docx

8051单片机的异步串行通信技术

第八章8051单片机的异步串行通信技术

第一节概述

计算机与外界的信息交换称为通信。

常用通信方式有两种:

并行通信与串行通信,简称并行传送和串行传送。

并行传送具有传送速度快,效率高等优点,但传送多少数据位就需要多少根数据线,传送成本高;串行传送是按位顺序进行数据传送,最少仅需要一根传输线即可完成,传送距离远,但传送速度慢。

串行通信又分同步和异步两种方式。

同步通信中,在数据传送开始时先用同步字符来指示(常约定1—2个),并由同时传送的时钟信号来实现发送端和接收端同步,即检测到规定的同步字符后,接着就连续按顺序传送数据。

这种传送方式对硬件结构要求较高。

在单片机异步通信中,数据分为一帧一帧地传送,即异步串行通信一次传送一个完整字符,字符格式如图8—1所示:

 

图8—1异步串行通信的字符格式

一个字符应包括以下信息:

1.起始位:

对应逻辑0(space)状态。

发送器通过发送起始位开始一帧字符的传送。

2.数据位:

起始位之后传送数据位。

数据位中低位在前,高位在后。

数据位可以是5、6、7、8位。

3.奇偶校验位:

奇偶校验位实际上是传送的附加位,若该位用于用于奇偶校验,可校检串行传送的正确性。

奇偶校验位的设置与否及校验方式(奇校验还是偶校验)由用户需要确定。

4.停止位:

用逻辑1(mark)表示。

停止位标志一个字符传送的结束。

停止位可以是1、1.5或2位。

串行通信中用每秒传送二进制数据位的数量表示传送速率,称为波特率。

1波特=1bps(位/秒)

例如数据传送速率是240帧/秒,每帧由一位起始位、八位数据位和一位停止位组成,则传送速率为:

10×240=2400位/秒=2400波特

单片机的串行通信主要采用异步通信传送方式。

在串行通信中,按不同的通信方向有单工传送和双工传送之分,如图8—2所示:

甲机乙机

(a)单工传送

甲机乙机

(b)双工传送

甲机乙机

(c)全双工传送

图8—2单片机串行通信方向示意

图8—2(a)中,甲.乙两机只能单方向发送或接收数据;

图8—2(b)中,甲机和乙机能分时进行双向发送和接收数据;

图8—2(c)中,甲,乙两机能同时双向发送和接收数据。

 

第二节8051串行口的基本结构

MCS—51系列单片机串行口结构框图如图8—3所示:

 

图8—38051串行口结构框图

一、串行口缓冲寄存器SBUF

图8—3中SUBF是串行口缓冲寄存器,发送SBUF和接收SBUF地址同为99H,但由于发送SBUF不能接收数据,接收SBUF也不具有发送功能,故二者工作互不干扰。

当CPU向SBUF写入时,数据进入发送SBUF,同时启动串行发送;CPU读SBUF时,实际上是读接收SBUF数据。

二、串行通信控制寄存器

与串行通信有关的控制寄存器主要是串行通信控制寄存器SCON。

SCON是8051的一个可以位寻址的专用寄存器,用于串行数据通信的控制。

SCON的单元地址98H,位地址9FH—98H。

寄存器内容及位地址表示如下:

SCON

位地址

9F

9E

9D

9C

9B

9A

99

98

位符号

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

各位功能说明如下:

 

位符号

功能说明

SM0,SM1

SM0,SM1──串行口工作方式选择位:

SM0SM1工作方式功能

0008位数码传送,波特率固定,为f晶振/12。

01110位数码传送,波特率可变。

10211位数码传送,波特率固定,为f晶振/64或f晶振/32。

11311位数码传送,波特率可变。

SM2

SM2──多机通信控制位:

当串行口以方式2或方式3接收时,如SM2=1,则只有当接收到的第九位数据(RB8)为1,才将接收到的前8位数据送入接收SBUF,并使RI位置1,产生中断请求信号;否则将接收到的前8位数据丢弃。

而当SM2=0时,则不论第九位数据为0还是为1,都将前8位数据装入接收SBUF中,并产生中断请求信号。

对方式0,SM2必须为0,对方式1,当SM2=1,只有接收到有效停止位后才使RI位置1。

REN

REN──允许接收位,用于对串行数据的接收进行控制:

REN=0,禁止接收;REN=1,允许接收。

该位由软件置1或清零。

TB8

TB8──发送数据位8:

在方式2和方式3时,TB8是要发送的第9位数据。

RB8

RB8——接收数据位8:

在方式2和方式3中,RB8位存放接收到的第9位数据

TI

TI──发送中断标志:

当方式0时,发送完第8位数据后,该位由硬件置位。

在其它方式下,于发送停止位之前由硬件置位。

因此TI=1,表示帧发送结束。

其状态既可供软件查询使用,也可请求中断。

TI位由软件清0。

RI

RI──接收中断标志:

当方式0时,接收完第8位数据后,该位由硬件置1。

在其它方式下,当接收到停止位时,该位由硬件置位。

因此RI=1,表示帧接收结束。

其状态既可供软件查询使用,也可以请求中断。

RI位由软件清0。

另外,电源控制寄存器PCON中SMOD位可影响串行口的波特率。

当(SMOD)=1,串行口波特率加倍。

还有中断允许寄存器IE中的ES位可选择串行口中断允许或禁止。

ES=0,禁止串行口中断

ES=1,允许串行口中断

第三节8051串行通信工作方式及应用

8051单片机的串行通信共有四种工作方式:

1.串行工作方式0

串行口为同步移位寄存器方式,波特率固定为f晶振/12。

该方式主要用于I/O口扩展等,方式0传送数据时,串行数据由RXD(P3.0)端输入或输出,而TXD(P3.1)此时仅作为同步移位脉冲发生器发出移位脉冲。

串行数据的发送和接收以8位为一帧,不设起始位和停止位,其格式如下:

D0

D1

D2

D3

D4

D5

D6

D7

方式0输出数据时,向SBUF写入数据的指令:

MOVSBUF,A

或:

MOVSBUF,XXH

即为从RXD端输出数据的发送启动指令。

当8位数据全部移出后,SCON中的TI位被自动置1。

方式0输入数据时,使SCON中REN位置1指令:

SETBREN

即为从RXD端输入数据启动指令。

当接收到8位数据后SCON中的RI位被自动置1。

方式0工作时往往需要外部有串入并出寄存器(输出)和并入串出寄存器(输入)配合使用,方式0多用于将串行口转变为并行口的使用场合,如图8—4所示:

并行输出并行输入

8051串行输出P8……P18051串行输入P8……P1

RXDDCD4094RXDQ8CD4014

TXDCLKSTBTXDCLKP/S

移位脉冲移位脉冲

P1.0P1.0

(a)(b)

图8—4串行工作方式0与输入,输出电路的连接示例

图8—4(a)中CD4094是”串入并出”移位寄存器,TXD端输出频率为F晶振/12的固定方波信号(移位脉冲),在该移位脉冲的作用下,D端串行输入数据可依次存入CD4094内部8D锁存器锁存。

P1.0为选通信号,当P1.0=STB为高电平时,将内部8D锁存器数据并行输出。

图8—4(b)中CD4014为“串入/并出—串出”移位寄存器,P1—P8为并行输入端,Q8为串行输出端,当P1.0=P/S=1,加在并行输入端P1—P8上的数据在时钟脉冲作用下从Q8端串行输出。

方式0的移位操作的波特率固定为单片机晶振频率f晶振的十二分之一。

即:

波特率=f晶振/12。

例如当f晶振=12MHZ,波特率=106(位/秒)。

例8—1试编写从CD4094并行输出数据36H的参考程序:

解:

参考程序如下:

MOVSCON,#00H;串行口工作方式0。

CLRES;禁止串行口中断。

MOVA,#36H;传送数据送A。

CLRP1.0;关闭并行输出。

MOVSBUF,A;启动串行输出。

HERE:

JBCTI,FS;等待串行输出完毕。

AJMPHERE

FS:

SETBP1.0;开启并行输出。

RET;返回。

2.串行工作方式1

(1)方式1传送的数据格式

方式1传送一帧为10位的串行数据,包括1位起始位,8位数据位和1位停止位。

其帧格式为:

始D0D1D2D3D4D5D6D7停

(2)方式1的波特率的确定

方式1的波特率是可变的,计算公式为:

波特率=(2smod/32)×(T1溢出率)

其中smod为PCON寄存器最高位的值。

所谓定时器T1的溢出就是T1在单位时间内溢出的次数。

如设T1为工作方式2,那么T1定时时间:

T1定时=(28—X)×T机=(28—X)×12/F晶振

则T1的溢出率=1/T1定时=F晶振/(12(28—X))

由此可得波特率的计算公式为:

波特率=(2smod/32)×F晶振/(12(28—X))

实际使用时总是先确定波特率,再计算定时器T1的记数初值X,然后进行T1的初始化。

根据上述波特率的计算公式,可得T1记数初值的计算公式为:

X=256-(F晶振×2smod)/(384×波特率)

定时器T1之所以选择工作方式2,是因为方式2具有自动加载功能,可避免通过程序反复装入计数初值而影响波特率的准确性。

(3)方式1数据的发送和接收

方式1的数据发送由一条写入单片机发送寄存器SBUF指令启动。

8位数据在串行口由硬件自动加入起始位和停止位组成完整的帧格式。

在内部移位脉冲作用下,由TXD端串行输出。

发送完一帧数据后,使TXD输出端维持”1”状态并置使TI标志位置1以通知CPU发送下一个字符。

接收数据由接收单片机SCON中的REN置1开始,随后串行口不断采样RXD端电平,当采样到RXD端电平从1向0跳变时,就认定是接收信号并开始接收从RXD端输入的数据,并送入内部接收寄存器SBUF中,直到停止位到来之后,并使RI位置1,通知CPU从SBUF中取走接收到的一帧字符。

方式1传送数据时发送前应先清TI,接收前应先清RI。

例8—2甲,乙两单片机拟以工作方式1进行串行数据通信,波特率为1200,甲机发送,发送数据在甲机外部RAM1000H-101FH单元中。

乙机接收,并把接收数据依次放入乙机外部RAM1000H-101FH单元中。

甲,乙机晶振频率均为6MHZ。

连接方式如图8—5所示:

TXDRXD

甲机乙机

图8—5例8—2示意图

解:

设定:

(1)甲、乙机定时用工作方式2,即初值

6×106×1

384×1200

X=256-=243=F3H

(2)SMOD=0,即波特率不倍增。

(3)用查询传送方式。

(4)SCON=01000000B=40H

可得甲机发送主程序如下:

ORG0030H

MOVTMOD,#20H;设定时器1工作方式2。

MOVTL1,#0F3H;设置定时器初值。

MOVTH1,#0F3H;设置重装值。

CLREA;禁止中断。

MOVPCON,#00H;(SMOD)=0。

MOVSCON,#40H;设串行工作方式1,禁止接收。

MOVDPTR,#1000H;建立发送数据地址指针初值。

MOVR7,#20H;建立计数指针。

SETBTR1;启动定时器1。

SEND:

MOVXA,@DPTR;取数据。

MOVSBUF,A;启动数据传送操作。

JNBTI,$;等待一帧发送完毕。

CLRTI;清TI标志。

INCDPTR;指向下一单元。

DJNZR7,SEND;数据块传送结束?

没结束继续传送。

CLRTR1;传送结束,停止定时器1工作。

RET;返回。

乙机接收参考程序如下:

ORG0030H

MOVTMOD,#20H;设定时器1工作方式2。

MOVTL1,#0F3H;设置定时器初值。

MOVTH1,#0F3H;设置重装值。

CLREA;禁止中断。

MOVPCON,#00H;SMOD=0。

MOVSCON,#40H;设串行工作方式1。

MOVDPTR,#1000H;建立接收地址指针初值。

MOVR7,#20H;建立计数指针。

SETBTR1;启动定时器T1。

SETBREN;启动接收数据操作。

RECIV:

JNBRI,$;等待数据接收完毕。

CLRRI;清RI标志。

MOVA,SBUF;取数据。

MOVX@DPTR,A;送外部RAM。

INCDPTR;指向下一单元。

DJNZR7,RECIV;数据块接收完毕?

没完继续接收。

CLRTR1;接收完毕,停止定时器1工作。

RET;返回。

如改用中断方式甲机发送参考程序如下:

ORG0000H

AJMPMAIN

ORG0023H

LJMPASEND;建立串行中断口地址。

ORG0030H

MAIN:

MOVSP,#30H;设置堆栈。

MOVTMOD,#20H;设定时器1工作方式2。

MOVTL1,#0F3H;设置定时器初值。

MOVTH1,#0F3H;设置重装值。

MOVPCON,#00H;SMOD=0。

MOVSCON,#40H;设串行工作方式1。

MOVR7,#1FH;建立计数指针。

MOVDPTR,#1000H;建立发送地址指针初值。

SETBEA;总中断允许。

SETBES;串行中断允许。

SETBTR0;启动定时器0。

MOVXA,@DPTR;第一个数据送A。

MOVSBUF,A;启动传送数据操作。

INCDPTR;指向下一RAM单元。

WAIT:

AJMP$;等待中断。

中断服务子程序:

ORG0100H

CLRTI;清TI。

ASEND:

MOVXA,@DPTR;取数据。

MOVSBUF,A;传送数据

INCDPTR;指向下一单元。

DJNZR7,GOON;传送结束?

没结束继续传送。

CLREA;传送结束,关闭。

CLRTR1

GOON:

RETI;返回。

顺便指出,甲机以中断方式传送数据时,计数指示为1FH而非20H,这是因为在启动甲机发送时已经向SBUF发送了一个数据。

至于乙机,既可用上述查询方式接收,也可用中断方式接收。

中断方式程序设计思路与查询方式类似,不再细述。

在异步串行通讯中,接收机以波特率的3倍检测RXD端信号,检测到两次以上相同信号即为有效信号。

在实际应用中,可根椐需要加入奇偶校验位一起传送,以提高传送的可靠性。

例8—3甲,乙两单片机同样以工作方式1进行串行数据通信,波特率为1200,甲机发送,发送数据在甲机外部RAM1000H-101FH单元中,在发送之前先将数据块长度发送给乙机,发送完后,向乙机发送一个累加校验和。

乙机接收,乙机首先接收数据长度,然后接收数据,并把接收数据依次放入乙机外部RAM1000H-101FH单元中,接收完毕后进行一次累加和校验,数据全部接收完毕时向甲机送出状态字,表示传送状态。

甲、乙机晶振频率均为6MHZ。

连接方式见图8—6:

甲乙

TXDRXD

RXDTXD

 

图8—6例8—3示意图

 

解:

设定如下:

(1)波特率约定为1200,以定时器T1为波特率发生器,T1用工作方式2(SMOD)=0,波特率不倍增。

6×106×1

384×1200

则初值:

X=256—=243=F3H

(2)设置R5为累加和寄存器,R6为数据块长度寄存器。

(3)用查询传送方式。

(4)串行口为工作方式1,允许接收,即;

SCON=01010000B=50H

可得甲机发送主程序如下:

ORG0030H

MOVTMOD,#20H;设定时器1工作方式2。

MOVTL1,#0F3H;设置定时器初值。

MOVTH1,#0F3H;设置重装值。

SETBTR1;启动定时器1。

MOVPCON,#00H;(SMOD)=0。

MOVSCON,#50H;设串行工作方式1,允许接收。

AGAIN:

MOVDPTR,#1000H;建立发送数据地址指针初值。

MOVR6,#20H;数据块长度送R6。

MOVR5,#00H;累加和寄存器清“0”。

MOVSBUF,R6;先发送长度值。

L1:

JBCTI,L2;等待发送结束。

AJMPL1

L2:

MOVXA,@DPTR;取数据块中数据。

MOVSBUF,A;发送数据。

ADDA,R5;发送数据累加。

MOVR5,A;累加和送R5。

INCDPTR;地址加1。

L3:

JBCTI,L4;等待一帧数据发送完毕。

AJMPL3

L4:

DJNZR6,L2;判断数据块是否发送完,若未完继续发送。

MOVSBUF,R5;数据块发送完毕,发累加和校验码。

L5:

JBCTI,L6;等待发送累加和码结束。

AJMPL5

L6:

JBCRI,L7;接收从机发来的结果标志码。

AJMPL6

L7:

MOVA,SBUF

JZL8;若标志码为00H,表示接收正确,返回;反之重发。

AJMPAGAIN;发送有错,重发。

L8:

RET

乙机接收参考程序如下:

ORG0030H

MOVTMOD,#20H;设定时器1工作方式2。

MOVTL1,#0F3H;设置定时器初值。

MOVTH0,#0F3H;设置重装值。

SETBTR1;启动T1。

MOVPCON,#00H;SMOD=0。

MOVSCON,#50H;设串行工作方式1,允许接收。

AGAIN:

MOVDPTR,#1000H;建立接收地址指针初值

L0:

JBCRI,L1;接收发送长度值。

AJMPL0

L1:

MOVA,SBUF

MOVR6,A;取发送长度值送R6。

MOVR5,#00H;累加和寄存器清”0”。

WAIT:

JBCRI,L2;接收数据。

AJMPWAIT

L2:

MOVA,SBUF

MOVX@DPTR,A;将所接收数据送数据区。

INCDPTR;指向下一单元。

ADDA,R5;累加。

MOVR5,A

DJNZR6,WAIT;若数据接收未完继续。

L3:

JBCRI,L4;数据接收完毕,接收主机的累加校验码。

AJMPL3

L4:

MOVA,SBUF;取主机累加和校验码。

XRLA,R5;与本机累加和进行校验。

JZL7;若校验正确转L7。

MOVSBUF,#0FFH;校验出错,回送校验出错标志码FFH,表示要求主机重发。

L5:

JBCTI,L6;回送FFH。

AJMPL5

L6:

AJMPAGAIN;重新接收

L7:

MOVSBUF,#00H;回送校验正确标志码00H。

L8:

JBCTI,L9;回送。

AJMPL8

L9:

RET;接收完成,返回。

3.串行工作方式2

方式2是11位为一帧的串行通信方式,即1位始位,9位数据位和1位停止位。

其中第9位数据既可作奇偶校验位,也可作控制位使用。

其帧格式为:

始D0D1D2D3D4D5D6D7D8停

附加第9位(D8)由软件置1或清零。

方式2发送时单片机自动将SBUF中8位数据加上SCON中TB8作为第9位数据进行发送。

接收时,单片机将接收到的前8位数据送入SBUF,而在SCON中RB8位中存放第9位数据。

方式2波特率只有两种,用公式表示:

波特率=(2smod/64)×f晶振

当SMOD=0,波特率为f晶振/64

当SMOD=1,波特率为f晶振/32

4.串行工作方式3

方式3通信过程与方式2完全相同。

区别仅在于方式3的波特率可通过设置定时的工作方式和初值来设定(与串行工作方式1波特率设定方法相同)。

顺便指出,由于方式1和方式3的波特率设置较为灵活,在单片机串行通信中得到广泛应用。

第四节单片机多机通信原理

单片机多机通信是指一台主机和多台从机之间的通信。

8051的串行通信控制寄存器SCON中设有多机通信控制位SM2(SCON.5)。

串行口以方式2或方式3接收时,若SM2=1,则仅当接收到的第九位数据为1时,才将数据送入接收缓冲器SBUF,并置位RI发出中断请求信号,否则将丢失信息;而当SM2=0时,则无论第九位是0还是1,都能将数据装入SBUF,并产生中断请求信号。

根据这个特性,便可实现主机与多个从机之间的串行通信。

图8—7为8051多机通信连接示意图,图中8051为主机,其余8051为从机。

TXD

RXD

TXDRXDTXDRXDTXDRXD

8051805180518051

主机

0#从机1#从机2#从机

图8—7多机通信连接示意

以主机向从机发送数据为例,在编程前,可先定义各从机通信地址,设三个从机地址分别为00H,01H,和02H。

主机和从机在初始化程序中将串行口工作方式设定为11位异步通信方式(方式2或方式3),且置位SM2,允许串行口中断。

在主机和某一从机通信之前,先向所有从机发出所选从机的地址,即联络通信命令,接着才发送数据或命令。

在主机发送地址时,地址数据标识位TB8(即发送的第九位数据)设置1以表示地址信息,各从机接收到主机发来的地址信息后,则置位中断标志RI,中断后判断主机送来的地址与本从机是否相符。

若为本地址,则将本机SM2位清0,准备与主机进行数据通信。

没选中的从机则保持SM2=1状态,接着主机发送数据帧(TB8=0表示),各串行口同时收到了数据帧,而只有已选中的从机(SM2=0)才能产生中断并接收该数据,其余从机因收到第九位数据RB8=0且本机SM2=1,所以将数据丢掉。

这就实现了主机和从机的一对一通信。

通信只能在主从机之间进行,如若在两个从机之间进行,必需通过

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

当前位置:首页 > 小学教育 > 数学

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

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