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;		//使能波特率倍速位SMOD
	SCON = 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;		//使能波特率倍速位SMOD
	SCON = 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分钟后面 。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

金和OA C6 RssModulesHttp.aspx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 RssModulesHttp.aspx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入…

018 Linux

文章目录 操作系统定义分类Linux系统构成 Linux文件系统Linux常用命令基础操作命令文件操作压缩解压权限管理显示展示命令其他命令 vi编译器操作使用 添加用户基本概念用户管理命令 ubuntu软件安装ssh服务终端启动Python服务 操作系统 定义 操作系统是管理计算机硬件与软件资…

【Linux系统学习】 4.Linux实用操作 上

Linux实用操作 1.各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c 命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1…

前端JavaScript篇之如何获得对象非原型链上的属性?

目录 如何获得对象非原型链上的属性&#xff1f; 如何获得对象非原型链上的属性&#xff1f; 要获取对象上非原型链上的属性&#xff0c;可以使用 hasOwnProperty() 方法。这个方法是 JavaScript 内置的对象方法&#xff0c;用于检查一个对象是否包含指定名称的属性&#xff0…

数字孪生与智慧园区的融合:打造未来产业生态的新篇章

随着科技的飞速发展&#xff0c;数字孪生和智慧园区已经成为当今社会发展的重要趋势。数字孪生技术为物理世界的对象提供了数字化的复制体&#xff0c;而智慧园区则通过各种信息技术手段实现园区的智能化管理。二者的融合&#xff0c;将为未来产业生态的发展开辟新的篇章。 一…

大华智慧园区综合管理平台 deleteFtp RCE漏洞复现

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

LLM大语言模型(六):RAG模式下基于PostgreSQL pgvector插件实现vector向量相似性检索

目录 HightLightMac上安装PostgreSQLDBever图形界面管理端创建DB 使用向量检索vector相似度计算近似近邻索引HNSW近似近邻索引示例 HightLight 使用PostgreSQL来存储和检索vector&#xff0c;在数据规模非庞大的情况下&#xff0c;简单高效。 可以和在线业务共用一套DB&#…

【PyQt】08 - 编辑Tab顺序

文章目录 前言一、Tab顺序二、编辑Tab顺序总结 前言 介绍了什么是Tab顺序&#xff0c;以及如何修改Tab顺序。 一、Tab顺序 当你的界面设计好之后&#xff0c;在输入栏按住Tab按键&#xff0c;他会按照你摆放的顺序一次转跳 二、编辑Tab顺序 方法一 然后鼠标左击就可以改变…

【力扣】快乐数,哈希集合 + 快慢指针 + 数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数 getNext(n) &#xff0c;返回 n 的所有位的平方和。一直执行 ngetNext(n) &#xff0c;最终只有 2 种可能&#xff1a; n 停留在 1 。无限循环且不为 1 。 证明&#xff1a;情况 1 是存在的&#xff0c;如力扣的示例一…

AcWing 1224 交换瓶子(简单图论)

[题目概述] 有 N 个瓶子&#xff0c;编号 1∼N&#xff0c;放在架子上。 比如有 5 个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起 2 个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这么简单的情况&#xff0c;显然&a…

Linux命令行工具使用HTTP代理的方法详解

亲爱的Linux用户们&#xff0c;有没有想过在命令行世界里&#xff0c;你的每一个指令都能悄无声息地穿越千山万水&#xff0c;而不被外界窥探&#xff1f;哈哈&#xff0c;没错&#xff0c;就是通过HTTP代理&#xff01;今天&#xff0c;我们就来一起探索如何在Linux命令行工具…

林浩然与杨凌芸的Java奇遇记:Lambda表达式大冒险

林浩然与杨凌芸的Java奇遇记&#xff1a;Lambda表达式大冒险 Lin Haoran and Yang Lingyun’s Java Adventure: The Grand Expedition of Lambda Expressions 在Java编程世界的一隅&#xff0c;住着一对编程界的“才子佳人”&#xff0c;男主角名叫林浩然&#xff0c;女主角唤作…

【Algorithms 4】算法(第4版)学习笔记 06 - 2.3 快速排序

文章目录 前言参考目录学习笔记1&#xff1a;基本算法1.1&#xff1a;快速排序 demo 演示1.2&#xff1a;快速排序切分代码实现1.3&#xff1a;实现细节1.4&#xff1a;案例分析1.4.1&#xff1a;最佳案例1.4.2&#xff1a;最坏案例1.4.3&#xff1a;平均案例分析1.5&#xff1…

从Kafka系统中读取消息数据——消费

从Kafka系统中读取消息数据——消费 消费 Kafka 集群中的主题消息检查消费者是不是单线程主题如何自动获取分区和手动分配分区subscribe实现订阅&#xff08;自动获取分区&#xff09;assign&#xff08;手动分配分区&#xff09; 反序列化主题消息反序列化一个类.演示 Kafka 自…

大模型学习 一

https://www.bilibili.com/video/BV1Kz4y1x7AK/?spm_id_from333.337.search-card.all.click GPU 计算单元多 并行计算能力强 指数更重要 A100 80G V100 A100 海外 100元/时 单卡 多卡并行&#xff1a; 单机多卡 模型并行 有资源的浪费 反向传播 反向传播&#xff08;B…

通过遵循最佳做法来提高 EDA 和 HPC 应用程序的 Azure NetApp 文件性能

介绍 Azure NetApp 文件是一项托管存储解决方案&#xff0c;适用于各种方案&#xff0c;包括高性能计算 (HPC) 基础结构。 低延迟和每秒高 I/O 操作数 (IOPS) 对于大规模企业而言是一种很好的组合。 假设你就职于一家半导体公司。 你的任务是设计公司的集成电路芯片&#xff…

Ajax+JSON学习一

AjaxJSON学习一 文章目录 前言一、Ajax简介1.1. Ajax基础1.2. 同源策略 二、Ajax的核心技术2.1. XMLHttpRequest 类2.2. open指定请求2.3. setRequestHeader 设置请求头2.4. send发送请求主体2.5. Ajax取得响应 总结 前言 一、Ajax简介 1.1. Ajax基础 Ajax 的全称是 Asynchron…

【项目问题解决】java. net.SocketException: Connection reset

目录 【项目问题解决】java. net.SocketException: Connection reset 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 通过JMeter 压测接口&#xff0c;无并发&#xff0c;无间歇时间跑接口10000次报错&#xff0c;后续改成建个…

DBdoctor恭祝大家龙行龘龘,前程朤朤

值此新年之际&#xff0c;DBdoctor恭祝大家龙行龘龘&#xff0c;前程朤朤。尤其是当前还跟我一样奋斗在护航春节一线的战友们&#xff0c;祝愿大家2024年系统又快又稳。 今年是DBdoctor护航春晚的第三年&#xff0c;聚好看作为海信旗下的互联网科技公司&#xff0c;服务着海信…

再识C语言 DAY17 【什么是原码、反码和补码】

文章目录 前言本文总结于此文章 一、知识补充二、原码三、反码四&#xff0c;补码 总结如果您发现文章有错误请与我留言&#xff0c;感谢 前言 本文总结于此文章 一、知识补充 通常&#xff0c;1字节包含8位。C语言用字节&#xff08;byte&#xff09;表示储存系统字符集所需…