第9章 串口通信.docx

上传人:b****8 文档编号:9852742 上传时间:2023-02-07 格式:DOCX 页数:39 大小:562.57KB
下载 相关 举报
第9章 串口通信.docx_第1页
第1页 / 共39页
第9章 串口通信.docx_第2页
第2页 / 共39页
第9章 串口通信.docx_第3页
第3页 / 共39页
第9章 串口通信.docx_第4页
第4页 / 共39页
第9章 串口通信.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

第9章 串口通信.docx

《第9章 串口通信.docx》由会员分享,可在线阅读,更多相关《第9章 串口通信.docx(39页珍藏版)》请在冰豆网上搜索。

第9章 串口通信.docx

第9章串口通信

第9章串口通信

9.1概述

单片机与外界进行信息交换,称为通信。

通信有并行通信和串行通信两种基本方式。

并行通信是多位数据同时被发送或接收,如图9-1(a)所示;串行通信则是数据逐位依次被发送或接收,如图9-1(b)所示。

并行通信和串行通信各有其优缺点,具体如表9-1所列。

(a)并行通信(b)串行通信

图9-1通信方式

表9-1并行通信和串行通信的特点

通信方式

优点

缺点

并行通信

多位数据同时传输,传送速度快

线路位数多,不便长距离传送

串行通信

适合长距离通信,节省传输线路,有一定的纠错能力

多位数据逐位依次传输,传送速度较慢

9.1.1串行通信

串行通信适合长距离、节省传输线、有纠错能力的突出优点,使其逐渐成为单片机与其它系统通信的主要方式。

串行通信又细分为异步通信和同步通信,单片机主要采用异步通信方式。

1、异步通信

异步通信数据按帧传输,一帧数据包含起始位、数据位、校验位和停止位。

异步通信凭借传输信息中设置的起始位、停止位来保持通信同步。

异步通信对硬件要求不高,容易实现且灵活,适用于数据的随机发送/接收,但因传送一个字节的数据就要建立一次同步,加上起始位、校验位和停止位,使得工作速度相对较低。

2、同步通信

同步通信传输的信息,是由1~2个同步字符和多字节数据位组成。

同步字符用于保持通信同步并作为起始位,用以触发同步时钟开始发送或接收数据;多字节数据之间不能有空隙,每位占用的时间相等。

同步通信传输速度快,但需要准确的时钟来实现收发双方的严格同步,硬件要求高,多用于批量数据传送。

9.1.2串行通信的制式

串行通信按照数据传送方向的不同,有三种传输方式:

1、单工制式

单工传输,是指通信双方传输信息时,只能从发送方单方向传送数据给接收方,如图9-2所示。

图9-2单工通信

2、半双工制式

半双工传输,是指通信双方都有接收器和发送器,都能够进行数据的发送和接收,但不能在同一时刻接收和发送数据,即发送时不能接收,接收时不能发送。

如图9-3所示。

图9-3半双工通信

3、全双工制式

全双工传输,是指通信双方均设有发送器和接收器,通信信道相互独立,既有发送信道又有接收信道。

因此,全双工传输可实现通信双方数据的同时发送和接收,即发送时可以接收,接收时也可以发送。

如图9-4所示。

图9-4全双工通信

51单片机内部的串行接口是全双工的,即它能同时发送和接收数据。

发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入。

串行口还具有接收缓冲功能,即从接收缓冲器中读出前一个已收到的字节数据之前,就可以开始接收第二字节数据了。

串行口的内部结构如图9-5所示。

图9-5串行口结构示意图

单片机知识:

串口缓冲器SBUF

串口缓冲器SBUF,是在物理上彼此独立的两个缓冲器:

一个是接收缓冲器,用于存放接收到的数据;另一个是发送缓冲器,用于存放待发送的数据。

所以,数据的发送和接收可以同时进行。

两个缓冲器共用一个地址99H,通过对SBUF的读、写语句,可以区分当前进行的操作是针对接收缓冲器还是发送缓冲器:

如果CPU在写SBUF,操作的对象就是发送缓冲器;而CPU在读SBUF时,操作的对象就是接收缓冲器了。

例如:

SBUF=send[i];//发送第i个数据

buffer[i]=SBUF;//接收数据

9.2单片机间的串口通信

功能说明:

单片机a与单片机b,通过串行口进行通信。

a机发送数据,b机接收a机发送的数据,并进行相应处理。

按键K1每按下一次,连接在b机P2.0引脚的蜂鸣器就报警鸣响一次,同时,连接在b机P2.7引脚的发光二极管D1闪烁一次。

按键K2按下一次,连接在b机P2.0引脚的蜂鸣器报警鸣响两次,同时,连接在b机P2.7引脚的发光二极管D1闪烁两次。

硬件说明:

1、硬件电路连接如图9-6所示,单片机a的P3.1引脚(TXD),连接到单片机b的P3.0引脚(RXD)。

2、按键K1和K2分别连接到单片机a的P1.0和P1.1引脚;

图9-6双机串口通信硬件连接图

程序清单如下:

//双机串口通信,a机发送数据程序

#include

#defineucharunsignedchar

sbitk1=P1^0;

sbitk2=P1^1;

uchari=0;

//************************************************************

voiddelay(uchari)//延时子函数

{

ucharj,k;

for(k=0;k

for(j=0;j<110;j++);

}

//************************************************************

main()//主函数

{

TMOD=0x20;//定时器1工作于方式2

TL1=0xf4;//波特率为2400b/s

TH1=0xf4;

TR1=1;

SCON=0x50;//设置串行口工作在方式1,允许接收

while

(1)

{

if(k1==0)

{

delay(5);

if(k1==0)

i=1;

}

if(k2==0)

{

delay(5);

if(k2==0)

i=2;

}

if(i!

=0)

{

SBUF=i;//发送数据i

while(TI==0);//查询等待发送是否完成

TI=0;//发送完成,TI由软件清0

i=0;

}

}

}

//双机串口通信,b接收数据程序

#include

#defineucharunsignedchar

sbitbeep=P2^0;

sbitD1=P2^7;

ucharx,y;

//************************************************************

voiddelay(uchari)//延时子函数

{

ucharj,k;

for(k=0;k

for(j=0;j<110;j++);

}

//************************************************************

main()//主函数

{

TMOD=0x20;//定时器1工作于方式2

TL1=0xf4;//波特率为2400b/s

TH1=0xf4;

TR1=1;

SCON=0x50;//设置串行口工作在方式1,允许接收

ES=1;//开串行口中断

EA=1;//开总中断允许位

while

(1)

{

if(x==1)//k1控制报警闪烁一次

{

beep=0;

D1=0;

delay(200);

beep=1;

D1=1;

}

if(x==2)//k2控制报警闪烁两次

{

for(y=x;y>0;y--)

{

beep=0;

D1=0;

delay(100);

beep=1;

D1=1;

}

}

}

}

//************************************************************

voidserial(void)interrupt4//串口中断类型号为4

{

EA=0;//关中断

RI=0;//软件清除中断标志位

x=SBUF;//接收数据

EA=1;//开中断允许位

}

单片机知识:

串行口

1、串行口的工作寄存器

51串行口工作时,需要进行相关寄存器的设置。

只有设置正确,串行口才能正常工作。

需要进行设置的寄存器,有串行口控制寄存器SCON、电源控制器PCON、中断允许寄存器IE和中断优先级寄存器IP。

其中IE和IP寄存器已在第4章有过详细介绍,此处重点介绍SCON和PCON。

(1)串行口控制寄存器SCON

串行口控制寄存器SCON是一个8位的寄存器,如表9-2所列。

系统复位时,SCON中的所有位都被清0。

其各位功能及含义如下:

表9-2SCON寄存器

位7

位6

位5

位4

位3

位2

位1

位0

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

◆位7、位6——SM0、SM1:

串行口操作方式选择位。

SM0和SM1这两个选择位组合后,对应串行口的四种工作方式,具体如表9-3所示。

表9-3串行口方式选择

SM0SM1

方式

功能说明

波特率

00

0

同步移位寄存器方式,8位全部是数据,无起始停止位

fosc/12

01

1

10位UART(其中1位起始位,8位数据位,1位停止位)

可变

10

2

11位UART(其中1位起始位,9位数据位,1位停止位)

fosc/64或fosc/32

11

3

同方式2

可变

◆位5——SM2:

方式2和3的多机通信使能位。

在方式2或方式3中,若SM2为0,则不论接收到的第9位数据RB8是0还是1,均可使接收到的数据进入SBUF,并激活接受中断标志位RI;若SM2为1,且接收到的第9位数据RB8为1,则接收到的数据进入SBUF,并激活接受中断标志位RI;若SM2为1,且接收到的第9位数据RB8为0,则接收到的数据被丢弃,接收中断标志RI不会被激活。

在方式1中,若SM2=1,则只有在收到有效的停止位时,才会激活RI。

在方式0中,SM2必须置为0。

◆位4——REN:

串行数据接收允许位。

REN=1,允许串行口接受数据;REN=0,禁止串行口接受数据。

该位由软件置位或清零。

◆位3——TB8:

方式0和方式1中不使用该位。

在方式2和方式3中,TB8中的值(1位二进制数)是发送数据的第9位,可按需要由软件指定其功能(数据的奇偶校验位或多机通信中的地址帧/数据帧的标志,一般1是地址帧,0是数据帧)。

◆位2——RB8:

是方式2和3中已接收到的第9位数据。

在方式1中,若SM2=0,RB8是接收到的停止位。

在方式0中,不使用RB8位。

◆位1——TI:

发送中断标志位。

在方式0中,当串行发送完8位数据时,由硬件置1,表明发送中断有请求;在其他方式中,在发送停止位时,由内部硬件置1。

需要特别注意的是,无论在何种方式,该位都必须由软件来清0。

◆位0——RI:

接收中断标志位。

在方式0中,当串行接收到8位数据结束时,由硬件置1。

无论在何种方式,该位都必须由软件来清0。

(2)电源控制器PCON

PCON是一个特殊功能寄存器,它是一个8位寄存器。

在串口通信中,只用到8位中SMOD这一位(位7)。

该位是波特率选择位,在串行口工作在方式为1、2或3时,若SMOD=1,则波特率提高一倍。

复位时,SMOD值为0。

(3)中断允许寄存器IE

中断允许寄存器IE的位4(ES)是串行口中断允许位,ES=1,允许串行口中断(总开关EA=1时);ES=0,禁止串行口中断。

中断允许寄存器IE如表9-4所列。

表9-4IE寄存器

位7

位6

位5

位4

位3

位2

位1

位0

EA

ES

ET1

EX1

ET0

EX0

(4)中断优先级寄存器IP

中断优先级寄存器IP的位4(PS),是串行口中断优先级控制位。

PS=1,串行口定义为高优先级中断源;PS=0,串行口定义为低优先级中断源。

2、串行口工作方式

串行口的工作方式由SM0和SM1定义,编码和功能如表9-3所示,下面分别介绍4种工作方式及其用途。

(1)方式0

串行口的工作方式0为同步移位寄存器输入输出方式,可外接移位寄存器,以扩展I/O口,也可外接同步I/O设备。

当串行口在方式0下发送(输出)数据时,数据串行逐位从RXD引脚输出;而TXD引脚则作移位脉冲的输出端,输出移位需要的同步时钟。

当串行口在方式0下接收(输入)数据时,RXD端为数据输入端,TXD仍为同步脉冲信号输出端。

接收器接收RXD端输入的数据信息,波特率是振荡频率的1/12。

方式0主要用于I/O扩展的场合。

此方式下的串行口,通过外接串入并出移位寄存器,可扩展输出口;通过外接并入串出移位寄存器,可扩展输入口。

串行口工作在方式0时,需要注意以下两点:

①方式0发送或接收完8位数据后,发送中断标志TI或接收中断标志RI,由硬件置1。

但在CPU响应了发送中断或接收中断的中断请求,并转入中断服务程序时,CPU并不自动将TI或RI清0,因此,用户必须编程将中断标志TI或RI清0。

②串行口在方式0下工作时,SM2位必须为0。

(2)方式1

串行口工作在方式1时,是一个波特率可变的10位异步通信接口,即1位起始位,8位数据位(低位在先)和1位停止位,其中起始位和停止位是在发送时自动插入的。

波特率的大小,取决于定时器1或定时器2的溢出速率。

当串行口在方式1下发送(输出)数据时,TI必须为0。

当CPU执行任何一条以SBUF为目的寄存器的指令或语句,都启动一次发送。

数据发送完时,发送中断标志位TI置1。

当串行口在方式1下接收(输入)数据时,其接收的前提条件是,串行口控制寄存器SCON的REN位为1,同时还要满足两个条件:

①RI必须为0,②SM2=0或者接收到的停止位为1,否则接收到的数据会被丢弃。

如果正确接收,则接收到的数据被装载进SBUF和RB8位,接收中断标志位RI被置1。

方式1一般多用于两个单片机之间的数据通信。

串行口工作在方式1时,发送中断标志TI或接收中断标志RI,须由用户清0。

).8F下=1;______________________________________________________________________________________________________________(3)方式2和方式3

串行口工作在方式2和方式3,是11位的异步通信接口。

方式2和方式3的操作过程完全一样,仅仅是波特率不同。

方式2的波特率固定,为fosc/32或fosc/64;方式3的波特率可变,取决于定时器1或定时器2溢出速率。

方式2和方式3的帧格式如表9-5所示。

表9-5方式2和方式3的帧格式

位0

位1

位2

位3

位4

位5

位6

位7

位8

位9

位10

起始

D0

D1

D2

D3

D4

D5

D6

D7

TB8/RB8

停止

当串行口在方式2或者3下发送(输出)数据时,任何一条写SBUF的语句,都可启动一次发送。

当第9位数据(TB8)输出之后,发送中断标志位TI被置1。

当串行口在方式2或者3下接收(输入)数据时,其前提条件依然是,SCON寄存器的REN位为1;同时还要满足两个条件——RI必须为0,SM2=0或者接收到的停止位为1,否则接收到的数据会被丢弃。

如果正确接收,则接收到的数据被装载进SBUF和RB8位,接收中断标志位RI被置1。

需要注意的是,在方式2和方式3中,装入RB8的是第9位数据,而不是停止位;但在方式1中,装入的RB8第9位是停止位。

3、波特率

串行口每秒钟发送(或接收)的二进制数的位数称为波特率。

设发送一位数据所需要的时间为T,则波特率为1/T。

为保证数据的正确发送和接收,单片机间必须使用相同的波特率。

串行口以方式0工作时,波特率固定为时钟振荡器频率的1/12;以方式2工作时,波特率为时钟振荡器频率的1/64或1/32(PCON中的SMOD位为1对应1/32;PCON中的SMOD位为0对应1/64)。

方式1和3的波特率,由定时器1的溢出率所决定。

当定时器1作波特率发生器时,波特率由下式确定:

波特率=2SMOD×(T1溢出率)/n

式中,T1溢出率,是定时器1在1秒钟内溢出的次数。

n为32或16(若SMOD=0,则n=32;若SMOD=1,则n=16)。

在串行通信的实际使用中,单片机的晶振频率必须选用11.0592MHz,否则,在定时器1的初值计算时,将会出现晶振频率不能被整除的问题,使波特率存在较大误差,从而导致串行通信的质量变差。

9.3单片机多机通信

9.3.1多机通信概述

承前所述,串行口以方式2和方式3接收时,若SM2为1,则只有当接收器接收到的第9位数据为1时,数据才被装入接收缓冲器,并将接收中断标志RI位置1,同时向CPU发出中断申请;如果接收到的第9位数据为0,则不产生中断标志,接收到的数据也将被丢弃;而SM2为0时,当接收到一个数据信息后,不管第9位数据是1还是0,都使接收中断标志位RI置1,并将接收到的数据装入接收缓冲器。

通过上述这种方式,就可以实现多个单片机之间的通信。

如图9-7所示,为一种简单的主从式的多机通信系统,主机控制它与各个从机之间的通信,而各个从机之间的通信也必须经过主机才能实现,可见,从机是被动的。

TXDRXD

89C51

从机3

图9-7多机通信连接原理图

从机的初始化程序(或相关的处理程序)中,将从机的串行口设置在方式2或方式3下,用于接收数据,且置SM2为1和允许串行口中断。

当主机准备发送一数据块给从机时,主机首先送出一个地址字节,用于辨认目标从机。

可用发送数据的第9位来区别当前发送的是地址字节信息还是数据字节信息:

发出地址信息时第9位为1,发数据(包括命令)信息时第9位为0。

主机发送的是地址信息,所以发送数据的第9位为1;而各从机接收到主机发送来的地址信息中,接收到的第9位信息(RB8)必定为1。

由于此时所有从机的SM2都为1,所以,所有从机将其接收中断标志RI置1,并将接收到的地址信息存进SBUF中。

这时,让每一台从机都检查一下,看自己的地址与接收到主机发送来的地址是否相符。

若某一台从机的地址与接收到的地址相符,则将该从机的SM2位清0;其它地址不相符的从机,则保持SM2=1的状态不变。

地址相符的从机,将SM2位清0的目的,是准备接收主机即将发送来的数据(或命令)。

在主机发送数据时,地址相符的从机由于SM2=0,则不论接收的第9位(RB8)是0还是1,它都将接收到的数据存入SBUF,并激活接收中断标志RI。

相反,那些地址不相符的从机,由于SM2依旧保持为1,则当主机发送数据时(主机发送的第9位数据是0,0代表的是数据,而1代表的是地址),这些从机接收到的第9位数据也是0,于是,这些从机将所接收到的数据丢失,同时并不激活接收中断标志位RI。

这样,就实现了主机仅对地址相符的那一台从机传输数据信息的功能。

9.3.2单片机多机通信实例

功能说明:

A、B、C三个单片机中,A为主机,B和C为从机。

独立按键K1是主机A外部中断0的中断源。

当K1被第一次按下时,数码管1显示数字1,数码管2显示字符“A”(“A”是主机A的编号);同时,连接到主机A上P1.0引脚的LED灯,点亮1秒钟时间。

当K1被第二次按下时,数码管1显示数字2,数码管2显示字符“B”(“B”是从机B的编号,此值由从机B传回到主机);同时,连接到从机B上的P1.0引脚的LED灯,点亮1秒钟时间。

当K1被第三次按下时,数码管1显示数字3,数码管2显示字符“C”(“C”是从机C的编号,此值由机C传回到主机);同时,连接到从机C上的P1.0引脚的LED灯,点亮1秒钟时间。

当K1被第四次按下时,数码管1显示数字1,数码管2显示字符“A”(“A”是主机A的编号);同时,连接到主机A上P1.0引脚的LED灯,点亮1秒钟时间……。

上述过程循环进行。

硬件说明:

1、硬件电路如图9-8所示。

主机A的P0口和P2口,分别连接共阴数码管1和2,数码管使用74HC573驱动;独立按键K1连接到主机A的P3.2引脚(外部中断0输入引脚);主机A上P1口的P1.0引脚连接有一只发光二极管D3;从机B和从机C的P3.1引脚,都连接到主机A的P3.0引脚;从机B和从机C的P3.0引脚都连接到主机A的P3.1引脚。

2、从机B和从机C,除跟主机通过串行线连接外,其P1口分别连接一只发光二极管。

图9-8单片机多机通信硬件连接图

程序清单如下:

//多机通信主机A程序

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

ucharmode;

sbitD3=P1^0;

//************************************************************

voidinit()

{

TMOD=0x20;//设定时器1的工作方式为方式2

TH1=0xfd;//设置串行口波特率为9600

TL1=0xfd;

TR1=1;

SCON=0xd0;//设置串行口的工作方式为方式3,允许接收

ES=1;//开串行口中断

EX0=1;//开外部中断0

IT0=1;//INT0下降沿触发

EA=1;//开总中断允许位

TI=0;

}

//************************************************************

voiddelay(uinti)//延时子函数

{

uintj,k;

for(k=0;k

for(j=0;j<110;j++);

}

//************************************************************

voidserial_procedure(ucharc)//本机串口发送程序

{

SBUF=c;

while(TI==0);

TI=0;

}

//************************************************************

voidhost_control(ucharAdd,ucharCmd)//主机控制处理程序

{

TB8=1;//地址信息标志

serial_procedure(Add);

delay(50);

TB8=0;//数据信息标志

serial_procedure(Cmd);

delay(50);

}

//************************************************************

voidINT_EX0(void)interrupt0//外中断0中断处理程序

{

P0=table[mode];//模式数据送P0口显示

if(mode

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

当前位置:首页 > 自然科学 > 生物学

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

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