51单片机之串口通讯

news/2024/11/22 14:52:48/

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;//设置串口为工作方式1TMOD|=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.ppmy.cn/news/1549061.html

相关文章

【Python】【持续项目】Python-安全项目搜集

1、前言 Python发展以来&#xff0c;除了web安全方向&#xff0c;二进制方向也早已经积累有很多用Python写的项目。作为搜集者当然不能错过&#xff01; 2、项目分类 安全编程 多功能Python键盘记录工具&#xff1a;Radium   项目地址&#xff1a;GitHub - mehulj94/Radium:…

【Mac】卸载JAVA、jdk

1. 通过终端执行 /usr/libexec/java_home -V 查找jdk的版本和位置&#xff0c;这里找到jdk文件的名字&#xff08;我是jdk-23.jdk 第4步会用到&#xff09; yyzccnn-mac ~ % /usr/libexec/java_home -V Matching Java Virtual Machines (1):23.0.1 (arm64) "Oracle Corpo…

大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

Redis Pipeline 管道 ✨

✨探索Redis Pipeline 管道✨ Redis Pipeline 管道批量处理&#xff1a;谨防传输命令过多 在 Redis 操作中&#xff0c;Redis Pipeline 管道批量处理是个很实用的功能&#xff0c;但使用时需格外留意&#xff0c;不要在一次批处理中传输太多命令&#xff0c;下面来详细说说原因…

【LeetCode面试150】——202快乐数

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…

力扣 LeetCode 98. 验证二叉搜索树(Day9:二叉树)

解题思路&#xff1a; 方法一&#xff1a;直接中序遍历放入数组&#xff08;非常直观的想法&#xff09; 需要注意用for循环进行重复值的判断&#xff0c;二叉搜索树不能有值相等的节点 class Solution {List<Integer> list new ArrayList<>();public boolean …

Redis 集群主要有以下几种类型

Redis 集群主要有以下几种类型&#xff1a; 主从复制模式&#xff1a; 这种模式包含一个主数据库实例&#xff08;master&#xff09;与一个或多个从数据库实例&#xff08;slave&#xff09;。客户端可以对主数据库进行读写操作&#xff0c;对从数据库进行读操作&#xff0c;主…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…