3.4 单片机的串行通信
51系列单片机内部有一个全双工串行口。串行通信是数据一位一位传输通信方式,它的突出优点适用于远距离通信,缺点传输速率慢。串行通信有两种通信方式:同步通信和异步通信。同步通信是一种连续传输数据的通信方式,一次通信传送多个字符数据,称为一帧信息。数据传输速率相对较高通常可以达到56000bit/s及以上。其缺点则是要求发送的时钟频率和接收时钟频率保持严格同步。异步通信中数据通常是以字符或者字节为单位组成数据帧进行传送。收发两端各自拥有彼此独立互不同步的通信机构,由于收发数据的帧格式相同,所以可以相互识别接收到的数据信息。
1.串行控制状态寄存器
串行控制状态寄存器(SCON)是一个逐位定义的8位寄存器,用于选择串行工作方式、控制串行的接收、发送和检测状态,字节地址是98H,位地址98H~9FH,见表3-9。
表3-9 SCON
SM0和SM1:串行工作方式控制位见表3-10。
表3-10 SCON工作方式
SM2:多机通信控制位。仅用于方式2和方式3多机通信。其中发送机SM2=1(需要程序控制设置)。接收机的串行工作于方式2或3,SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请引发串行接收中断,否则会将接收的数据放弃。当SM2=0时,不管第9位数据是0还是1,都将数据送入SBUF,并置位RI发出中断申请。工作于方式0时,SM2必须为0。
REN:串行接收允许位:REN=0时,禁止接收;REN=1时,允许接收。
TB8:在方式2、3中,TB8是发送机要发送的第9位数据。在多机通信中它代表传输的地址或数据,TB8=0为数据,TB8=1为地址。
RB8:在方式2、3中,RB8是接收机接收到的第9位数据,该数据正好来自发送机的TB8,从而识别接收到的数据特征。
TI:串行发送中断请求标志。当CPU发送完一串行数据后,此时SBUF寄存器为空,硬件使TI置1,请求中断。CPU响应中断后,由软件对TI清零。
RI:串行接收中断请求标志。当串行接收完一帧数据时,此时数据装载SBUF寄存器,硬件使RI置1,请求中断。CPU响应中断后,用软件对RI清零。
2.电源控制寄存器PCON
电源控制寄存器PCON字节地址是87H,并且不可对其进行位寻址,见表3-11。
表3-11 PCON
IDL:待机方式位,IDL=1进入待机工作位。若PD=1、IDE=1,则进入掉电工作方式。复位PCON所有位都是0。
PD:掉电方式位。
GF1、GF0:通用标志位,用户使用软件置位、复位。
SMOD:串口波特率倍增位。当SMOD被置位1并且串行通信工作在模式1、3时波特率提高1倍即波特率加倍。置位0时波特率正常。系统复位时SMOD=0。
3.串行通信工作方式
串行通信有4种工作方式。
1)方式0。方式0是同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)引脚输出。发送和接收均为8位数据,低位在先,高位在后。波特率固定位fose/12,SM2必为0。
2)方式1。方式1是10位数据的异步通信。TXD为数据发送引脚,RXD为数据接收引脚。其中1位是起始位,8位数据位,1位停止位。
数据发送和接收时使用方式1是由一条写发送寄存器(SBUF)指令开始。随后在串行口由硬件自动加入起始位和停止位,构成一个完整的帧格式,而后在移位脉冲的作用下由TXD端口串行输出一帧字符发送完以后TXD输出维持在1的状态下,并将SCON寄存器TI置1让CPU可以发送下一个字符。接收数据时SCON的REN位处于允许接收状态(REN=1),串行口接收数据RXD端监测到从1到0跳变,判定起始位接收,将接收到的数据装载到接收缓冲器SBUF中,直到停止位到来,将停止位送入RB8中并置位中断标志位RI通知CPU从SBUF中取走接收到的字符。
波特率设定:方式1的波特率是可变的,其波特率由定时器1的计数溢出率和SMOD共同决定,即
其中,SMOD是PCON最高位的值,SMOD=1表示波特率加倍定时器工作在方式2。
3)方式2。方式2是固定波特率的11位的异步通信。1个起始位,9个数据位和1个停止位。发送时编程位TB8可以赋值0或1,接收时可编程位进入SCON的RB8。
波特率则是固定的,波特率=2SMOD×fosc/64。波特率与PCON寄存器中SMOD位的值有关。
使用方式2程序初始化:单片机外接晶振fosc=11.0592MHz
SCON=0x80;
TMOD=0x01;
PCON=0x00;
TH1=0xFD;
TL1=0xFD;
EA=1;
EX0=1;
ES=1;
TR1=1;
4)方式3。方式3是11位异步串行通信,1个起始位,9个数据位和1个停止位,但波特率不固定其他与方式2相仿。
波特率是由定时/计数器T1的溢出率和SMOD共同决定的。
波特率=2SMOD×(定时器1溢出率)/32;
式中,T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。