本帖最后由 minDragon 于 2012-7-21 19:31 编辑
请高手指点下,按键消除抖动后,进入定时中断需要延时多久?我这里的程序是几个按键单音测试,可是按下去之后,除了case 1(发出Do的声音),其他的按下去后声音会很抖,不连续,不知道哪里出现了问题。望指点。。
附上
仿真图,在最下面
#include <reg51.h>
sbit speaker=P3^0;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;
unsigned char y;
void delay(unsigned char x)
{
unsigned i;
while(x--)
for(i=0;i<125;i++){}
}
void T1ISR(void) interrupt 1
{
switch(y)
{
case 1:
TH0=64580/256;
TL0=64580%256;
speaker=~speaker;
break;
case 2:
TH0=64684/256;
TL0=64684%256;
speaker=~speaker;
break;
case 3:
TH0=64777/256;
TL0=64777%256;
speaker=~speaker;
case 4:
TH0=64820/256;
TL0=64820%256;
speaker=~speaker;
}
}
main()
{
EA=1;
ET0=1;
TMOD=0X10;
TR0=0;
while(1)
{
if(D1==0)
{
delay(5);
if(D1==0)
{
y=1;
while(!D1)
{
TR0=1;
delay(150);
TR0=0;
}
}
}
if(D2==0)
{
delay(5);
if(D2==0)
{
y=2;
while(!D2)
{
TR0=1;
delay(150);
TR0=0;
}
}
}
if(D3==0)
{
delay(10);
if(D3==0)
{
y=3;
while(!D3)
{
TR0=1;
delay(100);
}
}
}
TR0=0;
if(D4==0)
{
delay(10);
if(D4==0)
{
y=4;
while(!D4)
{
TR0=1;
delay(100);
}
}
} TR0=0;
}
}
-
这设置的是定时器1,改成TMOD=0X01;
另外我看你是想设置成方式1,在主函数力应该再加两句TH0=?;TL0=?;因为方式1是需要重装初值的。
谢谢指点。。我今天看中断的时候也看到了这个知识点,刚好看到你的回复。。已经解决啦。。可以去优化程序了..
我试过了,还是不行。。不知道是不是Proteus的问题。。
一周热门 更多>