【51单片机】串口通信(发送与接收)

文章目录

  • 前言
    • 串口通信简介
    • 串口通信的原理
    • 串口通信的作用
    • 串口编程的一些概念
    • 仿真图
    • 如何使用串口
      • 初始化串口
      • 串口模式
      • 波特率配置
    • 发送与接收
      • 发送
      • 接收
    • 示例代码
  • 总结


前言

在嵌入式系统的开发中,串口通信是一种常见且重要的通信方式。它以其简单、稳定的特性在各种应用场景中得到了广泛的使用。本文将介绍51单片机中的串口通信,包括其定义、作用以及在实际应用中的重要性。


串口通信简介

串口通信,顾名思义,是一种串行通信方式,即数据是一位一位地顺序传输的。这与并行通信形成鲜明对比,后者是多位数据同时传输。在51单片机中,串口通信是通过特定的寄存器和引脚来实现的,如SCON寄存器用于设置串口模式,P3.0和P3.1引脚分别用于接收和发送数据。

串口通信的原理

首先,我们需要理解串口是一种串行通信方式,也就是说,数据是一位一位地按顺序传输的。这就像是你在一条单轨铁路上,一辆辆火车依次通过。

当我们要发送数据时,数据会被分解成一个个的二进制位(0或1),然后这些位会一个接一个地通过串口发送出去。这就像是你有一堆火车要发送,你会把它们一个接一个地放到铁轨上,让它们依次出发。

而当我们要接收数据时,串口会一位一位地读取传入的数据,然后把这些位组合起来,形成完整的数据。这就像是你在铁轨的另一端,一辆辆火车依次到达,你会把它们按顺序接收下来,然后组成一列完整的火车。

在这个过程中,还有一些重要的概念,比如波特率。波特率决定了数据传输的速度,也就是说,每秒钟可以传输多少位的数据。这就像是你的火车的速度,速度越快,每秒钟就能运送更多的火车。

总的来说,串口通信就是这样一种一位一位地发送和接收数据的方式,它简单、稳定,被广泛应用在各种电子设备中。

串口通信的作用

串口通信在51单片机中有着广泛的应用。首先,它可以用于单片机与外部设备的通信,如传感器、执行器等。通过串口,单片机可以接收外部设备的数据,或向外部设备发送控制命令。其次,串口通信也可以用于单片机与计算机的通信,这在开发和调试阶段尤其重要。通过串口,开发者可以直接从计算机向单片机发送指令,或从单片机读取运行状态,极大地方便了开发和调试工作。

串口编程的一些概念

  • 波特率:波特率是串口通信中的一个重要概念,它决定了数据传输的速度,单位是bps(比特每秒)。就像火车的速度,波特率越高,数据传输的速度就越快。

  • 数据位:数据位决定了每次传输的数据的大小。常见的数据位有5位、6位、7位和8位。就像火车的车厢数量,数据位越多,每次可以传输的数据就越多。

  • 停止位:停止位用于标记数据传输的结束,常见的停止位有1位和2位。就像火车站,停止位告诉接收端一列火车(也就是一个数据字节)已经到站。

  • 校验位:校验位用于检测数据在传输过程中是否出错。就像火车的检票员,校验位会检查数据是否正确。

仿真图

我们在下面找到Virtual Terminal,他的RXD连接到P3.1,他的TXD连接到P3.0即可
在这里插入图片描述

如何使用串口

初始化串口

初始化串口代码如下:

void UartInit()		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//设置波特率不倍速
	SCON = 0x50;		//设置为8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;			//设定定时初值
	TH1 = 0xFD;			//设定定时器重装值
	TR1 = 1;			//启动定时器1
	ET1 = 0;        	//禁止定时器1中断
	EA=1;				//开启总中断
	ES=1;				//开启串口中断
}

串口模式

51单片机的SCON(Serial Control Register)是串行口控制寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态。SCON既可以字节寻址,也可以位寻址,其字节地址为98H,地址位为98H~9FH。

SCON的各个位的功能如下:

  • RI:接收中断标志位,数据接收结束时,标志位会自动置1,需要通过程序将其置0。
  • TI:发送中断标志位,数据发送结束时,标志位会自动置1,需要通过程序将其置0。
  • RB8:存放发送数据的第9位。
  • TB8:存放接收数据的第9位。
  • REN:串行接收允许位,用于控制数据接收的允许和禁止,为1时允许接收,为0时禁止接收。
  • SM2:多机控制位。
  • SM1,SM0:串行工作方式。

波特率配置

TH1和TL1是定时器1的两个寄存器,分别用于存储定时器的高8位和低8位。在51单片机中,定时器1可以被配置为波特率发生器,用于生成串口通信的波特率。

当我们设置 TH1 = 0xFDTL1 = 0xFD 时,实际上是在设置定时器1的溢出时间,从而决定了串口通信的波特率。这里的 0xFD 是256减去所需的计数值,因为定时器是在计数值达到256时溢出的。

例如,如果我们想要设置波特率为9600,晶振频率为11.0592MHz,那么我们可以使用以下公式来计算所需的计数值:

计数值 = 晶振频率 32 × 波特率 计数值 = \frac{晶振频率}{32 \times 波特率} 计数值=32×波特率晶振频率

将11.0592MHz和9600代入公式,我们可以得到计数值大约为3。然后我们用256减去这个计数值,得到253,对应的十六进制数就是FD。所以我们设置 TH1 = 0xFDTL1 = 0xFD

发送与接收

发送

我们可以通过把数据给SBUF寄存器,他就会给我们发送出去,我们可以通过他来实现发送函数

发送函数代码如下:

void Uartsend(unsigned char byte) //定义一个函数,用于发送一个字节的数据
{
	SBUF = byte; //将要发送的数据(byte)写入到发送缓冲区(SBUF)
	while(TI == 0); //等待数据发送完成,发送完成后,硬件会将TI置1
	TI = 0; //数据发送完成后,通过软件将TI清零
}

接收

接收,我们使用中断来接收,接收到的数据存储在SBUF寄存器里面
串口的接收在函数后面加interrupt 4即可,表示这个接收中断使用他

void UART_ISR() interrupt 4 //定义一个中断服务程序,用于处理串口中断,中断号为4
{
	if(RI==1) //如果接收中断标志位RI为1,表示接收到数据
	{
		Uartsend(SBUF); //调用Uartsend函数,将接收到的数据(存储在SBUF中)发送出去
		RI=0; //数据发送完成后,通过软件将接收中断标志位RI清零
	}
}

示例代码

#include <REGX52.H>
void UartInit()		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//??????
	SCON = 0x50;		//8???,?????
	TMOD &= 0x0F;		//?????1???
	TMOD |= 0x20;		//?????1?8???????
	TL1 = 0xFD;			//??????
	TH1 = 0xFD;			//????????		
	TR1 = 1;			//?????1
	ET1 = 0;        	//?????1??
	EA=1;				//????? 
	ES=1;				//??????
}
void Uartsend(unsigned char byte)//??
{
	SBUF=byte;//??????????SBUF
	//??????????TI=1;?????????
	while(TI==0);
	TI=0;//????
}
void UART_ISR() interrupt 4//??????
{
	if(RI==1)//????
	{
		Uartsend(SBUF);//????????????
		RI=0;//????
	}
}
int main()
{
	UartInit();
	
	while(1)
	{
		Uartsend(0x00);
	}
}

总结

总的来说,串口通信在51单片机中扮演着重要的角色。它以其简单、稳定的特性,为单片机提供了与外部世界交流的桥梁。无论是在硬件控制,还是在软件开发和调试中,串口通信都是不可或缺的一部分。因此,深入理解和熟练掌握串口通信,对于每一个嵌入式开发者来说,都是非常重要的。希望本文能帮助你对51单片机的串口通信有更深入的理解。

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

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

相关文章

多阶段分层构建容器化Spring Boot应用程序

上一节中&#xff0c;容器化spring boot应用程序-CSDN博客我们介绍了基于简单的Dockerfile对spring boot进行容器化的过程&#xff0c;本讲将介绍如何基于Dockerfile进行多阶段的分层构建过程&#xff0c;希望对大家有所帮助。 Spring Boot从版本2.3.0开始支持分层构建容器化的…

4.x86游戏实战-人物状态标志位

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;3.x86游戏实战-寄存器 人物状态标志位&#xff1a; 什么叫人物状态标志位&…

PAE:从潮流报告中提炼有效产品属性

本文将介绍PAE&#xff0c;一种用于包含 PDF格式的文本和图像的产品属性提取算法。目前大部分的方法侧重于从标题或产品描述中提取属性&#xff0c;或利用现有产品图像中的视觉信息。与之前的工作相比&#xff0c;PAE从潮流趋势报告的PDF文件中提取属性&#xff0c;提取的属性包…

Django 自定义标签

1&#xff0c;简单标签 1.1 添加自定义标签函数 Test/app5/templatetags/mytags.py from django import template register template.Library() register.simple_tag() def show_title(value, n):if len(value) > n:return f{value[:n]}...else:return value 1.2 添加视…

day02-Spark集群及参数

一、Spark运行环境变量问题(了解) 1-pycharm远程开发运行时&#xff0c;执行的是服务器的代码 2-通过本地传递指令到远程服务器运行代码时&#xff0c;会加载对应环境变量数据&#xff0c;加载环境变量文件是用户目录下的.bashrc文件 在/etc/bashrc 1-1 在代码中添加 使用os模块…

Debug 调试代码

我们使用 debug 的目的, 认为就是查看代码的执行过程的。 步骤&#xff1a; 1. 打断点 断点的意义是, debug 运⾏的时候, 代码会在断点处停下来不执行如果是想要查看代码的执行过程, 建议将断点放在第⼀行在代码 和 行号之间 点击,出现的红色圆点 就是断点, 再次点击可以取消 …

ros1仿真导航机器人 基础传感器数据读取

仅为学习记录和一些自己的思考&#xff0c;不具有参考意义。 1 仿真环境 gazebo、rviz、ros1 2 机器人模型 <?xml version"1.0"?> <robot name"wpb_home_gazebo"><link name"base_footprint"><visual><origin …

嫦娥六号平安回家,Smartbi非常荣幸参与中国航天项目

“小时不识月&#xff0c;呼作白玉盘。”李白的这句诗&#xff0c;承载了古人对月亮的美好想象与纯真童趣。今天&#xff0c;当我们仰望夜空&#xff0c;那轮明月不仅是诗词中的意象&#xff0c;更是科学探索的目标和梦想的寄托。 2024年6月25日14时07分&#xff0c;嫦娥六号返…

安全与加密常识(0)安全与加密概述

文章目录 一、信息安全的基本概念二、加密技术概述三、常见的安全协议和实践四、加密的挑战与应对 在数字时代&#xff0c;信息安全和加密已成为保护个人和企业数据不受侵犯的关键技术。本文将探讨信息安全的基础、加密的基本原理&#xff0c;以及实用的保护措施&#xff0c;以…

Python中相关软件安装

1. python安装 1.下载地址 https://www.python.org/downloads/2.选择安装版本 1. Anaconda安装 安装地址 -- 清华大学镜像站点 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/查看anaconda是否安装成功 2.conda安装好后&#xff0c;将镜像源修改为清华大学的镜像…

知识库在AI大模型中的使用流程

大模型知识库的使用流程通常包括以下关键步骤&#xff0c;大模型知识库的使用流程需要跨学科的知识和技能&#xff0c;包括自然语言处理、数据库管理、软件工程等。同时&#xff0c;也需要关注用户体验、性能优化、安全保护等方面&#xff0c;以提供高质量的知识服务。北京木奇…

封装了一个iOS滚动厨窗效果

效果图 背景 我们要实现如图的厨窗效果&#xff0c;不能通过在tableView底部添加一个背景图片的方式&#xff0c;因为这需要修改整个tableView的背景色为透明&#xff0c;影响到的范围太大&#xff0c;只能将这个效果局限在这个cell 中&#xff0c;然后通过监听tableView的滚动…

昇思MindSpore学习笔记3--张量 Tensor

一、张量Tensor概念 矢量、标量和其他张量的计算函数&#xff0c;有内积、外积、线性映射以及笛卡儿积等 张量坐标在 n 维空间内&#xff0c;有 nr 个分量 每个分量都是坐标的函数,变换时每个坐标分量都按规则作线性变换 张量是一种特殊的数据结构&#xff0c;类似于数组和…

npm安装包报错解决

目录 一&#xff1a;问题回顾 二:问题分析 三&#xff1a;npm降级或者升级 四&#xff1a;npm和node js 关系 一&#xff1a;问题回顾 今天在本地部署一个vue开发的项目&#xff0c;需要在本地看下运行情况&#xff0c;按照常规的操作就是在网站根目录运行npm install 安装…

如何制作鼠标悬浮后伸缩的搜索框

引言 许多博客都在使用的伸缩搜索框制作教程 成品展示&#xff08;颜色自行搭配&#xff09; 初步布局 居中盒子&&初始化样式 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewpo…

Nuxt3 的生命周期和钩子函数(五)

title: Nuxt3 的生命周期和钩子函数&#xff08;五&#xff09; date: 2024/6/29 updated: 2024/6/29 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt3中的六个核心生命周期钩子及其用法&#xff0c;包括build:done、build:manifest、builder:generateApp、…

[oeasy]python021_赛博宝剑铭文大赏_宝剑上的铭文_特殊符号和宝物

继续运行 &#x1f94b; 回忆上次内容 上次修改了 程序 将 石中剑变成了 红色 爱之大剑 可以 让宝剑 具有 更多铭文符号 和 颜色 吗&#xff1f;&#x1f914; 铭文 亚瑟王 从石头中 取得宝剑 说明 不列颠科技从石器时代 进入了 青铜时代 第一把 Caliburn 断裂 第二把 湖中仙…

恢复的实现技术-日志和数据转储

一、引言 在系统正常运行的情况下&#xff0c;事务处理的恢复机制应采取某些技术措施为恢复做好相应的准备&#xff0c;保证在系统发生故障后&#xff0c;能将数据库从一个不一致的错误状态恢复到一个一致性状态 恢复技术主要包括 生成一个数据库日志&#xff0c;来记录系统中…

iOS开发中用到的自定义UI库

文章目录 前言cell 左右滑动菜单日历组件仿QQ 侧滑抽屉仿探探、陌陌的卡牌滑动库头部缩放视图自定义UITabbar刮刮乐广告横幅 前言 本文中的UI组件&#xff0c;是作者在移动应用开发中都用到过的。 确实&#xff0c;找到对的三方库可以快速帮助我们构建App, 极大程度上提高了生…

ESP32-C2模组数据透传模式配置详细教程

文章目录 1. 背景2. 关键步骤2.1 烧录AT指令固件2.2 配置透传模式2.3 如何退出透传模式重新配置3. 思考1. 背景 最近做的项目中,有蓝牙+WIFI的数据透传的需求,即系统A和系统B之间的通讯通过无线的方式,其实在实际项目中有很多这种场景比如无线调试手柄、无线数据终端、无线…