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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【87.1 信手拈來的軟件定時器。】 初學者會疑惑,51單片機只有2個定時器T0和T1,是不是太少了一點?2個定時器怎能滿足實際項目的需要,很多項目涉及到的定時器往往十幾個,怎么辦?這個問題的奧秘就在本節的內容。 51單片機內置的2個定時器T0和T1,是屬于硬件定時器,硬件定時器是一個母體,它可以孕育出N個軟件定時器,實際項目中,我們需要多少個定時器只需要從同一個硬件定時器中斷里構造出對應數量的軟件定時器即可。構造N個軟件定時器的框架如下: //“軟件定時器1”的相關變量 volatile unsigned char vGu8TimeFlag\_1=0; volatile unsigned int vGu16TimeCnt\_1=0; //“軟件定時器2”的相關變量 volatile unsigned char vGu8TimeFlag\_2=0; volatile unsigned int vGu16TimeCnt\_2=0; //“軟件定時器3”的相關變量 volatile unsigned char vGu8TimeFlag\_3=0; volatile unsigned int vGu16TimeCnt\_3=0; void main() { vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=1000; //“軟件定時器1”的定時時間是1000ms vGu8TimeFlag\_1=1; vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=500; //“軟件定時器2”的定時時間是500ms vGu8TimeFlag\_2=1; vGu8TimeFlag\_3=0; vGu16TimeCnt\_3=250; //“軟件定時器3”的定時時間是250ms vGu8TimeFlag\_3=1; while(1) //主循環 { if(0==vGu16TimeCnt\_1) //“軟件定時器1”的時間到了 { ...在這里執行具體的功能代碼 } if(0==vGu16TimeCnt\_2) //“軟件定時器2”的時間到了 { ...在這里執行具體的功能代碼 } if(0==vGu16TimeCnt\_3 //“軟件定時器3”的時間到了 { ...在這里執行具體的功能代碼 } } } void T0\_time() interrupt 1 //每1ms中斷一次的定時中斷函數 { if(1==vGu8TimeFlag\_1&&vGu16TimeCnt\_1>0) //在定時中斷里衍生出“軟件定時器1” { vGu16TimeCnt\_1--; } if(1==vGu8TimeFlag\_2&&vGu16TimeCnt\_2>0) //在定時中斷里衍生出“軟件定時器2” { vGu16TimeCnt\_2--; } if(1==vGu8TimeFlag\_3&&vGu16TimeCnt\_3>0) //在定時中斷里衍生出“軟件定時器3” { vGu16TimeCnt\_3--; } //按上面的套路繼續寫,可以衍生出N個“軟件定時器”,只要不超過單片機的RAM和ROM。 } 【87.2 練習例程。】 現在根據上述程序框架,編寫3個LED燈閃爍的程序。第1個LED燈的一閃一滅的周期是2秒,第2個LED燈的一閃一滅的周期是1秒,第3個LED燈一閃一滅的周期是0.5秒。這3個燈的閃爍頻率是不一樣的,因此需要3個軟件定時器。該例子其實也是一個多任務并行處理的典型例子,這3個LED燈就代表3個不同的任務,它們之間是通過switch這個關鍵語句進行多任務并行處理的。switch的精髓在于根據某個特定條件切換到對應的步驟(或稱“跳轉到對應的步驟”)。 ![](https://img.kancloud.cn/0f/49/0f49cc4e7b34f0e8c13dd7e514906c88_214x279.png) 圖87.2.1 灌入式驅動8個LED \#include "REG52.H" \#define BLINK\_TIME\_1 1000 //時間是1000ms \#define BLINK\_TIME\_2 500 //時間是500ms \#define BLINK\_TIME\_3 250 //時間是250ms sbit P0\_0=P0^0; sbit P0\_1=P0^1; sbit P0\_2=P0^2; //“軟件定時器1”的相關變量 volatile unsigned char vGu8TimeFlag\_1=0; volatile unsigned int vGu16TimeCnt\_1=0; //“軟件定時器2”的相關變量 volatile unsigned char vGu8TimeFlag\_2=0; volatile unsigned int vGu16TimeCnt\_2=0; //“軟件定時器3”的相關變量 volatile unsigned char vGu8TimeFlag\_3=0; volatile unsigned int vGu16TimeCnt\_3=0; unsigned char Gu8Step\_1=0; //軟件定時器1的switch切換步驟 unsigned char Gu8Step\_2=0; //軟件定時器2的switch切換步驟 unsigned char Gu8Step\_3=0; //軟件定時器3的switch切換步驟 void main() { TMOD=0x01; //設置定時器0為工作方式1 TH0=0xfc; //產生1ms中斷的TH0初始值 TL0=0x66; //產生1ms中斷的TL0初始值 EA=1; //開總中斷 ET0=1; //允許定時0的中斷 TR0=1; //啟動定時0的中斷 while(1) //主循環 { //軟件定時器1控制的LED燈閃爍 switch(Gu8Step\_1) { case 0: if(0==vGu16TimeCnt\_1) { P0\_0=0; vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; vGu8TimeFlag\_1=1; Gu8Step\_1=1; } break; case 1: if(0==vGu16TimeCnt\_1) { P0\_0=1; vGu8TimeFlag\_1=0; vGu16TimeCnt\_1=BLINK\_TIME\_1; vGu8TimeFlag\_1=1; Gu8Step\_1=0; } break; } //軟件定時器2控制的LED燈閃爍 switch(Gu8Step\_2) { case 0: if(0==vGu16TimeCnt\_2) { P0\_1=0; vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=BLINK\_TIME\_2; vGu8TimeFlag\_2=1; Gu8Step\_2=1; } break; case 1: if(0==vGu16TimeCnt\_2) { P0\_1=1; vGu8TimeFlag\_2=0; vGu16TimeCnt\_2=BLINK\_TIME\_2; vGu8TimeFlag\_2=1; Gu8Step\_2=0; } break; } //軟件定時器3控制的LED燈閃爍 switch(Gu8Step\_3) { case 0: if(0==vGu16TimeCnt\_3) { P0\_2=0; vGu8TimeFlag\_3=0; vGu16TimeCnt\_3=BLINK\_TIME\_3; vGu8TimeFlag\_3=1; Gu8Step\_3=1; } break; case 1: if(0==vGu16TimeCnt\_3) { P0\_2=1; vGu8TimeFlag\_3=0; vGu16TimeCnt\_3=BLINK\_TIME\_3; vGu8TimeFlag\_3=1; Gu8Step\_3=0; } break; } } } void T0\_time() interrupt 1 //定時器0的中斷函數,每1ms單片機自動執行一次此函數 { if(1==vGu8TimeFlag\_1&&vGu16TimeCnt\_1>0) //在定時中斷里衍生出“軟件定時器1” { vGu16TimeCnt\_1--; } if(1==vGu8TimeFlag\_2&&vGu16TimeCnt\_2>0) //在定時中斷里衍生出“軟件定時器2” { vGu16TimeCnt\_2--; } if(1==vGu8TimeFlag\_3&&vGu16TimeCnt\_3>0) //在定時中斷里衍生出“軟件定時器3” { vGu16TimeCnt\_3--; } TH0=0xfc; //重裝初值,不能忘 TL0=0x66; //重裝初值,不能忘 }
                  <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>

                              哎呀哎呀视频在线观看