- 博客(49)
- 收藏
- 关注
原创 stm32 蓝桥杯 物联网 独立键盘的使用
在蓝桥杯物联网平台里面,有5个外接设备,其中有一个就是6个独立按键。首先,我们先看一下按键有关的电路图。
2025-03-09 19:19:25
557
原创 stm32 基于蓝桥物联网赛 oled屏使用
在.h文件中实现一些宏定义,首先定义oled和按键的刷新时间,这代表了oled和按键工作函数每几秒工作一次。接着是按键的宏定义。无需严格写成这样子,只要三个数据不同即可。#define Oled_Min_Time 200 //定义oled和按键的最小刷新时间#define Asw_None 0x00 //定义按键,为后续的逻辑运算做准备#define Asw_1 0x01 //二进制为0001#define Asw_2 0x02 //二进制为0010 #define 后面不需要加;号。
2025-03-07 20:49:38
997
原创 stm32(hal库)学习笔记-时钟系统
时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单片机的脉搏。在我常用的stm32F1系列中,分别有HSE(高速外部),LSE(低速外部),HSI(高速内部),LSI(低速内部)。高速的两个一般用于滴答时钟,低速的两个一般用于RTC。其中还有两个比较少见的,分别是CSS(时钟安全系统)和FCLK(自由运行时钟)。CSS作用为若HSE启动失败,自动切换HSI,且其可以进NMI中断。FCLK用于采样中断和调试模块记时。休眠时仍然有效。
2025-03-01 19:43:59
776
原创 stack,queue,priority_queue学习知识点
在c++常用的容器中,有的是以容器迭代器为核心,而有的则以容器适配器为核心。较为常用的就包括queue和stack。接下来我将简单的以queue和stack的模拟实现介绍其特点。在以下的模拟实现中,class Con就是我们的容器适配器,他用于传一个容器,默认为deque类模版,deque模版是一种奇妙的模版,他在头部插入和删除时,效率很高,扩容效率也高,但是其不适合遍历。当我们想要实现某个类,而刚好这个类可以用其他类的功能来直接实现,那么我们就可以将这个类用另一个类包装起来。
2025-02-24 23:32:03
408
原创 List模拟实现
list,链表容器是一种能够高效进行数据存储的容器,与前面已经提到的一些容器相似,list也是用迭代器进行遍历和控制数据。但是list的迭代器实现起来较为复杂,因为其不是原生指针的typedef,如果我们要模拟实现一个list类型,需要自己重新定义一个类来实现。STL原文件实现的是双向带头节点的链表,此次我们实现的也相似。
2025-02-19 16:46:42
503
原创 vector的综合学习与OJ
首先我们需要知道,vector需要存储不同类型的数据,可以是存一堆整形也可以是存一串串的字符串,甚至可以存vector,因此,我们需要用模版来实现vector。并且,由于模版类声明和定义不可分离,因此我们大部分代码都要写在.h文件中在STL原装库中,vector是通过3个迭代器来进行定义的,分别是_start,_finish与_endof_Storage,名字可能略有不同,但是具体功能都在下文表示出来了。public:////////private:// 指向数据块的开始。
2025-02-16 10:53:35
874
原创 string类的模拟实现
string类是我们平时经常使用的一种类,他是c++中的字符串。通过自己手动写代码实现string类可以有效促进我们对string类的理解。
2025-02-09 20:12:59
389
原创 2025.2.1(迭代器,auto,for遍历)
迭代器是cpp中STL的重要组成部分,主要负责数据的遍历以及删改,//迭代器,形如指针,一些地方就是指针,begin返回这块空间开始的迭代器,end是最后一个数据的下一个位置的迭代器,很有可能是'\0',it需要解引用所以真的很像指针。
2025-02-01 11:34:19
264
原创 模块初阶学习
函数模版代表了一个函数家族,与特定具体类型无关,函数模版里面T1等参数由使用时决定类型,根据输入的实参推断出,此时T1......Tn应该是什么类型。
2025-01-25 21:40:08
360
原创 类和对象的学习(下)
在类和对象中,我们介绍过一种成员变量初始化的方法,那就是函数体内初始化。这种初始化依赖于函数体的缺省值和实参,并且无法初始化部分数据,如被const修饰的数据。构造函数体内也无法初始化引用成员变量。因此,我们在此介绍另一种成员变量初始化的方式:初始化列表。初始化列表的格式为在构造函数后面以‘:’开始,‘,’分隔,并且在成员变量后面的括号里放初始值或者表达式。这样,就完成了初始化列表。需要注意的是,初始化列表中的每个成员变量只需要初始化一次,多次初始化会到导致报错!
2025-01-22 21:53:23
982
原创 类和对象学习(中)
在C++的类中,有6个默认的成员函数,当我们不写的情况下编译器会默认生成。这六个里面最重要的是前4个,最后两个相对而言重要性较低。因此,我们重点介绍前四个函数。
2025-01-20 01:08:42
867
原创 类和对象(上)
在cpp中,class是定义类的关键字,例如以下代码,class是关键字,Date是类的名字,{}中是类的主体。该主体中可以放成员函数和成员变量。注意,{}后面的分号‘;’是不可以省略的。在cpp中,class与struct基本等价,但是一般我们还是用class来定义类。根据不同公司,不同学校的习惯,我们一般会把成员变量加一个特殊标识,在我的习惯中,便是在成员变量前加上一个_a以表示这是一个成员变量。cpp的成员函数默认是inline的,因此当成员函数的代码较少的时候,会展开为代码行。
2025-01-15 22:26:07
855
原创 C++基础入门
在学完了C语言和基础数据结构以后,我们可以开始逐渐开始学C++了。C++作为目前市场上最为热门的几款语言之一,也被人们称为最难的语言。C++有着强大的功能与复杂的语法,需要我们尽全力去好好学习他,掌握他,以提高自己的综合能力。因此,从今天开始,我将慢慢在优快云上更新我的学习笔记,若有错误之处,烦请您指出来,无尽感激。C++是大量包含了C语言语法的,因此,你直接在C++的编译器里面写C语言理论上也是没问题的。但是既然C++是plusplus,当然有他的改进与独到之处。
2025-01-13 23:44:17
649
原创 基于esp32-idf的FreeRTOS系统学习
1.运行当任务实际执行时, 它被称为处于运行状态。任务当前正在使用处理器。如果运行RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
2024-11-08 15:16:06
1101
原创 常见排序算法总结
排序,既将一串数据,无论其原先是有序还是无序状态,都将其变成有序的一个过程。在C语言中,排序有很多种方法,本次主要介绍其中几种,他们的空间复杂度和时间复杂度都可能有所不同。接下来我将以此讲解。
2024-10-08 12:22:26
767
1
原创 二叉树堆的建立与排序
在数据结构中,二叉树是非常好用的一种数据结构,这节暂时按下不表。这节课主要介绍堆的建立与使用。堆,是二叉树中一种很特殊的结构,首先,他必须是满二叉树,也就是除了最后一层以外,其他层都是满的。堆对于节点数据也有要求,其基本按照某种规律进行排序。首先堆分为大堆和小堆。大堆上大小大小堆上小下大。有非常大的差距。并且在堆中每个节点也满足完全二叉树的父子节点规律,既child=parent*2+1 | 2,1和2取决于是子左节点还是右节点。
2024-09-22 21:13:27
873
原创 回环相关知识
回环是链表中一个比较有意思的类型,指的是一条链表尾部的节点连接了链表中某一个节点,导致这个链表会无限遍历,具体表现为如下图所示那么,在回环链表中我们要探索什么呢?第一,我们要探索一个链表是否有无回环;第二,我们要找到链表的回环入口。
2024-09-11 11:32:23
241
原创 贪吃蛇游戏设计学习
在过去几个月,我陆续学习了简单的数据结构,为了能更好的知识学以致用,在此我们设计一款基于开发台的贪吃蛇小游戏,其基于Win32 API设计。贪吃蛇游戏的总体设计思路为,接着我们就先从初始化游戏开始讲。
2024-08-01 20:27:10
600
原创 单链表的学习与基础运用p
先创建一个节点newnote,接着判断链条是否为空链条,若是空链条,则将*pphead直接赋一个newnote,若不是,则开始判断pos的数值,若pos为0的话,那么就执行前插函数,若pos不为0,则在进行下一步。头删也是比较简单的,在头删函数中,我们首先需要先判断到底有没有数据,利用assert函数完成,如果有,再判断有几个数据,如果只有一个,那便是将头地址给删除,如果多于一个,那就将原先的头地址赋给一个值做备份,接着将头地址改变为下一个节点地址,再释放掉之前的头地址,即可完成头删。
2024-07-07 16:01:54
475
原创 顺序表的学习与通讯录的模拟实现
当我们把这些代码写完以后,我们需要把他们串在一起,并在main函数中使用。首先是各个c文件的头文件,两个头文件对自己的函数进行声明,并包含了所需要的库函数。并且为了后续数据以及类型的方便转换,我们还使用了#define对数据进行了定义。因为struct seqlist 与struct man在c文件的重命名无法直接在头文件里面使用,因此我们需要在头文件中重新进行一次命名。int size;}SL;//4int age;}x;
2024-05-08 18:04:24
540
原创 预处理详解
c语言设置了许多的预定义符号,是可以直接使用的,预定义符号也是在预处理阶段进行直接处理的,下列就是一些比较常见的预定义符号。FILE表示该文件保存到哪里,LINE表示当前行数,DATE表示编译时的日期,TIME表示编译时的时间int main()return 0;而在运行以后,也确实打印出了对应的内容。#define的机制包含一个规定,它是允许把参数替换到文本中的,这种实现方法被称为宏,或者叫做定义宏,下面是我举的一个小例子。
2024-05-01 11:33:44
339
1
原创 编译与链接
假设我创立了两个文件分别叫data.c.和main.c,然后main.c中需要用到data中的函数add,在前面的步骤由于都是独立进行的,所以无法使用到这个函数,编译器会暂时把这个搁置,在链接阶段链接器会根据名字进行索引,找到相应的函数的地址,然后将原先搁置的地方变成这个地址,对于这个过程就叫做重定义。我们在把代码以人类能够看懂的形式写好以后,它是不能直接使用的,它需要经过俩个环境,分别是翻译环境和运行环境:翻译环境会将源代码转换成可执行的机器指令,也就是二进制指令。接下里具体介绍编译阶段中的分阶段。
2024-04-27 18:14:09
336
原创 文件操作与使用
在前文提到过,如果文件读取结束,会根据原因留下不同的标识符,feof的功能是判断是否为文件末尾标识符,ferror的功能是判断是否为出错标识符,如果是对应的操作符,那么就会返回一个非0整数,如果不是,那么就会返回一个0.fputc的功能是将一个字符写入当前文件指向的位置,并使得文件指针向后移动一个单位,若写入成功,那么就返回这个字符,若写入失败,则返回EOF并在当前文件指针处设置一个错误标识符。ftell该函数的功能也不算复杂,它的功能就是计算当前文件指针距离文件最开始的地方的偏移量并返回这是值。
2024-04-27 15:29:52
743
原创 动态内存管理
如果原有空间后面已经没有足够大的空间了,那么realloc函数就会另外找一份内存空间,大小满足开辟以后的大小,然后将原空间中所有的数据放到新空间中,然后此时函数返回的地址就是新空间的地址。该函数会向内存申请一块连续可用的空间,并且会返回该空间的指针,因为尚不确定该空间到底会存入什么类型的数据,所所以返回的是void*类型的指针,一般我们会根据要求将他强制类型转换为int*等等。但是我们对于内存的使用是非常灵活的,我们有时候不需要死板的固定内存,我们需要的是灵活的方法。第二个是free函数,其声明如下。
2024-04-26 18:16:28
350
原创 Ds18B20理解与运用
首先,我们先来判断该数据的正负,我们先将该数据与上0xf800,判断符号位是否为0,若符号位都为0,表示温度为正数,则if通过,进入下面的语句,先将Temp右移4位,舍弃4位小数位,保留整数位,接着将Temp放大十倍,有人会疑惑为什么放大十倍,若我们的数据假设是23.3,这是一个浮点数,不好处理,我们将数据放大10倍以后就是一个整数了,处理起来比较容易。后面再让LSB与上0x0f,取出LSB的低4位,再乘以0.0625(分辨率)再乘以10,最终加上已经是整数的Temp,就得到了一个要求的小数。
2024-04-04 17:37:55
517
原创 结构体具体知识
通过查询指针的地址,我们可以直接找到另一个结构体,这是一个非常节省空间的方法,very good.并且,对于想要结构体传参,直接传过去一个结构体也是不合理的,太大了。如图所示,我这串代码就是建立了一个student 类型的结构体,并往里面放了3个数据,分别是类型为char的name,int类型的age,int类型的height,并在最后建立了一个student类型的变量a。4.如果结构体中有结构体,那么二次结构体的成员对齐到结构体成员中最大对齐数的整数倍数,二次结构体的大小就是最大对齐数的整数倍。
2024-04-02 16:17:13
423
原创 数据在内存中的存储
那么,关于数据的符号类型,我们分为了有符号数据与无符号数据。在内存中,-1原码是1000 0001,补码是1111 1110,补码是1111 1111,因为b是无符号字符,那么他在看到1111 1111时,他会认为这是一个所有位数都是数据的数字,那么就得到了255.第二个是一个有符号字符a被赋给了-128的数据,但是由于这是一个char类型数据,所以在打印的时候会发生整形提升,因为这个数字是负数,所以发生整形提升的时候填充的是1,然后填充了原本属于-128的数据,在计算以后,答案就是4294967168。
2024-04-01 21:46:32
300
原创 字符,字符串函数,与内存库函数的使用以及模拟
该函数进行的是两个字符串的大小比较,他会同时从两个字符串的初始位置开始,一个一个的往后进行比较,字符串的比较依托的是ascii值,如果字符串1查询到的ascii值大于字符串2,则返回1,若小于,则返回-1,如果直到最后的\0两者都相等,则返回0.以下是模拟实现。他的本意是若找到另一个字符串,则返回在第一个字符串中字符串2第一次出现的地址。该函数是用于在字符串中找到第一个分割符并进行分割,并用\0结尾,返回该地方的指针,一般来说strtok函数作用于临时拷贝的字符串,因为strtok会改变被操作的字符串。
2024-03-27 20:12:01
777
原创 sizeof与strlen具体区别
这张图是字符串数组,其中大部分答案与上面字符数组类似,但是他的内部是自带\0的,所有当它是以首元素为初始地址往后计算字符串长度时,是有具体结果的,比如这个字符串,他的结果就是6.第三行打印的是(*arr)的大小,这里的arr是首元素地址,所以它是计算arr[0]的大小,arr[0]就是1,1是int类型的数据,答案就是4.首先,sizeof是操作符,是不需要额外添加头文件的。第八行打印的是(&arr+1)的值,相当于arr的地址整个加一,跳过40字节,但是打印出来的依旧是一个地址,答案是4/8.
2024-03-09 15:53:47
1594
1
原创 结构体的学习,qsort库函数的使用,模拟实现qsort库函数
qsort需要我们自己写出比较方式,他的比较原理是当比较函数返回一个正数,表示p1大于p2,当返回0,表示p1=p2,当返回负数,表示p1<p2.所以在比较函数int_cmp中,我们需要先将void*类型进行数据强制转换为int*,接着直接返回两个数字相减的结果。它具有四个形参,第一个是想要排序的数据组的第一个数据的指针,第二个是这个数据组包含了多少数据,第三个是这个数据组中每个数据的长度,最后一个是要输入该数据的比较方式。接着,我们综合实训一下,将结构体,整形,字符串相结合,做到对结构体的比较。
2024-03-06 12:25:34
816
1
原创 2024/2/19知识点
一个整数数组,我们要对他进行排序,使偶数在前,奇数在后,那么我们可以从最左边的数字一路比较过来,如果是偶数,那就往后走一位,如果是奇数,就跳出循环,从右到左同理,当然,前提是左边永远在左边,右边永远是右边,保证左边不会加着加着超出数组范围,右边同理。如果,*left代表的已经是奇数,*right代表的是偶数,那么就直接对换。在这种题目中一一查询显然不合理,所以我们可以通过快速缩短区间,先找到右上角的数值与指定数值进行比较,要是小于指定数值就慢慢往下挪,如果大于指定数值了就往左挪,直到最终找到或没找到。
2024-02-20 11:33:18
293
1
原创 51单片机综合实训案例
接着,当传输过来的信号高四位是a时,我们先保留灯原来高四位的状态,由于我们的命令是1开灯0关灯,和电路板刚好相反,所以我们先对命令进行取反,接着利用逻辑门保存低四位,最后综合运算以后,我们就可以做到不影响高四位的情况下,对低四位进行改变,然后来控制灯。这一步比较简单,主要是将后面需要用到的一些变量先定义好,要注意的是,我们在写寄存器选择时,注意要多写一个不选择任何锁存器的选项,在后续代码中,通过这个选择,可以帮我们避开一些错误。最后的最后的全部代码,这一次,我终于大概的了解了逻辑门在51中的应用啦!
2024-01-19 16:45:54
2265
1
原创 串口通讯进阶应用(还是很初级其实)
由于51单片机是低电平也就是0启动,所以我们输入的数据和我们实际要展现的小灯是相反的,所以,我们可以先对数据进行取反,然后我们在利用或与门的知识,就可以直接让小灯按要求亮,这里需要一定的计算量,但是核心永远是下面的那俩句。在这次的题目中,我们需要发送字符串,在这里老师使用到了指针而我还没学到,所以就大概了解一下就好,等我学到,我再回来补上。我们先看这道题目,这道题目由三个部分组成,需要发送三类信息,用到的知识点也是之前就学到的,但这次,我们将更加综合的利用他们。0与任何数与都是0,f与任何数与都是任何数,
2024-01-15 23:33:53
491
1
原创 51单片机中串口通讯基础
关于这个寄存器,我们后面还需要将它等于0x00,下图是他的格式和含义,但最重要的是最后一位也就是B0,当B0不等于0的时候,我们的串口通讯将无法使用,为了方便,我们直接把他等于0x00,也不用考虑太多了。接着我们来写中断服务函数,首先,我们先定义一个dat变量来保存收到的数据,我们用到的是串口中断,对应的数字是4,然后我们检测RI是否等于1(是否已经接收到数据),接收到数据以后我们先将RI等于0,让我们可以进行下一次的接收,然后我们用dat来接收收到的数据,根据题目要求,我们再发送这个数据加1回去。
2024-01-14 12:22:58
620
1
原创 关于51单片机中PWM脉宽调制
首先我们先看下面的两张图,第一张图中占空比指的是高电平在整个周期中所占的比例,占空比也大概相当于每一档所代表的的能力,也不一定是占空比越高就能力越强,要具体到单片机中引脚是高电平启动还是低电平启动。然后,我们因为需要调光的亮度,假设就是0,1,2,3档吧,在这种情况下,switch语句是最好的选择。在生活中,我们总是需要换“档”,风扇需要换档,灯也要调亮灭,许多事情都是有档次的。在了解了以上知识以后,我们就可以来敲代码了,老生常谈的代码我们就不解释了,我们直接来看看和中断与键盘有关的代码.
2024-01-11 23:24:29
653
1
原创 51单片机中定时计数器的基本使用
首先,其实我们最早要写的话,其实是需要写成16进制的形式的,但是我们通过这样子一写,电脑会自动帮我们计算出相应的16进制数字,可以大大减少计算的麻烦。首先,我们先来理解一下定时计数器的基本使用,首先,我们先来理解一下TH0与TL0的概念,TH0指的是高八位,而TL0指的是低八位,定时计数器总共能包含65536个数值,也就是65.6ms,定时器的工作原理便是从初始化TH0,TL0的位置一直加,当数值溢出就会做出触发定时计数器。接下来就是要打开TR0,ET0和EA,这并不麻烦,看原理图即课知。
2024-01-09 14:52:02
2095
原创 51单片机中中断的学习
借助B站小蜜蜂老师的话,轮询就相于你有一个快递快到了,快递会送到快递柜,但是你没有手机没有电话,你无法知道快递什么时候到,所以你每几分钟就得下去看一下快递是否到了,费时费力(内存),而如果是中断的话,你就相当于有了电话,可以接到快递员的电话,于是你就可以准时去拿快递了。在51中,有4个中断源,从上到下分别是0,1,2,3。每两个类似名字中断源间有优先级,0>1。而中断代码由两部分组成,分别是初始化中断与中断服务函数,初始化中断就是在里面写上那些引脚等于0或者1.而服务函数里面写的是中断以后执行的指令。
2024-01-07 17:30:58
630
1
原创 扫雷游戏的基本实现
首先,为了实现功能,我们先定义雷的数量为10,初始化两个二维数组,一个数组arr1用来存放雷,一个arr2数组用来显示,而这个棋盘的大小,我们可以用Hang来表示行,用Lie来表示列,Hang和Lie我们会多次使用,且日后为了扩展扫雷游戏,所以我们把他放在头文件里面。y也是同样意思,这样我们就可以得到随机的x,y值了。这个游戏的规则是这样的,当我们进入这个游戏,我们输入一个坐标,电脑会判断这个坐标是否为雷,如果是雷,那么游戏结束,如果不是雷,那么游戏继续且显示出当前坐标附近八个坐标有几个雷。
2024-01-07 15:21:57
460
1
原创 矩阵键盘的使用
其实吧,接下来也就是非常无聊的重复写代码了,但是在写代码的过程中,我曾出现了一个致命的问题,调试了半天,还是不行,最后发现,我靠,引脚接错了!这是矩阵键盘最基础的操作了,首先还是最老生常谈的定义引脚和写出译码器的选择,这里就不通过代码体现了,要完成这个训练,我们还要弄一个0到F的字符显示数组。在51单片机中,矩阵键盘的使用量是非常频繁,于是掌握矩阵键盘的使用是非常重要的,接下来是我的学习心得。我们这次需要用到数码管,我们先把数码管显示函数写出来。接下来我们先让第一排键盘起效果,如代码所示。
2024-01-05 16:30:51
442
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人