0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

结合STM32单片来讲讲结构体的运用

FPGA之家 来源:果果小师弟 作者:智果芯 2021-05-27 17:42 次阅读

摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来讲讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。

大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书。

这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!但是等你真正的学单片机的时候,你会发现我不是学过C语言吗?计算机二级我也过了啊!怎么这个指针和结构体都不懂啊?难道我学了一个假的C语言?

其实这不是你的错,也不是单片机的错,而是在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 {数据类型} {别的名字}

#include “sys.h”#include “delay.h”#include “usart.h”typedef int zhjiguoxin;//zhjiguoxin就是int

zhjiguoxin value = 0;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

printf(“value=%d

”,value);

while(1)

{

}

}

虽然typedef可以给变量取别名,但是没有谁会像上面那样取名字,我这里只是举一个例子。

4、结构体的精髓注意下:

1、下面的代表了这个结构体数据类型

2、给这个数据类型起一个别名

注意是三部分, typedef {数据类型} {别的名字}。所以sensor就代表了这个结构体了。

建议初学者把下面这张图保存到你的电脑,这样你就永远也不会忘记typedef在结构体中的用法了,也能很快的记住结构体这个东东。

3、以后定义结构体变量的时候就不需要像最开始那样struct sensors sen;这样的定义结构体变量了,只需要sensor sen;即可。

4、结构体名字可以省略

注意结构体定义可以不写结构体名,对C语言来说,那个sensors不叫结构体名,而是叫标签(tag)。C语言结构体名是struct关键字 + tag。所以为了简便我们看到的单片机中的结构体都是写成如下的形式。

5、结构体的变量可以放任何变量1、结构体变量可以放任何变量(int型指针)

#include “sys.h”#include “delay.h”#include “usart.h”typedef struct

{

float temperature; //温度

char humidity; //湿度

char alcohol; //酒精浓度

int illumination;//光照强度

char CO; //一氧化碳浓度

int *p; //int型的指针变量

} sensor;

sensor sen;

int value =0;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

sen.p=&value;//把value的地址赋值

//打印p代表的地址里面的值(其实就是打印value的值)

printf(“value=%d

”,*(sen.p));

while(1)

{

}

}

既然是指针变量,所以给指针变量赋值时当然是赋值的是一个地址。

2、结构体变量可以放任何变量(函数指针)

#include “sys.h”#include “delay.h”#include “usart.h”typedef struct

{

float temperature; //温度

char humidity; //湿度

char alcohol; //酒精浓度

int illumination;//光照强度

char CO; //一氧化碳浓度

int *p; //int型的指针变量

void (*fun)();

} sensor;

sensor sen;

void function()

{

printf(“zhiguoxin

”);

}

int value =0;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

sen.fun=function;

sen.fun();

while(1)

{

}

}

既然是函数指针变量,所以给函数指针变量赋值时当然是赋值的也是地址,并且还要是一个函数的地址,而一个函数的函数名就是该函数的地址。所以才会有下面的把函数function();的地址function赋值给函数指针fun。这样大家是不是很清楚了。如果不清楚建议看个3遍以上!

3、结构体变量可以放任何变量(结构体变量)

这就是结构体嵌套,在一个结构体内包含了另一个结构体作为其成员。当出现结构体嵌套时,必须以级联方式访问结构体成员,即通过成员选择运算符逐级找到最底层的成员时再引用。

#include “sys.h”#include “delay.h”#include “usart.h”typedef struct

{

int i;

}zhiguoxin;

typedef struct

{

float temperature; //温度

char humidity; //湿度

char alcohol; //酒精浓度

int illumination;//光照强度

char CO; //一氧化碳浓度

int *p; //int型的指针变量

void (*fun)();

zhiguoxin guougo;

}sensor;

sensor sen;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

sen.guougo.i=100;

printf(“i=%d

”,sen.guougo.i);

while(1)

{

}

}

4、结构体变量可以放任何变量(结构体指针)

结构体是一个数据类型。数据类型当然也可以定义对应的指针变量啦。

就像是int 类型可以定义 int *p; 一样

所以当大家如果发现你的代码中结构体是通过—》访问的话,那么这个结构体变量一定是指针类型的变量。同理如果代码中结构体是通过。访问的话,那么这个结构体变量就不是指针变量,而是一般的变量。

总结:到这里结构体在单片机中的应用你已经掌握的差不多了,大家可能感觉本期讲的内容太简单了,不过只有你把这个简单的基础性知识打牢,你就会进步的更快。否则你总感觉你的代码差点意思。

原文标题:干货|手把手教你写单片机的结构体

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44526

    浏览量

    633448
  • C语言
    +关注

    关注

    180

    文章

    7601

    浏览量

    136318
  • 智能家居
    +关注

    关注

    1926

    文章

    9524

    浏览量

    184477

原文标题:干货|手把手教你写单片机的结构体

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    结构成员的顺序会影响结构的大小吗

    相同的结构成员,如果把顺序调整一下,会不会影响结构的大小? 答案是会的,这主要跟字节对齐有关。 比如这样的结构
    的头像 发表于 11-25 16:24 103次阅读

    stm32与物联网的结合应用

    随着物联网(IoT)技术的飞速发展,越来越多的智能设备被接入到网络中,实现远程监控、数据收集和智能控制等功能。STM32系列微控制器作为ARM Cortex-M内核的高性能单片机,以其丰富的外设
    的头像 发表于 11-19 15:55 252次阅读

    STM32单片机的特点介绍

    STM32系列单片机是由ST厂商推出的单片机,基于专为高性能、低成本、低功耗嵌入式应用设计的ARM Cortex-M内核,具备一流的外设配置,使其在功耗和集成度方面表现出色,STM32
    的头像 发表于 09-25 17:19 1010次阅读

    stm32单片机用什么软件编程

    STM32单片机是一种广泛应用于嵌入式系统领域的微控制器,具有高性能、低功耗、丰富的外设接口等特点。要对STM32单片机进行编程,需要选择合适的软件工具。 概述
    的头像 发表于 09-02 10:16 1050次阅读

    基于STM32单片机的语音播报体温计设计

    语音播报体温计系统包括温度采集模块,语音播放模块,显示模块,其中核心 CPU采用单片STM32STM32在电子行业运用广泛。温度采集模块使用 MLX90614红外传感器采集体温数
    的头像 发表于 06-24 14:31 1224次阅读
    基于<b class='flag-5'>STM32</b><b class='flag-5'>单片</b>机的语音播报体温计设计

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用结构在内
    的头像 发表于 06-04 08:04 389次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    51、STM32单片机的编程方式一样吗?

    STM32和51单片机是两种常见的单片机系列,它们在硬件架构、性能特点和编程方式等方面有所不同。但是从c语言编程的角度来说,我认为是大同小异的。我们来对比一下它们的编程特点:51&
    的头像 发表于 05-18 08:04 2005次阅读
    51、<b class='flag-5'>STM32</b><b class='flag-5'>单片</b>机的编程方式一样吗?

    STM32单片机最小化系统设计原理

    STM32最小系统,就是能让STM32单片机能够正常工作所必须拥有的组成部分的集合,也是STM32单片机正常运行的必要环境。
    发表于 04-23 14:54 2687次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>单片</b>机最小化系统设计原理

    STM32H7系列上的DMA, MDMA, BDMA的异同是什么?

    STM32H7上面有好多类型的DMA,大概看了一下功能都差不多呀!有没有谁了解的,来讲讲这几个DMA都有什么区别,有什么特别之处?实际使用可以用来干嘛
    发表于 04-17 08:09

    C语言结构史上最详细的讲解【软件干货】

    struct结构数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如 char int float long double string(c99) 等等数据类型,他们可以表示一些事物
    的头像 发表于 03-28 17:52 707次阅读

    求助,请问一个结构如何全部定义到 __attribute__ 区域?

    请问一个结构如何全部定义到 __attribute__ 区域? 例如我这里涉及到一些高速计算的缓存,计划将缓存数据存储到 __attribute__ 区域。 三个结构 ,每个
    发表于 01-16 07:29

    经典 C 语言编程,结构和联合体如何共用?

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,结构
    的头像 发表于 01-11 18:24 1276次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构结构可以
    的头像 发表于 01-11 08:00 951次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系

    单片机中for语句的运用

    单片机中的for语句是一种常见的循环控制结构,用于重复执行一段代码块,可以简化程序的编写和减少代码量。本文将详细介绍单片机中for语句的运用。 一、for语句的基本
    的头像 发表于 01-05 14:02 2224次阅读

    STM32单片机的特点和功能是什么

    STM32单片机是一款基于ARM Cortex-M内核的32位闪存微控制器,由STMicroelectronics公司(意法半导体)生产。STM32单片机具有高性能、低功耗、丰富的外设
    的头像 发表于 01-03 15:33 1.2w次阅读