第9章 串口通信.docx
- 文档编号:9852742
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:39
- 大小:562.57KB
第9章 串口通信.docx
《第9章 串口通信.docx》由会员分享,可在线阅读,更多相关《第9章 串口通信.docx(39页珍藏版)》请在冰豆网上搜索。
第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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 串口通信 串口 通信