基于单片机的电子琴(已解决)

2019-07-16 05:14发布

本帖最后由 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;
  }


}


50G)F33ALYP~%}97(%`D(SM.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
Lovedanpianji
1楼-- · 2019-07-16 07:43
TMOD=0X10;
这设置的是定时器1,改成TMOD=0X01;
另外我看你是想设置成方式1,在主函数力应该再加两句TH0=?;TL0=?;因为方式1是需要重装初值的。
minDragon
2楼-- · 2019-07-16 11:06
Lovedanpianji 发表于 2012-7-16 09:46
TMOD=0X10;
这设置的是定时器1,改成TMOD=0X01;
另外我看你是想设置成方式1,在主函数力应该再加两句TH0=? ...

谢谢指点。。我今天看中断的时候也看到了这个知识点,刚好看到你的回复。。已经解决啦。。可以去优化程序了..
朋仔¥
3楼-- · 2019-07-16 11:34
 精彩回答 2  元偷偷看……
lovezjf234
4楼-- · 2019-07-16 11:44
把这个 delay(150)延时增加试试;还有proteus仿真出来的声音不太好,很杂
minDragon
5楼-- · 2019-07-16 13:14
lovezjf234 发表于 2012-7-14 22:36
把这个 delay(150)延时增加试试;还有proteus仿真出来的声音不太好,很杂

我试过了,还是不行。。不知道是不是Proteus的问题。。
Lovedanpianji
6楼-- · 2019-07-16 14:56
建议你设置成方式2更好,避免重装初值

一周热门 更多>