为啥我这个代码第一次按下按键后是蜂鸣器响一下,后面就一直响了,怎么让他都是响一下呢
#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;
}