上班跟上学果然不一样,就比如一个蜂鸣器的驱动,学生时代写蜂鸣器的程序倒也直观:
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;
}
以上,就是刚学会的避免延时死等的方法驱动蜂鸣器,本人菜鸟,要多多学习,多多学习。