51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)

news2024/11/23 4:17:03

文章目录

  • 前言
  • 一、串行通信口的功能以及串行通信口的结构及原理
    • 1.1 串行通信口的功能
    • 1.2 51单片机串口的结构
  • 二、串行通信口的控制寄存器
    • 2.1 串行控制寄存器SCON
    • 2.2 电源控制寄存器PCON
    • 2.3 配置寄存器
      • 配置SCON寄存器
      • 配置PCON寄存器
      • 配置中断
    • 2.4 实验
      • 单片机向pc发送数据
      • PC向单片机发送数据,单片机接收数据
      • 2.5 实验现象
        • 单片机向PC发送数据
        • PC向单片机发送数据,单片机接收数据
  • 三、总结


前言

对于51单片机的串口通信学习进行一个总结,把自己的经验分享给大家,在学习过程中遇到了很多困难和不理解的地方,通过多次实践,对串口通信有了一个大概的了解,希望对大家能够有帮助。


一、串行通信口的功能以及串行通信口的结构及原理

1.1 串行通信口的功能

首先来了解什么是数据通信?

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

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

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

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

从上述来看,串行口的功能,就是通过串行口连接的数据传输线大大减少,可以进行远距离的数据通信。
在这里插入图片描述

1.2 51单片机串口的结构

串口的结构如下图所示,
通过定时器T1计时,由T1产生溢出率,作为波特率发生器。

  • 两个数据缓冲器,SBUF。分别是发送数据的发送寄存器,读取数据的接收寄存器。
    串口写入时,写入的是发送寄存器,即数据向发送寄存器SBUF写入。
    向串口读时,读出的是接收寄存器,即数据由接收寄存器SBUF读出。

  • 定时器1产生波特率, 串口一般使用定时器1,模式2,八位自动重装模式,来产生溢出率,从而产生波特率。而且在配置定时器相关的寄存器时不用配置定时器中断,只是使用定时器1来产生波特率的功能。

  • 移位寄存器,在接受控制器的控制下,将输入的数据逐位移入接收SBUF。

  • 串行控制寄存器SCON,SCON的功能是控制串行通信口的工作方式以及工作的状态。

![在这里插入图片描述](https://img-blog.csdnimg.cn/e5c05783ac394db9bd900f423d9bc550.pn


二、串行通信口的控制寄存器

2.1 串行控制寄存器SCON

SCON寄存器用来控制串行通信的工作方式及反映串行口的工作状态。SCON的地址是98H,可位寻址。如下图所示。
在这里插入图片描述
通过配置SCON寄存器来对串行通信的工作模式进行控制。
说说几个常用的位

  • SM0和SM1,组合确定串行口的模式,不同的模式下波特率不同,功能也不同,下面会详细介绍不同模式下的波特率该如何计算
  • REN,允许/禁止串行接收控制位。 由软件置位REN,即REN=1为允许串行接收状态,可启动串行口接收数据。
  • TI,发送中断请求标志位。主机通过串行口发送数据发送完成后,TI会置1,向串口申请中断,如果TI为1 就表示SUBF的数据已经发送完成了,要手动将TI位清零。(即SBUF=Data)
  • RI,接收中断请求标志位。从机接收到主机通过串行口接收到的数据后,RI会置1,即会串口申请中断,如果RI为1 就表示数据已经通过SBUF读取完成了,要手动将RI位清零。(即Data=SBUF)

2.2 电源控制寄存器PCON

在这里插入图片描述
这里我们只需要知道SMOD是啥就可以了。

  • SMOD位,就是波特率是否加倍,若SMOD=0,波特率不变。SMOD=1,波特率加倍SMOD默认为0。

2.3 配置寄存器

配置SCON寄存器

在这里插入图片描述
看,上图就是SCON寄存器的位图,下面以串口通信的模式1来举例。
模式1,那么
SM0和SM1就要配置成 0 1,注意这里SM0和SM1决定串口通信的模式,感谢评论区@nggtryy 指出
REN,可置1,置1就是允许串行通信口接收数据,当不需要接收数据的时候可以置0。
后面的几位直接不看,一般用不到
TI和RI,也默认为0,当接收数据或发送数据的时候,会由硬件置1,继而触发中断,这时要由软件置1。
这样SCON寄存器就配置好了。
这样我的SCON配置如下

SCON=0x40;   //方式1   REN置1/0 允许/禁止数据接收的控制位

配置PCON寄存器

在这里插入图片描述

我们只需要明确一点,我的波特率是否需要加倍,如果加倍,那么PCON的第一位SMOD就要置1。
这样我的PCON就配置好了,如加倍

PCON |= 0x80;  //波特率加倍

配置中断

注意,定时器1,不用开中断,即ET1=0,因为定时器的功能只是产生波特率。
下图为串口和中断的连接图,较为直观,也比较好理解
在这里插入图片描述

下方代码块为中断服务子函数模块

// 串口中断函数模板
void Uart_Routine() interrupt 4
{
	if(RI==1)  
	{
		RI=0;
	}
	if(TI==1)
	{
	TI=0;
	}
}

2.4 实验

单片机向pc发送数据

代码如下:
UART.c
因为是单片机向PC发送数据,不用接收数据,所以这里的SCON寄存器的REN位未置1,而模式1,SM1和SM2就要配置成 0 1。

#include <REGX52.H>

/**
  * @brief 串口初始化
  * @param  无
  * @retval 无
  */
void Uart_Init()	//4800bps@11.0592MHz
{
	SCON=0x40;   //方式1   REN置1 允许/禁止数据接收的控制位
	PCON |= 0x80;  //波特率加倍  
	
	//配置定时器1 模式二 8位自动重装
	TMOD&=0x0F;
	TMOD|=0x20;  //模式二
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值
	
	ET1=0;   //不用开启中断 定时器在这里的作用是产生波特率
	TR1=1;   //启动定时器1
	
}

/**
  * @brief 串口发送一位字节数据
  * @param  Byte 要发送的字节数据
  * @retval 无
  */
void Uart_SendByte(unsigned char Byte)
{
	SBUF=Byte;   //向缓存器中写入内容
	while(TI==0);   //发送中断标志位 如果检测到了寄存器的TI位 如果为0 就表示数据未发送完成  反复执行本条语句检测TI位
	//如果TI为1 就表示SUBF的数据已经发送完成了  马上执行下条语句将TI位清零
	TI=0;
}

main.c
这里,调用UART模块里的串口发送一位字节数据的函数,向PC发送递增的数据。

#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"

unsigned char Sec;
void main()
{
	Uart_Init();
	
	while(1)
	{
		Sec++;
		Uart_SendByte(Sec);
		Delay(50);
	}
}

PC向单片机发送数据,单片机接收数据

UART.c
这里,因为单片机要接收自己发送到PC里的数据,简而言之就是MCU->PC,然后PC->MCU

#include <REGX52.H>

/**
  * @brief 串口初始化
  * @param  无
  * @retval 无
  */
void Uart_Init()	//4800bps@11.0592MHz
{
	SCON=0x50;   //方式1   REN置1 允许/禁止数据接收的控制位  允许接收 REN置1
	PCON |= 0x80;  //波特率加倍  
	
	//配置定时器1 模式二 8位自动重装
	TMOD&=0x0F;
	TMOD|=0x20;  //模式二
	TL1 = 0xF4;		//设定定时初值
	TH1 = 0xF4;		//设定定时器重装值
	
	ET1=0;   //不用开启中断 定时器在这里的作用是产生波特率
	TR1=1;   //启动定时器1
	
	//接收数据完成后就触发中断
	ES=1;
	EA=1;
}

/**
  * @brief 串口发送一位字节数据
  * @param  Byte 要发送的字节数据
  * @retval 无
  */
void Uart_SendByte(unsigned char Byte)
{
	SBUF=Byte;   //向缓存器中写入内容
	while(TI==0);   //发送中断标志位 如果检测到了寄存器的TI位 如果为0 就表示数据未发送完成  反复执行本条语句检测TI位
	//如果TI为1 就表示SUBF的数据已经发送完成了  马上执行下条语句将TI位清零
	TI=0;
}

/* 串口中断函数模板
void Uart_Routine() interrupt 4
{
	if(RI==1)   //如果接收到数据 接收完成后 产生中断 如果是接收中断  
		//发送数据也会产生中断
	{
		P2=SBUF;  //从SUBF缓存器中读取数据
		Uart_SendByte(SBUF);
		RI=0;
	}
}
*/

main.c
如果接收到数据 接收完成后 产生中断 ,单片机把SBUF缓存里的数据读取出来了,因为检测到了接收中断,即RI=1,在主函数写了串口中断函数,检测是否接收中断,把接收到的数据,以LED灯的形式显示出来。

#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"

unsigned char Sec;
void main()
{
	Uart_Init();
	
	while(1)
	{
		
	}
}
void Uart_Routine() interrupt 4
{
	if(RI==1)   //如果接收到数据 接收完成后 产生中断 如果是接收中断  
		//发送数据也会产生中断
	{
		P2=SBUF;  //从SUBF缓存器中读取数据
		Uart_SendByte(SBUF);
		RI=0;
	}
}


2.5 实验现象

单片机向PC发送数据

可以看到单片机向PC发送递增的数据,直到关闭串口,数据停止发送。
在这里插入图片描述

PC向单片机发送数据,单片机接收数据

可以看到在PC上发送0xF0,LED灯以相应的状态亮起,串口数据发送成功。
在这里插入图片描述
在这里插入图片描述

三、总结

首先要保证双机通信时,配置的波特率相同

然后串口通信主要要明确S**CON中的RN,SM0和SM1模式位的选择,以及RI和TI和理解。

在配置定时器1的时候,一定不要开定时器中断,即ET1=0,因为定时器的功能只是产生波特率。

然后定时器1产生的波特率该如何计算,计时器的初始值应该如何计算,将会在下一篇文章中详细说明。

希望对你有帮助,行文仓促,还请谅解,欢迎指错。

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (58)-- 算法导论6.4 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;58&#xff09;-- 算法导论6.4 2题 二、试分析在使用下列循环不变量时&#xff0c;HEAPSORT 的正确性&#xff1a;在算法的第 2~5行 for 循环每次迭代开始时&#xff0c;子数组 A[1…i]是一个包含了数组A[1…n]中第i小元素的最大…

[疑难杂症2023-005]dcmtk-movescu访问dcm4chee模拟PACS Server报错问题解析

本文由Markdown语法编辑器编辑完成。 1. 背景 由于要在医院上线一个服务&#xff0c;用来定时从医院的PACS Server上面拉取dicom图像并进行分发。因此&#xff0c;需要首先在公司的内网环境上进行开发&#xff0c;测试和验证。 目前比较流行和开源的PACS Server模拟是基于dc…

python 面向对象编程(2)

文章目录 前言封装多态类属性和实例属性定义以及访问类属性修改类属性实例属性 类方法静态方法 前言 前面我们介绍了 python 类和对象以及继承、私有权限&#xff0c;那么今天我们将来介绍 python面向对象 剩下的两大特性封装、多态&#xff0c;以及如何访问、修改类属性、类方…

机器学习李宏毅学习笔记37

文章目录 前言一、ChatGPT做的事情二、ChatGPT基础介绍三、ChatGPT带来的研究问题总结 前言 ChatGPT简单原理介绍 一、ChatGPT做的事情 Chatgpt以句子为输入&#xff0c;输出这个句子后面接的词汇的概率分布&#xff0c;给每一个可能的符号一个概率&#xff0c;根据这个分布进…

【雕爷学编程】Arduino动手做(160)---HLK-V20离线语音模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

RabbitMQ知识掌握 【进阶篇】

一、如何保证消息的可靠性 &#x1f349; 1.保证消息的可靠性投递 &#x1f95d; 在生产环境中由于一些不明原因&#xff0c;导致 rabbitmq 重启&#xff0c;在 RabbitMQ 重启期间生产者消息投递失败&#xff0c;导致消息丢失&#xff0c;需要手动处理和恢复。于是&#xff0…

微信小程序活动抽奖简单实现,包教包会

问题&#xff1a; 针对用户使用活动抽奖&#xff0c;获得抽奖得到商品的成就以及满足感&#xff0c;那么我们应该怎么去实现小程序去转盘抽奖活动呢 例如&#xff1a;项目需要抽奖实现相应的奖品奖励 实现方法 实现的效果如下&#xff1a; 实现的主要代码&#xff1a; Page…

ANSYS Workbench项目分析与案例实操详解

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言准备工作创建项目导…

盘点5款Cesium三维GIS渲染引擎

目前&#xff0c;以Cesium为核心的各类产品繁多&#xff0c;本文将挑选一些以Cesium为核心的软件案例&#xff0c;为大家进行介绍。 1. CesiumJS CesiumJS相信凡是GIS行业相关人员都特别熟悉了&#xff0c;CesiumJS是一款开源的JavaScript库&#xff0c;用于创建高性能的地球…

以太网(Ethernet)入门了解

以太网&#xff08;Ethernet&#xff09;是一种常见的局域网&#xff08;LAN&#xff09;通信协议&#xff0c;它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议&#xff0c;它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

如何做到有效的项目质量管理?这三点很关键

“项目管理中&#xff0c;大家都遇到过的哪些绊脚石&#xff1f;” 近期看到了这样一个话题&#xff0c;大家纷纷吐槽了在项目中遇到的各种困难。除了常见的范围无限蔓延、进度不停延误、成本严重超支、内部沟通困难等一系列问题&#xff1b;其中提到次数较多的还有项目的质量…

QOwnNotes Mac版-QOwnNotes for Mac(事务笔记管理)

QOwnNotes for Mac是一款Mac平台上的笔记记录和待办事项软件&#xff0c;可以将你的笔记保存为纯文本文件&#xff0c;它支持 MarkDown 支持&#xff0c;并与 ownCloud 云服务紧密集成。 QOwnNotes 的亮点就是它集成了 ownCloud 云服务&#xff08;当然是可选的&#xff09;。…

JavaWeb 速通XML

目录 一、XML快速入门 1.基本介绍 : 2.入门案例 : 二、XML语法 0.文件结构 : 1.文档声明 &#xff1a; 2. 元素 : 3.属性 : 4.注释 : 5.CDATA节 : PS : XML转义符 : 三、Dom4j 1.关于XML解析技术 : 2 Dom4j介绍 : 3.Dom4j使用 : 1 获取Document对象的三种方式 2 …

ROS:Gazebo详解

目录 一、前言二、URDF与Gazebo基本集成流程2.1创建功能包2.2编写URDF文件2.3启动Gazebo并显示模型 三、URDF集成Gazebo相关设置3.1collision3.2inertial3.3颜色设置 四、URDF集成Gazebo实操4.1需求4.2流程4.3编写封装惯性矩阵算法的 xacro 文件4.4底盘 Xacro 文件4.5摄像头 Xa…

5个值得收藏字体网站,优秀字体不用再找

如何在大量的字体网站中选择安全可靠的字体呢&#xff1f;这里本文收集整理了5个好用的字体网站&#xff0c;一起来看看吧&#xff01; 1、即时设计 对于设计师来说&#xff0c;一个好的字体网站要具备两个基本要素:美观和免费。如果你对字体有同样的要求&#xff0c;那么即时…

给测试开发工程师的5条建议——你一定要知道

目录 前言 质量心态 获取其他测试领域的知识 探索性测试 数据测试 可视化测试 可访问性测试 安全测试 混沌测试 获得正确的帮助 自动化不仅仅是执行测试脚本 分享也是学习的一种途径 最后 前言 近些年可以看出测试开发工程师是热度比较高的测试职位&#xff0c;除…

【深度学习】多任务学习

多任务学习是一个很火的话题&#xff0c;在自动驾驶领域以及其他对存储资源要求较高的端侧任务&#xff0c;都会考虑这种方式。之前面试的时候也有被问题多任务学习。前几天看到一个写得很好的例子&#xff0c;在此记录一下&#xff0c;也好久没有写博客了。 1.参考 论文是20…

samba服务

samba服务 1. samba诞生背景2. samba简介3. samba配置文件详解3.1 配置文件中参数的作用3.1.1 security参数的四种验证方式3.1.2 passdb backend定义用户后台的类型 4. samba服务部署与配置windos共享linux挂载共享 1. samba诞生背景 1987 年&#xff0c;微软公司和英特尔公司…

fastapi初使用,构建自己的api

文章目录 1、安装2、api实现2.1、 app.get("/1")2.2、app.get("/{a}")2.3、app.get("/{a}{b}")2.4、函数和api分离 3、运行 原文链接&#xff1a;https://wangguo.site/posts/d98bb3c9.html fastapi 是一个基于 Python 的 API 构建框架&#xff…

C国演义 [第八章]

第八章 买卖股票的最佳时机题目理解步骤dp含义递推公式初始化遍历方向 代码 买卖股票的最佳时机II题目理解步骤dp含义递推公式初始化遍历方向 代码 买卖股票的最佳时机 力扣链接 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格 …