STC89C52单片机学习——第20节: [8-2]串口向电脑发送数据电脑通过串口控制LED

news2025/3/17 5:49:43

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.03.15

51单片机学习——第20节: [8-2]串口向电脑发送数据&电脑通过串口控制LED

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、串口通信
  • 二、串口向电脑发送数据
  • 三、电脑通过串口控制LED(*接收和发送)
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始51单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习51单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。不再另外购买视频中的普中开发板了。
   原理图如下
在这里插入图片描述
视频中的都用这个开发板来实现,如果有资源就利用起来。
仔细看了看:开发板的晶振为:11.0592Mhz;12Mhz晶振是用来给CH340G芯片外置晶振;

下图是实物图
在这里插入图片描述

引用

51单片机入门教程-2020版 程序全程纯手打 从零开始入门
还参考了下图中的书籍:
手把手教你学51单片机(C语言版)
在这里插入图片描述
STC89C52手册
在这里插入图片描述

解答和科普

一、串口通信

IO 口模拟串口通信,让大家了解了串口通信的本质,但是我们的单片机程序却需要不停的检测扫描单片机IO 口收到的数据,大量占用了单片机的运行时间。在单片机内部做一个硬件模块,让它自动接收数据,接收完了,通知我们一下就可以了。
51 单片机的UART 串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成。STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

模式1 是最常用的,就是我们前边提到的1 位起始位,8 位数据位和1 位停止位。STC89C52 单片机来讲,这个波特率发生器只能由定时器T1 或定时器T2 产生,而不能由定时器T0 产生,这和我们模拟的通信是完全不同的概念。如果用定时器2,需要配置额外的寄存器,默认是使用定时器1 的。 就使用定时器T1 作为波特率发生器来讲解,方式1 下的波特率发生器必须使用定时器T1 的模式2,也就是自动重装载模式,
定时器的重载值计算公式为:TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率
和波特率有关的还有一个寄存器,是一个电源管理寄存器PCON,他的最高位可以把波特率提高一倍,也就是如果写PCON |= 0x80 以后,计算公式就成了:TH1 = TL1 = 256 - 晶振值/12 /16 /波特率
公式中数字的含义这里解释一下,256 是8 位定时器的溢出值,也就是TL1 的溢出值,晶振值在我们的开发板上就是11059200,12 是说1 个机器周期等于12 个时钟周期,值得关注的是这个16,我们来重点说明。在IO 口模拟串口通信接收数据的时候,采集的是这一位数据的中间位置,而实际上串口模块比我们模拟的要复杂和精确一些。他采取的方式是把一位信号采集16 次,其中第7、8、9 次取出来, 这三次中其中两次如果是高电平,那么就认定这一位数据是1,如果两次是低电平,那么就认定这一位是0,这样一旦受到意外干扰读错一次数据,也依然可以保证最终数据的正确性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
UART 串口程序
一般情况下,我们编写串口通信程序的基本步骤如下所示:
1、配置串口为模式1。
2、配置定时器T1 为模式2,即自动重装模式。
3、根据波特率计算TH1 和TL1 的初值,如果有需要可以使用PCON 进行波特率加倍。
4、打开定时器控制寄存器TR1,让定时器跑起来。
这里还要特别注意一下,就是在使用T1 做波特率发生器的时候,千万不要再使能T1 的中断了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TL1 = 0xF3; //设定定时初值 256-243=13 13us溢出一次 1/13us =0.07692MhzTH1 = 0xF3; //设定定时器重装值 256-243=13 SMOD=1 0.07692/16=0.00480769MHZ 10001000=4807.69HZ 7.69/4800=0.001602的误差。
在这里插入图片描述
在这里插入图片描述

二、串口向电脑发送数据

配置UART串口:
1、配置串口为模式1。
在这里插入图片描述

SCON=0x40;						//工作模式选择1

在这里插入图片描述
只改变PCON寄存器的最高位,使SMOD为1.给1的时候是不处于2的。所以我们要给1.也就是12个周期的。

PCON &= 0x7F;		//波特率不倍速				

2、配置定时器T1 为模式2,即自动重装模式。
在这里插入图片描述
在这里插入图片描述
只操作T1,左边的M1和M0配置。定时器1应该配置为0010.

TMOD &= 0x0F;		//设置定时器模式清零
TMOD |= 0x20;		//设置定时器模式置1

3、根据波特率计算TH1 和TL1 的初值,如果有需要可以使用PCON 进行波特率加倍。

TL1 = 0xFD;		//设定定时初值
TH1 = 0xFD;		//设定定时器重装值

4、打开定时器控制寄存器TR1,让定时器跑起来。
这里还要特别注意一下,就是在使用T1 做波特率发生器的时候,千万不要再使能T1 的中断了。

ET1 = 0;		//禁止定时器1中断
TR1 = 1;		//启动定时器1

在这里插入图片描述
在这里插入图片描述

只发给电脑不接受的代码

#include <REGX52.H>

/**
  * @brief    串口初始化 9600bps@11.0592MHz
  * @param  	无
  * @retval 	无
  */
void UART_Init(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x40;		//8位数据,可变波特率
	

	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式

	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}


void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;
	while(TI==0);
	TI=0;

main.c

#include <REGX52.H>
#include <INTRINS.H>
#include "Delay.h"
#include "UART.h"

unsigned char sec;


void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(sec);
		sec++;
		Delay(1000);
		
	}
}




实验现象:

在这里插入图片描述

三、电脑通过串口控制LED(*接收和发送)

单片机接收的时候是不知道什么时候电脑会发送,所以用中断来触发。

在这里插入图片描述

SCON = 0x50;		//8位数据,可变波特率允许接收REN

在这里插入图片描述
使能中断

EA=1;
ES=1;			//接收和发送都会触发中断

在这里插入图片描述
前面的名称可以自己写
在这里插入图片描述
在这里插入图片描述
验证是否进入中断:

void UART_Routine()   interrupt 4
{
	P1=0x00;
}	
void UART_Routine()   interrupt 4		//发送和接受进入这同一个中断
{
	if(RI==1)				//区分开是发送还是接收
	{
		P1=SBUF;	//读取SBUF的值放在P1直接处理了
		RI=0;			//必须软件清零,硬件置1
	}
}	

实验现象:

电脑通过串口发送数据控制P1口接收SBUF

#include <REGX52.H>
#include <INTRINS.H>
#include "Delay.h"
#include "UART.h"

unsigned char sec;


void main()
{
	UART_Init();
	
	while(1)
	{
		
		
	}
}




void UART_Routine()   interrupt 4		//发送和接受进入这同一个中断
{
	if(RI==1)				//区分开是发送还是接收
	{
		P1=SBUF;	//读取SBUF的值放在P1直接处理了
		UART_SendByte(SBUF);
		RI=0;			//必须软件清零,硬件置1
	}
}	

实验现象:
在这里插入图片描述

发送控制单片机LED并给电脑显示

在这里插入图片描述

UART_SendByte(0x30);

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

问题

1、就是波特率加不加速
2、就是控制位有点多,脑子有点乱了
3、注意配置是否正确
4、另外涉及到通讯之后和我的拓展坞会卡顿我的鼠标

总结

本节课主要学了了LED闪烁,通过延迟函数的延迟,实现了LED闪烁。

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

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

相关文章

K8S下nodelocaldns crash问题导致域名请求响应缓慢

前言 最近做项目&#xff0c;有业务出现偶发的部署导致响应很慢的情况&#xff0c;据了解&#xff0c;业务使用域名访问&#xff0c;相同的nginx代理&#xff0c;唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台&#xff0c;毕竟业务是重启几次正常&#xff0c;偶…

CVPR2024 | TT3D | 物理世界中可迁移目标性 3D 对抗攻击

Towards Transferable Targeted 3D Adversarial Attack in the Physical World 速览总结摘要-Abstract引言-Introduction相关工作-Related Work方法-MethodologyPreliminray-预备知识问题表述-Problem FormulationNeRF参数空间中的双重优化-Dual Optimization in NeRF Paramete…

全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解

在当今的多媒体时代&#xff0c;视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…

传输层自学

传输实体&#xff1a;完成传输层任务的硬件或软件 可能位于&#xff1a; 操作系统内核独立的用户进程绑定在网络应用中的链接库网络接口卡 1.功能&#xff1a; 网络层与传输层作用范围比较&#xff1f; 网络层负责把数据从源机送达到目的机 传输层负责把数据送达到具体的应…

微服务架构下前端如何配置 OpenAPI 接口

在微服务架构中&#xff0c;后端通常由多个独立的服务组成&#xff0c;每个服务可能提供自己的 API 接口。为了在前端项目中高效地调用这些 API&#xff0c;可以使用 OpenAPI 规范生成客户端代码。以下是详细的配置步骤和最佳实践&#xff1a; 1. 理解 OpenAPI 规范 OpenAPI 是…

FreeRTOS源码概述

FreeRTOS源码概述 1 FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工程中&#xff0c;FreeRTOS 相关的源码如下&#xff1a; 主要涉及2个目录&#xff1a; Core Inc 目录下的 FreeRTOSConfig.h 是配置文件Src 目录下的 freertos.c 是 STM32CubeMX 创建的默认任务 Mi…

日志统计(C++,模拟,双指针)

题目要我们求在某个时间段中&#xff0c;帖子点赞数达到K的帖子数 遍历方式一 我们可以先对所有帖子根据时间&#xff0c;升序排序 枚举每一条帖子&#xff0c;枚举后续每一条帖子&#xff0c;如果id相同且时间差小于d&#xff0c;那么就记录起来&#xff0c;如果记录数量cn…

加固脱壳技术:DEX动态加载对抗

1. 加固技术原理剖析 1.1 DEX保护演进路线 加固方案发展历程&#xff1a; graph LR A[2015 代码混淆] --> B[2017 DEX动态加载] B --> C[2019 VMP指令虚拟化] C --> D[2022 全链路加密] 1.1.1 主流加固方案对比 厂商核心防护技术弱点分析梆梆加固DEX文件分片…

C++之list类(超详细)

在上一节中我们学习了STL中的vector这个容器&#xff0c;这节我们来学习一下另外一个常用的容器——list。 文章目录 前言 一、list的介绍 二、list的使用及相关接口 1.list的使用 2.list的迭代器使用 3.list的相关接口 3.1 list capacity 3.2 list element access 3.3…

强化学习的一些概念

目录 强化学习 打个比方 核心要素 State Action Reward 几个代码demo 学习目标 强化学习 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;旨在让智能体&#xff08;Agent&#xff09;通过与环境的交互学习最优策略&#xff0c;以…

MambaTab:表格数据处理的新利器

——基于结构化状态空间模型的特征增量学习框架 摘要 本文提出MambaTab&#xff0c;一种基于结构化状态空间模型&#xff08;SSM&#xff09;的表格数据处理框架。通过创新的嵌入稳定化设计与轻量化SSM架构&#xff0c;MambaTab在普通监督学习和特征增量学习场景中均表现优异&…

Kafka的流量控制机制

Kafka的流量控制机制 Kafka 作为一款高吞吐量的消息队列系统&#xff0c;能够在海量数据场景下提供稳定的消息生产和消费能力&#xff0c;其背后的流量控制机制功不可没。我们需要认识到&#xff0c;Kafka 的流量控制并非仅仅是为了防止系统过载或崩溃&#xff0c;它的目标是实…

CSSHTML新特性

HTML5 新特性探秘 在 Web 开发的不断演进中&#xff0c;HTML5 带来了一系列令人振奋的新特性&#xff0c;极大地提升了网页的功能和用户体验。今天&#xff0c;我们就来深入探究一下这些新特性。 语义化标签&#xff1a;让网页结构更清晰 语义化标签是 HTML5 的一大亮点。在…

51单片机的工作方式

目录 一、51 单片机的时钟电路及时钟信号 &#xff08;一&#xff09;时钟电路 &#xff08;二&#xff09;时钟信号 二、51 单片机的CPU 时序 &#xff08;一&#xff09;时钟周期​ &#xff08;二&#xff09;机器周期​ &#xff08;三&#xff09;指令周期​ 三、…

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道的练习题&#xff0c;欢迎大家在评论区多多交流&#xff0c;废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目&#xff1a;斐波那契数列_牛客题霸…

MrRobot靶机详细解答

一、主机发现 arp-scan -l二、端口扫描、目录枚举、指纹识别 2.1端口扫描 nmap -p- 192.168.55.147发现22端口关闭&#xff0c;且无其它特殊端口&#xff0c;只能去网页中寻找信息 2.2目录枚举 dirb http://192.168.55.1472.3指纹识别 nmap 192.168.55.147 -sV -sC -O --…

java线性表(单向链表)

对于链表我们有很多种&#xff0c;有带头和不带头&#xff0c;双向和单项&#xff0c;循环和不循环。 我们实现的单向链表是不带头单向不循环链表。 链表不比顺序表&#xff0c;它可以连续也可以不连续&#xff0c;是链子型的每条链子两边都有节点&#xff08;除首尾)。 单向…

QT:动态属性和对象树

动态对象 1.添加Q_PROPERTY对象 #ifndef MYPROPERTYCLASS_H #define MYPROPERTYCLASS_H#include <QObject>class MyPropertyClass : public QObject {Q_OBJECTQ_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged) public:explicit MyPropertyClass(Q…

PH热榜 | 2025-03-16

1. BrowserAgent 标语&#xff1a;基于浏览器的人工智能代理 - 无限使用&#xff0c;固定费用 介绍&#xff1a;在您的浏览器中直接创建和运行AI工作流程&#xff0c;无需支付API费用。我们的可视化编辑器不需要编写代码&#xff0c;同时我们的浏览器本地技术支持以固定价格进…

关于进程的实验(子进程和父进程相关的)

文章目录 1.第一个问题2.第二个问题3.第三个问题 1.第一个问题 编写一段程序&#xff0c;利用系统调用fork( )创建两个进程。当此程序运行时&#xff0c;在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符&#xff1a;父进程显示字符“a”;子进程分别显…