0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在單片機(jī)中引入面向?qū)ο蟮乃枷?/h1>

在看別人單片機(jī)程序時(shí),你也許是奔潰的,因?yàn)槿肿兞繚M(mǎn)天飛,不知道哪個(gè)在哪用了,哪個(gè)表示什么,而且編寫(xiě)極其不規(guī)范。自己寫(xiě)單片機(jī)程序時(shí),也許你也是奔潰的。總感覺(jué)重新開(kāi)啟一個(gè)項(xiàng)目,之前的寫(xiě)過(guò)相似的代碼也無(wú)法使用,得重新敲,代碼重用度不高,編程效率低下,代碼無(wú)法積累。而且感覺(jué)寫(xiě)這個(gè)代碼沒(méi)有思想,沒(méi)有靈魂,沒(méi)有框架,只是一個(gè)一個(gè)功能代碼的堆砌,很空泛。

那么這個(gè)時(shí)候,你也許應(yīng)該在單片機(jī)中引入面向?qū)ο蟮乃枷肓?,使代碼更規(guī)范。

一、單片機(jī)程序框架

1、輪流執(zhí)行

intmain(void)
{
while(1)
{
sing();
dance();
play();
}
}

函數(shù)sing執(zhí)行的時(shí)間比較長(zhǎng)的話(huà),函數(shù)dance就不能很快的被執(zhí)行。任何一個(gè)函數(shù)死掉的話(huà)就會(huì)影響整個(gè)系統(tǒng)。

2、前后臺(tái)

在使用 51、AVR、STM32 單片機(jī)裸機(jī)的時(shí)候一般都是在main函數(shù)里面用while(1)做一個(gè)大循環(huán)來(lái)完成所有的處理,即應(yīng)用程序是一個(gè)無(wú)限的循環(huán),循環(huán)中調(diào)用相應(yīng)的函數(shù)完成所需的處理。有時(shí)候我們也需要中斷中完成一些處理。相對(duì)于多任務(wù)系統(tǒng)而言,這個(gè)就是單任務(wù)系統(tǒng),也稱(chēng)作前后臺(tái)系統(tǒng),中斷服務(wù)函數(shù)作為前臺(tái)程序,大循環(huán)while(1)作為后臺(tái)程序。

對(duì)應(yīng)的編程代碼大概是這樣的:

voidEXTI_IRQHandler()
{
flag=1;
}
intmain(void)
{
while(1)
{
if(flag=1)
{
do_something();
flag=0;
}
}
}

有什么問(wèn)題?

前后臺(tái)系統(tǒng)的實(shí)時(shí)性差,前后臺(tái)系統(tǒng)各個(gè)任務(wù)(應(yīng)用程序)都是排隊(duì)等著輪流執(zhí)行,不管你這個(gè)程序現(xiàn)在有多緊急,沒(méi)輪到你就只能等著!相當(dāng)于所有任務(wù)(應(yīng)用程序)的優(yōu)先級(jí)都是一樣的。但是前后臺(tái)系統(tǒng)簡(jiǎn)單啊,資源消耗也少??!在稍微大一點(diǎn)的嵌入式應(yīng)用中前后臺(tái)系統(tǒng)就明顯力不從心了。

3、多任務(wù)

voidfirst_task()
{
while(1)
{
if(has_data())
put_data();
}
}
voidsecond_task()
{
while(1)
{
if(get_data())
do_something();
}
}

intmain(void)
{
create_task(first_task);
create_task(second_task);
start_scheduler();
}

多任務(wù)系統(tǒng)會(huì)把一個(gè)大問(wèn)題“分而治之”,把大任務(wù)劃分成很多個(gè)小問(wèn)題,逐步的把小任務(wù)解決掉,大任務(wù)也就隨之解決了,這些任務(wù)是并發(fā)處理的。注意,并不是說(shuō)同一時(shí)刻一起執(zhí)行很多個(gè)任務(wù),而是由于每個(gè)任務(wù)執(zhí)行的時(shí)間很短,導(dǎo)致看起來(lái)像是同一時(shí)刻執(zhí)行了很多個(gè)任務(wù)一樣。

二、執(zhí)行的程序怎么寫(xiě)?

以按鍵為例,點(diǎn)亮一個(gè)小燈!

1.常規(guī)寫(xiě)法

intmian(void)
{
while(1)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==GPIO_PIN_SET)
{
printf("按鍵按下
");
}
}
}

2.面向?qū)ο蟮膶?xiě)法

首先我們把每一個(gè)按鍵都看成一個(gè)對(duì)象,既然是對(duì)象就肯定有屬性和行為,比如我們定義一個(gè)學(xué)生,那么這個(gè)學(xué)生有什么屬性呢?

肯定有姓名、年齡、身高、體重對(duì)吧,這些是一些基本的屬性,我們可以用一些單獨(dú)的變量來(lái)定義它,比如:

typedefstruct
{
uint8_t*name;//姓名(變量)
uint8_tage;//年齡(變量)
uint8_theight;//身高(變量)
uint8_tweight;//體重(變量)
}student_t;

但是一個(gè)學(xué)生還有很多行為對(duì)吧,它會(huì)唱歌、跳舞、打籃球、也會(huì)關(guān)注果果小師弟的公眾號(hào)對(duì)吧,于是我們就可以這樣定義:

typedefstruct
{
uint8_t*name;//姓名(變量)
uint8_tage;//年齡(變量)
uint8_theight;//身高(變量)
uint8_tweight;//體重(變量)
void(*Sing_song)(void);//會(huì)唱歌(函數(shù)指針)
void(*Dance_latin)(void);//會(huì)跳舞(函數(shù)指針)
void(*Wechat_zhiguoxin)(void);//會(huì)關(guān)注果果的公眾號(hào)(函數(shù)指針)
}student_t;

好了,這里我們提到了函數(shù)指針,所以就來(lái)說(shuō)一說(shuō)函數(shù)指針。

函數(shù)指針,顧名思義它就是一個(gè)指針,只不過(guò)它是一個(gè)函數(shù)指針,所以指向的是一個(gè)函數(shù)。類(lèi)比一般的變量指針,指針變量,實(shí)質(zhì)上是一個(gè)變量,只不過(guò)這個(gè)變量存放的是一個(gè)地址,在32位單片機(jī)中,任何類(lèi)型的指針變量都存放的是一個(gè)大小為4字節(jié)的地址。

重要的話(huà)說(shuō)三遍!牢記在心?。?!為什要記住函數(shù)指針,因?yàn)樵趩纹瑱C(jī)面向?qū)ο缶幊讨?,結(jié)構(gòu)體的成員不是變量就是函數(shù)指針這兩種類(lèi)型。變量就不用說(shuō)了,函數(shù)指針理解就好。

其實(shí)函數(shù)指針可以類(lèi)比一般的變量,看下面:

inta;voidSing_song(void);
int*p;void(*zhiguoxin)(void);
p=&a;zhiguoxin=&Sing_song;
  1. 左邊走義變量a,右邊定義函數(shù)Sing_song;
  2. 左邊定義int指針,右邊定義函數(shù)指針;
  3. 左邊賦值指針,右邊賦值函數(shù)指針;

那么函數(shù)指針怎么用呢?我們還是以單片機(jī)為例,把按鍵類(lèi)比為一個(gè)對(duì)象,這個(gè)按鍵有按鍵標(biāo)志位,有長(zhǎng)按或者短按,按鍵還有行為:按鍵初始化、按鍵循環(huán)檢測(cè)等。

所以我們創(chuàng)建下面這樣一個(gè)結(jié)構(gòu)體,當(dāng)然這個(gè)結(jié)構(gòu)體不一定僅僅有這些變量和函數(shù),這完全取決于你自己的定義,你想怎么定義就怎么定義,你甚至可以定義按鍵的顏色都。

typedefstruct
{
uint8_tKEY_Flag;//標(biāo)志位(變量)
uint8_tClick;//按下(變量)
void(*KEY_Init)(void);//按鍵初始化(函數(shù)指針)
void(*KEY_Detect)(void);//按鍵檢測(cè)(函數(shù)指針)
}KEY_t;

現(xiàn)在已經(jīng)定義了KEY_t這種類(lèi)型的結(jié)構(gòu)體,處理器還沒(méi)有分配給這個(gè)結(jié)構(gòu)體內(nèi)存,因?yàn)槲覀冎皇锹暶鬟@樣一個(gè)類(lèi)型,而類(lèi)型是不占用內(nèi)存的,只有我們定義對(duì)應(yīng)的結(jié)構(gòu)體類(lèi)型的變量時(shí)才會(huì)在占用內(nèi)存空間。

那么怎么定義一個(gè)結(jié)構(gòu)體類(lèi)型的變量呢?

KEY_tKEY1;

然后就要初始化結(jié)構(gòu)體的成員變量了。

KEY_tKEY1={0,0,KEY_init,KEY_detect};

這里要注意了現(xiàn)在結(jié)構(gòu)體有四個(gè)成員,前兩個(gè)普通的變量,我們初始化為0,還有兩個(gè)函數(shù)指針,我們是不是要把我們想寫(xiě)得函數(shù)的函數(shù)名字放在這里啊。

那么聰明的你肯定知道還要定義KEY_init();KEY_detect();這兩個(gè)函數(shù)。這兩個(gè)函數(shù)可以這樣寫(xiě)。

staticvoidKEY_init()
{
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_InitStruct.Pin=GPIO_PIN_3;
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull=GPIO_NOPULL;
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
}
staticvoidKEY_detect()
{
uint8_ti=0;
if(KEY1.KEY_Flag==1)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)==GPIO_PIN_SET)
{
printf("按鍵按下
");
}
KEY1.KEY_Flag=0;
}
}

好了具體函數(shù)中的代碼我就不需要解釋了。這樣一個(gè)按鍵的對(duì)象我們就定義好了,這個(gè)按鍵我們賦予了"他"生命,有屬性(變量)有行為(函數(shù))

這樣我們?cè)谥骱瘮?shù)就可以這樣的調(diào)用,來(lái)實(shí)現(xiàn)相應(yīng)的功能了。按鍵使用了中斷,這里并沒(méi)有講解。

voidmain(void)
{
KEY1.KEY_Init();//初始化按鍵
while(1)
{
KEY1.KEY_Detect();//按鍵檢測(cè)
}
}

如果理解了這些,那么面向?qū)ο蟮木枘慊疽呀?jīng)掌握了,接下來(lái)就是不斷地去練習(xí)和實(shí)踐了。

三、為什么要面向?qū)ο螅?/span>

我們知道,現(xiàn)有的編程范式主要是:面向過(guò)程編程、面向?qū)ο缶幊獭⒑瘮?shù)式編程。

對(duì)于流程清晰的簡(jiǎn)單程序,一般只有一條流程主線(xiàn),很容易被劃分成順序執(zhí)行的幾個(gè)步驟,面向?qū)ο缶幊毯兔嫦蜻^(guò)程編程沒(méi)有太大差別,并且面向過(guò)程編程常常比面向?qū)ο缶幊谈又庇^高效。

但當(dāng)我們面對(duì)一個(gè)大型的復(fù)雜程序,由于其錯(cuò)綜復(fù)雜的流程和交互關(guān)系,很難將其簡(jiǎn)單地拆分成一條主線(xiàn)串成的簡(jiǎn)單步驟,而通常表現(xiàn)為一個(gè)網(wǎng)狀關(guān)系結(jié)構(gòu)。這個(gè)時(shí)候,面向過(guò)程編程的這種流程化和線(xiàn)性化的思維方式就會(huì)顯得比較吃力,而面向?qū)ο缶幊痰膬?yōu)勢(shì)就比較明顯了。

面向?qū)ο缶幊田L(fēng)格的代碼更容易復(fù)用、擴(kuò)展和維護(hù)、更高級(jí)、更人性化、更適合大規(guī)模復(fù)雜程序的開(kāi)發(fā)。在Linux中就是用的面向?qū)ο缶幊?,里面有很多的結(jié)構(gòu)體、指針、鏈表等等。如果還沒(méi)有接觸到面向?qū)ο缶幊讨荒苷f(shuō)明你做的東西還不夠復(fù)雜。

在單片機(jī)舉一個(gè)例子,一塊開(kāi)發(fā)板可能會(huì)適配不同的屏幕:

那么每一塊板子肯定有不同的代碼適配,在程序中我們可以讀出屏幕的ID,然后通過(guò)if判斷來(lái)執(zhí)行不同的指令,就行這樣。

如果使用面向?qū)ο缶幊?,那么就可以這樣寫(xiě)代碼。

typedefstructlcd{
uint8_ttype;
void(*LCD_Init)(void)
}lcd_t,*plcd_t;

intRead_id()
{
/*0:LCDA
*1:LCDB
*/
return0;
}

intGet_Lcd_Type(void)
{
returnRead_id();
}

voidLCDA_Init(void)//屏幕A初始化
{
LCD_WR_REG(0xCF);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0xC1);
LCD_WR_DATA(0X30);
}

voidLCDB_Init(void)//屏幕B初始化
{
LCD_WR_REG(0X11);
delay_ms(20);
LCD_WR_REG(0XD0);
LCD_WR_DATA(0X07);
}

lcd_topenedv_com_lcds[]={
{0,LCDA_Init},
{1,LCDB_Init},
};

plcd_tget_lcd(void)//獲取到屏幕類(lèi)型
{
inttype=Get_Lcd_Type();
return&openedv_com_lcds[type];
}

intmain(void)
{
plcd_tlcd;
lcd=get_lcd();//獲取到屏幕類(lèi)型
lcd->LCD_Init();//初始化對(duì)應(yīng)屏幕
while(1)
{}
}

這里只是偽代碼處理辦法,原理就和上面所講的一樣,在結(jié)構(gòu)體中使用變量和函數(shù)。

到這里你應(yīng)該掌握了面向?qū)ο蟮?a href="http://ttokpm.com/v/tag/1778/" target="_blank">單片機(jī)編程方法,一起來(lái)試驗(yàn)幾個(gè)例子:

LED

typedefstruct
{
void(*LED_ON)(uint8_tLED_Num);//打開(kāi)
void(*LED_OFF)(uint8_tLED_Num);//關(guān)閉
void(*LED_Flip)(uint8_tLED_Num);//翻轉(zhuǎn)
}LED_t;

按鍵KEY

typedefstruct
{
uint8_tKEY_Flag;//標(biāo)志位(變量)
uint8_tClick;//按下(變量)
void(*KEY_Init)(void);//按鍵初始化(函數(shù)指針)
void(*KEY_Detect)(void);//按鍵檢測(cè)(函數(shù)指針)
}KEY_t;

蜂鳴器BEEP

typedefstruct
{
uint8_tStatus;//狀態(tài)
void(*ON)(void);//打開(kāi)
void(*OFF)(void);//關(guān)閉
}BEEP_t;

串口UART

typedefstruct
{
USART_TypeDef*uart;/*STM32內(nèi)部串口設(shè)備指針*/
uint8_t*pTxBuf;/*發(fā)送緩沖區(qū)*/
uint8_t*pRxBuf;/*接收緩沖區(qū)*/

uint16_tusTxBufSize;/*發(fā)送緩沖區(qū)大小*/
uint16_tusRxBufSize;/*接收緩沖區(qū)大小*/

uint16_tusTxWrite;/*發(fā)送緩沖區(qū)寫(xiě)指針*/
uint16_tusTxRead;/*發(fā)送緩沖區(qū)讀指針*/
uint16_tusTxCount;/*等待發(fā)送的數(shù)據(jù)個(gè)數(shù)*/

uint16_tusRxWrite;/*接收緩沖區(qū)寫(xiě)指針*/
uint16_tusRxRead;/*接收緩沖區(qū)讀指針*/
uint16_tusRxCount;/*還未讀取的新數(shù)據(jù)個(gè)數(shù)*/

void(*RS485_Set_SendMode)(void);//RS-485接口設(shè)置為發(fā)送模式
void(*RS485_Set_RecMode)(void);//RS-485接口設(shè)置為接收模式
}UART_T;

責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6030

    文章

    44499

    瀏覽量

    632171
  • 程序
    +關(guān)注

    關(guān)注

    116

    文章

    3766

    瀏覽量

    80767
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4728

    瀏覽量

    68248

原文標(biāo)題:分享幾點(diǎn)單片機(jī)面向?qū)ο笏枷氲陌咐?/p>

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    單片機(jī)物聯(lián)網(wǎng)的作用

    隨著技術(shù)的飛速發(fā)展,物聯(lián)網(wǎng)已經(jīng)成為連接物理世界與數(shù)字世界的橋梁。物聯(lián)網(wǎng)設(shè)備通過(guò)互聯(lián)網(wǎng)相互連接,實(shí)現(xiàn)數(shù)據(jù)的收集、處理和傳輸,從而提高效率、降低成本并增強(qiáng)用戶(hù)體驗(yàn)。在這一過(guò)程,單片機(jī)作為物聯(lián)網(wǎng)設(shè)備
    的頭像 發(fā)表于 11-01 14:27 ?392次閱讀

    如何優(yōu)化單片機(jī)項(xiàng)目的功耗

    現(xiàn)代電子設(shè)計(jì),功耗優(yōu)化已成為一個(gè)不可忽視的重要議題。對(duì)于單片機(jī)(MCU)項(xiàng)目而言,功耗不僅關(guān)系到產(chǎn)品的能效比,還直接影響到電池壽命和熱管理。 硬件層面的功耗優(yōu)化 1. 選擇合適的單片機(jī)
    的頭像 發(fā)表于 11-01 14:16 ?143次閱讀

    單片機(jī)工業(yè)自動(dòng)化的應(yīng)用

    用電器、汽車(chē)電子和工業(yè)控制系統(tǒng)。工業(yè)自動(dòng)化,單片機(jī)因其可靠性、靈活性和成本效益而受到青睞。 2. 單片機(jī)的特點(diǎn) 低成本 :單片機(jī)的價(jià)格相
    的頭像 發(fā)表于 11-01 14:15 ?171次閱讀

    單片機(jī)怎么寫(xiě)入程序

    單片機(jī)(Microcontroller Unit,MCU)是一種集成電路芯片,它將計(jì)算機(jī)的CPU、存儲(chǔ)器、輸入/輸出接口等功能集成一個(gè)芯片上。單片機(jī)廣泛應(yīng)用于嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備
    的頭像 發(fā)表于 10-21 11:21 ?224次閱讀

    單片機(jī)的中斷機(jī)制

    單片機(jī)的中斷機(jī)制是一種重要的處理方式,它允許單片機(jī)執(zhí)行主程序的過(guò)程,能夠暫停當(dāng)前任務(wù),轉(zhuǎn)而處理外部或內(nèi)部緊急事件。這種機(jī)制極大地提高了系統(tǒng)的響應(yīng)速度和處理能力,使得
    的頭像 發(fā)表于 10-17 18:03 ?299次閱讀

    單片機(jī)STM32可以用Python寫(xiě)嗎?可以的開(kāi)發(fā)板有哪些?

    近年來(lái),隨著嵌入式技術(shù)的發(fā)展,Python語(yǔ)言逐漸被引入單片機(jī)開(kāi)發(fā),尤其是一些高性能的單片機(jī)上。這一趨勢(shì)給開(kāi)發(fā)者帶來(lái)了極大的便利,尤其是
    的頭像 發(fā)表于 09-05 08:00 ?2078次閱讀
    <b class='flag-5'>單片機(jī)</b>STM32可以用Python寫(xiě)嗎?可以的開(kāi)發(fā)板有哪些?

    單片機(jī)燒錄程序的基本步驟是什么

    單片機(jī)燒錄程序是單片機(jī)開(kāi)發(fā)過(guò)程中非常重要的一步,它涉及到將編寫(xiě)好的程序代碼通過(guò)一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)內(nèi)部的存儲(chǔ)器,使單片機(jī)能夠按照預(yù)定的邏
    的頭像 發(fā)表于 09-02 09:47 ?711次閱讀

    單片機(jī)復(fù)位電路的電容是什么電容?

    單片機(jī)復(fù)位電路的電容是一種特殊類(lèi)型的電容,通常被稱(chēng)為“去耦電容”或“旁路電容”。這種電容的主要作用是單片機(jī)的電源線(xiàn)路中提供一個(gè)低阻抗的路徑,以便在電源電壓發(fā)生瞬變時(shí),能夠迅速地吸收
    的頭像 發(fā)表于 08-06 10:31 ?579次閱讀

    PIC單片機(jī)振蕩電路如何選擇晶體?

    PIC單片機(jī)振蕩電路如何選擇晶體? PIC單片機(jī)振蕩電路中選擇晶體是一個(gè)重要的步驟,它直接影響到系統(tǒng)的穩(wěn)定性和性能。本文將詳細(xì)介紹如何
    的頭像 發(fā)表于 01-31 09:28 ?566次閱讀

    示波器測(cè)單片機(jī)輸出波形怎么測(cè)

    示波器是一種用來(lái)測(cè)量和顯示電壓信號(hào)波形的儀器,廣泛應(yīng)用于電子設(shè)備的調(diào)試和測(cè)試單片機(jī)開(kāi)發(fā),示波器可以用來(lái)測(cè)量單片機(jī)的輸出波形,幫助開(kāi)發(fā)
    的頭像 發(fā)表于 12-28 14:53 ?3879次閱讀

    sbit單片機(jī)的作用和用法

    sbit單片機(jī)的作用和用法。 一、sbit的作用和意義 單片機(jī),每個(gè)IO引腳都有特定的寄
    的頭像 發(fā)表于 12-20 09:35 ?1.7w次閱讀

    單片機(jī)并行是什么意思

    單片機(jī)的并行是指能夠同時(shí)執(zhí)行多個(gè)操作或指令的能力。傳統(tǒng)的計(jì)算機(jī)體系結(jié)構(gòu),處理器通常是按照順序執(zhí)行指令,即一條指令執(zhí)行完畢后再執(zhí)行下一條指令。而在單片機(jī)
    的頭像 發(fā)表于 12-20 09:33 ?1148次閱讀

    單片機(jī)boot腳干嘛的

    單片機(jī)boot腳是單片機(jī)的引導(dǎo)腳,用于控制單片機(jī)的啟動(dòng)和引導(dǎo)過(guò)程。單片機(jī)系統(tǒng),boot腳的作
    的頭像 發(fā)表于 12-19 09:47 ?9208次閱讀

    單片機(jī)如何檢測(cè)電流?

    單片機(jī)如何檢測(cè)電流? 隨著科技的發(fā)展,單片機(jī)技術(shù)電子設(shè)備得到了廣泛應(yīng)用。其中,電流檢測(cè)是單片機(jī)的一個(gè)重要功能之一。本文將詳細(xì)介紹
    的頭像 發(fā)表于 12-07 15:37 ?3593次閱讀

    單片機(jī)晶振的工作原理是什么?

    單片機(jī)晶振的工作原理是什么?
    的頭像 發(fā)表于 11-23 09:08 ?883次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>中</b>晶振的工作原理是什么?