高效蜂鳴器驅動法:用定時器掃描代替軟體延時
上班跟上學果然不一樣,就比如一個蜂鳴器的驅動,學生時代寫蜂鳴器的程式倒也直觀:
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;
}
以上,就是剛學會的避免延時死等的方法驅動蜂鳴器,本人菜鳥,要多多學習,多多學習。