51单片机串口通信及波特率设置
1. 数据缓冲寄存器SBUF
SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2. 状态控制寄存器SCON
SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。它的各个位定义如下:
MSB LSB
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。
SM0 SM1 | 工作方式 | 功能 | 波特率 |
0 0 | 0 | 8位同步移位寄存器 | Fosc/12 |
0 1 | 1 | 10位UART | 可变 |
1 0 | 2 | 11位UART | Fosc/64或Fosc/32 |
1 1 | 3 | 11位UART | 可变 |
SM2在工作方式2和3中是多机通信的使能位。在工作方式0中,SM2必须为0。在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。此功能可用于多处理机通信。
REN为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。
TB8是工作方式2和3要发送的第9位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通信中,该位用于表示是地址帧还是数据帧。
RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。在工作方式0中RB8不使用。
TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。
RI为接收中断标志位,由硬件置位,软件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。RI=1时,申请中断,要求CPU取走数据。但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。在任何工作方式中都必须由软件清除RI。
系统复位时,SCON的所有位都被清除。
控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:
MSB LSB
SMOD | —— | —— | —— | GF1 | GF0 | PD | IDL |
仅最高位SMOD与串口的控制有关,其他位与掉电方式有关。PCON的地址为87H只能按字节寻址,SMOD是串行通信波特率系数控制位,当串口工作在工作方式1、2时,若使用T1作为波特率发生器其SMOD=1则波特率加倍(见下面详述)。
GF1 和GF0用于一般的用途,对于AT89系列为通用的标志位,PD为电源下降位,对于AT89系列,PD为1进入掉电状态,IDL为IDLE模式位,对于AT89系列,IDL为1进入空闲工作方式,在PD和IDL同时为1时,PD优先。
(1) 工作方式0
SM0=0且SM1=0时,串口选择工作方式0,实质这是一种同步移位寄存器模式。
其数据传输的波特率固定为Fosc/12,数据由RXD引脚输入或输出,同步时钟由TXD引脚输出。接收/发送的是8位数据,传输是低位在前,帧格式如下:
…….. | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | ……. |
(2)工作方式1
当SM0=0且SM1=1时,串口选择工作方式1,其数据传输的波特率由定时/计数器T1、T2的溢出速率决定,可通过程序设定。当T2CON寄存器中的RCLK和TCLK置位时,用T2作为发送和接收波特率发生器,而RCLK=TCLK=0时,用T1作为波特率发生器,两者还可以交叉使用,即发送和接收采用不同的波特率。数据由TXD引脚发送,由RXD引脚接收。
发送或接收一帧的数据为10位,即1位起始位(0)、8位数据位(低位在先)和1位停止位(1)。真格式如下:
起始位0 | D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | 停止位1 |
类似于工作方式0,当执行任一条SBUF指令时,就启动串行数据的发送。在执行写入SBUF的指令时,也将“1”写入发送移位寄存器的第9位,并通知发送控制器有发送请求。实际上,发送过程始于内部的16分频计数器下次满度翻转(全“1”变全“0”)后的那几个机器周期的开始。所以
51单片机串口通信波特率设 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)