<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                【107.1 開關感應器的識別與軟件濾波。】 ![](https://img.kancloud.cn/a2/3d/a23df87ac21f61d2182864f67461b009_359x103.png) 上圖107.1.1 獨立按鍵模擬開關感應器 ![](https://img.kancloud.cn/68/91/6891d9a9e89ee7345b1505221de5c26b_252x282.png) 上圖107.1.2 LED電路 什么叫開關感應器?凡是只能輸出0和1這兩種狀態的感應器都可以統稱為開關感應器。前面花了大量的章節講按鍵,按鍵的識別主要是識別電平變化狀態的“下降沿”,程序代碼中有1個特別的變量標志叫“自鎖標志”,還有1個用來消除抖動的“計時器”。本節講的開關感應器跟按鍵很相似,差別在于,開關感應器是識別電平變化狀態的“電平”,程序代碼中沒有“自鎖標志”,但是多增加了1個用來消除抖動的“計時器”,也就是一共有兩個用來消除抖動的“計時器”,這兩個“計時器”相互“清零”相互“抗衡”,從而實現了開關感應器的“消抖”處理,專業術語也叫“軟件濾波”。消抖的時間跟按鍵差不多,我的經驗值是20ms到30ms之間,我平時在項目中喜歡用20ms。 在顯示框架方面,除了之前講過Gu8DisplayUpdate這類“顯示刷新變量”,本節介紹另外一種常用的顯示框架,原理是“某數值跟上一次對比,如果發生了變化(兩數值不一樣),則自動刷新顯示,并及時記錄當前值”。 本節例程實現的功能如下:用K1獨立按鍵模擬開關感應器,K1獨立按鍵“沒有被按下”時是高電平,單片機識別到這種“高電平”,就讓P1.4所在的LED燈發亮;K1獨立按鍵“被按下”時是低電平,單片機識別到這種“低電平”,就讓P1.4所在的LED燈熄滅。 \#include "REG52.H" \#define SENSOR\_TIME 20 //開關感應器的“濾波”時間 void T0\_time(); void SystemInitial(void) ; void Delay(unsigned long u32DelayTime) ; void PeripheralInitial(void) ; void VoiceScan(void); void SensorScan(void); void DisplayTask(void); //顯示的任務函數(LED顯示狀態) sbit P1\_4=P1^4; sbit Sensor\_K1\_sr=P2^2; //開關感應器K1所在的引腳 volatile unsigned char vGu8Sensor\_K1=0; //K1開關感應器的當前電平狀態。 void main() { SystemInitial(); Delay(10000); PeripheralInitial(); while(1) { DisplayTask(); //顯示的任務函數(LED顯示狀態) } } /\* 注釋一: \* 后綴為\_Last這類“對比上一次數值發生變化而自動刷新顯示”在“顯示框架”里是很常見的, \* 目的是,既能及時刷新顯示,又能避免主函數“不斷去執行顯示代碼”而影響程序效率。 \*/ void DisplayTask(void) //顯示的任務函數(LED顯示狀態) { // Su8Sensor\_K1\_Last初始化取值255,只要不為0或者1就行,目的是讓上電就發生第一次刷新。 static unsigned char Su8Sensor\_K1\_Last=255; //記錄K1開關感應器上一次的電平狀態。 if(Su8Sensor\_K1\_Last!=vGu8Sensor\_K1) //如果當前值與上一次值不一樣,就自動刷新 { Su8Sensor\_K1\_Last=vGu8Sensor\_K1; //及時記錄最新值,避免主函數“不斷去執行顯示代碼” if(0==vGu8Sensor\_K1) //如果當前電平狀態為“低電平”,LED熄滅 { P1\_4=1; //LED熄滅 } else //如果當前電平狀態為“高電平”,LED發亮 { P1\_4=0; //LED發亮 } } } /\* 注釋二: \* 本節破題的關鍵: \* 兩個“計時器”相互“清零”相互“抗衡”,從而實現了開關感應器的“消抖”處理, \* 專業術語也叫“軟件濾波”。這種濾波方式,不管是從“高轉成低”,還是“低轉成高”, \* 如果在某個瞬間出現干擾抖動,某個計數器都會及時被“清零”,從而起到非常高效的消抖濾波作用。 \*/ void SensorScan(void) //此函數放在定時中斷里每1ms掃描一次,用來識別和濾波開關感應器 { static unsigned int Su16Sensor\_K1\_H\_Cnt=0; //判斷高電平的計時器 static unsigned int Su16Sensor\_K1\_L\_Cnt=0; //判斷低電平的計時器 if(0==Sensor\_K1\_sr) { Su16Sensor\_K1\_H\_Cnt=0; //在判斷低電平的時候,高電平的計時器被清零,巧妙極了! Su16Sensor\_K1\_L\_Cnt++; if(Su16Sensor\_K1\_L\_Cnt>=SENSOR\_TIME) { Su16Sensor\_K1\_L\_Cnt=0; vGu8Sensor\_K1=0; //此全局變量反饋當前電平的狀態 } } else { Su16Sensor\_K1\_L\_Cnt=0; //在判斷高電平的時候,低電平的計時器被清零,巧妙極了! Su16Sensor\_K1\_H\_Cnt++; if(Su16Sensor\_K1\_H\_Cnt>=SENSOR\_TIME) { Su16Sensor\_K1\_H\_Cnt=0; vGu8Sensor\_K1=1; //此全局變量反饋當前電平的狀態 } } } void T0\_time() interrupt 1 { SensorScan(); //開關感應器的識別與軟件濾波處理 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) { }
                  <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>

                              哎呀哎呀视频在线观看