精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

結構體在單片機中的應用

硬件攻城獅 ? 來源:果果小師弟 ? 作者:果果小師弟 ? 2022-08-29 10:43 ? 次閱讀

摘要:聽說還有好多學單片機的小伙伴不會用結構體?指針和結構體是學單片機必須要掌握的,如果你C語言掌握的不牢,單片機根本學不到精髓,只能完成一些低級的項目。看得懂結構體并且能夠靈活運用結構體,才能說明你入門了單片機。

本篇將以最通俗的方式并結合STM32單片機,來給大家講一講結構體的運用。解決你學完C語言、考過了計算機二級還是看不懂單片機結構體的苦惱。

我們都知道,指針和結構體是單片機的難點,所以就去學習C語言,找視頻看書......

這里面每一個視頻的播放量都非常高。對于單純的學習C語言,這里講的很清楚。看完你不禁在下面評論一句:哇!講的真的太清楚了吧!

但是,等你真正學單片機的時候,你會發現自己不是學過C語言嘛,計算機二級我也過了,怎么這個指針和結構體還是不懂呀?難道我學了一個假的C語言?

其實這不是你的錯,也不是單片機的錯,而是在C語言和單片機之間需要一個過渡!這個需要過渡的點,在很多單片機視頻教程中并沒有去講解。因為教育機構默認你是知道的,所以在講流水燈時他們并不會講解GPIO初始化這個結構體,因為默認你是知道如何操作的。

3ee1f838-261c-11ed-ba43-dac502259ad0.png

申明一個GPIO_InitTypeDef的結構體,然后在LED_Init(void)函數中定義一個GPIO_InitStructure的變量GPIO_InitStructure,那么這個變量就可以設置這個GPIO_InitTypeDef的結構體中的成員。這里先做了解,請接著往下看。

1、為什么需要結構體

這里先不說什么是結構體,說說為什么需要結構體?只有知道為什么需要,才能按照你的需要去學習,這樣效率才會高。你才知道在什么情況下我們需要寫一個結構體,怎么樣去用結構體。

這里我們以一個智能家居的項目為例。

首先,我們來看一個實際的問題:話說有一個項目上有4個傳感器光照傳感器、煙霧傳感器、酒精傳感器、濕度傳感器然后這四個各個傳感器還有設置報警的閾值范圍。

一般都是這樣寫:

#include"sys.h"
#include"delay.h"
#include"usart.h"

/*記錄傳感器的數值*/
floattemperature;//溫度
charhumidity;//濕度
charalcohol;//酒精濃度
intillumination;//光照強度

/*記錄傳感器高低閾值*/
floattemperature_threshold[2];
floathumidity_threshold[2];
floatalcohol_threshold[2];
floatillumination_threshold[2];

intmain(void)
{
uart_init(115200);//串口初始化
delay_init();
while(1)
{
}
}
3ef433b8-261c-11ed-ba43-dac502259ad0.png

當然,你做一個項目肯定還定義了很多其他的變量,還需要記錄其它變量。

3f012bd6-261c-11ed-ba43-dac502259ad0.png

然后過了幾天,又增加了個一氧化碳傳感器。

3f0de9b6-261c-11ed-ba43-dac502259ad0.png

然后又過了幾天,每個傳感器還需要加個是否正常工作的標志位。

3f224f1e-261c-11ed-ba43-dac502259ad0.png

因為項目的需要,然后又增加了4個相同的傳感器:溫濕度、光照強度、煙霧濃度、酒精濃度。

3f43e35e-261c-11ed-ba43-dac502259ad0.png

然后又增加了4個相同的傳感器:溫濕度、光照強度、煙霧濃度、酒精濃度。

截圖截不開了....

3f502af6-261c-11ed-ba43-dac502259ad0.png

滿屏的變量......

滿屏的變量......

滿屏的變量......

在項目剛開始做的時候如果不能未雨綢繆,接著干下去整個程序代碼別說維護了,就是接著寫都讓人頭疼!

滿屏的變量...

滿屏的變量...

2、結構體閃亮登場

然后搞C語言那幫家伙就造了個功能struct

1、結構體就是可以把變量包含到里面的東西

struct就代表要定義一個結構體,sensors是這個結構體的名字,然后是一個大括號 { }

大括號里面就隨意定義變量啦~

3f5cf632-261c-11ed-ba43-dac502259ad0.png

怎么使用里面的變量呢?

注意:結構體是一個數據類型就像是int和char一樣的這種類型。

既然是一種數據類型,那么就可以用這個數據類型定義變量。

定義一個該結構體的變量:

3f6b240a-261c-11ed-ba43-dac502259ad0.png

為啥要那樣子定義啊?

答:你去問造C語言的那幫家伙去!問問他們為啥要設計成這樣子!

然后操作結構體變量里面的成員變量。當我們定義好結構體變量后,在初始化變量里面的成員變量時就會自動出現結構體里面的成員變量,如果這個代碼是你一個一個敲出來的話,你就會感嘆結構體在單片機中是那么的奇妙!

3f778ea2-261c-11ed-ba43-dac502259ad0.png3f847e5a-261c-11ed-ba43-dac502259ad0.png3f928cd4-261c-11ed-ba43-dac502259ad0.png

有人會問為啥是結構體變量中間加個點?

答:你去問造C語言的那幫家伙去!問問他們為啥要設計成這樣子。

2、其實定義結構體變量可以下面這樣子

3f9fcb38-261c-11ed-ba43-dac502259ad0.png

也可以定義多個:

3fa9d5c4-261c-11ed-ba43-dac502259ad0.png3fb6379c-261c-11ed-ba43-dac502259ad0.png

發現了沒,每個結構體變量都是單獨擁有結構體里面的全部成員變量。

就像是最開始說的,如果再增加一套傳感器:溫濕度、光照強度、煙霧濃度、酒精濃度。

使用結構體的話只需要再定義一個結構體變量即可

但很多時候,我們在單片機中見到的結構體并不是上面那樣定義的,而是在前面加了一個typedef 關鍵字。

這樣的例子在庫函數的頭文件中,我們經常會看到如下結構體:

3fc377c2-261c-11ed-ba43-dac502259ad0.png

3、typedef關鍵字

先看一下百度百科對typedef的定義:

3fcf9232-261c-11ed-ba43-dac502259ad0.png

總結一句就是:typedef可以把一個數據類型取一個別的名字

typedef {數據類型} {別的名字}

#include"sys.h"
#include"delay.h"
#include"usart.h"

typedefintzhjiguoxin;//zhjiguoxin就是int

zhjiguoxinvalue=0;

intmain(void)
{
uart_init(115200);//串口初始化
delay_init();

printf("value=%d
",value);

while(1)
{
}
}
3fdce4dc-261c-11ed-ba43-dac502259ad0.png3fe86c3a-261c-11ed-ba43-dac502259ad0.png

雖然typedef可以給變量取別名,但是沒有誰會像上面那樣取名字,我這里只是舉一個例子。

4、結構體的精髓

注意:

1、下面的代表了這個結構體數據類型

3ff906da-261c-11ed-ba43-dac502259ad0.png

2、給這個數據類型起一個別名

注意是三部分, typedef {數據類型} {別的名字}。所以sensor就代表了這個結構體了。

建議初學者把下面這張圖保存到你的電腦,這樣你就永遠也不會忘記typedef在結構體中的用法了,也能很快的記住結構體這個東東。

4005f606-261c-11ed-ba43-dac502259ad0.png

3、以后定義結構體變量的時候,就不需要像最開始那樣struct sensors sen;這樣的定義結構體變量了,只需要sensor sen;即可。

4010e246-261c-11ed-ba43-dac502259ad0.png

4、結構體名字可以省略

注意結構體定義可以不寫結構體名,對C語言來說,那個sensors不叫結構體名,而是叫標簽(tag)。C語言結構體名是struct關鍵字 + tag。所以為了簡便,我們看到的單片機中的結構體都是寫成如下的形式。

401fb3de-261c-11ed-ba43-dac502259ad0.png

5、結構體的變量可以放任何變量

1、結構體變量可以放任何變量(int型指針)

#include"sys.h"
#include"delay.h"
#include"usart.h"
typedefstruct
{
floattemperature;//溫度
charhumidity;//濕度
charalcohol;//酒精濃度
intillumination;//光照強度
charCO;//一氧化碳濃度
int*p;//int型的指針變量
}sensor;
sensorsen;
intvalue=0;
intmain(void)
{
uart_init(115200);//串口初始化
delay_init();
sen.p=&value;//把value的地址賦值
//打印p代表的地址里面的值(其實就是打印value的值)
printf("value=%d
",*(sen.p));
while(1)
{
}
}

既然是指針變量,所以給指針變量賦值時當然是賦值的是一個地址。

403054f0-261c-11ed-ba43-dac502259ad0.png403f8b0a-261c-11ed-ba43-dac502259ad0.png

2、結構體變量可以放任何變量(函數指針)

#include"sys.h"
#include"delay.h"
#include"usart.h"
typedefstruct
{
floattemperature;//溫度
charhumidity;//濕度
charalcohol;//酒精濃度
intillumination;//光照強度
charCO;//一氧化碳濃度
int*p;//int型的指針變量
void(*fun)();
}sensor;
sensorsen;
voidfunction()
{
printf("zhiguoxin
");
}
intvalue=0;
intmain(void)
{
uart_init(115200);//串口初始化
delay_init();
sen.fun=function;
sen.fun();
while(1)
{
}
}

既然是函數指針變量,所以給函數指針變量賦值時當然是賦值的也是地址,并且還要是一個函數的地址,而一個函數的函數名就是該函數的地址。所以才會有下面的把函數function();的地址function賦值給函數指針fun。

這樣大家是不是很清楚了?如果不清楚,建議看個3遍以上!

404c2e82-261c-11ed-ba43-dac502259ad0.png405c1c2a-261c-11ed-ba43-dac502259ad0.png

3、結構體變量可以放任何變量(結構體變量)

這就是結構體嵌套,在一個結構體內包含了另一個結構體作為其成員。當出現結構體嵌套時,必須以級聯方式訪問結構體成員,即通過成員選擇運算符逐級找到最底層的成員時再引用。

#include"sys.h"
#include"delay.h"
#include"usart.h"

typedefstruct
{
inti;
}zhiguoxin;

typedefstruct
{
floattemperature;//溫度
charhumidity;//濕度
charalcohol;//酒精濃度
intillumination;//光照強度
charCO;//一氧化碳濃度
int*p;//int型的指針變量
void(*fun)();
zhiguoxinguougo;
}sensor;

sensorsen;

intmain(void)
{
uart_init(115200);//串口初始化
delay_init();

sen.guougo.i=100;
printf("i=%d
",sen.guougo.i);

while(1)
{
}
}
40691a42-261c-11ed-ba43-dac502259ad0.png4078ffca-261c-11ed-ba43-dac502259ad0.png

4、結構體變量可以放任何變量(結構體指針)

結構體是一個數據類型。當然,數據類型也可以定義對應的指針變量啦。

就像是int 類型可以定義 int *p; 一樣

4088dbf2-261c-11ed-ba43-dac502259ad0.png

所以,當大家如果發現你的代碼中結構體是通過—>訪問的話,那么這個結構體變量一定是指針類型的變量。

同理,如果代碼中結構體是通過.訪問的話,那么這個結構體變量就不是指針變量,而是一般的變量。

4094398e-261c-11ed-ba43-dac502259ad0.png40ab3f9e-261c-11ed-ba43-dac502259ad0.png

總結:至此,有關結構體在單片機中的應用,相信你已經掌握的差不多了。大家可能感覺本文的內容太簡單了,但只有把這個簡單的基礎性知識打牢,你才能進步得更快,否則你總感覺自己的代碼差點意思。

審核編輯:湯梓紅


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6032

    文章

    44525

    瀏覽量

    633249
  • C語言
    +關注

    關注

    180

    文章

    7601

    瀏覽量

    136251
  • 結構體
    +關注

    關注

    1

    文章

    130

    瀏覽量

    10835

原文標題:講的太太太太清晰了~從零開始教你寫單片機的結構體

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言的結構單片機的應用有哪些?

    C語言的好處是什么?C語言的結構單片機的應用有哪些?
    發表于 10-14 06:18

    C語言的結構和共用單片機的妙用是什么

    【分享】C語言的結構和共用單片機的妙用C語言的結構
    發表于 11-30 06:13

    c語言結構單片機的應用是什么

    Struck看到單片機中有很多struck 的應用,但是呢我當初學C語言的時候又沒有很認真的去學習,今天復習下,寫一篇小小的交流,希望能夠給大家帶來幫助。1.struck的定義
    發表于 11-30 07:21

    如何寫單片機的C語言結構

    摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機必須要掌握的,如果你C語言
    發表于 12-03 07:11

    結構C程序STM32單片機串口接收中有哪些作用呢

    什么是大端和小端呢?結構C程序STM32單片機串口接收中有哪些作用呢?
    發表于 12-07 06:25

    如何去實現單片機系統結構數據類型的存儲和讀取呢

    單片機系統結構數據類型的存儲和讀取單片機系統開發
    發表于 01-26 07:42

    單片機+CPLD結構體系電子設計的應用

    介紹在數字電路設計,單純以單片機為主體結構的優缺點;結合CPLD 的特點,提出單片機+ CPLD 體系結構
    發表于 05-14 13:31 ?17次下載

    單片機結構和指針等資料說明

    本文檔的主要內容詳細介紹的是單片機結構和指針等資料說明包括了:單片機的常量,單片機的變量,構造類型:數組,構造類型:
    發表于 12-05 17:23 ?17次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>結構</b><b class='flag-5'>體</b>和指針等資料說明

    手把手教你如何寫單片機結構

    摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機必須要掌握的,如果你C語言
    的頭像 發表于 05-13 11:29 ?3940次閱讀
    手把手教你如何寫<b class='flag-5'>單片機</b>的<b class='flag-5'>結構</b><b class='flag-5'>體</b>

    干貨|手把手教你寫單片機結構

    摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機必須要掌握的,如果你C語言
    發表于 11-13 15:51 ?11次下載
    干貨|手把手教你寫<b class='flag-5'>單片機</b>的<b class='flag-5'>結構</b><b class='flag-5'>體</b>

    C語言的結構和共用單片機的妙用

    【分享】C語言的結構和共用單片機的妙用C語言的結構
    發表于 11-20 19:36 ?20次下載
    C語言的<b class='flag-5'>結構</b><b class='flag-5'>體</b>和共用<b class='flag-5'>體</b><b class='flag-5'>在</b><b class='flag-5'>單片機</b><b class='flag-5'>中</b>的妙用

    c語言結構單片機的應用

    Struck看到單片機中有很多struck 的應用,但是呢我當初學C語言的時候又沒有很認真的去學習,今天復習下,寫一篇小小的交流,希望能夠給大家帶來幫助。1.struck的定義
    發表于 11-20 19:51 ?10次下載
    c語言<b class='flag-5'>結構</b><b class='flag-5'>體</b><b class='flag-5'>在</b><b class='flag-5'>單片機</b><b class='flag-5'>中</b>的應用

    干貨|手把手教你寫單片機的C語言結構

    摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機必須要掌握的,如果你C語言
    發表于 11-23 17:51 ?42次下載
    干貨|手把手教你寫<b class='flag-5'>單片機</b>的C語言<b class='flag-5'>結構</b><b class='flag-5'>體</b>

    干貨|手把手教你寫單片機結構

    摘要:聽說還有好多學單片機的小伙伴不會用結構?指針和結構是學單片機必須要掌握的,如果你C語言
    發表于 01-25 18:11 ?4次下載
    干貨|手把手教你寫<b class='flag-5'>單片機</b>的<b class='flag-5'>結構</b><b class='flag-5'>體</b>

    51單片機結構數組1206顯示

    用51單片機編寫結構數組,用1206顯示
    發表于 06-06 09:17 ?9次下載