51单片机-串口通信

news2025/1/11 6:30:49

目录

1.什么是通信

1.1.通信的概念

1.2.传送方式

1.3.同步方式

1.4.传送方向

1.5.校验方式

2.单片机串口介绍

2.1.硬件电路

2.2.电平标准

2.3.常见接口

2.4.内部结构

2.5.相关寄存器

2.6.工作模式(模式1)

2.7.如何配置串口中断

3.实际应用

3.1.单片机向电脑发送数据

3.2.电脑向单片机发送数据


1.什么是通信

1.1.通信的概念

        简单来说,通信就是传递信息;我把信息发给你,你把信息发给我,这就是通信;但是我如何把信息准确传递给你,方式有很多。

        在硬件领域,通信的方式也有很多种,从简单的串口通信,到I2C,SPI,CAN,MIPI等,不同的通信总线,对应的协议也不同;但通信的本质有相同之处;

  • 按照数据传送方式可分为串行通信和并行通信;
  • 按照通信的数据同步方式,可分为异步通信和同步通信;
  • 按照数据的传输方向又可分为单工、半双工和全双工通信

1.2.传送方式

        计算机与外界的信息交换称为通信,通信传送的基本方式可分为并行通信和串行通信两种;

并行通信:将数据字节的各位用多条数据线同时进行传送,如系统总线;

  • 优点:控制简单,传输速度快;
  • 缺点:由于传输线较多,长距离传送时成本高;抗干扰能力差,固接受方的各位同时接收存在困难;

串行通信:将数据字节分成一位一位的形式,在一条传输线上逐位传送

  • 优点:传输线少,长距离传送时,成本低;抗干扰能力强,适合长距离传送;
  • 缺点:控制复杂,传输速度慢;

1.3.同步方式

同步通信:同步通信是一种连续传送数据的通信方式,一次通信传送多个字符数据,称为一帧信息。

  • 特点:数据传输速率较高;其缺点是通信双方必须建立准确的位定时信号,也就是发送时钟和接收时钟保持严格同步;

  • 同步字符:传送数据前,传送同步字符进行联络;
  • 信息帧:包含同步字符,数据场,校验字符;
  • 数据场:多个数据字节之间没有间隙,连续发送;

异步通信:在异步通信中,数据通常是以字符或字节为单位组成数据帧进行传送的。收、发端各有一套彼此独立,互不同步的通信机构,由于收发数据的帧格式相同,因此可以相互识别接收到的数据信息

  • 特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。

  • 起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步;
  • 数据位:数据位紧跟在起始位之后,是通信中的真正有效信息;数据位的位数可以由通信双方共同约定;传输数据时先传送字符的低位,后传送字符的高位;
  • 校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。
  • 停止位:停止位可以是是1位、1.5位或2位,可以由软件设定;它一定是逻辑1电平,标志着传输一个字符的结束;
  • 空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充;

1.4.传送方向

        串行通信的传送方式有三种,分别是单工、半双工和全双工。

单工: 数据传输只支持数据在一个方向上传输;

半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;

全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。

1.5.校验方式

  • 奇偶校验:在发送数据时,数据位尾随的1位为奇偶校验位(1或0)。奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数;偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。
  • 代码和校验:代码和校验是发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,相符则无差错,否则即认为传送过程中出现了差错。
  • 循环冗余校验:这种校验是通过某种数学运算实现有效信息与校验位之间的循环校验,常用于对磁盘信息的传输、存储区的完整性校验等。这种校验方法纠错能力强,广泛应用于同步通信中。

2.单片机串口介绍

        串口通信(Serial Communication),是指外设和计算机间通过数据信号线地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

        51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

2.1.硬件电路

        简单双向串口通信有两根通信线(发送端TXD和接收端RXD),交叉连接,并且共GND,如图:

2.2.电平标准

        电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

  • TTL电平:+5V表示1,0V表示0
  • RS232电平:-3~-15V表示1,+3~+15V表示0
  • RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

2.3.常见接口

 此外,还有CAN、USB等;

2.4.内部结构

        有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误

2.5.相关寄存器

 1.串口控制寄存器SCON

  • SM0/SM1:工作方式选择位;

  • SM2:多机通讯控制位;方式2/3中使用,控制接收数据;SM2=1,只有当RB8=1才能激活R1,接收数据;
  • REN:允许串行接收位;REN=1,启动串行口接收数据;REN=0,禁止接收;
  • TB8:在方式2或方式3中,是发送数据的第9位,可以用软件规定其作用;可以用作数据基偶校验位,或在多机通信中,作为地址帧/数据帧的标志位;
  • RB8:在方式2或方式3中,是发送数据的第9位,可以用软件规定其作用;可以用作数据基偶校验位;在方式1时,若SM2=0,则RB8是接收到的停止位;
  • TI:发送中断标志位;在方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发送中断申请;在中断服务程序中,必须用软件将其清0,取消此中断申请
  • RI:接收专断标志位;在方式0时,当串行发送第8位数据结束时,或在其他方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发送中断申请;在中断服务程序中,必须用软件将其清0,取消此中断申请;

2.电源控制寄存器PCON

只有一位SMOD和串口工作相关,其他位是电源控制相关;那为什么和串口相关的控制位,会放到PCON去呢,原因是串口控制位超过了8位,刚好电源的控制位用不到8位,所以...

  • SMOD:波特率倍增位;在串口方式1/2/3时,波特率与SMOD有关,当SMOD=1,波特率加倍;复位时,SMOD=0;

2.6.工作模式(模式1)

模式1:模式1是10位数据的异步通信口,其中1位起始位,8位数据位,1位停止位,TXD和RXD分别为数据的发送和接收引脚;其传输波特率是可变的,对于51单片机,波特率由定时器1的溢出率决定;通常我们在做单片机与单片机串口通信,单片机与计算机串口通信,计算机与计算机串口通信时,基本都选择模式1,其传输一帧的数据格式如下:

        模式1传输一帧的数据共10位,1位起始位(0),8位数据位,最低位在前,最高位在后,1位停止位(1),帧与帧之间可以有空闲,也可以无空闲,模式1数据输出和输入时序图如下:

波特率:模式1的波特率是可变的,波特率=2^SMOD/32*溢出率;

  • 当单片机工作在12T模式时,定时器1的溢出率=SYSclk/12/(256-TH1)
  • 当单片机工作在6T模式时,定时器1的溢出率=SYSclk/6/(256-TH1)

溢出率:单位时间(秒)内定时器/计数器1回0溢出的次数,即定时器/计数器1的溢出率=定时器/计数器1的溢出次数/秒

2.7.如何配置串口中断

        在具体操作串行口之前,需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置,主要是设置产生波特率的定时器1,串行口控制,和中断控制,具体步骤如下:

  • 配置TMOD寄存器:确定定时器的工作模式(T2);
  • 配置TCON寄存器:定时器的控制开关;
  • 计数器初值配置:装载TH1,TL1;
  • 配置SCON寄存器:确定串行口工作模式;
  • 中断配置:串行口在中断方式时,要进行中断设置(配置IE,I);

//*串口初始化
void UART_Init()
{
	//*TMOD配置:设置定时器模式,
	TMOD&=0x0F;
	TMOD|=0x20;

    //*TCON配置
	TR1=1;       //打开定时器

    //*计数器配置
	TH1=0xF3;    //设置定时器初始值 1111 0011
	TL1=0xF3;    //设置定时器重装值 1111 0011
    /********************************************
    波特率计算:
    1.二进制的OxF3=十进制的243;
    2.每隔256溢出一次,256-243=13(每计13个数就溢出1次)
    3.12MHz的晶振,每1us计一次数,以上计13个数就会溢出,也就需要13us
    4.溢出率=1/13us=0.07692MHz
    5.波特率=溢出率/16=0.00480769MHz=4807Hz
    6.波特率加倍=波特率*2=9614Hz
    **********************************************/

    //*SCON配置 波特率9600hz
	SCON=0x50;	 //设置串口工作模式1,SCON=0101 0000
	PCON=0x80;   //设置波特率,SMOD=1,波特率加倍;PCON=1000 0000

    //*中断配置
    ES=1;        //打开串行口中断
    EA=1;        //打开总中断   
}

3.实际应用

3.1.单片机向电脑发送数据

功能需求:串口向电脑发送递增的16进制数据(单片机每隔一段时间通过串口向电脑发送数据)

程序设计:首先,将串口有关的特殊功能寄存器进行初始化设置(初始化);其次,定义串口需要发送的字节(子函数);最后,通过主函数实现想要的效果

#include <REGX51.H>
#include "Delay.h"

unsigned char Sec;//全局变量

//*串口初始化函数
/********************************************
因定时器1在工作模式2时,为8位自动重装方式,我们进中断后无事可做,
因此,无需打开定时器1的中断,更无需写定时器1的中断服务程序
**********************************************/
void UART_Init()
{
	TMOD&=0x0F;
	TMOD|=0x20;
	TR1=1;
	TH1=0xF3;
	TL1=0xF3;
	ET1=0;
	SCON=0x40;
	PCON|=0x80;
}

//*子函数
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;    //把Byte的值赋给缓存SBUF
	while(TI==0); //确认发送控制器TI标志位的状态,只有当TI不等于0时,才会跳出循环
	TI=0;         //清除发送完成标志位
}

//*主函数
void main()
{
	UART_Init();
	while(1)
	{
		UART_SendByte(Sec);
        Sec++;
		Delay(1000);//延时1s
	}
}

3.2.电脑向单片机发送数据

功能需求:电脑向单片机发送数据,同时控制LED灯亮灭

程序设计:首先,将串口有关的特殊功能寄存器进行初始化设置(初始化);其次,定义串口需要发送的数据(子函数);最后,通过主函数和中断服务程序,实现想要功能

#include <REGX51.H>

//*串口初始化函数
void UART_Init()
{
	TMOD&=0x0F;
	TMOD|=0x20;
	TR1=1;
	TH1=0xF3;
	TL1=0xF3;
	ET1=0;
	SCON=0x50;
	PCON|=0x80;
	ES=1;
	EA=1;
}

//*子函数
void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;    //把Byte的值赋给缓存SBUF
	while(TI==0); //确认发送控制器TI标志位的状态,只有当TI不等于0时,才会跳出循环
	TI=0;         //清除发送完成标志位
}

//*主函数
void main()
{
	UART_Init();
	while(1)
	{

	}
}

//*中断函数
void UART_Routine() interrupt 4
{
	if(RI==1)    //接收中断
	{
		P2=~SBUF;//将P2口赋值为~SBUF,控制LED亮灭
		UART_SendByte(SBUF);//单片机接收电脑发送的数据
		RI=0;    //清除接收完成标志位
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/567582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【手撕MyBatis源码】JDBC处理器StatementHandler

文章目录 回顾MyBatis的执行流程StatementHandler定义与结构PreparedStatementHandler执行流程参数处理参数转换参数映射参数赋值 结果集处理 回顾MyBatis的执行流程 MyBatis是一个基于JDBC的Dao框架&#xff0c;但前面我们提到的会话、执行器完全没有提到JDBC&#xff0c;原因…

python实现科学计算与自定义手绘风

目标&#xff1a; 1.运用科学计算库进行矩阵分析和数值运算&#xff1b; 2.掌握numpy库的使用。 要点&#xff1a;这是一个使用numpy和PIL库提取图像特征形成手绘效果的实例。 使用PIL库获取了图像的轮廓&#xff0c;虽然提取了轮廓,但这个轮廓缺少立体感&#xff0c;视觉效果不…

STL简介与类模板,函数模板的联系,迭代器的引入与初步简单认识

什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的版本 原始版本&#xff1a;Alexander Stepanov、Meng Lee 在惠普实验室完成的原…

关于宝塔部署jar包和war包

文章目录 前言一、jar包部署二、war包部署1.maven如果打包不了使用命令打包2.安装Tomcat进行访问是否成功2.进入Tomcat目录进行配置war包 一、项目访问方法 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、jar包部署 1.其实jar包没什么讲的&…

开源云原生数仓引擎ByConity 存储计算分离架构和优势

供稿 | ByConity技术团队 出品 | CSDN 云计算 ByConity是一款字节跳动开源的云原生数仓引擎。它的一个重要优势是采用存储计算分离的架构&#xff0c;实现了读写分离和弹性扩缩容。这种架构确保读操作和写操作不会相互影响&#xff0c;使得计算资源和存储资源解耦&#xff0c;…

SpringBoot 结合 MyBatis-plus 进行逻辑删除

一 、逻辑删除的概念 逻辑删除不会在数据库中删除数据&#xff0c;只是通过一个字段用来标识被删除的记录&#xff0c;数据仍然保存在数据库中。在实际的工作当中&#xff0c;因为数据非常重要&#xff0c;为了防止因用户误操作删除数据后无法恢复的问题&#xff0c;我们通常不…

在 Spring Boot 中使用 Spring Cloud Kubernetes 部署应用到 Kubernetes

在 Spring Boot 中使用 Spring Cloud Kubernetes 部署应用到 Kubernetes Kubernetes 是目前最流行的容器编排平台之一&#xff0c;提供了一种灵活的方式来管理容器化应用程序。Spring Cloud Kubernetes 是一个基于 Spring Cloud 的项目&#xff0c;它提供了一种简单的方式来将…

探索可视化大屏:引领信息时代的视觉革命

可视化大屏是一种利用先进的数据可视化技术和交互技术&#xff0c;将大量的数据和信息以直观、易于理解的方式展示在大屏幕上的解决方案。可视化大屏通常由高分辨率的显示屏、强大的计算和处理设备以及专业的可视化软件组成&#xff0c;它通过图表、图形、动画等可视化元素&…

day08 Spring MVC

spring MVC相当于Servlet mvc解释:模型,视图,控制器 **使用该思想的作用:**减少耦合性,提高可维护性 Spring MVC前端控制器 方式1 1.在web.xml中配置前端控制器方式2 ​ 要是用前端控制器,必须在web.xml中配置DidpatcherServlet类 <!--前端控制器--> <servlet&g…

面试经验小结

1、为什么C有重载而C语言没有&#xff1f; C的编译过程中&#xff0c;将函数名后面的数据类型也加入到了编译阶段。 2、用异或完成两个数的数值交换。 x^y&#xff1b; y^x&#xff1b; x^y&#xff1b; 3、数组指针与指针数组&#xff1b;函数指针与指针函数 4、segment …

jdk15至17——sealed密封关键字

sealed关键字是从jdk15开始预览&#xff0c;直到jdk17成为正式版&#xff0c;可以对继承父类和实现接口进行更加细粒度的限制&#xff0c;之前的限制也只有final用于禁止继承&#xff0c;默认包权限限制在同一个包内&#xff0c;sealed密封类/接口可以明确指定哪些类可以进行继…

C# 调用Matlab打包的 DLL文件(傻瓜式操作)

1、准备Matlab代码 2. 打包 在matlab命令行窗口输入deploytool,打开MATLAB Complier,选择Library Compiler 在TYPE中选择.NET Assembly;在EXPORTED FUNCTIONS中选择要打包的文件&#xff1b;可以选择为自己打包的文件自定义NameSpace名称&#xff0c;本例中将NameSpace定义为…

Google Earth Engine(GEE):大数据林业应用

近年来遥感技术得到了突飞猛进的发展&#xff0c;航天、航空、临近空间等多遥感平台不断增加&#xff0c;数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量猛增&#xff0c;遥感数据已经越来越具有大数据特征。遥感大数据的出现为相关研究提供了前所未有的机遇&#xf…

AcrelCloud-9500电瓶车充电桩收费平台 在苏州市某拆迁小区的应用

摘 要&#xff1a;全国各地电瓶车充电引发火灾的事故时有发生&#xff0c;对人民群众的生命财产安全造成了很大的威胁&#xff0c;本文介绍的苏州市某拆迁小区&#xff0c;是海虞镇为创建市级消防安全“331”示范社区选定的社区&#xff0c;该社区采用4G通信方式与服务器进行通…

一篇文章带你看懂5G网络(接入网+承载网+核心网)

通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧&#xff1a;手机或者集团客户通过基站…

mysql安装8.**版本

1. 下载MySQL 8.0.22 源码包: wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.22.tar.gz 2. 解压源码包: tar -zxvf mysql-8.0.22.tar.gz -C /usr/local 3. 创建用于编译的构建目录: …

LDO基本知识

本文引用TI文档 压降 压降电压 VDO 是指为实现正常稳压&#xff0c;输入电压 VIN 必须高出 所需输出电压 VOUT(nom) 的最小压差。 如果 VIN 低于此值&#xff0c;线性稳压器将以压降状态工作&#xff0c;不再调 节所需的输出电压。在这种情况下&#xff0c;输出电压 VOUT(drop…

【Docker】进入docker容器

进入已经在运行的docker容器 1、查看所有在运行的docker容器 docker ps2、进入指定的docker容器 docker attach 容器CONTAINERID docker attach 8ad850b602ff查看log docker logs -f 8ad850b602ff

普通本科机械设计毕业生,如何零基础转行数据分析?

作为本科生转行数据分析还是比较容易的&#xff0c;我们数据分析班里本科生占了一大半&#xff0c;专业也都是非计算机相关的&#xff0c;有机械、机电、会计、金融等专业的应届生&#xff0c;基本对于计算机方面接触都不算多&#xff0c;专业方面肯定都是零基础&#xff0c;会…

【案例教程】R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件&#xff0c;以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛&#xff0c;数据常多样而复杂。利用R语言进行多元统计分析&#xff0c;从复杂的现象中发现规律、探索机制正是R的优势。为此&#xff0c;本课程以鱼类、昆虫、水文、地形等多样…