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

相关推荐
智商偏低3 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen4 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森6 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白6 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D7 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术10 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt10 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘11 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang11 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n13 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件