为什么在进入结束函数时只是关闭了中断,BUZZ没有取反,蜂鸣器却不响l呢。

使用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.c 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    /******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);
    }
    
    

    主函数部分:


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^