天天看點

高效蜂鳴器驅動法:用定時器掃描代替軟體延時

  上班跟上學果然不一樣,就比如一個蜂鳴器的驅動,學生時代寫蜂鳴器的程式倒也直覺:

    PWM_SET(0x0a,0x80);//PWM0輸出4.24Khz,占空比50%

    Delay_ms(200);//延時200ms

    PWM_SET(0x0a,0);//PWM0輸出占空比為0        

    這樣就是一個簡單的蜂鳴器響一聲的程式(約200ms)

    但是吧,有的時候200ms還是很重要的,雖然我現在還沒這個意識,但是有經驗的人都會知道的,程式最重要的就是高效,哪怕現在編的程式簡單,資源雖然浪費但是運作效果不影響,但假如想做一名專業人士,節能減排的意識不能少;

    工作中遇到的師兄教我用定時器法避免延時,挺好的法子,讓他寫部落格吧,他又懶得做,我隻好總結一下,也是給自己長長記性,省的忘記了;

    1.定時器子程式中,開1ms延時進入一次中斷

void Timer0_ISR() interrupt 1

{

    T0_INT_FLAG_CLR;//清除Timer0中斷标志

    TH0 = TH0_Reload;   

    TL0 = TL0_Reload;

    Time_10ms++;//每1ms進入一次中斷,自加1

    if(Time_10ms == 10)

    {

        Time_10ms = 0;

        IS_10ms = 1;//每10ms置位一次的标志位

    }

}

    2.蜂鳴器驅動子程式

void pwm_boom(void)

{

    if(IS_10ms == 1)//每10ms進入一次程式

    {

        IS_10ms = 0;

        if(boom_enable == 1)//在别的程式中使能這個标志位,就可以運作以下響一聲程式

        {

           PWM_SET(0x0a,0x80);//PWM0輸出4.24Khz,占空比50%

            //開始響,并計時

            boom_times ++;

            if(boom_times == 20)//每10ms記一次數,20次即200ms

            {

                PWM_SET(0x0a,0);//PWM0輸出占空比為0        

                boom_times = 0;

                boom_enable = 0;

            }                

        }

    }    

}

    3.在主程式的while循環中一直運作着蜂鳴器驅動程式,在需要的地方将是使能蜂鳴器的标志位置位就好了

while(1)

 {

         pwm_boom();

         if( 任意符合你要驅動蜂鳴器的設定)

             //使能蜂鳴器标志位,響一聲,約200ms

                boom_enable = 1;

}    

以上,就是剛學會的避免延時死等的方法驅動蜂鳴器,本人菜鳥,要多多學習,多多學習。