在C语言和单片机之间需要一个过渡!这个需要过渡的点在很多单片机视频教程中并没有去讲解。因为教育机构默认你是知道的,所以在讲流水灯时他们并不会讲解GPIO初始化这个结构体,因为默认你是知道如何操作的。

申明一个GPIO_InitTypeDef的结构体,然后在LED_Init(void)函数中定义一个GPIO_InitStructure的变量GPIO_InitStructure,那么这个变量就可以设置这个GPIO_InitTypeDef的结构体中的成员。这里先做了解,请接着往下看。
1、为什么需要结构体这里先不说什么是结构体,说说为什么需要结构体?只有知道为什么需要,才能按照你的需要去学习,这样效率才会高。你才知道在什么情况下我们需要写一个结构体,怎么样去用结构体。
这里我们以一个智能家居的项目为例。
先来看一个实际的问题
话说有一个项目上有4个传感器:光照传感器、烟雾传感器、酒精传感器、湿度传感器。然后这四个各个传感器还有设置报警的阈值范围。
一般都是这样写
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- /*记录传感器的数值*/
- float temperature; //温度
- char humidity; //湿度
- char alcohol; //酒精浓度
- int illumination; //光照强度
- /*记录传感器高低阈值*/
- float temperature_threshold[2];
- float humidity_threshold[2];
- float alcohol_threshold[2];
- float illumination_threshold[2];
- int main(void)
- {
- uart_init(115200);//串口初始化
- delay_init();
- while(1)
- {
- }
- }

当然你做一个项目肯定还定义了很多其他的变量,还需要记录其它变量

然后过了几天又增加了个一氧化碳传感器

然后过了几天,每个传感器还需要加个是否正常工作的标志位

因为项目的需要,然后又增加了4个相同的传感器:温湿度、光照强度、烟雾浓度、酒精浓度。

然后又增加了4个相同的传感器:温湿度、光照强度、烟雾浓度、酒精浓度。
截图截不开了....

在项目刚开始做的时候如果不能未雨绸缪,接着干下去整个程序代码别说维护了,就是接着写都让人头疼!
2、结构体闪亮登场然后搞C语言那帮家伙就造了个功能struct
1、结构体就是可以把变量包含到里面的东西
struct就代表要定义一个结构体,sensors是这个结构体的名字, 然后是一个大括号 { }
大括号里面就随意定义变量啦~

怎么使用里面的变量呢?
注意结构体是一个数据类型就像是int和char一样的这种类型
既然是一种数据类型, 那么就可以用这个数据类型定义变量
定义一个该结构体的变量

为啥要那样子定义啊?
答:你去问造C语言的那帮家伙去!问问他们为啥要设计成这样子!
然后操作结构体变量里面的成员变量。当我们定义好结构体变量后,在初始化变量里面的成员变量时就会自动出现结构体里面的成员变量,如果这个代码是你一个一个敲出来的话,你就会感叹结构体在单片机中是那么的奇妙!



有人会问为啥是结构体变量中间加个点?
答:你去问造C语言的那帮家伙去!问问他们为啥要设计成这样子。
2、其实定义结构体变量可以下面这样子

也可以定义多个


发现了没,每个结构体变量都是单独拥有结构体里面的全部成员变量。
就像是最开始说的,如果再增加一套传感器:温湿度、光照强度、烟雾浓度、酒精浓度。
使用结构体的话只需要再定义一个结构体变量即可。
但是很多时候我们在单片机中见到的结构体并不是上面那样定义的,而是在前面加了一个typedef 关键字。
这样的例子在库函数的头文件中我们经常会看到如下结构体

3、typedef关键字先看一下百度百科对typedef的定义

总结一句就是:typedef可以把一个数据类型取一个别的名字
typedef {数据类型} {别的名字}
|