十一、51单片机之串口通信

news2025/1/13 10:24:44

1、通信的关键

(1)事先约定。通信之前规定好的,如通信速率,起始信号,结束信号等。

(2)通信传输的基本信息单元。

(3)信息的编码、传输、解码。

2、通信相关的概念

2.1、同步和异步

(1)同步通信要求接收端时钟频率与发送端时钟频率一致,发送端发送连续比特流;

(2)异步通信时,接收端时钟和发送端时钟不需要同步。发送端发送一个字节后,下一个字节可以在任何长时间内发送。

2.2、单工、半双工、全双工

(1)单工即数据传输只在一个方向上传输,方向是固定的,不能实现双向通信。

(2)半双工传输方向可以切换,允许数据在两个方向上传输。但是某个时刻,只允许数据在一个方向上传输,可以基本双向通信。像RS485属于半双工通讯。

(3)全双工允许数据同时在两个方向传输,发送和接收完全独立,在发送的同时可以接收信号,或者在接收的同时可以发送。它要求发送和接收设备都要有独立的发送和接收能力。

比如RS232、RS422就属于全双工通讯。

2.3、并行和串行

(1)并行通信:同一时刻,可以传输多个bit位的信号,有多少个信号位就需要多少根信号线。

(2)串行通讯:同一时刻,只能传输一个bit位的信号,只需要一根信号线。

2.4、电平信号和差分信号

(1)电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。

(2)差分信号的传输线中没有参考电平线,所有都是信号线,然后1和0的表达靠信号线之间的电压差。

(3)电平信号的2根通信线之间的电平差异容易受到干扰,传输容易失败;差分信号不容易受到干扰,因此传输质量比较稳定。现代通信一般都使用差分信号,电平信号几乎没有了。

3、串口通信

3.1、串口通信基础

(1)一种特定的通信协议

(2)别名:串行通信、串口通信、UART、USART。

(3)特点:异步、串行、全双工。

3.2、串口通信主要用途

(1)早期:计算机之间的短距离通信(15米内),早期是一种完备的通信机制。

(2)现在:CPU之间的近距离通信、调试信息的输出,单片机串口与外围元件之间的通信。单片机上的串口一般是非完备通信机制。

3.3、串口通信的工作方式

(1)一般是四根线,VCC、GND、RxD(接收线)、TxD(发送线)。receive接收、transmit发送。

(2)发送方有发送移位寄存器,接收方有接收移位寄存器。

(3)数据在发送方和接收方的CPU中都以字节为单位整字节处理。

(4)数据在通信线上以位(bit)为单位传输。

3.4、串行通信的主要概念

(1)数据帧:用于表示一段完整的数据信息。串口中一帧数据包括:起始位、数据位、校验位、停止位。

(2)波特率:指一个单位时间内传输符号的个数。发送方和接收方必须波特率设置为一样。

4、串口发送接收的软硬件协作方式

(1)查询方式。例如发送:

        硬件在发送完一帧数据后会将一个标志位置位(标志位本来是0),软件需要不断读取这个标志位的值来判断硬件是否完成了发送,如果读出来是0就表示硬件没有完成发送,所以我们就不能认为硬件发完了,所以就不能给硬件安排下一帧数据的发送;如果读出来的是1则说明硬件已经发完了上一帧数据,这时候软件就应该给硬件再给一帧数据去发送。   

(2)中断方式。

        查询方式处理的劣势是CPU必须一直守着串口发送,在串口发送完所有字节之前CPU不能离开去做别的事情,这对CPU来说是极大的浪费(因此CPU的速度比串口发送的速度快多了)。因此用中断方式来处理串口发送接收是非常合适的,可以提升CPU使用率。    

(3)一般情况下,发送采用查询方式,接收采用中断方式。

发送查询:虽然采用中断可以提高效率,但比较麻烦。

中断接收:因为不知道发送端会什么时候发送数据,因此只能采用中断接收。

5、串行通信相关的寄存器

详情参考数据手册,采用单片机为STC89C516。

(1)SCON,串行口控制寄存器。

(2)SBUF,串行口数据缓冲寄存器。

(3)PCON,电源控制寄存器。

(4)IE,中断允许寄存器。

(5)IPH,中断优先级控制寄存器高

(6)IP,中断优先级控制寄存器。

(7)SADER,从机地址掩模寄存器。

(8)SADDR,从机地址寄存器。

6、串口通信硬件接线

6.1、接线分析

(1)将电脑与51单片机通过串口线连接起来。

(2)现在的电脑上一般没有串口,所以电脑需要安装USB转串口驱动。

常见的USB转串口驱动:CH340、CP210x。

(3)51单片机使用TTL电平。

6.2、接线方法

(1)使用TTL接口的USB转串口线:USB端接电脑,另一端接单片机的TxD、RxD、GND。

(2)使用板载CH340:单片机程序下载USB口与电脑USB口相连。

7、串口调试软件简介

(1)RTS、DTR为流控相关,现在已经用不到,不用勾选。

(2)数据位(Data bits)一般选择8位,停止位(Stop bits)选择1位,奇偶校验(Parity)无,流控制(Flow control)无。

(3)一个串口号只能被一个串口软件打开。

8、示例代码

(1)单片机为STC89C516.

(2)代码可参考STC-ISP软件。

(3)代码

#include <reg52.h>
#include <intrins.h>


/*函数声明*/
void Delay500ms();                   		 //@12.000MH
void UartInit(void);                     //串口初始化函数
void UartSendByte(unsigned char Dat);    //通过串口发送一个字节数据     
void UartSendString(unsigned char *str); //通过串口发送字符串


void main(void)
{
	UartInit();		                        //串口初始化
	while(1)
	{
		//UartSendByte('D');
		UartSendString("Hello World\r\n");   //编译器会自动在字符串末尾添加'\0',英文是ASCALL码,一个字符8bit
		//UartSendString("知行统一\r\n");     //发送中文和串口无关,编译器会转换成相应编码,一个中文16bit
		//Delay500ms();
	}
}


void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


/*
 *功能:串口初始化函数,8数据位,1停止位,无校验位,波特率4800
 *参数:无
 *返回值:无
 */
void UartInit(void)
{
	SCON = 0x50;  //串口工作在模式1,8位数据位,允许串行接收
	PCON = 0x80;  //波特率加倍
	TMOD = 0x20;  //设置T1为模式2 
	TH1 = 243;    //波特率4800	,TH1 = 晶振频率/12/32/波特率
	TL1 = 243;    //8位自动重装,意识是TH1用完了之后下一个周期TL1会自动重装到TH1去。
	TR1 = 1;      //开启定时器1
	ES = 1;       //打开串口中断
	EA = 1;       //打开总中断
}


/*
 *功能:通过串口发送一个字节数据
 *参数:需要发送的内容
 *返回值:无
 */
void UartSendByte(unsigned char Dat)
{
	SBUF = Dat;      //准备好需要发送的一个字节
	while(TI == 0);  //确认串口发送没有再忙,while循环需要加超时判断
	TI = 0;			 //软件复位TI标志位
}


/*
 *功能:通过串口发送字符串
 *参数:待发送的字符串
 *返回值:无
 */
void UartSendString(unsigned char *str)
{
	while(*str != '\0')      //等待字符串发完*/
	{
		UartSendByte(*str);  //发送一个字符
		str++;               //指针指向下一个字符
	}
}


/*
 *功能:串口中断接收函数
 *参数:无
 *返回值:无
 *注意:中断函数通过中断编号识别,中断编号可通过查数据手册得到
 */
void Uart_Isr() interrupt 4 
{
	unsigned char ReceiveBit;
	if(RI == 1)
	{
		ReceiveBit = SBUF;		      //读取SBUF,读取串口接收到的一个字节
		RI = 0;
	}
	UartSendByte(ReceiveBit);		  //接收到的内容原封不动发回去
}

9、UART、RS232、RS485、RS422

(1)UART的缺点:传输举例受限。

(2)单片机UART采用TTL电平。

(3)波特率越高通信举例越短。

9.1、远距离传输怎么办?

(1)提高电压标准。(距离越长,电压在通信线上衰减越多)

(2)提高通信线抗干扰能力、降低阻抗。

(3)使用差分信号。

9.2、RS232

(1)RS232理论上传输距离限于15米。

(2)常用的串行通信标准之一。

(3)采用负逻辑传送,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。选用该电气标准的目的在于提高抗干扰能力,增大通信距离。

9.3、RS485

(1)最大通信距离1200米,最快通信速率10Mbps,距离和速度成反比。

(2)采用负逻辑传送。

(3)更远距离可以加中继器。

(4)RS485采用半双工工作方式。

(5)RS485只提供物理层通信能力,不提供数据层协议,需要用户自定义,或者使用标准协议如MODBUS协议。

(6)RS485采用差分信号。

9.4、RS422

(1)差分信号传输。

(2)全双工。

9.5、单片机UART与RS485

(1)CPU本身只会提供UART接口,而不会提供RS485接口。CPU根本不认识RS485。

(2)RS485使用时场景是:CPUA→UART转RS485------远距离通信-----RS485转UART→CPUB。

(3)RS485是纯硬件实现的,硬件芯片如MAX485来管理,根本不涉及软件编程。软件工程师只关注串口,只通过串口将数据发送出去或者接收回来即可。UART转485和485转串口对CPU来说是透明的。

(4)MAX485原理图

(5)RS485接线

 RS485的两根线A、B,A接A,B接B。这两根线组成差分信号,所以RS485为差分信号。

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

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

相关文章

【Python爬虫项目实战】Python爬虫采集弹幕数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、开发工具二、环境搭建三、数据来源查询分析四、代码实现1. 发送请求2.设置编码格式3.解析数据4.保存数据总结前言 今天给大家介绍的是Python爬虫采集弹幕数…

django项目中使用logging记录日志

前提 基于已有项目https://blog.csdn.net/qq_38122800/article/details/128583379?spm1001.2014.3001.5502 1、修改settings.py 在settings.py文件中添加如下代码: 先导入模块: import os,time#配置日志cur_path os.path.dirname(os.path.realpath(__file__)) # log_pat…

Vue3——第九章(依赖注入:provide、inject)

一、Prop 逐级透传问题 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。如果需要给深层子组件传递数据&#xff0c;会非常麻烦&#xff0c;如下图&#xff1a; provide 和 inject 可以帮助我们解决这一问题。一个父组件相对于其所有的…

【memcpy和memove函数的详解】

1.memcpy函数详解 模拟实现memcpy函数 2.memmove函数详解 模拟实现memmove函数 memset函数详解 memcpy函数 了解一个函数&#xff0c;就查询该函数的相关信息 memcpy函数在库中的声明如下&#xff1a; void * memcpy ( void * destination, const void * source, size_…

Node.js安装与编写

Node.js是JavaScript运行环境&#xff0c;是可以让JavaScript运行在服务端的开发平台。 Node.js对一些特殊用例进行优化&#xff0c;提供替代的API。 Node.js本质上是为文件系统、数据库之类的资源提供接口。 Node.js是单线程的&#xff0c;通过事件循环&#xff08;event l…

05【JSP-MVC】

文章目录05【JSP-MVC】一、JSP简介1.1 JSP概述1.1.1 HTML和Servlet的弊端1.1.1 什么是JSP1.2 JSP体验&#xff1a;1.2.2 JSP的执行过程1.2.2 JSP和Servlet是什么关系&#xff1f;二、JSP的脚本元素2.1 JSP中的注释&#xff1a;2.2 JSP脚本表达式2.3 JSP代码片段2.4 JSP声明2.5 …

数字音频接口DAI之I2S/PCM

I2S/PCM数字音频接口概述数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信号的方式。相比于模拟接口&#xff0c;数字音频接口抗干扰能力更强&#xff0c;硬件设计简单&#xff0c;DAI在音频电路设计…

深度学习——循环神经网络RNN(笔记)

循环神经网络RNN&#xff1a;对于序列模型的神经网络 1.回顾&#xff1a;潜变量自回归模型 使用潜变量ht总结过去的信息 ①xt跟当前的ht和x(t-1)相关 ②ht跟ht-1和xt-1相关 ③n元语法模型中&#xff0c;单词xt在时间t的条件概率取决于前面n-1个单词 隐藏层和隐藏状态的区别…

【ESP32Cam项目1】:ESP32Cam人脸检测(ArduinoESP32底层、Python版opencv)

人脸检测项目效果图&#xff1a; 人脸检测效果视频&#xff1a; 暮年的主页 - 抖音 (douyin.com) 人脸检测项目目标&#xff1a; 大家好&#xff01;近期拿到了便宜的ESP32Cam开发板&#xff0c;摄像头让我想起来人脸识别&#xff0c;于是ESP32Cam人脸检测项目由此诞生。后期还…

一文总结ACE代码框架

一、前言ACE_Engine框架是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;的UI开发框架&#xff0c;为开发者提供在进行应用UI开发时所必需的各种组件&#xff0c;以及定义这些组件的属性、样式、事件及方法&#xff0c;通过这些组件可以方便进行OpenHarmony…

JavaScript面试题

目录1.★★ 介绍一下JS的内置类型有哪些&#xff1f;2.★★★★ 介绍一下 typeof 区分类型的原理3.★★★ 介绍一下类型转换4.★★★★ 说说你对 JavaScript 的作用域的理解。什么是作用域链&#xff1f;5.★★ 解释下 let 和 const 的块级作用域6.★★★★ 说说你对执行上下文…

用Vue+Nodejs+Axios+express连接Sqlserver做一个动态网页demo

文章目录一、主要工具二、流程2.1. 安装Node2.2. 新建Vue工程并启动2.3. 前后端通信2.3.1. 修改前端2.3.2. 用axios来发起请求2.3.3. 创建服务端程序一、主要工具 Vue做前端页面Nodejs做服务器后端&#xff08;Nodejs是一个JS的运行环境&#xff0c;可以让JS像其它后端语言一样…

使用超体素上下文和基于图的优化从MLS点云对城市地区的树木进行实例分割

Abstract 在本文中&#xff0c;开发了一种用于从城市场景中的 MLS 数据集中提取树木的实例分割方法。所提出的方法利用超体素结构来组织点云&#xff0c;然后从超体素的局部上下文中提取去除趋势的几何特征。结合局部上下文的去趋势特征&#xff0c;将采用随机森林&#xff08…

Qt基于CTK Plugin Framework搭建插件框架--创建插件

文章目录一、前言二、工程搭建2.1、新建Qt工程2.2、CTK环境配置三、CTK Plugin Framework使用3.1、主函数启动插件框架3.2、插件的创建3.3、插件的使用一、前言 CTK保姆级编译教程&#xff1a;https://blog.csdn.net/Mr_robot_strange/article/details/128547331?spm1001.201…

JavaGUI:多功能计算器(五)--Swing实现双语数据包+菜单切换(完整源码)

JavaGUI&#xff1a;多功能计算器&#xff08;五&#xff09;–Swing实现双语数据包菜单切换&#xff08;完整源码&#xff09; 【背景提示】 “软件国际化”就是实现多种语言显示切换。 1.在前端网页上&#xff0c;可通过探测本地化语言环境实现自动切换&#xff1b; 2.在操…

C++ 20 原子引用 (一)

C 20 原子引用 &#xff08;一&#xff09; std::atomic_ref{} std::atomic_ref类型对其引用的对象进行原子操作。 使用std::atomic_ref 进行多线程读写时不会造成数据争用。被引用对象的生命周期必须超过std::atomic_ref 。操作std::atomic_ref 的子对象是未定义行为。 错…

Docker版RabbitMQ安装延迟队列插件及延迟队列项目应用实战

前言 在项目中经常有延迟业务处理的背景&#xff0c;此时可以借助于Rabbitmq的延迟队列进行实现&#xff0c;但Rabbitmq本身并不支持延迟队列&#xff0c;但可以通过安装插件的方式实现延迟队列 环境准备 首先确认目前项目使用的Rabbitmq的版本&#xff0c;这里博主的版本是3.…

STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

前言 本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台&#xff0c;并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6&#xff0c;使用其他主控的话基本要求有2个串口&#xff0c;一个串口用于调试使用&#xff0c;另一个用于ESP模块通讯。 一、前…

SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图

工程图是传达您设计意图的重要文档&#xff0c;您设计的产品越复杂&#xff0c;越需要详细注释说明。SOLIDWORKS 2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图&#xff0c;并且扩展新功能使您的设计工作延伸到更多的业务领域。您现在可以从更高层级的…

C 程序设计教程(15)—— 选择结构程序设计练习题

C 程序设计教程&#xff08;15&#xff09;—— 选择结构程序设计练习题 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;1…