|
做一个无源蜂鸣器PWM输出报警声音。
方案一:IO口翻转这条语句(Buzz=~Buzz;)放while(1)循环里,频率变化放定时中断里。正常连续发声。
方案二:IO口翻转,和频率变化都放定时中断里。 声音会间歇性中断,响一下,又停一下。
定时器初始化函数是STC-ISP里生成的,方案一也是正常,方案二为什么有问题。
======== 【定时器初始化】=========
void Timer0Init(void) //10微秒@11.0592MHz
{
AUXR |= 0x80;//定时器时钟1T模式
TMOD &= 0xF0;//设置定时器模式
TMOD |= 0x02;//设置定时器模式0x02-8位自动重装
TL0 = 0x91;//设置定时初始值
TH0 = 0x91;//设置定时重载值
TF0 = 0;//清除TF0标志
TR0 = 1;//定时器0开始计时
}
======== 【定时器中断函数】=========
void TM0_Isr() interrupt 1
{
tpwmcnt++;
if(tpwmcnt==tpwm2)
{
tpwmcnt=0;
Buzz=~Buzz;
}
//上面是IO口翻转,计数达到半个周期翻转一次。
//下面频率周期变化
tchgcnt++;
if(tchgcnt==1000) //1000个10微秒频率变化一次
{
tchgcnt=0;
if(updnflag==1) //频率增大
{
tpwm2++;
if(tpwm2==20) //达到最大频率改变标志
{updnflag=0;}
}
if(updnflag==0) //频率减小
{
tpwm2--;
if(tpwm2==10) //达到最小频率改变标志
{updnflag=1;}
}
}
}
void main()
{
ET0 = 1;
EA = 1;
Timer0Init();
while (1)
{
} |
|