51单片机之串口通讯
1.串口简介
串口,全称串行通信接口或串行通讯接口(通常指COM接口),是一种常用于电子设备间通讯的全双工扩展接口。
串口通讯的技术基础,指一位一位地按顺序传送数据。其特点是线路简单,只需一对传输线,即可实现双向通信,大大降低成本。串行收发模块是串口的现实载体,负责实现串行通讯,被集成到各种计算机设备中。其中,应用最广的是USART(Universal Synchronous/Asynchronous Receiver/Transmitter)——通用同/异步串行接收/发送器。
发送设备将并行数据转换为串行数据,在数据字节前发送起始位(逻辑低电平),然后依次发送数据字节的每个Bit(最低位先发送)。数据字节发送完成后,发送设备发送停止位(逻辑高电平)。接收设备检测到起始位后开始接收数据位和停止位,并转换为并行数据输出。
随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能愈来 愈显得重要。在WIFI、蓝牙、GPS、GSM/GPRS等应用的控制无不体现串口通信的重要性。
本章节将介绍串口收发功能配置方式,开发板上集成了1个串口通信电路,通过USB转串口CH340C模块实现上位机与开发板之间通讯。本串口也是作为程序下载端口。
2.协议特性
串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。常用的协议包括RS-232、RS-422和RS-485等。
RS-232:用于计算机与外部设备通信的标准串口协议,传输距离短,使用±3到±15V表示逻辑信号。它只限于PC串口和设备间点对点的通信,最远距离是50英尺(约15米)。
RS-422:使用差分信号,具有更好的抗噪声能力和更远的传输距离。它允许在相同传输线上连接多个接收节点,最多可接10个节点,即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信。
RS-485:在RS-422基础上增加了多点通信功能,支持多设备连接。它可以实现一主多从的通信结构,总线上可多接到32个设备。
3.串行通讯与并行通讯
- 串行通讯
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。如下图所示:
- 并行通讯
并行通信通常是将数据字节的各位用多条数据线同时进行传送,通常是8位、16位、32位等数据一起传输。如下图所示:
4.同步通讯与异步通讯
- 同步通讯
同步通讯是一种比特同步通信技术,要求发送方和接收方具有同频同相的同步时钟信号。在数据传输开始时,只需在报文的开头添加特定的同步字符,以便双方建立同步关系。此后,数据将在同步时钟的控制下逐位进行发送和接收。
同步通讯需要严格的时序要求,依赖于共享的时钟信号来协调数据的传输。数据在同步时钟的控制下逐位发送和接收,具有较高的数据传输速率。
同步通讯通常采用阻塞式方式,即发送方在发送数据后会阻塞,等待接收方的响应。这种方式由于数据在同一时间进行发送和接收,延迟较小,因此非常适合实时应用。
同步通讯适用于高速数据传输和实时控制系统,如传感器接口(I2C协议)、显示屏数据传输(SPI协议)等。
- 异步通讯
异步通讯是一种不需要共享时钟信号的通信模式。发送方和接收方之间没有严格的时序要求,可以独立进行操作,而无需等待对方的响应。数据一旦在发送方准备好,就可以立即发送,接收方在收到数据后进行处理。
异步通讯:对时序的要求较低,不需要共享时钟信号,允许在不同时刻发送和接收数据。字符之间的时间间隔可以是任意的,但字符内各位的时间间隔是固定的。需要在每个字符的开始和结束处添加标志(开始位和停止位),以确保接收方能够正确接收每个字符。
异步通讯发送方可以在任何时刻开始发送字符,接收方在收到数据后进行处理,并通过回调机制通知发送方发送的字符已经得到了确认。
异步通讯适用于长距离通信和低速数据传输的应用,如串口通信(UART协议)、远程数据传输等。
5.通讯波特率
衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示。比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。如每秒钟传送240个字符,帧格式为1位起始位+8位数据位+1位停止位,即传输一个字符需要10位数据。这时的比特率为:
6.串口相关寄存器
6.1 串口控制寄存器SCON
地址:0x98 可位寻址
6.2 电源控制寄存器PCON
地址:0x87 不可位寻址
6.3 串口数据寄存器SBUF
地址:0x99
STC89xx系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。
串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。
由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
7.软件设计
配置串口工作模式为方式1,设置波特率为9600,使能串口接收中断。串口初始化代码如下:
void USART_Init(void)//设置波特率为9600
{
PCON=0x80;//波特率加倍
SCON=0x50;//设置串口为工作方式1
TMOD|=0x20;//设置定时器1为工作方式2:8位自动重装载
//波特率
TH1=0xFA;
TL1=0xFA;
//开启中断
ES=1;//串口中断
EA=1;//总中断
TR1=1;//使能串口1
}
串口中断服务函数如下:
void usart_irq(void) interrupt 4
{
u8 dat;
RI=0;//清除标志位
dat=SBUF;//读取数据
SBUF=dat;
while(TI==0){}//等待发送完成
TI=0;
}
串口发送数据函数:
void USART_SendCha(u8 cha)
{
ES=0;//串口中断
TI=0;
SBUF=cha;
while(TI==0){}//等待发送完成
TI=0;
ES=1;//串口中断
}
/*串口发送数据*/
void USART_Sendstr(u8 *dat)
{
while(*dat)
{
USART_SendCha(*dat++);
Delay_Us(3);
}
}
主函数
#include "main.h"
#include "delay.h"
#include "key/key.h"
#include "TIMER/timer.h"
#include "usart/usart.h"
sbit BEEP=P2^5;
void BEEP_Ctl(u16 time)
{
if(time<=0)return ;
while(time--)
{
BEEP=!BEEP;
Delay_Us(50);//频率2~5KHZ
}
}
int main()
{
u8 i=0;
u8 key;
char buffer[10];
u8 *str="12345";
u8 cnt=100;
key_Init();
LED=0xFF;//关闭所有LED
//Timer0_Init(0xFBC3);
Timer0_Init(164);
USART_Init();//串口初始化
USART_Sendstr("51单片机 串口初始化完成\r\n");
USART_Sendstr(buffer);
while(1)
{
key=Key_GetValue();
if(key)
{
BEEP_Ctl(100);
Delay_Ms(20);
BEEP_Ctl(0);
LED=~LED;
}
}
}
注意:串口发送数据时需要将串口中断关闭,发送完成在开启。
8.串口通讯波特率计算
以方式1为例,方式1(SM1 SM0=01),8bit USART可变波特率,波特率加倍(SMOD=1),设置波特率为9600,计算方式如下:
定时器工作在12T,溢出率计算如下: