目录
串行通信的两种方式
串行通信的传输模式
串行通信的错误校验
1.奇偶校验
2.代码和校验
3.循环冗余码校验
串行口结构
串行口控制寄存器SCON
特殊功能寄存器PCON
串行口的4种工作方式
方式0:
(1)方式0的发送过程
(2)方式0接收
方式1:
(1)方式1的发送
(2)方式1接收
方式2:
(1)方式2的发送
(2)方式2接收
多机通信
串口通信需注意的点
1.波特率
(1)波特率的指定方法
(2)波特率的定义
(3)定时器T1产生波特率的计算
(4)定时器/计数器T2作为波特率发生器
串行通信应用举例
1.串行口方式1应用编程
2.串行口方式2应用编程
3.串行口方式3应用编程
串行通信的两种方式
串行通信有两种方式:异步通信,同步通信
同步串行通信是采用一个同步时钟,通过一条同步时钟线,加到收发双方,使收、发双方达到完全同步,此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙,既保持位同步关系。同步通信及数据格式见图6-3。
异步串行通信是指收、发双方使用各自的时钟控制数据的发送和接收这样可省去连接收、发双方的一条同步时钟信号线,使得异步串行通信连接更加简单且容易实现。为使收发双方协调,要求收、发双方的时钟尽可能一致。
串行通信的传输模式
串行通信按照按照数据传输的方向及时间关系可分为单工、半双工和全双工。
1.单工
数据传输仅能按一个固定方向传输,不能反向传输,如图所示。
2.半双工
数据传输可以双向传输,但不能同时进行,不能同时传输,如图所示。
3.全双工
数据传输可同时进行双向传输,如图所示。
串行通信的错误校验
在串行通信中,往往要对数据传送的正确与否进行校验。校验时保证传输数据准确无误的关键。常用的有奇偶校验与循环冗余码校验等方法。
1.奇偶校验
串行发送数据时,数据位尾随1位奇偶校验位(1或0)。当约定为奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;当约定为偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。数据发送方与接收方应一致。在接收数据帧时,对“1”的个数进行校验,若发现不一致则说明数据传输过程中出现了差错,则通知发送端重发。
2.代码和校验
代码和校验是发送方将所发数据块求和或各字节异或,产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时同时对数据块(除校验字节)求和或各字节异或,将所得结果与发送方的“校验和”进行比较如果相符,则无差错,否则即认为在传输过程中出现了差错。
3.循环冗余码校验
循环冗余码校验纠错能力强,容易实现。该校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。是目前应用最广的检错码编码方式之一,广泛用于同步通信中。
串行口结构
有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器)可同时发送、接收数据
发送缓冲器只能写入不能读出
接收缓冲器只能读出不能写入
两个缓冲器共用一个特殊功能寄存器字节地址 (99H)控制寄存器共有两个:特殊功能寄存器SCON和PCON。
串行口控制寄存器SCON
字节地址98H,可位寻址,位地址为98H~9FH。格式如图所示。
(1)SM0、SM1----串行口4种工作方式选择位
(2) SM2一多机通信控制位
多机通信是在方式2和方式3下进行。当串口以方式2或方式3接收时,如果SM2=1,则只有当接收到的第9位数据 (RB8)为“1”时,才使RI置“1”产生中断请求,并将接收到的前8位数据送入SBUF。
当接收到的第9位数据 (RB8)为“0”时,则将接收到的前8位数据丢弃。
当SM2 = 0时,则不论第9位数据是1还是0,都将前8位数据送入SBUF中,并使RI置1,产生中断请求。
在方式1时,如果SM2=1,则只有收到有效的停止位时才会激活RI
在方式0时,SM2必须为0。
(3) REN----允许串行接收位
由软件置“1”或清“0”
REN=1,允许串行口接收数据
REN=0,禁止串行口接收数据
(4) TB8----发送的第9位数据
方式2和方式3,TB8是要发送的第9位数据,其值由软件置“1”或清“0”。在双机串行通信时,一般作为奇偶校验位使用,在多机串行通信中用来表示主机发送的是地址帧还是数据帧,TB8=1为地址帧,TB8=0为数据帧。
(5) RB8----接收的第9位数据
方式2和方式3,RB8存放接收到的第9位数据。在方式1,如SM2=0,RB8是接收到的停止位。在方式0,不使用RB8。
(6) TI----发送中断标志位
方式0,串行发送的第8位数据结束时TI由硬件置“1”,在其他方式中,串行口发送停止位的开始时置TI为“1”
TI =1,表示一帧数据发送结束。TI的状态可供软件查询,也可申请中断。CPU响应中断后,在中断服务程序中向SBUF写入要发送的下一帧数据。TI必须由软件清“0”
(7) RI-接收中断标志位
方式0时,接收完第8位数据时,RI由硬件置“1”。在其他工作方式中串行接收到停止位时,该位置“1”。RI= 1,表示一帧数据接收完毕,并申请中断,要求CPU从接收SBUF取走数据。该位的状态也可供软件查询。RI必须由软件清“0”
SCON的所有位都可进行位操作清“0”或置“1”
特殊功能寄存器PCON
字节地址为87H,不能位寻址。
PCON最重要的功能是SMOD:波特率选择位
当SMOD = 1时,要比SMOD = 0时的波特率加倍,所以也称SMOD位为波特率倍增位。
串行口的4种工作方式
4种工作方式由SCON中SM0、SM1位定义
方式0:
方式0为同步移位寄存器输入/输出方式。该方式并不用于两个单片机之间的异步串行通信,而是用于串行口外接移位寄存器,扩展并行I/O口。
8位数据为一帧,无起始位和停止位,先发送或接收最低位。波特率固定为/12。帧格式如图所示。
(1)方式0的发送过程
当CPU执行一条将数据写入发送缓冲器SBUF的指令时,产生一个正脉冲,串行口开始把SBUF中的8位数据以/12的固定特率从RXD引脚(p3.0引脚)串行输出,低位在先,TXD引脚(p3.1引脚)输出同步移位脉冲,发送完8位数据,中断标志位TI置“1”。发送时序如图所示。
外接串入并出移位寄存器74LS164扩展的并行输出口:
实现串行输入数据,并行输出数据
(2)方式0接收
•方式0接收过程
方式0接收,REN为串行口允许接收控制位,0---禁止接收; 1---允许接收。
当向SCON寄存器写入控制字(设置为方式0,并使REN位置1,同时RI=0) 时,产生一个正脉冲,串行口开始接收数据。
引脚RXD为数据输入端,TXD为移位脉冲信号输出端,接收器以/12的固定波特率采样RXD引脚的数据信息,当接收完8位数据时,中断标志RI置1,表示一帧数据接收完毕,可进行下一帧数据的接收,时序如图所示
•方式0接收应用举例
图为串行口外接两片8位并行输入串行输出的寄存器74LS165扩展两个8位并行输入口的电路。
当74LS165的S/L* 端由高到低跳变时,并行输入端的数据被置入寄存器当S/L*=1,且时钟禁止端 (15脚) 为低时,允许TXD (P3.1) 串行移位脉冲输入,这时在移位脉冲作用下,数据由右向左方向移动,以串行方式进入串行口的接收缓冲器中。
在图中:
TXD(P3.1)作为移位冲输出与所有75LS165的移位脉冲输入端CP相连;RXD(P3.0)作为串行数据输入端与74LS165的串行输出端Q相连;P1.0与S/L*相连,用来控制74LS165的串行移位或并行输入;
74LS165的时钟禁止端 (15脚)接地,表示允许时钟输入
当扩展多个8位输入口时,相邻两芯片的首尾 (Q与SIN)相连
注:
在方式0,SCON中的TB8、RB8位没有用到,发送或接收完8位数据由硬件使TI或RI中断标志位置“1”,CPU应TI或RI中断,在中服务程序中向发送SBUF中送入下一个要发送的数据或从接收SBUF中把接收到的1B存入内部RAM中。
注意,TI或RI标志位必须由软件清“0”,采用如下指令:
CIR TI ;TI位清“0”
CIR RI ;RI位清“0”
方式0时,SM2位(多机通信控制位)必须为0。
方式1:
方式1为双机串行通信方式,当SM0、SM1=0,1时,串行口设为方式1的双机串行通信。TXD脚和RXD脚分别用于发送和接收数据。
方式1一帧为10位,1个起始位 (0),8个数据位,1个停止位 (1)先发送或接收最低位。格式如图所示。
方式1为波特率可变的8位异步通信接口:
其中的SMOD是PCON寄存器的最高位的值(0或1)
(1)方式1的发送
方式1输出时,数据位由TXD端输出,发送一帧信息为10位: 1位起始位0,8位数据位(先低位) 和1位停止位1。
当CPU执行一条数据写SBUF的指令,就启动发送。发送时序见图。
图中TX时钟的频率就是发送的波特率。
发送开始时,内部发送控制信号SEND*变为有效,将起始位向TXD脚(P3.1)输出,此后每经过一个TX时钟周期,便产生一个移位脉冲,并由TXD引脚输出一个数据位。8位数据位全部发送完毕后,中断标志位TI置1。然后SEND*无效。
(2)方式1接收
方式1接收时(REN=1),数据从RXD (P3.0)脚输入。当检测到起始位的负跳变,则开始接收。
接收时序见图。
接收时,定时控制信号有两种,一种是接收移位时钟(RX时钟),它的频率和传送的波特率相同,另一种是位检测器采样脉冲,频率是RX时钟的16倍。以波特率的16倍速率采样RXD脚状态。当采样到RXD端从1到0的负跳变时就启动检测器,接收的值是3次连续采样 (第7、8、9个脉冲时采样) 取两次相同的值,以确认起始位(负跳变)的开始,较好地消除干扰引起的影响。
注:上图的写SBUF和SEND都有,只是此图没有绘制
当确认起始位有效时,开始接收一帧信息。每一位数据,也都进行3次连续采样(第7、8、9个脉冲采样),接收的值是3次采样中至少两次相同的值。当一帧数据接收完毕后,同时满足以下两个条件,接收才有效。
•RI=0,即上一数据接收完成时,RI=1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空
•SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则将接收到的数据装入SBUF和RB8(装入的是停止位),且中断标志RI置
若不同时满足两个条件,收的数据不能装入SBUF,该帧数据将丢弃。
方式2:
方式2和方式3,为9位异步通信接口。每帧数据为11位,1位起始位0,8位数据位(先低位),1位可程控为1或0的第9位数据和1位停止位。方式2、方式3帧格式如图所示。
D8就是可控位,由用户控制,若为发送,则是TB8位,若为接收,则是RB8位
方式2和方式3除了支持的最高波特率有所不同,其他工作方式等都相同,这里主要介绍方式2
方式2波特率:
(1)方式2的发送
发送前,先根据通信协议由软件设置TB8(如奇偶校验位或多机通信的地址/数据标志位),然后将要发送的数据写入SBUF,即启动发送。TB8自动装入第9位数据位,逐一发送。发送完毕,使TI位置“1”。
例:方式2发送在双机串行通信中的应用
下面的发送中断服务程序,以TB8作为奇偶校验位,偶校验发送。数据写入SBUF之前,先将数据的偶校验位写入TB8(设第2组的工作存器区的R0作为发送数据区地址指针)。
(2)方式2接收
SM0、SM1=10,且REN=1时,以方式2接收数据。数据由RXD端输入,接收11位信息。当位检测逻辑采样到RXD的负跳变,判断起始位有效,便开始接收一帧信息。在接收完第9位数据后,需满足以下两个条件,才能将接收到的数据送入SBUF(接收缓冲器)。
(1) RI=0,意味着接收缓冲器为空。
(2) SM2=0 或 RB8=1。
当满足上述两个条件时,收到的数据送SBEF(接收缓冲器),第9位数据送入RB8,且RI置“1”。若不满足这两个条件,接收的信息将被丢弃。
串行口方式2和方式3接收时序如图所示:
方式2接收在双击通信中的应用
本例对例发送的数据进行偶校验接收,程序如下(设1组寄存器区的R0为数据缓冲区指针)
注:这里P的奇偶数是接收到的数据的实际值,而这里的RB8的奇偶数,是发送时TB8中用户写进的奇偶数。
多机通信
1.多机通信的工作原理
多个单片机可利用串行口进行多机通信,常采用图中的主从式结构。系统有1个主机(单片机或其他有行接口的微机)和多个单片机组成的从机系统。主机RXD与所有从机的TXD端相连,TXD与所有从机的RXD端相连。从机地址分别为01H、02H和03H。
主从式是指多机系统中,只有一个主机,其余全是从机。主机发送的信息可以被所有从机接收,任何一个从机发送的信息,只能由主机接收。从机和从机之间不能进行直接通信,只能经主机才能实现。
多机通信的工作原理:
要保证主机与所选择的从机通信,须保证串口有识别功能。SCON中的SM2位就是为满足这一条件设置的多机通信控制位。其工作原理是在串行口以方式2(或方式3) 接收时,若SM2=1,则表示进行多机通信,可能以下两种情况:
(1)从机接收到的主机发来的第9位数据RB8=1时,前8位数据才装入SBUF,并置中断标志RI= 1,向CPU发出中断请求
在中断服务程序中,从机把接收到的SBuF中的数据存入数据缓冲区中。
(2) 如果从机接收到的第9位数据RB8=0时,则不产生中断标志RI=1,不引起中断,从机不接收主机发来的数据。
若SM2=0,则接收的第9位数据不论是0还是1,从机都将产生RI=1中断标志,接收到的数据装入SBUF中。
应用这特性,可实现AT89S52单片机的多机通信。多机通信的工作过程:
(1)各从机初始化程序允许从机的串行口中断,将串行口编程为方式2或方式3接收,即9位异步通信方式,且SM2和REN位置“1”,使从机处于多机通信且只接收地址帧的状态(RB=0,数据帧,会被直接丢弃)。
(2)在主机和某个从机通信之前,先将从机地址(即准备接收数据的从机) 发送给各个从机,接着才传送数据(或命令),主机发出的地址帧信息的第9位为1,数据 (或命令) 的第9位为0。当主机向各从机发送地址帧时,各从机的串行口接收到的第9位信息RB8为1,且由于各从机的SM2=1,则RI置“1”,各从机响应中断,在中断服务子程序中,判断主机送来的地址是否和本机地址相符合,若为本机地址,则该从机SM2位清6607准备接收主机的数据或命令;若地址不相符,则保持SM2=1。
(3)接着主机发送数据 (或命令),数据的第9位为0。此时各从机接收到的RB8=0。
只有与前面地址相符合的从机(即SM2位已清“0”的从机)才能激活中断标志位RI,从而进入中断服务程序,接收主机发来的数据(或命令);与主机发来的地址不相符的从机,由于SM2保持为1,又RB8=0,因此不能激活中断标志RI,就不能接受主机发来的数据帧。从而保证主机与从机间通信的正确性。此时主机与建立联系的从机已经设置为单机通信模式,即在整个通信中,通信的双方都要保持发送数据的第9位(即TB8位)为0,防止其他的从机误接收数据
(4) 结束数据通信并为下一次的多机通信做好准备。在多机系统,每个从机都被赋予唯一的地址。例如,图中三个从机的地址可设为:01H、02H、03H。
还要预留1~2个“广播地址”,它是所有从机共有的地址,例如将“广播地址”设为00H。当主机与从机的数据通信结束后,一定要将从机再设置为多机通信模式,以便进行下一次的多机通信
串口通信需注意的点
1.波特率
(1)波特率的指定方法
串行通信,收、发双方发送或接收的波特率必须一致。4种工作方式中
方式0和方式2的波特率是固定的;
方式1和方式3的波特率是可变的,由T1溢出率确定。
(2)波特率的定义
波特率的定义:串行口每秒发送 (或接收) 的位数。设发送一位所需要的时间为T,则波特率为1/T。
定时器的不同工作方式,得到的波特率的范围不一样,这是由T1在不同工作方式下计数位数的不同所决定。
(3)定时器T1产生波特率的计算
与串行口的工作方式有关
(1)方式0时,波特率固定为时钟频率的1/12,不受SMOD位值的影响。若=12 MHz,波特率为1Mbit/s。
(2)方式2时,波特率仅与SMOD位的值有关
若=12 MHz:SMOD=0,波特率 =187.5 kbit/s; SMOD=1,波特率为375 kbit/s。
(3)方式1或方式3定时,常用T1作为波特率发生器,其关系式为:
在实际设定波特率时,T1常设置为方式2定时 (自动装初值),即TL1作为8位计数器,TH1存放备用初值。这种方式操作方便,也避免因软件重装初值带来的定时误差。
实际使用时,经常根据已知波特率和时钟频率来计算T1的初值X。为避免繁杂的初值计算,常用的波特率和初值X间的关系常列成下表的形式以供查用。
注:
(1)在使用的时钟率12MH或6MH时,将初值X带入式(6-3)中计算出的波特率有一定误差。消除误差可采用时钟频率11.0592MHz。
(2)如果选用很低的波特率,如波特率选为55,可将定时器T1设置为方式1定时。但在这种情况下,T1溢出时,需在中断服务程序中重新装入初值。中断响应时间和执行指令时间会使波特率产生一定的误差,可用改变初值的方法加以调整。
(4)定时器/计数器T2作为波特率发生器
AT89S52单片机的T2本身具有专用的“波特率发生器”的工作模式通过软件设置T2CON寄存器中的RCLK和/或TCLK,可将T2设置为波特率发生器。
需要注意的是,如果T2用于波特率发生器和定时器/计数器T1用于别的功能,则这个接收/发送波特率可能是不同的。
设置RCLK和/或TCLK使定时器/计数器T2进入波特率发生器模式,如图6-22所示。由图6-22,当设置T2CON寄存器中的C1为0,设置RCLK和/或TCLK为1时,输出16分频的接收1发送波特率。
另外通过对T2EX引脚(P1.1)跳变信号的检测,并置位EXF2中断请求标志位,向CPU请求中断。需要注意的是,图6-22中的主振频率是经过2分频,而不是12分频。
定时器/计数器T2工作在波特率发生器模式,属于16位自动装载定时模式串行通信方式1和方式3的波特率计算公式为:
定时器/计数器T2的波特率发生器可选择定时模式或计数模式,一般都选择定时模式。
注意,在选择定时器使用时,是主振频率fosc经12分频为一个机器周期作为加1计数信号,而作为波特率发生器使用时是以每个时钟状态S(2分频主振频率)作为加1计数信号。
因此串行通信方式1和方式3的波特率计算公式为:
式(6-4)中“RCAP2H RCAP2L”为定时器/计数器T2的初值。例如“RCAP2H RCAP2L”初值为FFFFH,则65536-65535=1,则式(6-4)的波特率=(fosc/32)b/s。
设主振频率fosc=12MHz,则上述波特率=375kb/s。从式(6-4)可见采用定时器/计数器2用作波特率发生器,其波特率设置范围极广。
从图6-22可见,当定时器/计数器2用作波特率发生器时,具有以下特点
(1)必须设置T2CON寄存器中的RCLK和/或TCLK为1(有效);
(2)计数器回0溢出再装载但不会置位TF2向CPU请求中断;
(3)如果T2EX引脚上发生负跳变将置位EXF2为1,向CPU请求中断处理,但不会将陷阱寄存器“RCAP2H RCAP2L中预置的计数初值装入TH2和TL2中。因此,可将T2EX引脚用作额外的输入引脚或外部中断源。
(4)采用定时模式作波特率发生器时,是对fosc经2分频(时钟状态S)作为计数单位,而不是osc经12分频的机器周期信号。
(5)波特率设置范围广,精确度高。
串行通信应用举例
串行通信接口设计时,需考虑如下问题。
(1)首先确定通信双方的数据传输速率。
(2)由数据传输速率确定采用的串行通信接口标准。
(3)在通信接口标准允许的范围内确定通信的波特率。为减小波特率的误差,通常选用11.0592MHz的晶振频率。
(4)根据任务需要,确定收发双方使用的通信协议。
(5)通信线的选择,这是要考虑的一个很重要的因素。通信线一般选用双绞线较好,并根据传输的距离选择纤芯的直径。如果空间的干扰较多,还要选择带有屏蔽层的双绞线。
(6)通信协议确定后,进行通信软件编程。
1.串行口方式1应用编程
(1)甲机发送程序
甲机要发送的数据块的地址为片外RAM的2000H~201FH。发送时先发数据块的首末地址,然后再发送数据块。甲机先采用查询方式发4个字节的首末地址,然后再采用中断方式发送数据块,并采用比较末地址的方法,判断数据块是否发送结束。程序中用到了一个数据块发送完毕标志位F0,数据块如发送完毕,则标志位F0=1。
(2)乙机接收程序
乙机采用中断方式接收,先接收甲机发送的4个字节的首末地址,然后存于片内RAM的78H~75H单元中。接着再接收甲机发送的数据块,乙机把接收到的数据块存于片外RAM的2000H~201FH单元中。
程序中使用了两个标志位F0和7FH:
•标志位F0=0,表示接收地址,F0=1接收数据
•标志位7FH=0,表示数据未接收完;7FH=1表示数据接收完毕。
乙机接收程序如下:
2.串行口方式2应用编程
方式2和方式1有两点不同之处。接收/发送11位信息,多出第9位程控位,该位可由用户置TB8决定,这是一个不同点。另一不同点是方式2波持率变化范围比方式1小,方式2的波特率=振荡器频率/n。
当SMOD=0时,n=64。当SMOD=1时,n=32
鉴于方式2的使用和方式3基本一样 (只是波特率不同),所以方式2的应用,可参照下面的方式3编程。
3.串行口方式3应用编程
(1)甲机发送程序
(2)乙机接收程序
乙机把最先接收到的两字节数据(实质是存放数据的首地址)送给数据指针DPTR,作为数据存放的首地址,然后将后续接收到的数据存放到以先前接收的数据为首地址的单元中去。
乙机中断方式接收程序如下:
一般来说,定时器方式2用来确定波特率是比较理想,它不需反复装初值且波特率比较准确。在波特率不是很低的情况下,建议使用定时器T1的方式2来确定波特率。