帮看看这个程序有什么问题

为啥我这个代码第一次按下按键后是蜂鸣器响一下,后面就一直响了,怎么让他都是响一下呢

#include<reg52.h>
#define uint unsigned int 
uint pp;
sbit k1=P3^4;
sbit BEEP=P2^3;
void Delay1ms(int i) 
{
int j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}

void main()
{TMOD=0x01;         
    TR0=1;             
    TH0=0Xff;         
    TL0=0Xa4;
    ET0=1;             
    EA=1;
    
    while(1)
    {
            if(k1==0)            
            BEEP=0;
        if(pp==10000)    
            BEEP=1;
    }
}

void time0() interrupt 1
{    TH0=0Xff;
    TL0=0Xa4;
    pp++;
}

按照你的代码逻辑,每次按下按键后,会导致BEEP引脚输出低电平(BEEP=0),这样当pp自增到10000时,会使BEEP引脚输出高电平(BEEP=1),从而驱动蜂鸣器发声。所以,为了让蜂鸣器只响一次,你需要将BEEP引脚的状态重置,以下是修改后的代码:

void main()
{
    TMOD = 0x01;         
    TR0 = 1;             
    TH0 = 0xff;         
    TL0 = 0xa4;
    ET0 = 1;             
    EA = 1;
    
    while(1)
    {
        if(k1 == 0)            
        {
            BEEP = 0;
            pp = 0;  // 重置pp计数器
        }
        if(pp == 10000)    
        {
            BEEP = 1;
            pp++;   // 避免pp一直等于10000,导致BEEP一直为高电平
        }
    }
}

void time0() interrupt 1
{
    TH0 = 0xff;
    TL0 = 0xa4;
    pp++;
}

在按下按键并关闭蜂鸣器的同时,将pp计数器重置为0。当pp再次累计到10000时,蜂鸣器才会再次响起。

你是什么蜂鸣器,是有源蜂鸣器还是无缘蜂鸣器?
如果是无源蜂鸣器,给1给0都不会响,要给振荡才会响;如果是有源蜂鸣器,有电就会一直响。

加一个标志位,例如:

          if(k1==0 && flag==0)        
{    
            BEEP=0;
            flag=1;
}
        else if(k1 == 1 && flag ==1)
{    
            BEEP=1;
             flag=0;
}