自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 二叉树堆的建立与排序

在数据结构中,二叉树是非常好用的一种数据结构,这节暂时按下不表。这节课主要介绍堆的建立与使用。堆,是二叉树中一种很特殊的结构,首先,他必须是满二叉树,也就是除了最后一层以外,其他层都是满的。堆对于节点数据也有要求,其基本按照某种规律进行排序。首先堆分为大堆和小堆。大堆上大小大小堆上小下大。有非常大的差距。并且在堆中每个节点也满足完全二叉树的父子节点规律,既child=parent*2+1 | 2,1和2取决于是子左节点还是右节点。

2024-09-22 21:13:27 809

原创 栈与队列相关知识点

栈与队列是比较常用的两种数据结构,其中他们分别有特别的使用方法。今天,我们先来简单了解一下栈与队列的实现。

2024-09-16 21:13:03 726

原创 回环相关知识

回环是链表中一个比较有意思的类型,指的是一条链表尾部的节点连接了链表中某一个节点,导致这个链表会无限遍历,具体表现为如下图所示那么,在回环链表中我们要探索什么呢?第一,我们要探索一个链表是否有无回环;第二,我们要找到链表的回环入口。

2024-09-11 11:32:23 152

原创 贪吃蛇游戏设计学习

在过去几个月,我陆续学习了简单的数据结构,为了能更好的知识学以致用,在此我们设计一款基于开发台的贪吃蛇小游戏,其基于Win32 API设计。贪吃蛇游戏的总体设计思路为,接着我们就先从初始化游戏开始讲。

2024-08-01 20:27:10 498

原创 单链表的学习与基础运用p

先创建一个节点newnote,接着判断链条是否为空链条,若是空链条,则将*pphead直接赋一个newnote,若不是,则开始判断pos的数值,若pos为0的话,那么就执行前插函数,若pos不为0,则在进行下一步。头删也是比较简单的,在头删函数中,我们首先需要先判断到底有没有数据,利用assert函数完成,如果有,再判断有几个数据,如果只有一个,那便是将头地址给删除,如果多于一个,那就将原先的头地址赋给一个值做备份,接着将头地址改变为下一个节点地址,再释放掉之前的头地址,即可完成头删。

2024-07-07 16:01:54 454

原创 顺序表的学习与通讯录的模拟实现

当我们把这些代码写完以后,我们需要把他们串在一起,并在main函数中使用。首先是各个c文件的头文件,两个头文件对自己的函数进行声明,并包含了所需要的库函数。并且为了后续数据以及类型的方便转换,我们还使用了#define对数据进行了定义。因为struct seqlist 与struct man在c文件的重命名无法直接在头文件里面使用,因此我们需要在头文件中重新进行一次命名。int size;}SL;//4int age;}x;

2024-05-08 18:04:24 515

原创 预处理详解

c语言设置了许多的预定义符号,是可以直接使用的,预定义符号也是在预处理阶段进行直接处理的,下列就是一些比较常见的预定义符号。FILE表示该文件保存到哪里,LINE表示当前行数,DATE表示编译时的日期,TIME表示编译时的时间int main()return 0;而在运行以后,也确实打印出了对应的内容。#define的机制包含一个规定,它是允许把参数替换到文本中的,这种实现方法被称为宏,或者叫做定义宏,下面是我举的一个小例子。

2024-05-01 11:33:44 303 1

原创 编译与链接

假设我创立了两个文件分别叫data.c.和main.c,然后main.c中需要用到data中的函数add,在前面的步骤由于都是独立进行的,所以无法使用到这个函数,编译器会暂时把这个搁置,在链接阶段链接器会根据名字进行索引,找到相应的函数的地址,然后将原先搁置的地方变成这个地址,对于这个过程就叫做重定义。我们在把代码以人类能够看懂的形式写好以后,它是不能直接使用的,它需要经过俩个环境,分别是翻译环境和运行环境:翻译环境会将源代码转换成可执行的机器指令,也就是二进制指令。接下里具体介绍编译阶段中的分阶段。

2024-04-27 18:14:09 320

原创 文件操作与使用

在前文提到过,如果文件读取结束,会根据原因留下不同的标识符,feof的功能是判断是否为文件末尾标识符,ferror的功能是判断是否为出错标识符,如果是对应的操作符,那么就会返回一个非0整数,如果不是,那么就会返回一个0.fputc的功能是将一个字符写入当前文件指向的位置,并使得文件指针向后移动一个单位,若写入成功,那么就返回这个字符,若写入失败,则返回EOF并在当前文件指针处设置一个错误标识符。ftell该函数的功能也不算复杂,它的功能就是计算当前文件指针距离文件最开始的地方的偏移量并返回这是值。

2024-04-27 15:29:52 722

原创 动态内存管理

如果原有空间后面已经没有足够大的空间了,那么realloc函数就会另外找一份内存空间,大小满足开辟以后的大小,然后将原空间中所有的数据放到新空间中,然后此时函数返回的地址就是新空间的地址。该函数会向内存申请一块连续可用的空间,并且会返回该空间的指针,因为尚不确定该空间到底会存入什么类型的数据,所所以返回的是void*类型的指针,一般我们会根据要求将他强制类型转换为int*等等。但是我们对于内存的使用是非常灵活的,我们有时候不需要死板的固定内存,我们需要的是灵活的方法。第二个是free函数,其声明如下。

2024-04-26 18:16:28 339

原创 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 412

原创 结构体具体知识

通过查询指针的地址,我们可以直接找到另一个结构体,这是一个非常节省空间的方法,very good.并且,对于想要结构体传参,直接传过去一个结构体也是不合理的,太大了。如图所示,我这串代码就是建立了一个student 类型的结构体,并往里面放了3个数据,分别是类型为char的name,int类型的age,int类型的height,并在最后建立了一个student类型的变量a。4.如果结构体中有结构体,那么二次结构体的成员对齐到结构体成员中最大对齐数的整数倍数,二次结构体的大小就是最大对齐数的整数倍。

2024-04-02 16:17:13 402

原创 数据在内存中的存储

那么,关于数据的符号类型,我们分为了有符号数据与无符号数据。在内存中,-1原码是1000 0001,补码是1111 1110,补码是1111 1111,因为b是无符号字符,那么他在看到1111 1111时,他会认为这是一个所有位数都是数据的数字,那么就得到了255.第二个是一个有符号字符a被赋给了-128的数据,但是由于这是一个char类型数据,所以在打印的时候会发生整形提升,因为这个数字是负数,所以发生整形提升的时候填充的是1,然后填充了原本属于-128的数据,在计算以后,答案就是4294967168。

2024-04-01 21:46:32 279

原创 字符,字符串函数,与内存库函数的使用以及模拟

该函数进行的是两个字符串的大小比较,他会同时从两个字符串的初始位置开始,一个一个的往后进行比较,字符串的比较依托的是ascii值,如果字符串1查询到的ascii值大于字符串2,则返回1,若小于,则返回-1,如果直到最后的\0两者都相等,则返回0.以下是模拟实现。他的本意是若找到另一个字符串,则返回在第一个字符串中字符串2第一次出现的地址。该函数是用于在字符串中找到第一个分割符并进行分割,并用\0结尾,返回该地方的指针,一般来说strtok函数作用于临时拷贝的字符串,因为strtok会改变被操作的字符串。

2024-03-27 20:12:01 757

原创 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 1540 1

原创 结构体的学习,qsort库函数的使用,模拟实现qsort库函数

qsort需要我们自己写出比较方式,他的比较原理是当比较函数返回一个正数,表示p1大于p2,当返回0,表示p1=p2,当返回负数,表示p1<p2.所以在比较函数int_cmp中,我们需要先将void*类型进行数据强制转换为int*,接着直接返回两个数字相减的结果。它具有四个形参,第一个是想要排序的数据组的第一个数据的指针,第二个是这个数据组包含了多少数据,第三个是这个数据组中每个数据的长度,最后一个是要输入该数据的比较方式。接着,我们综合实训一下,将结构体,整形,字符串相结合,做到对结构体的比较。

2024-03-06 12:25:34 769 1

原创 2024/2/19知识点

一个整数数组,我们要对他进行排序,使偶数在前,奇数在后,那么我们可以从最左边的数字一路比较过来,如果是偶数,那就往后走一位,如果是奇数,就跳出循环,从右到左同理,当然,前提是左边永远在左边,右边永远是右边,保证左边不会加着加着超出数组范围,右边同理。如果,*left代表的已经是奇数,*right代表的是偶数,那么就直接对换。在这种题目中一一查询显然不合理,所以我们可以通过快速缩短区间,先找到右上角的数值与指定数值进行比较,要是小于指定数值就慢慢往下挪,如果大于指定数值了就往左挪,直到最终找到或没找到。

2024-02-20 11:33:18 266 1

原创 51单片机综合实训案例

接着,当传输过来的信号高四位是a时,我们先保留灯原来高四位的状态,由于我们的命令是1开灯0关灯,和电路板刚好相反,所以我们先对命令进行取反,接着利用逻辑门保存低四位,最后综合运算以后,我们就可以做到不影响高四位的情况下,对低四位进行改变,然后来控制灯。这一步比较简单,主要是将后面需要用到的一些变量先定义好,要注意的是,我们在写寄存器选择时,注意要多写一个不选择任何锁存器的选项,在后续代码中,通过这个选择,可以帮我们避开一些错误。最后的最后的全部代码,这一次,我终于大概的了解了逻辑门在51中的应用啦!

2024-01-19 16:45:54 1782 1

原创 串口通讯进阶应用(还是很初级其实)

由于51单片机是低电平也就是0启动,所以我们输入的数据和我们实际要展现的小灯是相反的,所以,我们可以先对数据进行取反,然后我们在利用或与门的知识,就可以直接让小灯按要求亮,这里需要一定的计算量,但是核心永远是下面的那俩句。在这次的题目中,我们需要发送字符串,在这里老师使用到了指针而我还没学到,所以就大概了解一下就好,等我学到,我再回来补上。我们先看这道题目,这道题目由三个部分组成,需要发送三类信息,用到的知识点也是之前就学到的,但这次,我们将更加综合的利用他们。0与任何数与都是0,f与任何数与都是任何数,

2024-01-15 23:33:53 433 1

原创 51单片机中串口通讯基础

关于这个寄存器,我们后面还需要将它等于0x00,下图是他的格式和含义,但最重要的是最后一位也就是B0,当B0不等于0的时候,我们的串口通讯将无法使用,为了方便,我们直接把他等于0x00,也不用考虑太多了。接着我们来写中断服务函数,首先,我们先定义一个dat变量来保存收到的数据,我们用到的是串口中断,对应的数字是4,然后我们检测RI是否等于1(是否已经接收到数据),接收到数据以后我们先将RI等于0,让我们可以进行下一次的接收,然后我们用dat来接收收到的数据,根据题目要求,我们再发送这个数据加1回去。

2024-01-14 12:22:58 593 1

原创 关于51单片机中PWM脉宽调制

首先我们先看下面的两张图,第一张图中占空比指的是高电平在整个周期中所占的比例,占空比也大概相当于每一档所代表的的能力,也不一定是占空比越高就能力越强,要具体到单片机中引脚是高电平启动还是低电平启动。然后,我们因为需要调光的亮度,假设就是0,1,2,3档吧,在这种情况下,switch语句是最好的选择。在生活中,我们总是需要换“档”,风扇需要换档,灯也要调亮灭,许多事情都是有档次的。在了解了以上知识以后,我们就可以来敲代码了,老生常谈的代码我们就不解释了,我们直接来看看和中断与键盘有关的代码.

2024-01-11 23:24:29 596 1

原创 51单片机中定时计数器的基本使用

首先,其实我们最早要写的话,其实是需要写成16进制的形式的,但是我们通过这样子一写,电脑会自动帮我们计算出相应的16进制数字,可以大大减少计算的麻烦。首先,我们先来理解一下定时计数器的基本使用,首先,我们先来理解一下TH0与TL0的概念,TH0指的是高八位,而TL0指的是低八位,定时计数器总共能包含65536个数值,也就是65.6ms,定时器的工作原理便是从初始化TH0,TL0的位置一直加,当数值溢出就会做出触发定时计数器。接下来就是要打开TR0,ET0和EA,这并不麻烦,看原理图即课知。

2024-01-09 14:52:02 1363

原创 51单片机中中断的学习

借助B站小蜜蜂老师的话,轮询就相于你有一个快递快到了,快递会送到快递柜,但是你没有手机没有电话,你无法知道快递什么时候到,所以你每几分钟就得下去看一下快递是否到了,费时费力(内存),而如果是中断的话,你就相当于有了电话,可以接到快递员的电话,于是你就可以准时去拿快递了。在51中,有4个中断源,从上到下分别是0,1,2,3。每两个类似名字中断源间有优先级,0>1。而中断代码由两部分组成,分别是初始化中断与中断服务函数,初始化中断就是在里面写上那些引脚等于0或者1.而服务函数里面写的是中断以后执行的指令。

2024-01-07 17:30:58 604 1

原创 扫雷游戏的基本实现

首先,为了实现功能,我们先定义雷的数量为10,初始化两个二维数组,一个数组arr1用来存放雷,一个arr2数组用来显示,而这个棋盘的大小,我们可以用Hang来表示行,用Lie来表示列,Hang和Lie我们会多次使用,且日后为了扩展扫雷游戏,所以我们把他放在头文件里面。y也是同样意思,这样我们就可以得到随机的x,y值了。这个游戏的规则是这样的,当我们进入这个游戏,我们输入一个坐标,电脑会判断这个坐标是否为雷,如果是雷,那么游戏结束,如果不是雷,那么游戏继续且显示出当前坐标附近八个坐标有几个雷。

2024-01-07 15:21:57 446 1

原创 矩阵键盘的使用

其实吧,接下来也就是非常无聊的重复写代码了,但是在写代码的过程中,我曾出现了一个致命的问题,调试了半天,还是不行,最后发现,我靠,引脚接错了!这是矩阵键盘最基础的操作了,首先还是最老生常谈的定义引脚和写出译码器的选择,这里就不通过代码体现了,要完成这个训练,我们还要弄一个0到F的字符显示数组。在51单片机中,矩阵键盘的使用量是非常频繁,于是掌握矩阵键盘的使用是非常重要的,接下来是我的学习心得。我们这次需要用到数码管,我们先把数码管显示函数写出来。接下来我们先让第一排键盘起效果,如代码所示。

2024-01-05 16:30:51 340 1

原创 51单片机中独立按键的使用

首先,我们要判定按键是否按下,于是我们便写一个if函数来侦察,如果按下,我们便进行一次延时消除抖动,然后再判断一次是否按下(实名怀疑这布的意义),于是,我们便可以让LED灯亮起来了,但是我们这是一个if判断语句,不具备循环效果,于是,我们可以加入一段while代码,来让灯在按下的时候一直亮着,如果松开,则熄灭。在51单片机中,独立按键是指S1,S2,S3,S4这四个按键,按键对于单片机的操作非常重要,学会独立按键的使用也可以更好的学会矩阵按键,更加熟练的掌握单片机。,会导致板子感应到多次被按下,影响操作。

2024-01-03 20:44:58 712 1

原创 共阳数码管动态显示

数码管的不同数码管显示不同数字基本上有两种方法,一种是调用IO口去直接连接数码管,但是这样子会大量占用IO口,使得单片机的其他功能无法实现,所以我们可以利用单片机的时间可控性与物理上的一些关于光的性质来实现相关功能。如上图所示,我们可以利用余晖效应来达成这个目的,相关理论知识请自行查询,总之,我们可以通过每一个数码管都显示的时间极短与快速的扫描来让数码管实现一个数码管显示一个特定的数字或字母或符号。接下来有了新的问题,一个数码管显示一个数字我们是做到了,可是,我们如何让各个数字动起来显示出不同的状态呢?

2023-12-22 20:06:04 208

原创 静态共阳管

为了实现以上功能,我们先创一个数组,将十六进制中的所有数字(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f)都包含进去,且包括"."号和"-"号.数码管是一个很好的工具,他可以直接在单片机板子显示数字,而我们经常使用的是动态显示的数码管,在学习动态数码管之前,我们应该先学习静态共阳管.是为了告诉单片机,这个数据是要放在ROM里面的,当运行的时候他是固定不变的,这点是为了减小RAM的压力.再结合前面所提到的一些相关知识与C语言基本知识,我们基本上可以写出这个代码了。

2023-12-21 23:18:04 26

原创 单片机中蜂鸣器与继电器的使用

的文章,于是我们可以用一个Switch文件将他封装起来,这样子,就可以比较快速的使用.然后,当我们观察原理图时可以发现,当(N_RELAY)或者(N_BUZZ)处于低电压时,继电器或者蜂鸣器分别会做出反应.的构成是达林顿管,可以简单直接理解为一个一个的飞门,1过变0,0过变1.与门表示0与1在输入时,只有输入1与1时,才能取到1,否则皆为0。与门表示0与1在输入时,只有输入0与0时,才能取到0,否则皆为1。而非门则是将输入的反过来,1变为0,0变为1。在结合我们之前写的代码(是的,我偷。

2023-12-21 21:07:32 204

原创 C语言中随机数的生成

里面,应该放一个随机数或者是在时刻改变的数呢。但是我们现在就是想要得到一个随机数,那就套娃了。),time会返回1970年1月1日0时0点0分0秒到现在的时间,返回类型为time_t型。就是时间,时间是在不断流逝的,而C语言也可以计算时间,在C语言中,有一个函数叫。但是问题又来了,如果我们要初始化一个值,那我们就需要进入编码器重新在。里面填词,这显然不是我们想要做的,我们想要的是让他自动初始化。)来生成随机数,但是当我们使用他们时,我们会发现一些尴尬的事情。于是,我们便可以做一下好玩的了。

2023-12-19 21:18:48 143 1

原创 单片机重新点灯

/1111 1111 +++ 0111 1111左移丢失一位并且补0。//通过ABC的开启或否来决定。P0 = 0x00;P0 = 0xff;点灯大师重新踏上旅途。

2023-12-19 20:50:25 26 1

原创 2023年12月17号小小知识点

sizeof是操作符,用于计算类型所占空间大小,单位为字节。而strlen是计算字符串长度,需要库函数<str.h>。字符串中会自动包含一个/0,计算长度时,sizeof会包含/0,stelen不会。

2023-12-19 20:46:40 25

原创 Delay函数在单片机中的使用(待更新)学习日志

首先先在软件里弄出一个1ms的delay函数,然后括号里面给他赋值,(unsigned int xms),再写一个while循环函数,先让他兜1ms,然后写一个xms=xms-1(xms--),这样子的话,以后调用这个函数的时候,就会侦察Delay()里的数字。然后就先1ms的延迟,然后判断xms-1的值,如果不是等于0,那就再次循环,直到x减到了0,跳出循环。但是,这样还是有误差。当函数这样子写的时候,只是大概延时,不精确,Delay(60000)时间比较长,是为了让我能比较清楚的看到灯现象。

2023-11-11 13:49:24 933 1

原创 关于P2 = (P2 & 0x1f) | 0x80;我的学习感悟

我们需要的是P2引脚群前三位分别是1 0 0,所以,我们就先让P2(1111,1111)2&(或)上0x1f(0001 1111),这样以后P2就是(0001,1111),然后再让P2 | (与)上0x80(1000 0000),于是现在P2就变成了(1001 1111)。接着,我们来分析P2 = (P2 & 0x1f) | 0x80;单片机中P2是一个引脚,包括了P2^(0~7)的引脚。观察原理图和HC138译码器的原理图我们可知,当引脚处于不同状态时,会使outputs亦处于不同状态。

2023-11-03 15:25:43 686

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除