NO9 蓝桥杯单片机串口通信之进阶版

1 回顾

串口通信的代码编写结构还是与中断一样,不同的是:

初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器(定时器1用于产生波特率),但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。

void  函数名()

{

包含两部分寄存器:定时器1+串口通信

定时器1: TMOD (选择模式),TH1和TL1(初始计时寄存器),TR1(TCON寄存器里的启动计时按钮)

串口通信:SCON(总的来说功能是模式选择),AUXR(辅助寄存器),中断开关(分开关+总开关)

}

void  函数名() interrupt  中断号

{

就是写时间到后执行什么。注意中断号要写串口通信的,而不是定时器的,因为定时器作用只是产生波特率而不是产生中断。

}

2 C语言字符串知识补充:

字符串的C语言知识发现自己还不是很懂,就简单写一下。

常用的有两种,一种是字符串常量,一种是字符串数组。

判断字符串中止的标志是“\0 ”,表示NULL。

2.1 字符串常量

公式:char  *(+指针名称如A)= “ 字符串常量内容”

表示在A指针所对应的往下连续地址中,储存字符串常量。

char *message = "Hello World!";// 上面的语句也可以拆分成下面两句
char *message;
message = "Hello World!";

2.2 字符串数组

char charArray[] = {'H','e','l','l','o'};    // 声明并初始化一个字符数组
char charArray[] = "Hello World!"; 

以上参考以下帖子,详情可点击进去查看。

C语言 -- 字符串详解 - 知乎 (zhihu.com)

3 实践

3.1 任务

3.2 思路

读题目是串口通信———那么就要写串口通信的结构

采用8位UART模式,波特率9600--------这些条件就可以确定串口通信结构的中断初始函数怎么写(NO9串口通信实践的另一篇有详细说明这里就不再赘述)

void Init_uart()
{TMOD = 0x20;TH1 = 0xfd;TL1 = 0xfd;TR1 = 1;AUXR = 0x00;SCON = 0x50;ES = 1;EA = 1;}

要上上位机发送,故要写一个发送函数,又是字符串,那么就要利用2的字符串知识补充来写

这里字符串是一个字符接一个字符来发的(但速度较快看起来就是一下子发了出来),而 while(*str != '\0') 是判断字符串是否发完了,如果没发完,那么字符串的指针就加1,即一个一个字节来发。

void SentByte(unsigned char dat)
{SBUF = dat;while(TI == 0);TI = 0;
}void SentString(unsigned char *str)
{while(*str != '\0'){SentByte(*str++);}}

通过串口发送的接收命令来进行控制操作,那么就需要一个收的操作,并且还要写一个函数来判断并执行不同命令。

这里就主要将以下这个判断命令的思路。

命令分三种,是0xa_ , 0xb_ ,和0xc0,a,b,c来判断哪一种命令,低四位则代表这种命令的相关操作。

首先就要区别abc哪一种命令,这里可以用command来储存收到的命令,用command & 0xf0 来判断是a还是b还是c,与上0xf0,即是保留command高四位去掉低四位,那么command要么是0xa0要么是0xb0要么是0xc0,然后再用一个switch-case来存放三种命令的情况。

case里面放置三种命令的具体执行。

case(0xa0):是要用command的低四位去控制灯(L1~L4),注意这里1是开灯,0是关灯。(而单片机本身是0才亮灯。)

这里用这个公式来执行此命令: P0 = ~(command & 0x0f);  break;

分析:command先与上0x0f,表示command高四位清零,低四位保留,然后在取反。

比如 command = 0xa3(1010 0011),表示L1和L2点亮。

1010 0011   

                    & 

0000 1111

                     =

0000 0011

然后~(0000 0011) = 1111 1100, 而在单片机上恰好和命令相反是0时灯才亮,所以就完成了。

(注意,判断哪种命令时使用了command&0xf0,并没有改变command的值,因为它是在switch条件里的switch(command & 0xf0)的操作,而不是command = command &0xf0,所以这里并没有改变command的值。)

case(0xb0):这里就不再解释0xb0了,和0xa0的操作思路差不多。

case(0xc0):此命令是发送字符串,那么就用到了写的sentByte函数,注意这里发送完后command要清零,不然就会循环发送字符串。

unsigned char dat;
unsigned char command = 0x00;
void Service_uart() interrupt 4
{if (RI == 1)       收操作{command = SBUF;RI =0;}}void Working()      判断并执行命令
{if(command != 0x00){switch(command & 0xf0){case(0xa0):P0 = ~(command & 0x0f);  break;case(0xb0):P0 = ~((command & 0x0f)<<4);  break;case(0xc0):SentString("The system is running...\n"); command = 0x00; break;    }}
}

3.3 完整代码

#include "stc15f2k60s2.h"void selectHC138(unsigned int n)
{switch(n){case 0:P2 = (P2 & 0x1f) | 0x00;  break;case 1:P2 = (P2 & 0x1f) | 0x20;  break;case 2:P2 = (P2 & 0x1f) | 0x40;  break; case 3: P2 = (P2 & 0x1f) | 0x60;  break; case 4:P2 = (P2 & 0x1f) | 0x80;  break; case 5:P2 = (P2 & 0x1f) | 0xa0;  break; case 6:P2 = (P2 & 0x1f) | 0xc0;  break; case 7:P2 = (P2 & 0x1f) | 0xe0;  break;}
}
//==================================
void Init_uart()
{TMOD = 0x20;TH1 = 0xfd;TL1 = 0xfd;TR1 = 1;AUXR = 0x00;SCON = 0x50;ES = 1;EA = 1;}unsigned char dat;
unsigned char command = 0x00;
void Service_uart() interrupt 4
{if (RI == 1){command = SBUF;RI =0;}}void SentByte(unsigned char dat)
{SBUF = dat;while(TI == 0);TI = 0;
}void SentString(unsigned char *str)
{while(*str != '\0'){SentByte(*str++);}}void Working()
{if(command != 0x00){switch(command & 0xf0){case(0xa0):P0 = ~(command & 0x0f);  break;case(0xb0):P0 = ~((command & 0x0f)<<4);  break;case(0xc0):SentString("The system is running...\n"); command = 0x00; break;    }}
}//===============================void close()
{selectHC138(5);P0 = 0x00;selectHC138(4);P0 = 0xff;
}void main()
{close();Init_uart();SentString("Welcome to system!\n");while(1){Working();}
}

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

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

相关文章

跟着cherno手搓游戏引擎【29】Batch简单合批

思路&#xff1a; CPU和GPU都开辟同样大小的一大块内存&#xff08;为了存储顶点信息&#xff09; 索引在程序运行时生成对应规则后绑定到索引缓冲中 动态生成顶点信息&#xff08;现在改成Drawquad只是确定图形顶点的位置&#xff09; 然后在Endscene&#xff0c;将CPU的动…

网络安全-文件包含

一、php://input 我们先来看一个简单的代码 <meta charset"utf8"> <?php error_reporting(0); $file $_GET["file"]; if(stristr($file,"php://filter") || stristr($file,"zip://") || stristr($file,"phar://&quo…

如何忽略Chrome最小字号的限制

通过控制台调整字体大小时&#xff0c;可以发现即便设置了小于12px的字号&#xff0c;也并不会变小&#xff0c;这是因为Chrome默认最小字号为12px。 在Chrome设置中的外观选项卡中可以发现&#xff0c;默认字体是16px。将最小字号改为0&#xff0c;就能随意设置小于12px的字号…

我在京东做数据分析,一位京东数据分析师的工作日常

有人说&#xff1a;“种下一棵树最好的时间是十年前&#xff0c;其次是现在”。任何时候&#xff0c;我们都应该抓住机遇&#xff0c;说不定就是改变你现状的一个机会。 2020年&#xff0c;我在疫情得到控制后&#xff0c;面试入职京东大数据组&#xff0c;截止目前&#xff0…

libVLC 视频裁剪

使用 libVLC 进行视频裁剪并不是直接支持的功能&#xff0c;因为 libVLC 主要是一个媒体播放库。然而&#xff0c;你可以通过调整播放窗口的大小和设置视频输出的区域来实现一种“视觉上的裁剪”。这意味着视频本身并没有被修改&#xff0c;但可以控制显示给用户的视频区域。 …

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…

Mysql数据库:日志管理、备份与恢复

目录 前言 一、MySQL日志管理 1、存放日志和数据文件的目录 2、日志的分类 2.1 错误日志 2.2 通用查询日志 2.3 二进制日志 2.4 慢查询日志 2.5 中继日志 3、日志综合配置 4、查询日志是否开启 二、数据备份概述 1、数据备份的重要性 2、备份类型 2.1 从物理与…

SpringBoot学习之ElasticSearch下载安装和启动(Windows版)(三十)

本文先写windows下的下载安装和启动,后续有时间再补充其他环境下(Mac、Linux、Docker)的,这里我们后续对ElasticSearch简称为ES,读者习惯这一称呼就好。 一,ES下载 可以百度【ElasticSearch官网】或者直接点击这里的ES官网下载地址:​​​​​ Download Elasticsearch…

数字乡村战略实施:科技引领农村经济社会全面发展

随着信息技术的快速发展&#xff0c;数字化已经成为推动经济社会发展的重要力量。在乡村振兴战略的大背景下&#xff0c;数字乡村战略的实施成为了引领农村经济社会全面发展的关键。本文将从数字乡村战略的内涵、实施现状、面临挑战及未来展望等方面&#xff0c;探讨科技如何引…

Mac 装 虚拟机 vmware、centos7等

vmware&#xff1a; https://www.vmware.com/products/fusion.html centos7 清华镜像&#xff1a; 暂时没有官方的 m1 arm架构镜像 centos7 链接: https://pan.baidu.com/s/1oZw1cLyl6Uo3lAD2_FqfEw?pwdzjt4 提取码: zjt4 复制这段内容后打开百度网盘手机App&#xff0c;操…

[flask]cookie的基本使用/

彻底理解 Cookie - 知乎 (zhihu.com) 是什么 cookie是当你浏览某个网站的时候&#xff0c;由web服务器存储在你的机器硬盘上的一个小的文本文件。它其中记录了你的用户名、密码、浏览的网页、停留的时间等等信息。当你再次来到这个网站时&#xff0c;web服务器会先看看有没有…

[音视频学习笔记]八、FFMpeg结构体分析 -上一个项目用到的数据结构简单解析:AVFrame、AVFormatContext、AVCodecContext

前言 上次我们做了一个简单的视频解码&#xff0c;MediaPlay-FFmpeg - Public 这一次简单对这个代码进行一个剖析&#xff0c;对其中的数据结构进行一个解析。 这些数据结构之间的关系 AVFrame 、AVFormatContext 、AVCodecContext 、AVIOContext 、AVCodec 、AVStream 、AV…

flask_restful规范返回值之类型设置

大型的互联网项目中&#xff0c;返回的数据格式&#xff0c;有时是比较复杂的结构。 如&#xff1a;豆瓣电影 https://movie.douban.com/j/chart/top_list?type24&interval_id 100%3A90&action&start20&limit20 返回的值里有 json 或者列表数据&#xff0c…

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-子串分值和

solution1&#xff08;通过40%&#xff09; 依次求子串并统计出现过的字母个数 #include<iostream> #include<string> #include<set> using namespace std; int main(){string s, subs;cin >> s;int len s.size(), ans 0;for(int j 1; j < len…

vscode下c++的boost库安装

Boost Downloadshttps://www.boost.org/users/download/下载最新的库文件。在shell中&#xff0c;使用命令bootstrap.bat gcc生成b2.exe文件。然后是.\b2.exe toolsetgcc生成库文件&#xff0c;在stage\lib文件夹下把stage\lib文件夹中的库文件拷贝到mingw64\x86_64-w64-mingw3…

Node.js之沙盒专题

​ Node.js一直是薄弱项&#xff0c;今天特意整理一下&#xff0c;基本上是各个大佬写的大杂烩&#xff0c;仅用于学习记录~~~ 1. child_process 首先介绍一下nodejs中用来执行系统命令的模块child_process。Nodejs通过使用child_process模块来生成多个子进程来处理其他事物…

(三)Qt+OpenCV调用海康工业相机SDK抓拍示例

系列文章目录 提示&#xff1a;这里是该系列文章的所有文章的目录 第一章&#xff1a; &#xff08;一&#xff09;QtOpenCV调用海康工业相机SDK示例开发 第二章&#xff1a; &#xff08;二&#xff09;Qt多线程实现海康工业相机图像实时采集 第三章&#xff1a; &#xff08;…

命令模式(请求与具体实现解耦)

目录 前言 UML plantuml 类图 实战代码 模板 Command Invoker Receiver Client 前言 命令模式解耦了命令请求者&#xff08;Invoker&#xff09;和命令执行者&#xff08;receiver&#xff09;&#xff0c;使得 Invoker 不再直接引用 receiver&#xff0c;而是依赖于…

学习vue3第十一节(依赖注入:provide/inject)

本机介绍&#xff1a;provide/inject 注意&#xff1a;大家在看此小节时候&#xff0c;默认大家已经了解一些组件的使用方法 1、依赖注入的用途&#xff1a; 当嵌套层级多的时候&#xff0c;某个子组件需要较远层级的父组件数据时候&#xff0c;如果我们依然使用props 传递数…

数据挖掘与机器学习 1. 绪论

于高山之巅&#xff0c;方见大河奔涌&#xff1b;于群峰之上&#xff0c;便觉长风浩荡 —— 24.3.24 一、数据挖掘和机器学习的定义 1.数据挖掘的狭义定义 背景&#xff1a;大数据时代——知识贫乏 数据挖掘的狭义定义&#xff1a; 数据挖掘就是从大量的、不完全的、有噪声的、…