<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                【91.1 蜂鳴器的硬件電路簡介。】 ![](https://img.kancloud.cn/89/70/8970513a066fe0726b2997dcb0329ce0_194x190.png) 上圖91.1.1 PNP三極管驅動有源蜂鳴器 蜂鳴器有兩種,一種是有源蜂鳴器,一種是無源蜂鳴器。有源蜂鳴器的驅動最簡單,只要通電就一直響,斷電就停,跟驅動LED燈一樣。無源蜂鳴器則不一樣,無源蜂鳴器一直斷電不響,奇怪的是一直通電也不響,只有“通,關,通,關...”反復通電關電的狀態,才會持續發生穩定的聲音,此方式稱為脈沖驅動方式,或者PWM驅動方式。本教程用的是有源蜂鳴器。 蜂鳴器的驅動電路也有兩種常用的方式,一種是NPN三極管驅動,一種是PNP三極管驅動。NPN三極管驅動電路,單片機輸出“1”(高電平)蜂鳴器導通,輸出“0”(低電平)蜂鳴器關閉。而PNP三極管驅動電路恰恰相反,單片機輸出“0”(低電平)蜂鳴器導通,輸出“1”(高電平)蜂鳴器關閉。本教程所用的是PNP三極管驅動電路,如上圖。 【91.2 “非阻塞”驅動程序。】 “驅動層”是相對“應用層”而言。“應用層”發號施令,“驅動層”負責執行。一個好的“驅動層”必須給“應用層”提供快捷便利的調用接口,此接口可以是函數或者全局變量。本節驅動蜂鳴器所用的是全局變量vGu16BeepTimerCnt和vGu8BeepTimerFlag。“應用層”只需給vGu16BeepTimerCnt賦值,給vGu8BeepTimerFlag置1,就可以控制蜂鳴器發聲,賦值越大,發聲越長,500代表發聲500ms,1000代表發聲1000ms,具體細節實現,則由“驅動層”的驅動函數負責執行,驅動函數放在定時中斷函數里定時掃描。為什么不把驅動函數放到main函數的循環里去?因為放在定時中斷里,能保證蜂鳴器的聲音長度是一致的,如果放在main循環里,聲音的長度有可能在某些項目中受到某些必須一氣呵成的任務干擾,得不到及時響應,影響聲音長度的一致性。下面代碼實現的功能是,單片機只要一上電,蜂鳴器就發出一次1000ms長度的“嘀”聲音。 \#include "REG52.H" \#define BEEP\_TIME 1000 //控制蜂鳴器發聲的長度,此處是1000ms void T0\_time(); void SystemInitial(void) ; void Delay(unsigned long u32DelayTime) ; void PeripheralInitial(void) ; void BeepOpen(void); //蜂鳴器發聲 void BeepClose(void); //蜂鳴器關閉 void VoiceScan(void); //蜂鳴器的驅動函數,放在定時中斷里 sbit P3\_4=P3^4; //控制蜂鳴器的IO口。0代表發聲,1代表關閉。 volatile unsigned char vGu8BeepTimerFlag=0; volatile unsigned int vGu16BeepTimerCnt=0; //控制蜂鳴器發聲長度的計時器 void main() { SystemInitial(); Delay(10000); PeripheralInitial(); //此函數內部有“應用層”的賦值操作,控制上電的聲音長度。 while(1) { ; } } void T0\_time() interrupt 1 { VoiceScan(); //蜂鳴器的驅動函數 TH0=0xfc; TL0=0x66; } void SystemInitial(void) { TMOD=0x01; TH0=0xfc; TL0=0x66; EA=1; ET0=1; TR0=1; } void Delay(unsigned long u32DelayTime) { for(;u32DelayTime>0;u32DelayTime--); } void PeripheralInitial(void) { vGu8BeepTimerFlag=0; vGu16BeepTimerCnt=BEEP\_TIME; //“應用層”只需賦值,一上電,蜂鳴器發出1000ms長度的聲音。 vGu8BeepTimerFlag=1; } //蜂鳴器發聲 void BeepOpen(void) { P3\_4=0; //0代表發聲 } //蜂鳴器關閉 void BeepClose(void) { P3\_4=1; //1代表關閉 } //蜂鳴器的驅動函數,放在定時中斷函數里每定時1ms掃描一次。 void VoiceScan(void) { //Su8Lock的作用是避免BeepOpen()被重復掃描影響效率,發聲時只執行一次此函數即可。 //同時,也巧妙借用else結構,實現邏輯順序分解成“先發聲,下一次再開始定時”的兩個步驟。 static unsigned char Su8Lock=0; if(1==vGu8BeepTimerFlag&&vGu16BeepTimerCnt>0) { if(0==Su8Lock) { Su8Lock=1; //進入觸發聲音后就自鎖起來 BeepOpen(); //發聲,此處封裝成函數,為了今后代碼的移植性。 } else //巧妙借用else結構,實現先發聲,下一次中斷再開始計時的邏輯順序。比如, { //如果賦值1,就能確保有1ms的計時發聲。 vGu16BeepTimerCnt--; //定時器自減,控制蜂鳴器發聲的時間長度 if(0==vGu16BeepTimerCnt) { Su8Lock=0; //關閉聲音后,及時解鎖,為下一次觸發做準備 BeepClose(); //關閉聲音,此處封裝成函數,為了今后代碼的移植性。 } } } }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看