当前位置: 首页 > article >正文

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

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,计算方式如下:

波特率=(2SMOD/32)*定时器T1溢出率
9600=(2/32)*T1溢出率; T1溢出率=153600

   定时器工作在12T,溢出率计算如下:

溢出率=(sysclk/12)/(256-TH1)
153600=((11.0592*1000000)/12)/(256-TH1)
TH1=250=0xFA

http://www.kler.cn/a/404017.html

相关文章:

  • XCode Build时遇到 .entitlements could not be opened 的问题
  • 【大语言模型】ACL2024论文-19 SportsMetrics: 融合文本和数值数据以理解大型语言模型中的信息融合
  • 【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作
  • 【反向迭代器】—— 我与C++的不解之缘(十七)
  • 使⽤MATLAB进⾏⽬标检测
  • tcpdump抓取流量包详解
  • 「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
  • 【linux】linux挂载网络磁盘-挂载windows的smb共享文件夹
  • 【HarmonyOS Next】鸿蒙实用装饰器一览(一)
  • Hive 函数(实例操作版2)
  • Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
  • 【SQL实验】视图操作(菜单操作和命令操作)
  • 储能柜起什么作用,工商业储能柜厂家有哪些?
  • php 使用mqtt
  • Docker3:docker基础1
  • 手游市场的蓬勃发展,进一步促进了中国【游戏模拟器】的发展
  • MATLAB方程组
  • Ubuntu networkmanager
  • 【过程控制系统】第5章 简单控制系统
  • 五种算法B站视频推荐系统|vue+springboot前后端分离架构、多层感知机+矩阵奇异值分解+协同过滤四种推荐算法集成+机器学习预测算法、B站视频爬取
  • SAP API:查找、配置、测试
  • litellm - 简化大模型 API 调用的工具
  • SEO网站都用哪里的服务器
  • 40分钟学 Go 语言高并发:Goroutine基础与原理
  • Linux网络——传输层协议
  • Scala学习记录,全文单词统计