自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 资源 (3)
  • 收藏
  • 关注

原创 从C出发 34--- 自定义数据类型(下)

因为 a 和 f 的类型不同,一个是整型一个是浮点型,而整型数据和浮点数据在内存中的表示方式是不一样的,所以同一段内存,同是 4 个字节,按照整型的方式去解释这4个字节中的数据时,得到的是一个结果,按照浮点型的方式去解释这4个字节中的数据时,得到的是另外一个结果。st 里面的成员地址不同,并且a 和 f 相差了4 个字节,意味着在 st 里面的 a 和 f 对应的内存是不同的。枚举类型中,定义的这些常量,其本质是整型值,而使用枚举类型所定义的变量,其本质是整型变量。定义真正意义的常量,这样写。

2023-05-19 18:07:28 138

原创 从C出发 33 --- 自定义数据类型(中)

这里的 t 是变量,既然是变量,它的本质是一段内存,而 t 又是变量的集合,所以说这段内存被分为了 2 部分,一部分是a 成员变量所占用的内存,一部分是b 成员变量所占用的内存,因此 a 和 b 占用独立的内存。struct 结构体类型当中的成员,是占用独立的内存,因为struct 结构体变量其实就是一个包,在这个包里面有各种各样的成员变量,而这些各种各样的成员变量是分别占用内存的,他们是独立的。,既然是数据类型,就是用来创建变量,而创建的这个变量其实是 变量的集合,是结构体里面成员变量的集合。

2023-05-15 00:33:56 422

原创 从C出发 32 --- 自定义数据类型(上)

typedef 表面上这个类型的意思是 type define ,类型定义,但是它并没有做类型定义的工作,它做的工作是起新名字,给已有的类型起一个新的名字。struct 就会创建新类型了,是 C 语言里面自定义类型的关键字,它自定义出来的类型是有序的,不同数据类型变量的集合类型。typedef 这个关键字是用来创建新名字的,并不会创建新的类型,只会创建已有类型的新名字。由 3 个部分组成的,一个数组,一个int 类型的变量,一个short 类型的变量,

2023-05-12 23:01:22 550

原创 从C出发 31 --- 指针专题经典问题剖析

这个二级指针的本质还是变量,只有是指针本质就是变量。,是另一个指针类型,是不同的指针类型,于是,这个 ppv 就是一个指针,这个指针用来指向 这个类型的变量 ----这种指针用来保存其他指针的地址,换句话说,也就是指向指针的指针。是另一个指针,所以有了这样的初始化写法 ---- Type** ppv = &pv;ppv 这个二级指针还是变量,肯定有地址,怎么获得它的地址 ------- &ppv。---- 表示一个指针类型 , 指针类型后面再加一个。ppv 它的类型是 : Type**

2023-05-12 12:00:20 376 3

原创 ADC滤波处理的十种方法

【代码】ADC滤波处理的十种方法。

2023-05-06 14:03:27 858

原创 从C出发 30 --- 指针与堆空间

char 代表的长度信息是 1 字节,int 4 字节, float 4 字节, double 8字节,所以这些基础的数据类型所扩展出来的指针,都能够访问数据出来,而void 不具备长度信息,没有办法使用void 扩展出来的指针去访问内存中的数据。这里定义了一个指针 p , 这个指针 p 想要指向 int 类型的变量,具体指向哪个int 类型变量,p 是指向了堆空间里面的 4 个字节,换句话说,p 指向了int 类型的变量存在于 堆空间中,, 可以使用void 类型,来扩展成这样的指针类型。

2023-05-03 13:27:24 44

原创 从C出发 29 --- 指针与函数

函数和数组的本质都是连续的内存,只不过内存中的东西\]不一样而已,对于数组来说这一片连续的内存中存放的是一个一个的数据,对于函数来说,这一片连续的内存中存放的是一行一行的代码,本质是一样的。只有知道具体位置,才有可能跳到那个位置去执行,如果不知道在哪里,怎么跳?因此,我们可以推论出,真正调用函数时,跳转到这一片内存的起始位置处执行。很显然,这一片连续的内存当中,保存的就是我们所编写的一行一行的代码。数组有自己独特的类型,函数也有自己独特的类型。函数就是一片连续的内存。数组就是一片连续的内存。

2023-04-27 13:30:59 349

原创 从C出发 28 --- 指针与数组

怎么访问,一个while 循环来访问的 %c (每次打印的是一个字符), *s 先访问了 s 所指向的数据,这个时候 s 所指向的数据就是字符,然后进行移动,移动后指向下一个字符,所以这样不停的取值,不停的取值,不停的指向下一个字符,肯定 s 最终指向一个 '\0' 值,这个'\ 0' 值就是 D.T.Software这个字符串常量的结束符。为什么打印 1,因为死循环了,当前p的值指向了数组当中的第 0 号元素,而第 0 号元素的值就为 1,所以这里反复不停的循环,反复不停的打印 1 出来,

2023-04-23 19:50:30 307

原创 从C出发 27 --- 深入理解指针与地址

指针是变量,这种变量有一点特殊,它特殊在保存的值是内存地址,并且我们还可以通过指针所保存的内存地址来直接访问相应内存中的数据。每一种指针类型的变量只保存对应类型变量的地址 比如这个类型的指针变量,只保存对应的 int 类型的普通变量的地址。有效指的就是 合法的,可用的。

2023-04-22 00:31:47 359

原创 从C出发 26 --- 指针 : 一种特殊的变量

这个打印出来的是一个16 进制数,这个16 进制数占用几个字节啊,占用4 个字节,换句话说,获取的地址是一个 4 字节的无符号整数。结论 : 在程序中除了可以通过变量名来具体的访问一个变量,使用一个变量之外,我们可以通过内存地址来访问一个变量,使用一个变量。这个整型变量占用了 4 个字节 ,这个整型变量的名字叫 var ,换句话说 var 就代表了这4个字节。内存地址指的就是存储单元的编号,每一个字节有一个编号,这个编号就是内存地址。在计算机内部逻辑上是一个一个存储单元,每个存储单元是一个字节。

2023-04-20 13:05:38 383

原创 从C出发 25 --- 宏定义

原因在于实参与形参没有任何关系,在这个地方确实是以 x 与 y 作为实参来调用swap了,而真实发生的事情是 ,x作为初始值用于初始化a ,也就是说,这次调用a被初始化为1了,然后y作为初始值用于初始化b,也就是说这次调用b的值为2了,之后x 与 y 的调用就与这次调用没有任何关系了,在这个函数的内部,a和b 发生了交换,交换完之后这个函数就返回了,既然函数返回,也就意味着a和b 就被销毁了,所以接着向下执行,从swap返回,所以接着向下执行x 与 y 还是 1 与 2。函数中改变的是形参的值。

2023-04-20 01:02:58 49

原创 从C出发 24 --- 递归函数介绍

总结: 递归的主要表现形式就是分解,将大问题分解成小问题,解决了小问题,那大问题就解决了,并且分解出来的小问题和大问题是同一个类型的问题,所以只有小问题解决大问题就解决,分解一定要有停止的时候,这个停止的关键点叫做边界条件,如果说分解无法停止,那么递归就无解。我们编写递归函数的时候以及阅读递归函数的时候,不要陷入函数的执行细节,不要用大脑执行递归函数的代码,这样是错误的。递归函数的编写是需要递归模型支撑的,递归函数的本质就是描述递归模型。正确的方式是:思考递归所对应的模型是什么。

2023-04-19 01:39:01 48

原创 从C出发 23 --- 函数专题练习

C: 从操作系统的角度来看 C 并不一定正确,因为从技术角度我们可以有方法,让一个 C 语言程序不从main 函数开始执行。A:我们可以将 main 理解为操作系统调用的函数,操作系统运行一个应用程序时,就去调用这个应用程序里面的main函数。D :通常会在 main 函数之前定义一些会被main 函数所调用的函数。如果没写返回语句,这个函数也会返回一个值,只不过返回的值是一个随机值。B: 函数中只能定义变量,定义的变量叫局部变量。不写返回类型,它的返回类型是什么?没有返回语句,他会返回什么呐?

2023-04-17 13:23:31 305

原创 从C出发 22 --- 变量的作用域与生命期

生命期是从时间的角度上来访问一个变量是否可以访问,对于函数中的局部变量,当调用了这个函数他们才是可访问才是合法的 ,函数执行返回后这些局部变量就被销毁,不可再访问了。什么都不会输出,因为这里的 i++;是让局部变量的 i ++,程序会一直死循环。因为他们都是存放在栈空间当中的,从内存的角度来看,他们是同一块内存区域里面的变量。这里的空间指的就是代码段,在哪个代码段可以访问,在哪个代码段不能访问。问题 : 我们要打印的var 到底是 10 还是 100.为什么都是 11,为什么没有持续的累积呐?

2023-04-16 19:51:25 193

原创 从C出发 21 --- 函数对数组排序

【代码】从C出发 20 --- 函数对数组排序。

2023-04-16 17:14:53 48

原创 从C出发 20 --- 函数参数深度剖析

如果理解了初始化的定义,这个问题就迎刃而解了,这个地方是将 i 的值拿出来, i 的值是3,那么拿出来之后放到 n 里面,这样的话,那么上面的 i ,和下面的 n ,拥有的值是一样的都是3,i 是上面的变量,n是下面函数的变量,仅仅是值相同而已,除此之外没有任何关系,所以在函数内部修改了n,i 不会受影响,函数调用的时候,实参和形参所发生的事情,就是初始化而已,和普通变量初始化所发生的事情是一样的,没有任何本质的不同。如果函数的形参是一个数组,那么调用的时候就必须用同类型的数组作为实参。

2023-04-15 21:23:04 354

原创 从C出发 19 --- 函数定义细节剖析

因为编译器是自上而下执行代码的,当编译到 paw2 的时候不知道是什么东西,看起来像一个函数但是前面的代码没有发现它,这个时候编译器就会报错。所以这里的 void 表示的并不是返回值的类型,表示的是demo 这个函数它没有返回值。void 在 c 语言里面就表示一种空类型,这种空类型不能用来定义变量,也没有任何值是属于空类型的。编译器会报错,因为要调用的函数虽然声明了,但是在任何地方都找不到所对应的定义。错误, demo 没有返回类型,还 return i。如果我们声明了,但没有定义,会发生什么?

2023-04-13 13:16:18 699

原创 从C出发 17 --- 函数调用

它是一个名为 main 的函数,没有参数返回类型为 int ,函数体没有任何有意义的语句,只有一个 return 语句,return 语句将 0作为结果返回,这个 0 是字面量,默认类型是 int , 所以和 main 的返回类型就对应起来了,换句话说,main 被调用后得到的结果就是 0。从表面上来看,函数就是一个代码片段,只不过说这个代码片段可以反复利用,通过调用的方式反复利用,通过函数调用,我们可以将参数传到函数所对应的代码片段里面,然后代码片段去处理这些参数,得到一个我们想要的结果。

2023-04-13 01:08:24 425

原创 从C出发 16 --- 程序中的函数

对于一个 function 而言是数据到数据的处理,输入一个数据返回一个数据,返回的数据要有类型,但凡在程序里面接触到数据了,都要意识到它是什么类型,因此对于一个 function 类型的函数来说,必须指明返回的数据是什么类型,那这个返回类型就是函数的重要组成部分了。调用 func_name这个函数,并且指定输入数据是 10 ,意味着将 10 进过一系列的加工得到另一个数据,接下来要保存处理的结果,怎么保存,用变量保存,也就是说 r2 这个变量保存的值就是19了。过程定义的函数 process。

2023-04-12 01:15:14 52

原创 从C出发 15 --- 数组练习

二维数组本质上就是一维数组,C 语言里面的数组就只有一维数组,那么二维数组就是一个数组的数组,从数学角度来看,二维数组相当于一个矩阵。字符串长度就是这个字符串中包含的字符个数,字符串大小就是这个字符串占用的内存空间是多少。这里的 r 最多能表示长度为 9 的字符串,因为最后的结束 0 元素也需要占空间的。只需要保证 S 所对应的字符数组大小超过5,在d的后面还有还有一个元素,所以是5。既然是字符串的连接,就要保证连接的都是字符串,而这里的 r 仅仅是一个字符数组。s 是一个字符数组同时也是一个字符串。

2023-04-08 23:37:21 287

原创 STM32 ---寄存器点灯

任意一个模块,比如 I2S3 ,如果想要时钟能够过来让它工作,怎么做,就是要先将 I2S3 前面的与门打开,这个与门怎么打开,就是要外设时钟使能端使能,把它设置为1,输入是什么输出就是什么,如果为使能端为0,信号过不来,这个 I2S3 就不能工作了。将_main 这个地址送到 R0 里面去,BX (汇编语言的跳转指令)跳转到R0里面去,刚才我们已经将函数的地址(函数的名字)放在R0里面去了(在C语言函数的名字代表一个地址),所以现在是将地址传到R0里面去,接下来跳转到地址执行它的东西。

2023-04-08 00:31:05 405

原创 从C出发 14 --- 字符数组与字符串

char 既可以看成整型,又可以看成字符型,所以说字符数组不仅可以看成整数的有序集合,也可以看成字符的有序集合,因此我们可以用字符的有序集合来表示可阅读的文本信息。字符数组里面的每个元素是char 类型的变量,而char 类型就是一种整型,是最小的整型,小在哪里,小在只占用一个字节。字符串字面量,也就是字符串常量包含了0元素,这个0元素在哪里,在最后一个字符这里,虽然我们看不到,但其实不至这4个字符。‘ 0 ’ 意义是字符0,字符0所对应的整数是48 ,没转义的时候 字符0 所对应的整数是48。

2023-04-06 00:12:48 296

原创 在MDK5(Keil537)中同时配置STM32和C51的环境(简单可行)

但是之前基于ARMCC的项目使用ARMCLANG(compiler version 6)编译会报错,所以导致之前大部分项目都不能直接用,而每个项目都修改代码的话,是一个很大的工作量。这里的解决方案是:打开 'Manage Project Items - Folders/Extensions'(魔术棒旁边的三晶体堆),可看到目前只有ARMCLANG,需要额外添加一个ARMCC(提前在网站下载,并放在Keil安装路径的ARM文件夹下)【OK】,再去编译程序,就不会报错了。2.安装完成后,这一步。

2023-04-05 17:59:23 1586

原创 从C出发 13 --- 多维数组

二维数组就是数组的数组 我们得知道数组里面元素的具体类型 而数组的类型由2个要素组成,第一个要素是 具体的变量的类型。这个说法只是表示数组里面的元素是int 类型 而这个数组的类型是 int a[5] 由元素类型和数组大小共同决定。C语言里面只有一个数组的概念,多维数组是我们扩展出来的,为了与扩展出来的多维数组区别开来,就把之前所学到的数组叫做。数组名为: Name 数组大小: [N1] 数组里面元素的类型: type [N2]数组它是有自己特别的类型的。第二个要素 就是大小。

2023-04-05 00:14:32 298

原创 从C出发 12 --- 数组特性深入剖析

int size;//用一个随机值定义数组,已经出现问题。这片连续的内存有多大呐?sizeof是用来获取内存字节数的,单位是字节。编译器根据初始值个数自动确定数组大小。

2023-04-04 21:37:37 35

原创 从C出发 11 --- 数组

提高效率, 因为上面的程序每次都要重新计算。数组元素: 通过数组创建的变量。

2023-04-04 21:01:06 45

原创 CAN通讯协议

CAN总线协议已广泛应用在汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。种类型的帧:数据帧、遥控帧、错误帧、过载帧、间隔帧,其中数据帧最为常用。为了满足汽车产业的“减少线束的数量”、“通过多个。没有类似地址的信息,添加设备不改变原来总线的状态。CAN总线以“帧”形式进行通信。b) CAN收发器芯片介绍。用于将数据帧 及遥控帧与前面的帧分离开来的帧。a) CAN帧种类介绍。b) CAN数据帧介绍。c) CAN位时序介绍。b) CAN总线特点。d) CAN总线仲裁。,进行大量数据的高速通信”的需求。

2023-04-04 19:00:01 566

原创 从C出发 10 --- C语言中的常量

用const 修饰一个变量,得到一个只读变量,并不是真正意义上的常量。枚举常量和宏常量是类似的,最主要的区别是语法差异。枚举常量只能是整型,宏常量可以是任意类型。const 本质还是一个变量。

2023-04-04 16:23:20 44

原创 IIC通讯协议

4.数据传输速率: 标准模式100k bit/s 快速模式400k bit/s 高速模式3.4M bit/s。1.由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平。IIC: inter Integrated Circuit,集成电路总线,是一种。2.总线支持多设备连接,允许多主机存在,每个设备都有一个唯一的地址。AT24C02数据手册可知道 iic_delay()的延时时间。3.连接到总线上的数目受总线的最大电容400pf限制。IIC (总线/协议)总线就是传输数据通道。

2023-04-04 15:09:24 171

原创 从C出发 09 --- 程序中的铺助语句

五、goto - 程序世界中的 破坏者。辅助语句只是为了让程序更加精练。

2023-04-03 21:14:50 42

原创 从C出发 08 --- 经典问题剖析

变量既可以做左值又可以做右值。else总是与它最近的 if 匹配。c语言里面每一条语句要以分号结束。

2023-04-03 20:10:44 30

原创 从C出发 07 --- 再论数据类型

用不同的类型所创建的变量占用的内存不同,只有变量才会占用内存。类型本身不会占用内存,只有变量才会占用内存。为什么不同的类型表示的范围不同?long long 表示长整型。1.除了表示的数据方式不同。因为不同的类型所占用的内存不同。字面量也有类型(通过后缀表示)2.还有占用的内存不同。

2023-04-03 01:03:52 37

原创 从C出发 06 --- signed 与 unsigned

signed 和 unsigned 表示的个数是一样的,不同之处仅仅是取值范围不同。打印的数值大于int 能表示的范围之后,那么打印的结果就会发送错误。un 的取值范围小于int的取值范围 所以%d可以输出期望的值。

2023-04-03 00:32:55 43

原创 从C出发 05 --- 函数

static修饰变量 普通形参在调用完一次后内存会释放,static 修饰后的变量只会初始化一次。# 预编译 :就是指程序执行前的一些预处理工作 ,主要指#表示的。static修饰函数 主要是起到保护的作用。声明的时候只需要类型就可以了。

2023-03-31 15:07:06 28

原创 从C出发 04 --- 基本语句

【代码】从C出发 04 --- 基本语句

2023-03-31 13:50:00 43

原创 从C出发 03 --- 逻辑运算

【代码】从C出发 03 --- 逻辑运算。

2023-03-30 23:41:18 35

原创 从C出发 02 --- 算术运算

从C出发 02 --- 算术运算

2023-03-30 22:54:14 34

原创 从C出发 01 --- 数据类型(数据类型,进制数,ASCII,补码)

3.十六进制 (逢十六进一, 本位变0) 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10。四字节 float 3.4\*10^-38 ~3.4\*10^38。long int 长整型。2、16位: 双字节。3、32位: 四字节。五、原码、反码、补码。

2023-03-30 19:57:00 86

原创 深入学习C语言中memset/strcat/strstr/strlen函数的用法

功能: strstr(字符串1, 字符串2);判断字符串2是不是在字符串1的里面出现。1.功能:将某一块内存全部设置为指定的值。通常用来初始化数组或者结构体。功能: 在一个字符串后面追加上另外一个字符串。一. 初始化函数 --- memset。二. 连接函数 --- strcat。3.判断函数 --- strstr。4.初始化结构体数组。功能: 计算字符串的长度。

2023-03-30 16:10:27 133

原创 C_指针(指针函数&函数指针)——学习笔记

另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就称 p 指向了 c,或者说 p 是指向变量 c 的指针。需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,它们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。是指向函数的指针变量,其本质是一个指针变量。

2022-09-23 17:48:38 215

ARMCC的安装资源包

ARMCC的安装资源包

2023-04-05

stm32CubeMx 红外遥控智能车

温湿度,红外遥控,夜间自动亮灯,舵机控制,多任务处理裸机编程思想,有任何问题欢迎私信或评论区留言交流

2022-07-17

1 - 01 -HZ.zip

这是一个正点原子屏幕的移植代码,用的是CubeMx(适合原子的各种尺寸的电容或电阻屏),已经内置字模函数,直接取模即可,方便移植自己的项目中,当初移植屏幕的时候走了不少弯路,希望能帮到大家。

2021-08-13

Blue_Text_1_ok.zip

通过手机app 控制单片机 1.app名称:lightblue(ios/Android) 2.MCU: stm32f103zet6 3.蓝牙:正点原子蓝牙4.2

2021-08-12

空空如也

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

TA关注的人

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