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位数据。这时的比特率为:
10位×240个/秒 = 2400bps

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,使能串口接收中断。串口初始化代码如下:

c 复制代码
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
}

串口中断服务函数如下:

c 复制代码
void usart_irq(void) interrupt 4
{
  u8 dat;
  RI=0;//清除标志位
  dat=SBUF;//读取数据
  SBUF=dat;
  while(TI==0){}//等待发送完成
    TI=0;
}

串口发送数据函数:

c 复制代码
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);
  }
}

主函数

c 复制代码
#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,计算方式如下:
波特率=(2SMOD/32)*定时器T1溢出率 9600=(2/32)*T1溢出率; T1溢出率=153600

定时器工作在12T,溢出率计算如下:
溢出率=(sysclk/12)/(256-TH1) 153600=((11.0592*1000000)/12)/(256-TH1) TH1=250=0xFA

相关推荐
MARIN_shen19 分钟前
Marin说PCB之POC电路layout设计仿真案例---06
网络·单片机·嵌入式硬件·硬件工程·pcb工艺
Asa31935 分钟前
STM32-按键扫描配置
stm32·单片机·嵌入式硬件
南城花随雪。1 小时前
单片机:实现驱动超声波(附带源码)
单片机·嵌入式硬件
yutian06069 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程12 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉16 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67716 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣17 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室17 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费17 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件