51单片机编程应用(C语言):串口通信

目录

通信的基本概念和种类

   1.1串行通信与并行通信

​编辑

1.2同步通信与异步通信

1.3单工,半双工,全双工  

1.4通信速率 

二、波特率和比特率的关系

串口通信简介:

1.接口标准

RS-232

2、D型9针接口定义

3.通信协议:

2.串口内部结构 

51单片机串口相关寄存器 

 1.80c51串行口的控制寄存器

2.串口的使用方法 

串口实验 

1.单片机向电脑发送数据。

 2.电脑通过串口控制LED(且把数据传回电脑串口显示)


通信的基本概念和种类

   1.1串行通信与并行通信

什么是数据通信:数据通信就是指单片机与单片机之间或者单片机和其他设备之间的信息交换

而数据通信又分为串行通信并行通信

1.串行通信:

  • 串行通信:一位一位的按顺序的进行发送或接收的通信方式。优点是需要的传输线少,成本低。缺点是传输的速率慢,适合远距离的数据通信。

  • 并行通信:数据的各位同时进行发送或接收的通信方式。优点是速率高。缺点是需要的传输线多,成本高,只适合近距离的数据通信。

1.2同步通信与异步通信

同步通信与异步通信:简单来说就是发送方和接收方按照同一个时钟节拍工作就叫同步,发送方和接收方没有统一的时钟节拍,而各自按照自己的节拍工作就叫异步。

比如  烽火台      和            狼烟

(同步)

烽火台按照规定的时间发,比如7:00发一次,7:30发一次。

看狼烟的人也按规定的时间去接收,7:00看一次有没有狼烟,7:30看一次有没有狼烟。

7;05分敌人进攻了,烽火台也不会发生狼烟。看狼烟的人也不会接收到。

(异步)

烽火台按照规定的时间发,比如7:00发一次,7:05发一次。5分钟一次发

比如7:04分敌人进攻了,烽火台要到7:05发烽火,不会7:04发烽火

看狼烟的人2分钟看一下有没有狼烟。7:04看了没有狼烟,7:06才会去看

所以看狼烟的人7:06分才接受到有敌人进攻的消息。

同步通信中,通信双方按照同一节拍工作,配合很好:一般需要发送方给接收方发送信息同时发送时钟信息。接收方根据发送方给自己的时钟信号来安排自己的节奏。下图所示,时钟就是节拍。规定好的时间,计算机乙接收了节拍,就知道多少分钟拿一次数据。

同步通信用在双方信息交换频率固定,或者经常通信时。

优点:配合十分好       劣势:多了一个通讯线,专门发时钟的。

异步通信: 又叫异步通知,在双方通信频率不固定时适合,(有时3ms收发一次,有时3天才发一次),这样就不适合使用同步通信而适合异步通信。

因为另外一个CPU要眼盯着你发送,有时长时间一个都不发,有时发一堆,没有规律,这样就浪费了接收方自己的很多时间。比如,看狼烟的人不可能一直盯着天空看,有没有狼烟,这样浪费了他很多时间。他自己也是有活干的。

再举个例子,两个人聊天,一个人说,你陪我说句话吧,那个人说,好,结果,你看到QQ有消息,回QQ消息回了3小时,那个人眼盯着你回消息回三个小时,一直等你说那句话,这样他肯定会很生气。自己3小时啥都没干,所以这就是异步通信的好处。如果是异步通信,你就会说,兄弟,我现在有点忙,你先忙你的,等我忙忘了,再来找你。

异步通信时接收方不必一直在意接收方,发送方需要发送信息时会首先给接收方一个信息开始的起始信号,接收方接收到起始信号后。就认为后面紧跟着的是有效信息。才会开始注意接收信息,直到收到发送方发来的结束标志。

举例子,还是你跟一个人说一句话,这是你来电话了,你跟那个人说,你先忙你的,等你打完电话,这是你拍了拍他(发生起始信号),那个人就会转头,让你把那句话说完,你说,OK,没事了(发送结束标志),那个人就继续干自己的事。

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

1.3单工,半双工,全双工  

单工:只能单个方向传输。(相当于广播)单工是指数据传输仅能沿一个方向,不能实现反向传输。

 半双工(分时)(相当于对讲机)半双工是指数据传输可以沿两个方向,但是需要分时进行。

 全双工 (可以同时)(相当于电话) 全双工是指数据可以同时进行双向传输。

所以每一个通信方式在这三种都要进行选择,当然每一个芯片都有自己的设定方式。

1.4通信速率 

 也叫比特率:衡量通信速度的快慢。

  比特率是每秒钟传输二进制代码的位数,单位是:位 / 秒(bps)。比如每秒钟传送240个字符,而每个字符格式包括10位(1个起始位,1个停止位,8个数据位),这时的比特率为:

10位 x 240个/秒 = 2400 bps

波特率:可以看成比特率。是每秒钟传输多少个码元,

 码元:在通信系统中,携带数据信息的信号单元称为码元,也称为符号(symbol)

比如0V,同二进制0,5V同二进制1,所以一个码元等于二进制的比特位,可以存储0或1.

此时波特率等于比特率

0V,2V,4V,6V,分别用二进制00 01 10 11 表示的话,8个比特,4个码元,所以波特率等于比特率一半。

 举例说明:日常生活中乘坐公共交通工具出行,每个人就是一个比特,公共交通工具就是码元,单位时间的发车数量就是波特率,单位时间运输的人数就是比特率 。

在串口通信中,每秒发送的比特(0或1)是波特率,每秒钟发送的bit数为比特率。 所以,通常情况下,波特率等于比特率

二、波特率和比特率的关系

由此可以得出,假设码元状态为N,则此码元所需要的比特位数如下:

频谱带宽:频谱带宽其实是通信信号的最高频率和最低频率的差值。信号的波特率越高,在通信信道中传输此信号时,占用的通信信道频谱宽度就越大。比如在运输系统中,车型越大,行车占用的道路宽度就越大。

受硬件芯片处理速度的限制,为提升比特率,可通过提升波特率以及单个码元比特位数,进而提升比特率。此外,通信系统还要求设备芯片波特率≥信号波特率 ,通常芯片波特率有45GB、 69GB、 96GB、 128GB。如果所设计的信号波特率大于设备芯片波特率,则说明此信号是无法实现的,因为没芯片可以支持此信号的产生。

同时根据香农定理和经验,信号所需的频谱宽度数值应大于信号波特率的1.2倍,才能保证信号可以被高质量传输。在不考虑其它影响传输的因素,我们可以根据香农定理和经验,粗略算出波特率与所需频谱带宽的关系。

在主机和从机传输信号的过程中,主机和从机需要设置相同的波特率,否则会出现数据传输乱码现象或者数据传输失败现象。

串口通信简介:

1.接口标准

什么是串口:串口,全称为串行接口(Serial Port),是一种计算机通信接口,主要用于连接计算机和其他外部设备,如键盘、鼠标、打印机等。串口通过串行通信的方式工作,这意味着数据是以位(bit)为单位依次发送的。这种通信方式的一个显著特点是可以使用简单的双绞线实现双向通信,这在成本降低方面非常有用,尤其适合于长距离通信。尽管串口的速度相对较慢,但它提供了可靠的数据传输和低成本的解决方案,因此在许多应用中仍然被广泛使用。

串口是一种接线标准,他的接口一定要一致,如下图:

串口通信遵循特定的通信协议,这些协议定义了数据位的位数、波特率、校验位和停止位等参数。不同的串口技术,如通用异步收发器(UART)、TTL电平转换和RS-232/RS-485,虽然它们的电气特性可能有所不同,但它们都遵循相似的通信时序协议,因此都可以统称为串口。

总结来说,串口是一种使用串行通信技术的物理接口,提供了一种低成本且易于使用的数据传输方法,广泛应用于各种外设产品和数据采集系统中。

我们举个例子:

RS-232

RS-232接口符合美国电子工业联盟(EIA)制定的串行数据通信的接口标准,全双工,其中 RS 为英文 “Recomend Standard” 的缩写,中文翻译为“推荐标准”,232为标识号。原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接,连接电缆和机械、电气特性、信号功能及传送过程,其输出的电平称为 RS232 电平。

1、RS-232电平逻辑
RS-232不同于TTL的电平逻辑,为负逻辑,最简单的RS232通信由三条数据线组成,即 TxD、RxD 和GND。负12V代表高电平,即-15V ~ -3V为逻辑1,正12V代表低电平,即+3V ~ +15V为逻辑0,电压也有标准范围。这里的电平,是TXD线(或者RXD线)相对于 GND 的电压。

2、D型9针接口定义

记住一点,这种接口的协议只有两种:RS-232和RS-485。不会是TTL电平的(除非特殊应用)。

一般用的最多的是RXD、TXD、GND,三个信号。9针如上图右所示。

引脚功能图如下:

通常我们在串口通信只会用2 3 7脚D25模式下 

3.通信协议:

串行通信是一种概念,是指一个bit一个bit的收发数据,相对于并行通信可一次性可以同时收发n个bit而言。包括普通的串口通信,包括IIC,包括SPI等等。串口通信是一种通信手段/方式,是相对于以太网方式、红外方式、蓝牙方式、usb方式(usb广义也算串行通信)等而言,是一种比较低级的通信手段。

了解各种通信还需要多去实验,后面我会主要介绍几种常用的通信协议。

2.串口内部结构 

51单片机串口相关寄存器 

 1.80c51串行口的控制寄存器

    △ SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。 在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。

 △ REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收

    △ TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。

 △ RB8, 在方式2或者方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。

  △ TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

  △ RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

2.串口的使用方法 

 

根据自己需要按步骤来设置。 

串口实验 

发送和接收都“可以”触发中断,只是在发送的时候中断允许没有打开,所以“不会”发生中断。至于为什么发送的时候为什么不打开中断允许,看个人需要。(个人理解,错了指正)

为什么串口发电脑不要中断,串口接收电脑要中断

因为发送之后不需要单片机做什么,接受的时候需要单片机来记录下数据

4.只要RI>=1或者TI>=1就会触发串口中断。前提是程序打开了总中断和串口中断。

此时发送和接受都触发了中断,而且我们打开了中断,所以我们要区分(串口发电脑我们没有打开总的中断)

1.首先和内部结构有关,要结合串口通信内部结构来理解。

2.有数据发送过来,RI和TI会由硬件自动置1.

1.单片机向电脑发送数据。

写在while循环外面就要按复位键,不然一直停止while循环里面

下面是代码:完成单片机每次向电脑发送递增的数据(16进制)

这里没有用中断,定时器一只是可以计数,这样有溢出来产生波特率

#include <REGX52.H>
#include "Delay.h"unsigned char  Sec;void UART_Init(void)		//4800bps@11.0592MHz
{PCON |= 0x80;		//使能波特率倍速位SMODSCON = 0x40;		//8位数据,可变波特率   REN接收使能没打开TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xF4;		//设置定时初始值TH1 = 0xF4;		//设置定时重载值ET1 = 0;		//禁止定时器%d中断TR1 = 1;		//定时器1开始计时
}void UART_sendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}void  main()
{UART_Init();//UART_sendByte(0x11);while (1){UART_sendByte(Sec);Sec++;Delay(1000);}
}

 2.电脑通过串口控制LED(且把数据传回电脑串口显示)

用的是串口中断。无法知道电脑什么时候发送,如果电脑发送数据了,触发串口中断,在中断中处理数据

main.c

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"void  main()
{UART_Init();while (1){}
}void UART_Routine()  interrupt 4
{if(RI==1){P2=~SBUF;UART_sendByte(SBUF);RI=0;}
}

UART.c

#include <REGX52.H>/*** @brief  串口初始化    4800bps@11.0592MHz* @param  无* @retval 无*/
void UART_Init(void)		
{PCON |= 0x80;		//使能波特率倍速位SMODSCON = 0x50;		//8位数据,可变波特率TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xF4;		//设置定时初始值TH1 = 0xF4;		//设置定时重载值ET1 = 0;		//禁止定时器%d中断TR1 = 1;		//定时器1开始计时EA=1;           //使用打开中断ES=1;           //表示使用串口中断
}
/*** @brief  串口发送一个字节数据* @param  Byte  要发送一个字节数据* @retval */
void UART_sendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}

 UART.h

#ifndef __UART_H__
#define __UART_H__void UART_Init(void);
void UART_sendByte(unsigned char Byte);#endif

波特率计算方式,hex模式和文本模式区别听P20 47分钟后面 。

 

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

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

相关文章

【类与对象 -2】学习类的6个默认成员函数中的构造函数与析构函数

目录 1.类的6个默认成员函数 2.构造函数 2.1概念 2.2特性 3.析构函数 3.1析构函数的概念 3.2特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;…

PWM驱动直流电机

一、知识补充; 低频时有蜂鸣器响声&#xff0c;加大PWM频率&#xff0c;超出人耳范围就可以听不到&#xff0c;20Hz~20kHz 加大频率-->减小预分频器&#xff0c;从720-->36现在频率就是20kHz这样不会影响占空比&#xff1f; 二、接线图 三、代码分析 main,c #include…

docker (四)-docker网络

默认网络 docker会自动创建三个网络&#xff0c;bridge,host,none bridge桥接网络 如果不指定&#xff0c;新创建的容器默认将连接到bridge网络。 默认情况下&#xff0c;使用bridge网络&#xff0c;宿主机可以ping通容器ip&#xff0c;容器中也能ping通宿主机。 容器之间只…

飞天使-k8s知识点21-kubernetes实操6-daemonset

文章目录 daemonsetservice endpoint pod 之间的关系service基于Service访问外部服务 daemonset DaemonSet 是 Kubernetes 中的一种资源对象&#xff0c;它确保在集群中的每个节点上都运行一个 Pod 的副本。这对于运行集群级别的守护进程&#xff08;例如日志收集器、监控代理…

链式结构实现队列

链式结构实现队列 1.队列1.1队列的概念及结构1.2队列的实现 2. 队列的各种函数实现3. 队列的全部代码实现 1.队列 1.1队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(Fi…

.NET Core WebAPI中使用Log4net记录日志

一、安装NuGet包 二、添加配置 // log4net日志builder.Logging.AddLog4Net("CfgFile/log4net.config");三、配置log4net.config文件 <?xml version"1.0" encoding"utf-8"?> <log4net><!-- Define some output appenders -->…

python-自动化篇-办公-将PDF文件转存为图片

因工作中的某些奇葩要求&#xff0c;需要将PDF文件的每页内容转存成按顺序编号的图片。用第三方软件或者在线转换也可以&#xff0c;但批量操作还是Python方便&#xff0c;所谓搞定办公自动化&#xff0c;Python出山&#xff0c;一统天下&#xff1b;Python出征&#xff0c;寸草…

机器学习中7种常用的线性降维技术总结

上篇文章中我们主要总结了非线性的降维技术&#xff0c;本文我们来总结一下常见的线性降维技术。 1、Principal Component Analysis (PCA) Principal Component Analysis (PCA) 是一种常用的降维技术&#xff0c;用于将高维数据集转换为低维表示&#xff0c;同时保留数据集的…

高校疫情防控系统的全栈开发实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Fiddler 无法抓包手机 https 报文的解决方案来啦!!

解决手机https无法抓包的问题 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息 这时候怎么解决呢&#xff1f; 以软件测试面试提刷题APP为例&#xff1a; Fiddler上的显示…

蓝桥杯 星期计算

思路1 由于2022太大&#xff0c;用double来存储&#xff0c;即(52022 % 7) % 7即可 int num 5;int t (int)(Math.pow(20,22)%7);num t;num%7;System.out.println(num1);思路2 你需要知道 (a * b ) % p a % p * b % p Scanner scan new Scanner(System.in);int num 1;for…

深入解析ESP32C3(3)- bootloader启动流程

ESP32C3启动流程可以分为如下3 个步骤&#xff1a; 一级引导程序(PBL)&#xff1a;被固化在了ESP32-C3 内部的ROM 中&#xff0c;它会从flash 的0x0 偏移地址处加载二级引导程序至RAM (IRAM & DRAM) 中。二级引导程序(SBL)&#xff1a;从flash 中加载分区表和主程序镜像至…

python解构赋值详解(包含leetcode226.翻转二叉树题目讲解以及python代码)

目录 一、背景 1.1问题 1.2原因 二、解构赋值 2.1定义 2.2解题应用 2.2.1翻转二叉树 2.2.2 思路以及代码 一、背景 1.1问题 在写二叉树相关代码赋值的时候发现这样的写法&#xff0c;担心会发生这样的情况&#xff1a;先把node.right的值给node.left&#xff0c;在把…

MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(3)-系统数据集合设计

前言 前几章教程我们把ToDoList系统的基本框架搭建好了&#xff0c;现在我们需要根据我们的需求把ToDoList系统所需要的系统集合&#xff08;相当于关系型数据库中的数据库表&#xff09;。接下来我们先简单概述一下这个系统主要需要实现的功能以及实现这些功能我们需要设计那些…

互联网加竞赛 基于设深度学习的人脸性别年龄识别系统

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习机器视觉的…

【RL】Value Iteration and Policy Iteration(利用迭代算法求解贝尔曼最优等式)

Lecture 4: Value Iteration and Policy Iteration Value Iteration Algorithm 对于Bellman最优公式&#xff1a; v f ( v ) m a x π ( r γ P π v ) \mathbf{v} f(\mathbf{v}) max_{\pi}(\mathbf{r} \gamma \mathbf{P}_{\pi} \mathbf{v}) vf(v)maxπ​(rγPπ​v) …

『运维备忘录』之 Sed 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(1)发现与明确问题

抱歉&#xff0c;过春节这几天&#xff0c;没有更新。赶紧续上。 人就是这样&#xff0c;放假之前呢&#xff0c;想着趁着这个假期&#xff0c;把很多之前没有做好的事情&#xff0c;都梳理好&#xff0c;该补的也补上&#xff0c;结果一个假期就这样过去了&#xff0c;很多想…

stm32:pwm output模块,记录一下我是用smt32,输出pwm波的记录--(实现--重要)

我是实现了输出pwm波&#xff0c;频率固定&#xff0c;占空比可以不断调整的方法&#xff0c;将PA0接到示波器上&#xff0c;可以看到是一个标准的PWM波&#xff0c;如图下面示波器图。 1&#xff0c;首先是ioc的配置 我刚开始设置的分频的倍数是7199&#xff0c;使得分频的太…

Fiddler抓包(网页、手机、MUMU模拟器)

前置条件&#xff1a;电脑上下载安装好了Fiddler&#xff0c;有浏览器 一、网页抓包 1、fiddler下载安装证书 Tools-Options 勾选下面两个框 点击下面的选项&#xff0c;信任证书 会弹出弹窗&#xff0c;点击yes&#xff08;这个时候注意&#xff0c;DO_NOT_TRUST_FiddlerRo…