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

目录

串口向电脑发送数据

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

电脑通过串口控制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是一个意思

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

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

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

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

相关文章

【Git】上传本地文件到Git(以Windows环境为例)

Git 的下载参考:Git 安装及配置 一、Git 上传的整体流程 1、工作区 > 本地仓库 将本地文件上传到Git,需要先上传到本地仓库,然后再上传到远程仓库。要上传文件到本地仓库,不是直接拷贝进去的,而是需要通过命令一步…

2024-02-11 Unity 编辑器开发之编辑器拓展2 —— 自定义窗口

文章目录 1 创建窗口类2 显示窗口3 窗口事件回调函数4 窗口中常用的生命周期函数5 编辑器窗口类中的常用成员6 小结 1 创建窗口类 ​ 当想为 Unity 拓展一个自定义窗口时,只需实现继承 EditorWindow 的类即可,并在该类的 OnGUI 函数中编写面板控件相关的…

QT入门-信号与槽

1.QT基本框架 #include "myWindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);myWindow w;w.show();return a.exec(); } QApplicata&#xff1a;应用程序对象&#xff0c;必须有且只能有一个 Qwidget&#xff1…

过河卒(洛谷)

题目 原题 题目描述 棋盘上 A A A 点有一个过河卒&#xff0c;需要走到目标 B B B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。…

3秒实现无痛基于Stable Diffusion WebUI安装ComfyUI!无需重复安装环境!无需重复下载模型!安装教程

标题略有夸张的表达了接下来这一套确实很简单&#xff0c;相较于直接下载或者通过秋叶包更新而言。大大节省磁盘空间&#xff0c;和下载时间。 这篇教程不需要你有&#xff1a; 代码基础。都是复制粘贴就完事。魔法。 这篇教程默认你已经有&#xff1a; 1. 本地能够正常使用…

汽车出租管理系统

文章目录 汽车出租管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 汽车出租管理系统 一、系统演示 汽车租赁系统 二、项目介绍 语言&#xff1a;java 框架&#xff1a;SpringBoot、…

【2024年数据】67个“绿色金融”主题DID政策汇总(已去重)

DID”发文趋势和主题分布 数据来源&#xff1a;中国知网、各期刊官网 时间跨度&#xff1a;2017-2024年 数据范围&#xff1a;中国各省 数据指标&#xff1a; 序号 用于构建DID的政策 文献标题 1 “宽带中国” 数字技术创新与中国企业高质量发展——来自企业数字专利的证据…

陶陶摘苹果C++

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; int main(){//一、分析问题//已知&#xff1a;10 个苹果到地面的高度a[10],陶陶把手伸直的时候能够达到的最大高度height//未知&#xff1a;陶陶能够摘到的苹果的数目sum。//关系&#xff…

ncc匹配提速总结

我们ncc最原始的匹配方法是&#xff1a;学习模板w*h个像素都要带入ncc公式计算 第一种提速&#xff0c;学习模板是w*h&#xff0c;而我们支取其中的w/2*h/2,匹配窗口同理&#xff0c;计算量只有1/4。 另外一种因为ncc是线性匹配&#xff0c;我们在这上面也做了文章&#xff0…

ROS URDF、rviz、gazebo(1)

文章目录 1.URDF优化_xacro:1.1.xacro语法&#xff1a;1.2.xacro之launch集成&#xff1a; 2.arbotix控制机器人运动:2.1.编写arbotix配置文件&#xff1a;2.2.配置launch文件&#xff1a;2.3.向话题发布信息&#xff1a; 3.URDF集成gazebo&#xff1a;3.1.创建功能包并导入相关…

专业140+总分410+华南理工大学811信号与系统考研经验华工电子信息与通信,真题,大纲,参考书。

23考研已经落幕&#xff0c;我也成功的上岸华工&#xff0c;回首这一年多的历程&#xff0c;也是有一些经验想和大家分享一下。 首先说一下个人情况&#xff0c;本科211&#xff0c;初试成绩400分。专业课140。 整体时间安排 对于考研&#xff0c;很重要的一环就是时间安排&…

C语言--------数据在内存中的存储

1.整数在内存中的存储 整数在内存是以补码的形式存在的&#xff1b; 整型家族包括char,int ,long long,short类型&#xff1b; 因为char类型是以ASCII值形式存在&#xff0c;所以也是整形家族&#xff1b; 这四种都包括signed,unsigned两种&#xff0c;即有符号和无符号&am…

中文GPTS使用秘籍,字节扣子Coze工作流使用全教程

大家好&#xff0c;我是斜杠君。今天和大家分享字节扣子Coze工作流创建和使用全教程&#xff0c;手把手教会你。 首先我们先来看一下如何创建一个工作流。 我们以创建这样一个工作流为例。这个工作流程的作用是&#xff1a;把用户输入的内容通过头条接口查询信息&#xff0c;把…

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…

深入理解 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…

模拟发送 Ctrl+Alt+Del 快捷键

目录 前言 一、在 XP 系统上模拟 SAS 二、在不低于 Vista 的系统上模拟 SAS 2.1 一些细节 2.2 实现原理和应用 三、完整实现代码和测试 3.1 客户端控制台程序 3.2 服务程序 3.3 编译&测试程序 四、总结&更新 参考文献 前言 对于开启了安全登陆的窗口工作站…

Java 基于微信小程序的电子商城购物系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

《统计学简易速速上手小册》第9章:统计学在现代科技中的应用(2024 最新版)

文章目录 9.1 统计学与大数据9.1.1 基础知识9.1.2 主要案例&#xff1a;社交媒体情感分析9.1.3 拓展案例 1&#xff1a;电商销售预测9.1.4 拓展案例 2&#xff1a;实时交通流量分析 9.2 统计学在机器学习和人工智能中的应用9.2.1 基础知识9.2.2 主要案例&#xff1a;预测客户流…

C语言 服务器编程-日志系统

日志系统的实现 引言最简单的日志类 demo按天日志分类和超行日志分类日志信息分级同步和异步两种写入方式 引言 日志系统是通过文件来记录项目的 调试信息&#xff0c;运行状态&#xff0c;访问记录&#xff0c;产生的警告和错误的一个系统&#xff0c;是项目中非常重要的一部…

Flutter 网络请求之Dio库

Flutter 网络请求之Dio库 前言正文一、配置项目二、网络请求三、封装① 单例模式② 网络拦截器③ 返回值封装④ 封装请求 四、结合GetX使用五、源码 前言 最近再写Flutter系列文章&#xff0c;在了解过状态管理之后&#xff0c;我们再来学习一下网络请求。 正文 网络请求对于一…