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

news2024/11/20 4:56:29

目录

串口向电脑发送数据

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

电脑通过串口控制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.coloradmin.cn/o/1442595.html

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

相关文章

Swift 初见

Swift 初见 学习swift的记录 控制台输出 print("hello world")可以无分号!!!!!!! 变量声明 let 常量声明 如果在常量声明后再次修改他会报错 var 变量声明 一个常量的值&#xf…

Python ABC:应用场景和示例

前言 在Python编程中,抽象基类(Abstract Base Classes,简称ABC)是一种用于定义接口和规范的强大工具。它们提供了一种方式来确保类遵循特定的约定,从而增强了代码的可读性、可维护性和可扩展性。本文将深入探讨Python…

CVE-2018-19518 漏洞复现

CVE-2018-19518 漏洞介绍 IMAP协议(因特网消息访问协议)它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它运行在TCP/IP协议之上,使用的端口是143。在php中调用的是imap_open函数。 PHP 的…

vscode开发FPGA(0)--windows平台搭建

一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese(simplified)中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…

2024-02-08(Flume)

1.Flume 的架构和MQ消息队列有点类似 2.Flume也可以做数据的持久化操作 在Channel部分选择使用File channel组件 3.Flume进行日志文件监控 场景:企业中应用程序部署后会将日志写入到文件中,我们可以使用Flume从各个日志文件将日志收集到日志中心以便…

Flume安装部署

安装部署 安装包连接:链接:https://pan.baidu.com/s/1m0d5O3Q2eH14BpWsGGfbLw?pwd6666 (1)将apache-flume-1.10.1-bin.tar.gz上传到linux的/opt/software目录下 (2)解压apache-flume-1.10.1-bin.tar.gz…

《小狗钱钱》读书笔记——如何看待金钱

目录 前言 作者 经典摘录 1、 了解致富的规律,一开始,必须明确金钱对你的意义 2、 梦想储蓄罐和梦想相册 3、认真去找机会 4、主人公吉娅的财富路径 5、注意财富积累本质 写在最后 前言 尽管[ 智慧是无法传授的], 但读书可以启发思路&#xff0…

嵌入式学习之Linux入门篇笔记——17,makefile基本语法(上)

配套视频学习链接:http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 目录 一.设置 vim 首行缩进 二.Makefile 基本语法…

Transformer的PyTorch实现之若干问题探讨(二)

在《Transformer的PyTorch实现之若干问题探讨(一)》中探讨了Transformer的训练整体流程,本文进一步探讨Transformer训练过程中teacher forcing的实现原理。 1.Transformer中decoder的流程 在论文《Attention is all you need》中&#xff0…

电商小程序06用户审核

目录 1 创建自定义应用2 显示待办数量3 创建审核页面4 开发审核功能5 搭建布局6 最终效果总结 上一篇我们讲解了用户注册的功能,用户注册之后状态是待审核,需要管理员进行审核。通常给管理员提供一套PC端的软件进行相关的操作,在低代码中&…

ChatGPT高效提问—prompt常见用法(续篇五)

ChatGPT高效提问—prompt常见用法(续篇五) 1.1 种子词 ​ 种子词(seed word)通常指的是在对话中使用的初始提示或关键词,用于引导ChatGPT生成相关回复。种子词可以是一个词、短语或句子,通常与对话的主题…

问题:老年人心理健康维护与促进的原则为________、________、发展原则。 #媒体#知识分享

问题:老年人心理健康维护与促进的原则为________、________、发展原则。 参考答案如图所示

肯尼斯·里科《C和指针》第12章 使用结构和指针(1)链表

只恨当时学的时候没有读到这本书,,,,,, 12.1 链表 有些读者可能还不熟悉链表,这里对它作一简单介绍。链表(linked list)就一些包含数据的独立数据结构(通常称为节点)的集…

第5章 数据库操作

学习目标 了解数据库,能够说出数据库的概念、特点和分类 熟悉Flask-SQLAlchemy的安装,能够在Flask程序中独立安装扩展包Flask-SQLAlchemy 掌握数据库的连接方式,能够通过设置配置项SQLALCHEMY_DATABASE_URI的方式连接数据库 掌握模型的定义…

来自谷歌的新年礼物!速来免费领取2个月谷歌Gemini Advanced会员!价值280元!对标ChatGPT Plus!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

Vue3.3新特新和Vue3-Pinia

文章目录 1.Vue3.3新特性 - defineOptionsVue3.3新特性 - defineModel3.Pinia快速入门4.手动添加Pinia到Vue项目5.Vue3 - Pinia的基本语法6.action的异步实现7.Vue3-Pinia-storeToRefs方法8.Pinia持久化插件安装用法 1.Vue3.3新特性 - defineOptions 背景说明 有<script se…

项目02《游戏-11-开发》Unity3D

基于 项目02《游戏-10-开发》Unity3D &#xff0c; 任务&#xff1a;飞行坐骑 首先创建脚本&#xff0c; 绑定脚本&#xff0c; using UnityEngine; public class Dragon : MonoBehaviour{ [SerializeField] private float speed 10f; public Transfo…

redis-sentinel(哨兵模式)

目录 1、哨兵简介:Redis Sentinel 2、作用 3、工作模式 4、主观下线和客观下线 5、配置哨兵模式 希望能够帮助到大家&#xff01;&#xff01;&#xff01; 1、哨兵简介:Redis Sentinel Sentinel(哨兵)是用于监控redis集群中Master状态的工具&#xff0c;其已经被集成在re…

【Makefile语法 01】程序编译与执行

目录 一、编译原理概述 二、编译过程分析 三、编译动静态库 四、执行过程分析 一、编译原理概述 make&#xff1a; 一个GCC工具程序&#xff0c;它会读 makefile 脚本来确定程序中的哪个部分需要编译和连接&#xff0c;然后发布必要的命令。它读出的脚本&#xff08;叫做 …

blender几何节点中样条线参数中的系数(factor)是个什么概念?

一根样条线&#xff0c;通常由两个及以上的控制点构成。 每个控制点的系数&#xff0c;其实相当于该点处位于整个样条线的比值。 如图&#xff0c;一根样条线有十一个控制点。相当于把它分成了十段&#xff0c;那每一段可以看到x、y都是0&#xff0c;唯独z每次增加0.1&#xff…