使用51单片机中的无源蜂鸣器 在进入启动函数后进入中断,BUZZ端口取反,问题是为什么在进入结束函数时只是关闭了中断,BUZZ没有取反,蜂鸣器却不响l呢。
#include
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; //反转蜂鸣器控制点平
}
参考GPT和自己的思路:根据代码和描述来看,可能是由于结束函数没有将BUZZ端口重新设置为高电平,导致蜂鸣器始终处于反转状态,无法响应。建议在结束函数中添加BUZZ=1这行代码来解决问题。另外,建议在中断服务函数中添加一个延迟,使蜂鸣器可以持续一段时间后再停止,而不是立即停止。
不知道你这个问题是否已经解决, 如果还没有解决的话:/******BuzzerWarning******/
#include<reg51.h>
#include"LCD1602.h"
#include"ADC0808.h"
#define uchar unsigned char
#define uint unsigned int
extern code uchar table5[];
extern code uchar table6[];
sbit SPEAKER = P1^7;
void BuzzerWarning0_5V(){
uint t,i;
//SPEAKER = 1;
//LcdPrint11(table5);
for(t=0;t<3;t++){
for(i=0;i<35;i++)
Delay_10ms();
SPEAKER =~ SPEAKER;
}
SPEAKER = 1;
Delay_ms(800);
}
主函数部分: