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进制)

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

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#ifndef __UART_H__
#define __UART_H__
 
void UART_Init(void);
void UART_sendByte(unsigned char Byte);
 
#endif

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

相关推荐
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香3 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
字节高级特工4 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白5 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
yutian06068 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
XH华10 小时前
初识C语言之二维数组(下)
c语言·算法
析木不会编程11 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
Uu_05kkq13 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法