使用51单片机中的无源蜂鸣器 在进入启动函数后进入中断,BUZZ端口取反,问题是为什么在进入结束函数时只是关闭了中断,BUZZ没有取反,蜂鸣器却不响l呢。
#include<reg52.h>
sbit BUZZ=P1^6; //蜂鸣器控制引脚
unsigned char T0RH=0; //T0重载值高字节
unsigned char T0RL=0; //T0重载值低字节
void OpenBuzz(unsigned int frequ); //打开蜂鸣器
void StopBuzz(); //关闭蜂鸣器
void main()
{
unsigned int i;
TMOD=0x01; //指定模式 但不启动
EA=1; //中断总使能
while(1)
{
OpenBuzz(4000); //以4khz的频率启动蜂鸣器
for(i=0;i<40000;i++); //延时
StopBuzz();
for(i=0;i<40000;i++);
OpenBuzz(1000); //以1khz的频率启动蜂鸣器
for(i=0;i<40000;i++);
StopBuzz();
for(i=0;i<40000;i++);
}
}
void OpenBuzz(unsigned int frequ)
{
unsigned int reload;
reload=65536-(11059200/12)/(frequ*2); //计算所需的定时器重载值 强制类型转换
T0RH=(unsigned char)(reload>>8); //由给定频率计算定时器重载值 reload两个字节,把16位reload进行转换后得到的低8位移出,把高八位给到T0RH
T0RL=(unsigned char)reload; //16位重载值分解为高低两个字节 把reload低八位赋值给T0RL
TH0=0xFF;
TL0=0xFE; //设定接近溢出的初值,让定时器马上投入工作 随意给定的
ET0=1; //使能t0中断
TR0=1; //启动t
}
void StopBuzz()
{
ET0=0; //关闭定时器和中断
TR0=0;
}
/*t0中断服务函数,用于控制蜂鸣器发声*/
void interrupttimer0() interrupt 1
{
TH0=T0RH; //重新加载重载值
TL0=T0RL;
BUZZ=~BUZZ; //反转蜂鸣器控制点平
}