国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2024年09月08日(星期日)

2020年09月08日 | ATmega328P定時器詳解

發(fā)布者:睿智之光 來源: eefocus關(guān)鍵字:ATmega328P  定時器  組件 手機看文章 掃描二維碼
隨時隨地手機看文章

寫這篇文章,純粹是想為博客拉點點擊量。在博客園,游客訪問好像是不計入閱讀量的,而作為一個十八線博主,注冊用戶的訪問應(yīng)該以搜索引擎為主,博客園首頁為次,個位數(shù)的粉絲就別談了。


所以,希望各位從搜索引擎點進來的朋友,多多評論,有問題咱們一起討論。


我寫過AVR單片機教程,設(shè)計過自己的Arduino板,希望你相信我能給你帶來收獲。

我不想聽你放那么多屁,我只想知道周期為1ms的定時器中斷怎么寫!

什么是定時器

在ATmega328P單片機中,定時/計數(shù)器(Timer/Counter)是這樣的組件:它需要一個時鐘源,驅(qū)動一個8或16位的計數(shù)器遞增或遞減,當(dāng)計數(shù)器等于一個值時,會觸發(fā)一些操作,如產(chǎn)生中斷、翻轉(zhuǎn)引腳電平等。由于定時器的時鐘源是系統(tǒng)時鐘或外接晶振(一種產(chǎn)生頻率精準(zhǔn)的波的器件)分頻得到的,一旦設(shè)置好定時器的工作參數(shù),直到下次調(diào)整參數(shù),定時器都會按照預(yù)期工作,與CPU執(zhí)行的代碼無關(guān)。


為什么要用定時器

之前有過這樣的經(jīng)歷:

跟一個優(yōu)秀作品設(shè)計者聊了幾句,他說同時控制舵機和揚聲器很難控制好延時,揚聲器輸出的音樂節(jié)奏會亂。我第一反應(yīng)當(dāng)然是他沒有用定時器中斷,一問果然如此,并且他不知道中斷也不知道定時器。

還有一位同學(xué),寫TI計算器的程序。在他的一個作品中,每次循環(huán)的計算量不定,循環(huán)間隔也不定,導(dǎo)致游戲效果不好。他的解決方法是根據(jù)計算量計算出循環(huán)最后需要的延時,使得循環(huán)間隔基本保持不變。


這種思路是相當(dāng)優(yōu)秀的。但是如果有定時器可用的話,編程難度會降低,循環(huán)間隔的一致性也會更好,是更加優(yōu)秀的解決方案。


其實你一直在用定時器

Arduino Uno Rev3的3、5、6、9、10、11號端口可以使用analogWrite和tone函數(shù),它們的功能都是利用定時器實現(xiàn)的。用函數(shù)確實方便,但是只知使用而不知其原理就只能停留在技術(shù)的表面——Arduino的強大封裝對開發(fā)者的學(xué)習(xí)有兩面性。


定時器其實不知道什么3號端口,它只知道OC2B。兩種表示之間的對應(yīng)關(guān)系如下表:

端口編號硬件符號
3PD3(PCINT19/OC2B/INT1)
5PD5(PCINT21/OC0B/T1)
6PD6(PCINT22/OC0A/AIN0)
9PB1(PCINT1/OC1A)
10PB2(PCINT2/SS/OC1B)
11PB3(PCINT3/OC2A/MOSI)

寄存器

寄存器是開發(fā)者與硬件打交道的方式。從編程的語法上,可以把寄存器當(dāng)作是變量,可以對它賦值,也可以讀取它的數(shù)值。


寄存器中的位有幾種不同的組織結(jié)構(gòu),它們的存取方式也不盡相同:

TCCR1B寄存器中有4組參數(shù):ICNC1、ICES1、WGM1[3:2]、CS1[2:0]。現(xiàn)在你完全無需理解這些字母的含義,但是得對這些數(shù)字有個概念:WGM1[3:2]表示從WGM13到WGM12;TCCR1B中的1表示該寄存器屬于定時器1,ICNC1和WGM13等名字中的1也是;CS12中的2表示該位為CS1[2:0]位域(bitfield)中的第2位(最低位為第0位)。


ICNC1和ICES1都是1位的位域,它們的值可以是0或1;WGM1[3:2]是2位的位域,它的值可以是00、01、10、11;CS1[2:0]同理。


你也許一眼就能看出二進制的11在十進制中是3,但是你很可能看不出23對應(yīng)10111。在Arduino編程中(語言為C++),二進制數(shù)可以直接寫,無需與十進制或十六進制轉(zhuǎn)換。Arduino提供的方法是B10111,GCC提供的是0b10111(0b前綴字面量是C++14標(biāo)準(zhǔn)才規(guī)定的)。后者是我一直以來的習(xí)慣。


假如我要把這4個參數(shù)分別寫為1、0、0b00、0b101,就要寫:

TCCR1B =     1 << ICNC1

       |     0 << ICES1

       |  0b00 << WGM12

       | 0b101 << CS10

       ;

全是0的可以不寫,寫是為了可讀性。ICNC1是寄存器的第7位,所以代碼中它的值就是7,其他位同理。


如果要判斷ICNC1位是否為1:


if (TCCR1B & 1 << ICNC1)

    // ...

如果要讀取WGM1[3:2]位:


uint8_t wgm = (TCCR1B & 0b11 << WGM12) >> WGM12;

有的位因為不存在而不能寫,如TCCR1B的第5位;有的位即使存在但是只讀所以也不能寫;有的位域分布于多個寄存器中,如WGM1[3:0],低兩位在TCCR1A,高兩位在TCCR1B。


除了一個或多個位的位域以外,有些寄存器是整體使用的:

可以直接當(dāng)變量讀寫:


OCR0A = 233;

uint8_t ocr0a = OCR0A;

還有16位寄存器,雖然讀寫不能用一句匯編搞定,但是高級語言層面上可以:

TCNT1 = 10086;

uint16_t tcnt1 = TCNT1;

不超過255的話可以只寫低字節(jié)TCNT1L。


定時器相關(guān)寄存器總覽:

定時器的工作模式

讀數(shù)據(jù)手冊無疑是深入了解單片機的最好方法,可惜很多人沒這個耐心,幾十頁的英語也不是每個人都吃得消的。有些中文書打著介紹AVR單片機的幌子翻譯數(shù)據(jù)手冊,不僅沒有營養(yǎng)還漏洞百出,我不也推薦。寫這篇文章,也有避免后人重蹈覆轍的目的。


當(dāng)然,除了有代碼示例以外,本文再“詳解”也詳細(xì)不過數(shù)據(jù)手冊,不過至少可以讓你對定時器有個大致的印象,不致于讓你讀的時候一頭霧水。


ATmega328P有3個定時器:定時器0、定時器1和定時器2(簡單粗暴)。0和2都是8位的,2支持異步工作;1是16位的,精度更高,支持更多工作模式。我接觸過其他型號的單片機,AVR的定時器是相對簡單的。


定時器有3種工作模式:普通模式、CTC模式、PWM模式,其中PWM還分快速PWM、相位矯正(波形居中)PWM、相位與頻率矯正PWM(頻率可以任取,僅限定時器1)。

先講各種模式中共通的部分。定時器需要一個時鐘源,它可以是:

時鐘源適用范圍
所有
clkI/O/N,N=1,8,64,256,1024clkI/O/N,N=1,8,64,256,1024
(clkI/OclkI/O為系統(tǒng)時鐘,16MHz)
定時器0/1
T0(4)引腳上升/下降沿定時器0
T1(5)引腳上升/下降沿定時器1
clkT2S/N,N=1,8,32,64,128,256,1024clkT2S/N,N=1,8,32,64,128,256,1024
(clkT2SclkT2S為系統(tǒng)時鐘或外置32kHz晶振)
定時器2

工作模式之間的區(qū)別在于計數(shù)器的變化方向與范圍,介紹之前需要先下3個定義:

名稱描述
BOTTOM0,計數(shù)器的最小值
MAX對8位定時器為0xFF,對16位定時器為0xFFFF,計數(shù)器的最大可能值
TOP計數(shù)器達到這個值時,可能會被清零,或變化方向改變
對定時器0和2,可以為MAX或OCRnA
對定時器1,可以為0x00FF、0x01FF、0x03FF、OCR1A或ICR1
  • 普通模式中,計數(shù)器從0開始增長到MAX,然后溢出回到0,周而復(fù)始。頻率為(clkclk為定時器時鐘頻率)


    clkMAX+1clkMAX+1


  • CTC模式和快速PWM模式中,計數(shù)器從0開始增長到TOP,然后不再繼續(xù)增長而是直接回到0,重新開始增長。頻率為


    clkTOP+1clkTOP+1


  • 兩種相位矯正PWM模式中,計數(shù)器從0到TOP,再從TOP回到0,如此循環(huán)。頻率為


    clk2TOPclk2TOP


計數(shù)器比較

當(dāng)計數(shù)器的值與OCRnA或OCRnB相等時,可以對OCnx的電平進行一些操作。

  • 所有模式下,OCnx都可以不連接定時器。

  • 非PWM模式下,可以把OCnx置為低電平、高電平或翻轉(zhuǎn)電平,tone就是這樣實現(xiàn)的;

  • PWM模式下,有正相和反相兩種模式,正相為OCRnx越大占空比越高,analogWrite就是這樣實現(xiàn)的;反相反之;有些配置下OCnA可以被翻轉(zhuǎn),請參考數(shù)據(jù)手冊。

由于引腳電平可以有宏觀表現(xiàn),我們終于可以開始寫代碼了。


先試試tone。在9號端口上連接一個蜂鳴器,使用定時器1的CTC模式,產(chǎn)生440Hz方波:

void setup() {

  pinMode(9, OUTPUT);

  TCCR1A = 0b01 << COM1A0 | 0b00 << WGM10;

  TCCR1B = 0b01 << WGM12 | 0b001 << CS10;

  OCR1A = 18181;

}


void loop() {

  

}


OCR1A = 18181是怎么來的呢?每次計數(shù)器與OCR1A相等電平翻轉(zhuǎn),兩次為一周期,頻率為clk2(OCR1A+1)clk2(OCR1A+1)。先取clkclk為不分頻試試,算出OCR1A為18181,沒有超過最大值65535,因此就取這個。如果超過了,就要把定時器頻率下調(diào),直到OCRnx合理為止。

void setup() {

  pinMode(3, OUTPUT);

  TCCR2A = 0b10 << COM2B0 | 0b11 << WGM20;

  TCCR2B = 0 << WGM22 | 0b100 << CS20;

}


int brightness = 0;

int fadeAmount = 5;


void loop() {

  OCR2B = brightness;

  brightness = brightness + fadeAmount;

  if (brightness <= 0 || brightness >= 255)

    fadeAmount = -fadeAmount;

  delay(30);

}


如果要讓程序以頻率為參數(shù)計算出合適的分頻系數(shù)與OCRnx值,可以參考tone的實現(xiàn)。

再試試analogWrite。在3號端口上連接一個LED,使用定時器2的快速PWM模式,實現(xiàn)呼吸燈的效果:


在快速PWM模式中,正相輸出占空比不能為0,反相輸出占空比不能為1,如果要達到這兩個值,需要斷開引腳與定時器的連接,用digitalWrite等方法輸出。

定時器中斷

懶得寫了,我抄我自己:

中斷,是單片機的精華。

當(dāng)一個事件發(fā)生時,CPU會停止當(dāng)前執(zhí)行的代碼,轉(zhuǎn)而處理這個事件,這就是一個中斷。觸發(fā)中斷的事件成為中斷源,處理事件的函數(shù)稱為中斷服務(wù)程序(ISR)。

中斷在單片機開發(fā)中有著舉足輕重的地位——沒有中斷,很多功能就無法實現(xiàn)。比如,在程序干別的事時接受UART總線上的輸入,而uart_scan_char等函數(shù)只會接收調(diào)用該函數(shù)后的輸入,先前的則會被忽略。利用中斷,我們可以在每次接受到一個字節(jié)輸入時把數(shù)據(jù)存放到緩沖區(qū)中,程序可以從緩沖區(qū)中讀取已經(jīng)接收的數(shù)據(jù)。

AVR單片機支持多種中斷,包括外部引腳中斷、定時器中斷、總線中斷等。每一個中斷被觸發(fā)時,通過中斷向量表跳轉(zhuǎn)到對應(yīng)ISR。如果一個中斷對應(yīng)的ISR不存在,鏈接器會把復(fù)位地址放在那里,如果這個中斷被響應(yīng)程序就會復(fù)位(但單片機不會復(fù)位)。

那么,我們以前從未寫過ISR,但經(jīng)常改變引腳電平,為什么沒有復(fù)位呢?因為中斷默認(rèn)是不開啟的。要啟用一個中斷,需要讓兩個位于不同寄存器中的位為1,一個是中斷對應(yīng)的中斷使能位,每個中斷都有各自的位,另一個是全局中斷使能位,位于寄存器SREG中,不能直接存取,需要通過定義在頭文件中的sei()函數(shù)開全局中斷,相對地,cli()用于關(guān)全局中斷。

定時器中斷同樣有著舉足輕重的地位——操作系統(tǒng)的任務(wù)調(diào)度就是在定時器中斷中進行的。如果沒有中斷,CPU就在那自顧自地執(zhí)行代碼,它哪知道什么時候要調(diào)度呢?正因為定時器是獨立于CPU運行的,時間控制非常精準(zhǔn)且不受影響,因而能解決前面優(yōu)秀作品和計算器游戲中的問題。


什么時候需要定時器中斷呢?當(dāng)你發(fā)現(xiàn)沒有中斷的程序結(jié)構(gòu)不能勝任你的需求時,或者……把所有代碼都放進ISR。比如,每1ms產(chǎn)生一次中斷,先檢測按鍵是否被按下,根據(jù)其情況執(zhí)行相應(yīng)操作。


每個定時器都有3個中斷源:OVF、COMPA和COMPB(定時器1還有CAPT),分別在計數(shù)器溢出、與OCRnA、OCRnB相等時觸發(fā)。

產(chǎn)生精準(zhǔn)的定時器中斷,一般使用CTC模式和COMPA中斷,分頻系數(shù)與TOP值的計算方法與上面相同。


void setup() {

  pinMode(13, OUTPUT);

  TCCR1A = 0b00 << WGM10;

  TCCR1B = 0b01 << WGM12 | 0b100 << CS10;

  OCR1A = 31249;

  TIMSK1 = 1 << OCIE1A;

  sei();

}


ISR(TIMER1_COMPA_vect)

{

  static bool light = true;

  digitalWrite(13, light = !light);

}


void loop() {

  

}

在這個程序中:


WGM1[3:0] = 0b0100,定時器1工作于CTC模式,TOP為OCR1A;


CS1[2:0] = 0b100,時鐘為clkI/O/256,分頻系數(shù)N=256;


OCR1A為31249;


TIMSK1中OCIE1A置位,sei()開全局中斷,COMPA中斷啟用;


ISR(TIMER1_COMPA_vect)為定時器1COMPA中斷的函數(shù)頭,TIMER1_COMPA_vect這個名字可以當(dāng)成函數(shù)來用;


定時器中斷頻率為f=clkTOP+1=F_CPUN?(OCR1A+1)=16×106256×(31249+1)=2Hz。


一般而言,定時器中斷的頻率不要超過10kHz,1kHz已經(jīng)能夠應(yīng)付旋轉(zhuǎn)編碼器了。


進入中斷后,全局中斷會自動禁用,如果中斷代碼執(zhí)行期間發(fā)生了定時器事件,對應(yīng)的中斷不會觸發(fā),而是等到當(dāng)前中斷返回后再處理。可以用sei()開中斷,但是要小心代碼執(zhí)行時間接近或超過周期的情況,雖然定時準(zhǔn)了,但中斷嵌套導(dǎo)致內(nèi)存耗盡,程序跑飛了,得不償失??梢钥紤]另一種時間同步的方法,在loop的最后輪詢OCFnA直到它置位:


void setup() {

  pinMode(13, OUTPUT);

  TCCR1A = 0b00 << WGM10;

  TCCR1B = 0b01 << WGM12 | 0b100 << CS10;

  OCR1A = 31249;

}


void loop() {

  static bool light = true;

  digitalWrite(13, light = !light);

  while (!(TIFR1 & 1 << OCF1A))

    ;

  TIFR1 |= 1 << OCF1A;

}

這種程序結(jié)構(gòu)有定時作用,但不能中斷。頻率較高的時候,推薦使用后一種,頂多定時不準(zhǔn),程序還是能運行的。


照顧一下Arduino

Arduino庫非常貪心,在setup之前就把所有定時器都開啟了(也許你不同意,但我想把這種行為稱為“流氓”——想想百度網(wǎng)盤偷了你多少帶寬和流量!)。定時器0是時間相關(guān)函數(shù)的命根,除非你想把它割掉,否則不要動定時器0。如果你不動定時器0,5和6的analogWrite和tone可以照常使用。


如果你要用定時器1,如用以下代碼配置周期為1ms的定時器中斷:


void init_timer1()

{

  TCCR1A = 0b00 << WGM10;

  TCCR1B = 0b01 << WGM12 | 0b011 << CS10;

  OCR1AL = 249;

  TIMSK1 = 1 << OCIE1A;

  sei();

}


void setup() {

  init_timer1();

  // ...

}


ISR(TIMER1_COMPA_vect)

{

  // ...

}


void loop() {

  // ...

}

需要注意:


由于Arduino庫在setup之前動過TCCR1A,不能認(rèn)為在執(zhí)行我們的代碼時TCCR1A為默認(rèn)值,因此即使我們想要的是默認(rèn)值也不能省略。


9和10端口不僅analogWrite和tone不能用,digitalWrite也不能用!請直接使用寄存器寫引腳電平,參見:AVR單片機教程——數(shù)字IO寄存器。


定時器2同理,3和11不能用。


void init_timer2()

{

  TCCR2A = 0b10 << WGM20;

  TCCR2B = 0 << WGM22 | 0b100 << CS20;

  OCR2A = 249;

  TIMSK2 = 1 << OCIE2A;

  sei();

}


void setup() {

  init_timer2();

  // ...

}


ISR(TIMER2_COMPA_vect)

{

  // ...

}


void loop() {

  // ...

}

其他功能

有些工作模式下,向OCRnx寫值并不會立即更新它,而是會在計數(shù)器達到BOTTOM或TOP時更新,這保證了PWM占空比的正確性,但是CTC模式中OCRnx是立即更新的,可能會錯過匹配。


定時器1有輸入捕獲單元,可以對信號進行計數(shù),計數(shù)達到一定值時觸發(fā)中斷。外部中斷同樣可以捕獲引腳電平變化,但是中斷是有成本的,信號頻率不能太高,而定時器的捕獲功能更加強大。


定時器1有額外的ICR1寄存器,作為TOP值可以實現(xiàn)許多特殊的功能,并且由于定時器1是16位的,即使是復(fù)用時的精度也比定時器0和2高,見思考題1。


定時器2可以用外置晶振驅(qū)動,比較適合實現(xiàn)實時時鐘,可以在系統(tǒng)時鐘停止的省電狀態(tài)下工作。


關(guān)鍵字:ATmega328P  定時器  組件 引用地址:ATmega328P定時器詳解

上一篇:AVR單片機教程——ADC
下一篇:AVR單片機教程——走向高層

推薦閱讀

//使用函數(shù)指針來實現(xiàn)typedef   void(*PFUN)(void);pFun  =(PFUN)0x8000;        (*pFun)();  #define  GotoHere(a)   ((void (*)(void))a)() GotoHere(0X8000);  asm("JP $8000");
在今天的發(fā)布會上,華為發(fā)布了全球首款藍牙&低功效藍牙無線芯片——麒麟 A1芯片,擁有著出色的抗干擾能力與高性能的雙通道藍牙連接,同比延遲降低30%,傳輸速率提升2.8倍,再現(xiàn)無損高清音質(zhì)!此外,余承東展示首款搭載麒麟A1芯片的無線耳機FreeBuds 3亮相,尺寸小巧、性能強大。據(jù)介紹,華為FreeBuds 3采用開放式的耳塞設(shè)計,符合人體工學(xué),佩戴舒適。...
/*******************************************************************//*******************超聲波測距儀************************************//*******************(液晶屏顯示)************************************//*******************晶振 11.0592MHz********************************/#include <reg52.h>#include "12864.h"#include <l298....
近日,中國領(lǐng)先的半導(dǎo)體晶圓廠自動化設(shè)備企業(yè)彌費科技宣布完成超億元A輪融資,本輪融資由啟明創(chuàng)投領(lǐng)投,金浦智能、紅曄資本跟投。本輪融資資金將用于擴大公司運營規(guī)模、加大研發(fā)投入、拓展海外市場等。彌費科技于2014年創(chuàng)辦于上海,是一家技術(shù)驅(qū)動型的半導(dǎo)體晶圓廠自動化設(shè)備公司,專注于生產(chǎn)、研發(fā)、銷售適用于半導(dǎo)體晶圓廠的自動物料搬運系統(tǒng)(AMHS, Au...

史海拾趣

問答坊 | AI 解惑

AT89C51可以直接代替8751嗎

同樣的程序分別寫入8751和89c51,使用8751系統(tǒng)運行正常,但使用89c51卻不工作。為什么?…

查看全部問答∨

有沒集成wifi功能的單片機或處理器件芯片

有沒集成wifi功能的單片機或處理器件芯片. 我想將該處理器做一個WIFI終端設(shè)備來用. 芯片價錢…

查看全部問答∨

請教uCOS移植問題

這兩天終于把uCOS2.86移植到自己的板上了,自己在DEMO框架中寫了一個簡單的測試,下載到FLASH中可以正常調(diào)試和運行。試著把它改到在SRAM中運行,希望以后調(diào)試時可以減少燒錄FLASH次數(shù)。照著參考做了一些改動:將STM32F_FLASH.ICF 改為STM ...…

查看全部問答∨

Xilinx Spartan-6 LX9

9月10日到9月20日:查找資料。了解XINILIX的開發(fā)工具的使用方法和產(chǎn)品的定義、模塊的劃分。9月21日到9 月25日:各模塊的硬件結(jié)構(gòu)的定義和設(shè)計。9月26日到9月30日:模塊的整合。測試系統(tǒng)的性能。10月1日到10月10日:文檔的整理?!?

查看全部問答∨

物聯(lián)網(wǎng)入門者的幾個問題

本人初入物聯(lián)網(wǎng)行業(yè),孜孜以求中。。。目前接觸比較多的是富士通的RFID芯片,有幾個菜鳥的問題請教:在RFID中為什么包括富士通和TI這些大佬都采用鐵電存儲(FRAM)技術(shù)(我們用的富士通MB97R803/804系列都配置FRAM),不是說這個技術(shù)因為難以大容 ...…

查看全部問答∨

ARM Cortex A系列處理器與蘋果A系列處理器區(qū)別

ARM Cortex A系列處理器與蘋果A系列處理器區(qū)別…

查看全部問答∨

【跟TI學(xué)電源】系列-----運算放大器穩(wěn)定性分析(TI合集)

運算放大器穩(wěn)定性分析(TI合集) 大家看下面的截圖,如果有的朋友就免了,    …

查看全部問答∨

關(guān)于cc2530協(xié)議棧里的休眠和喚醒機制的疑問

請問有大俠了解cc2530協(xié)議棧里的休眠和喚醒機制嗎? 怎么控制休眠的時間長短呢? halSleep( uint16 osal_timeout )這個函數(shù)傳入的參數(shù)是osal_next_timeout()獲取的 不明白這個獲取時間的函數(shù)的意義 我在halSleep( uint16 osal_timeout )函數(shù)下 ...…

查看全部問答∨

《運算放大器噪聲優(yōu)化手冊》閱讀【Ⅶ】1/f噪聲

本帖最后由 dontium 于 2015-1-23 11:21 編輯 1/f噪聲構(gòu)成了低頻噪聲的主要部分。一般只關(guān)注0.1hz-10hz。而雙極性運放的1/f噪聲要小一些。 對于低頻應(yīng)用,消除1/f噪聲的辦法是采用零漂移運放,如自穩(wěn)零,斬波,或者兩者的結(jié)合,如ADI的AD862 ...…

查看全部問答∨

mos管驅(qū)動問題求助!

今天遇到一件奇怪的事情,我用IR2110驅(qū)動IRF3710,在不加mos管之前,2110的高端輸出是好的,波形如下: 可是接上mos管之后,驅(qū)動波形就變成這個樣子了: 不知道這個是怎么回事,,,,,,,, …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved