蓝桥杯备战——6.串口通讯

news2024/11/17 5:21:56

1.分析原理图

在这里插入图片描述
由上图我们可以看到串口1通过CH340接到了USB口上,通过串口1我们就能跟电脑进行数据交互。
在这里插入图片描述
另外需要注意的是STC15F是有两组高速串口的,而且可以切换端口。

2.配置串口

由于比赛时间紧,我们最好不要去现场查寄存器手册,去计算波特率。建议直接使用STC-ISP烧录软件里面的小工具去配置就行。例如我这是使用定时器2用作串口1的波特率发生器,波特率9600。需要注意的是如果你想要使能串口1中断,需要加上 ES = 1;EA = 1;
在这里插入图片描述
如果你使能了串口中断,下面就是串口中断函数的写法:

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if(RI) RI = 0;   //清除RI位
    if (TI){
			TI = 0;  		//清除TI位
       busy = 0;  //清忙标志
    }
}

3.封装串口收发函数

串口收发函数其实也不需要我们自己现场去写,在STC-ISP烧录软件里面有示例,复制出来稍作修改就行。
在这里插入图片描述
下面是我修改过后的代码

#include "uart.h"

bit busy;

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xE6;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	ES = 1;         //使能串口1中断
  EA = 1;
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if(RI) RI = 0;   //清除RI位
    if (TI){
			TI = 0;  		//清除TI位
       busy = 0;  //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(u8 dat)
{
    while (busy);               //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;                 //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
			SendData(*s++);         //发送当前字符
    }
}

4.使用printf函数

C51也是可以通过串口重定向,就能直接使用printf()函数往串口发送格式化数据,具体操作如下:

/*-----------------------------
串口重定向
-------------------------------*/
char putchar(char c)
{
	SendData(c);
	return c;
}

然后就能直接使用printf()函数了,示例:按键按下后将获取到的温度数据通过串口发送到电脑
在这里插入图片描述
在这里插入图片描述
需要注意的是如果提示printf函数未定义,请引入头文件stdio.h 如果还是提示没有定义,请自行往stdio.h头文件里面添加如下代码:
在这里插入图片描述

5.完整封装库

#include "uart.h"

bit busy;

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xE6;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	ES = 1;         //使能串口1中断
  	EA = 1;
}

/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
    if(RI) RI = 0;   //清除RI位
    if (TI)
    {
		TI = 0;  	//清除TI位
       	busy = 0;  	//清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(u8 dat)
{
    while (busy); //等待前面的数据发送完成
    busy = 1;
    SBUF = dat;  //写数据到UART数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)  //检测字符串结束标志
    {
		SendData(*s++); //发送当前字符
    }
}

/*-----------------------------
串口重定向
-------------------------------*/
char putchar(char c)
{
	SendData(c);
	return c;
}

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

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

相关文章

Redis学习——入门篇③

Redis学习——入门篇③ 1. Redis事务1.1 事务实际操作1.2 watch 2. Redis管道(pipelining)2.1 管道简介2.2 管道实际操作2.3 管道小总结 3. Redis(pub、sub)发布订阅(不重要)3.1 简介3.2 发布订阅实际操作 这是一个分水岭…

uniapp 实现路由拦截,权限或者登录控制

背景: 项目需要判断token,即是否登录,登录之后权限 参考uni-app官方: 为了兼容其他端的跳转权限控制,uni-app并没有用vue router路由,而是内部实现一个类似此功能的钩子:拦截器,由…

Jmeter连接数据库报错Cannot load JDBC driver class‘com.mysql.jdbc.Driver’解决

问题产生: 我在用jmeter连接数据库查询我的接口是否添加数据成功时,结果树响应Cannot load JDBC driver class com.mysql.jdbc.Driver 产生原因: 1、连接数据库的用户密码等信息使用的变量我放在了下面,导致没有取到用户名密码IP等信息,导致连接失败 2、jmeter没有JDB…

echarts 柱状图数据过多时自动滚动

当我们柱状图中X轴数据太多的时候,会自动把柱形的宽度挤的很细,带来的交互非常不好,我们可以用dataZoom属性来解决 简易的版本,横向滚动。 option.dataZoom [{type: "slider",show: true,startValue: 0, //数据窗口范…

对接京东SDK踩坑

背景 最近刚好需要对接京东本地生活,部分接口和数据可以直接对接京东的开放平台,有一些敏感数据需要在京东云鼎上面入驻,然后在鼎内做一些业务逻辑,然后再将数据做一个转发,然后踩了一个坑就是京东SDK打包时未打包依赖…

C语言第十弹---函数(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 函数 1、函数的概念 2、库函数 2.1、标准库和头文件 2.2、库函数的使用方法 2.2.1、功能 2.2.2、头文件包含 2.2.3、实践 2.2.4、库函数文档的⼀般格式 …

C++实现推箱子游戏

推箱子游戏 运行之后的效果如视频所示,在完成游戏后播放音乐 准备工作:建立一个新的文件夹,并在文件夹中任意增加一张背景图片,以及各个部件的照片文件 因为这里用到了贴图技术,要使用graphic.h这个函数&#xff0c…

【DeepLearning-8】MobileViT模块配置

完整代码: import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

C/C++:混肴点分析

C中的常量介绍 字面常量 字面常量是指直接出现在代码中的常量值。例如,整数常量10、浮点数常量3.14、字符常量A等都属于字面常量。字面常量的值在编译时就已经确定,并且不能被修改。 字面常量存在类型,但没有地址 注意字符常量和只包含一个字…

关于我写过那些MySQL专栏

写在文章开头 这是截至今日写过的文章汇总,对于关注笔者公众号有一段时间的读者都知道,笔者会每周对自己写过的文章整理至相关专栏,以便读者可以按需进行检索阅读。 你好,我叫sharkchili,目前还是在一线奋斗的Java开…

免费开源的微信小程序源码、小游戏源码精选70套!

微信小程序已经成为我们日常的一部分了,也基本是每个程序员都会涉及的内容,今天给大家分享从网络收集的70个小程序源码。其中这些源码包含:小游戏到商城小程序,再到实用的工具小程序,以及那些令人惊叹的防各大站点的小…

Docker数据卷操作 Docker挂载Nginx、MySQL数据卷

容器与数据(容器内文件)耦合: 不便于修改:如果需要修改配置文件,需要进入容器的内部。数据不可复用:容器内的修改对外不可见,无法复用。升级维护困难:如果想要升级容器,…

pinia实现todos

store/todos.js //导入defineStore import {defineStore} from pinia const userTodosStoredefineStore(todos,{ state:()>({// list:[// {id:1,name:吃饭,done:false},// {id:2,name:睡觉,done:true},// {id:3,name:打豆豆,done:false}// ],list:JSON.parse(l…

wireshark利用sshdump自身组件进行远程实时抓包过滤

引言 以前在不了解wireshark可以远程抓包的时间,经常通过tcpdump在远程linux主机将抓包文件保存下来后,然后拖拽入windows中再打开,进行分析查看。 此过程比较繁琐,也不够实时。比较常用的抓包动作是仅出现某特征的报文后&#…

六、VTK创建平面vtkPlaneSource

vtkPlaneSource创建位于平面中的四边形数组 先看看效果图: vtkPlaneSource 创建一个 m x n 个四边形数组,这些四边形在平面中排列为规则平铺。通过指定一个原点来定义平面,然后指定另外两个点,这两个点与原点一起定义平面的两个轴。这些轴不必是正交的 - 因此您可以创建平行…

牵手国际企业,OpenAI计划自己制造AI芯片

据外媒报道称,近日,OpenAI的首席执行官萨姆奥特曼正在积极洽谈一项规模达数十亿美元的投资项目,计划与多家顶级芯片制造商合作,建设一个覆盖全球的人工智能芯片生产网络。 奥特曼曾多次反馈目前的芯片已不能满足OpenAI公司的AI研发…

Excel导出指定格式

期望 实现 Slf4j RequestMapping(value "/data") RestController public class DataStatController {GetMapping(value "/export", produces MediaType.APPLICATION_OCTET_STREAM_VALUE)public void export(HttpServletResponse response) {final Stri…

docker 存储管理

文章目录 docker 存储管理容器存储方案docker 容器存储解决方案 docker 存储驱动基本概述存储驱动的选择原则主流的 docker 存储驱动docker 版本支持的存储驱动 overlay2 存储驱动OverlayFSoverlay2 存储驱动要求配置 docker 使用 overlay2 驱动 overlay2 存储驱动的工作机制Ov…

mybatis-plus常用使用方法

** mybaits-plus常用使用方法 ** 常用三层分别继承方法 1.1mapper层&#xff08;接口定义层&#xff09;可以用BaseMapper<> 例如&#xff1a; 1.2.里面常用的封装方法有 1.3常用方法介绍 【添加数据&#xff1a;&#xff08;增&#xff09;】int insert(T entity);…

Neo4j 国内镜像下载与安装

Neo4j 5.x 简体中文版指南 社区版&#xff1a;https://neo4j.com/download-center/#community 链接地址&#xff08;Linux版&#xff09;&#xff1a;https://neo4j.com/artifact.php?nameneo4j-community-3.5.13-unix.tar.gz 链接地址&#xff08;Windows&#xff09;&#x…