单片机学习笔记---串口向电脑发送数据电脑通过串口控制LED

news/2024/3/4 21:33:07/文章来源:https://blog.csdn.net/xiaobaivera/article/details/136062130

目录

串口向电脑发送数据

每隔一秒串口就发送一个递增的数给电脑

电脑通过串口控制LED

波特率的具体计算

HEX模式和文本模式


前两节是本节的理论基础,这节开始代码演示!

串口向电脑发送数据

接下来先开始演示一下串口单向发送一个数字给电脑:

写好框架后把前几节写好的Delay程序添加进来,后面会用到

接下来就是怎么配置串口的问题。

我们要写一个串口初始化函数,可以借助STC软件上的一个小工具帮我们生成代码

复制过来

改造成

即完成了下图中的定时器(橘色标识)和串口相关寄存器(蓝色标识)的配置(目前是禁止中断状态,即还没有配置中断系统)

开始调用

然后我们尝试发送一个字节给电脑

首先要把值写进SBUF,只要上面写的那个串口函数的波特率配置好了,定时器配置好了之后就自动发出去了。

但是我们还需要检测是否完成发送,因为刚写完不会立即发完,如果连续发就会出错,所以我们需要检测。怎么检测呢?就是看TI标志位。

标志位置1之后,我们用软件清零

然后我们来调用一下这个函数,假设传一个字节0110 0110过去

编译无错误后下载到单片机里面,重启板子,然后找到串口助手,点击打开串口(注意打开串口之后一定要把波特率改成4800,因为我们前面选择定时器1的初始值(波特率)是4800,采样之前要保证接收双方的速率是相同的,所以这里接收的话也要设置为4800)然后一般都是选择无校验位,停止位为1位

然后按下开发板上的复位

就可以看到电脑的确接收了0x66的数据,以十六进制显示

PS:以后我们可以把这里给勾上,以后就不用每次都要点击打开串口了

以上单向发送就已经写好了。

每隔一秒串口就发送一个递增的数给电脑

下面我们开始演示本节要实现的第一个示例:每隔一秒串口就发送一个递增的数给电脑。

首先我们要在以上程序的基础之上添加一个全局变量

然后主程序改成每发送一次就延迟1秒

看看效果

第一个程序完成!

然后我们可以模块化我们的程序,方便下一次代码演示。

main.c

UART.c

UART.h

别忘了还有我们的延时Delay函数的模块化,前面很多节都模块化过了,这里就不说了。

模块化后的程序放在评论区了,需要的自取!

电脑通过串口控制LED

下面我们开始演示本节要实现的第二个示例:电脑通过串口控制LED

我们把新创建一个工程(可以复制前面的工程文件,修改工程文件名)打开

然后把前面写的UART代码改造一下。

我们要添加一个中断函数,因为我们不知道电脑什么时候发过来,我们也不能一直检测,我们就利用中断,当电脑发过来之后就触发中断,然后再中断函数里面进行数据处理,把这个数据拿出来。

这次我们要将REN置1,所以把SCON改成0x50

REN允许接收后,单片机接收完数据之后触发中断,这时我们要把串口的中断打开

启动中断后,程序就跳转到中断函数里面

我们要查询串口中断的中断号,由下图我们可以知道UART的中断号为4

然后我们就应用这个中断号写一个串口中断函数在主程序文件中

由于给SBUF写数据的时候(即串口给电脑发送数据的时候)也会触发中断,而且发送和接收的中断标志位是占用同一通道的

所以发送和接收要区分开,因此加一个if判断语句

编译无错误后下载到单片机,然后重启板子,在串口助手中的发送区写入数据(然后串口就能接收到数据),点击发送后就能看到开发板上的LED发生响应的变化。

比如我写一个11即0x11,也就是0001 0001,所以LED的状态如下:

如果想让LED按二进制响应,比如你输入数字1,就是D1亮,输入2就是D2亮,输入3就是D2和D1亮,要实现这样的效果的话可以对输入的数据进行取反:

以上是单片机接收数据,然后我们还要把单片机接收的数据发给电脑

怎么写呢?就是调用前面写的UART_SendByte ( )函数

完整的代码:

main.c

UART.c

UART.h

别忘了还有我们的延时Delay函数的模块化,前面很多节都模块化过了,这里就不说了。

模块化后的程序放在评论区了,需要的自取!

编译后下载到单片机里面,当我们在发送区写入数据后,LED按响应的二进制响应,同时接收区就收到我们的数据

到这里,电脑和串口之间互相通信的程序就写好了。

波特率的具体计算

接下来我们具体说一下串口初始化函数里面的这个波特率怎么计算的

首先我们的波特率产生时是这个环节

然后函数里面我们当时在STC上选择的波特率是4800,生成的代码是F3

F3的十进制是243

每隔256溢出一次

256-243=13,就说明计数值是13,也就是每计13个数就溢出一次。

我们的单片机晶振是12MHz,机器周期是1微秒,也就是每一微秒就计一次数,也就是每隔13微秒就溢出一次,那溢出的频率就是1/13微秒,这就是定时器的溢出率。

1/13等于:

也就是说T1定时器的溢出率是0.07692MHz

然后我们这里还设置了波特率的倍数SMOD=1

那它就走的是除以16这条路线,

那0.07692还要除以16

这个结果是兆赫兹,我们需要转换成赫兹,那就乘以1000000

四舍五入就等于我们当时选的4800,这就是波特率了,大概0.16%的误差

如果不选择SMOD=1的话,那就是1/13先除2再除以16,那最后波特率就是SMOD=1时的一半

手册上也有计算公式

最后再补充一下数据显示模式方面的知识

HEX模式和文本模式

我们看到串口助手这里有两种数据模式:HEX模式和文本模式

HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

文本模式/字符模式:以原始数据编码后(对照ASCII表上的数据)的形式显示

为什么需要这个ASCII值呢?

是因为原始数据只能发0~255这些数字,如果我们需要发其他的,比如说发个ABCD和其他一些符号,怎么发呢?这个时候就需要它按照这个ASCII表对我们输入的数据进行编码。

比如我们想要给电脑发个A,那我就可以输入0x41

文本模式下,它就会把0x41编码成A

如果你忘记了A这个字符的ASCII值,可以写成 ’A’,它和0x41是一个意思

以上就是本节所有内容,本节的代码都放在文件在评论区了,自取!

如有问题,请评论区留言。

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

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Native 解放 JVM

一、Spring Native 是什么 Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像,提供了一种新的方式来部署Spring应用。与Java虚拟机相比,原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常…

深入理解 Nginx 插件及功能优化指南

深入理解 Nginx 插件及功能优化指南 深入理解 Nginx 插件及功能优化指南1. Nginx 插件介绍1.1 HTTP 模块插件ngx_http_rewrite_modulengx_http_access_module 1.2 过滤器插件ngx_http_gzip_modulengx_http_ssl_module 1.3 负载均衡插件ngx_http_upstream_modulengx_http_upstre…

Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

什么是对象和类 什么是 Python 类、类对象、实例对象 类变量、实例变量/类属性、实例属性 前言 只是叫法不一样 实例属性 实例变量 类属性 类变量 个人认为叫属性更恰当 类属性和实例属性区别 类属性,所有实例对象共享该属性实例属性,属于某一…

推荐系统|行为序列_用户行为序列建模、Din模型和SIM模型

文章目录 用户行为序列建模Din模型Din模型的缺点 用户行为序列建模 物品ID通过Embedding将会得到一个向量,性质差不多的向量在空间中也会处于差不多的位置,可以用取平均方式得到一个综合所有向量的向量。 取平均后可以作为代表用户的一个特征。 以上的…

VTK 三维场景的基本要素(相机) vtkCamera 相机的运动

相机的运动 当物体在处于静止位置时,相机可以在物体周围移动,摄取不同角度的图像 移动 移动分为相机的移动,和相机焦点的移动;移动改变了相机相对焦点的位置,离焦点更近或者更远;这样就会改变被渲染的物体…

Molecular Cell | MD鉴定琥珀酸与SUCNR1的结合路径以及在SUCNR1上的两个高亲和力结合位点

Background SUCNR1(GPR91)是一种G蛋白偶联受体,能够感知代谢应激信号,如琥珀酸。这种受体在细胞修复、重塑以及炎症反应中发挥作用。尽管已经确定了SUCNR1的正位结合位点,但其分子激活机制尚不清楚。本研究旨在通过分子…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

C++ STL string类使用及实现详解

1. string简介 C语言中&#xff0c;可以用字符数组来存储字符串&#xff0c;如&#xff1a; char ch[] "hello world"; C中&#xff0c;可以使用string类对象来存储字符串&#xff0c;使用起来比C语言中的字符数组要方便得多&#xff0c;而且不用考虑容量的问题。…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主机诶点上写入数据。而且&#xff0c;严重的话&#xff0…

Android Studio 中使用 Gradle 配置多渠道打包 配置不同的渠道名称 配置不同的App名称 配置不同的Logo

废话 三种操作都是可以混合一起用的&#xff0c;本来也不是很难的事情&#xff0c;为了方便分别理解&#xff0c;这里我就分开处理了。 如果需要将打包出来的apk的名称自动命名成指定格式&#xff0c;也可以进行配置&#xff0c;我这里没这个需求&#xff0c;所以这里就不讨论了…

应用程序数字证书生成及签名步骤

1.非管理员权限切换到管理员用户下&#xff0c;再C盘找到C:\Program Files (x86)\Windows Kits&#xff0c;查看当前路径下是否包含生成数字签名的文件。 注意&#xff1a; 此时不同的电脑会有不同的路径&#xff08;如蓝色框&#xff09;&#xff0c;需要找到具备生成工具的相…

Spring是怎么解决循环依赖的

首先先解释一下什么叫循环依赖 循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于A 循环依赖在spring中是允许存在的,spring框架依据三级缓存已经解决了大部分的循环依赖 一级缓存:单例池,缓存已经经历了完整的…

【漏洞复现】狮子鱼CMS文件上传漏洞(image_upload.php)

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

re:从0开始的CSS学习之路 1. CSS语法规则

0. 写在前面 现在大模型卷的飞起&#xff0c;感觉做页面的活可能以后就不需要人来做了&#xff0c;不知道现在还有没有学前端的必要。。。 1. HTML和CSS结合的三种方式 在HTML中&#xff0c;我们强调HTML并不关心显示样式&#xff0c;样式是CSS的工作&#xff0c;现在就轮到C…

disql备份还原

disql备份还原 前言 本文档根据官方文档&#xff0c;进行整理。 一、概述 在 disql 工具中使用 BACKUP 语句你可以备份整个数据库。通常情况下&#xff0c;在数据库实例配置归档后输入以下语句即可备份数据库&#xff1a; BACKUP DATABASE BACKUPSET db_bak_01;语句执行完…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库

目录 简介首次用户功能特点进一步探索 简介 HTTPX 是一个为 Python 设计的下一代 HTTP 客户端库&#xff0c;由 Tom Christie 创建。它提供了同步和异步的 API&#xff0c;并支持 HTTP/1.1 和 HTTP/2 协议。与 Requests 库类似&#xff0c;但增加了对异步请求的支持和 HTTP/2 …

《UE5_C++多人TPS完整教程》学习笔记9 ——《P10 创建会话(Creating A Session)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P10 创建会话&#xff08;Creating A Session&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

拟合案例1:matlab积分函数拟合详细步骤及源码

本文介绍一下基于matlab实现积分函数拟合的过程。采用的工具是lsqcurvefit和nlinfit两个函数工具。关于包含积分运算的函数,这里可以分为两大类啊。我们用具体的案例来展示:一种是积分运算中不包含这个自变量,如下图的第一个公式,也就是说它这个积分运算只有R和Q这两个待定…

基于图像掩膜和深度学习的花生豆分拣(附源码)

目录 项目介绍 图像分类网络构建 处理花生豆图片完成预测 项目介绍 这是一个使用图像掩膜技术和深度学习技术实现的一个花生豆分拣系统 我们有大量的花生豆图片&#xff0c;并以及打好了标签&#xff0c;可以看一下目录结构和几张具体的图片 同时我们也有几张大的图片&…