高效蜂鸣器驱动法:用定时器扫描代替软件延时

  上班跟上学果然不一样,就比如一个蜂鸣器的驱动,学生时代写蜂鸣器的程序倒也直观:

    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;

}    

以上,就是刚学会的避免延时死等的方法驱动蜂鸣器,本人菜鸟,要多多学习,多多学习。

猜你喜欢

转载自blog.csdn.net/sjj_zhiyu/article/details/82343716