1. 程式人生 > >高效蜂鳴器驅動法:用定時器掃描代替軟體延時

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

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

    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;

}    

 

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