独孤夕林 发表于 2012-12-11 19:17   
会不会是由于按键抖动啊?  
#include<reg52.h> 
#include<intrins.h> 
#define uchar unsigned char 
#define uint unsigned int 
sbit key1=P3^2; 
sbit key2=P3^3; 
sbit beep=P1^5; 
uchar aa=0xfe; 
uchar flag0=0; 
uchar flag1=0; 
uchar Count; 
/*以下数组是音符编码*/ 
unsigned char code SONG[] ={      //祝你平安 
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10, 
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10, 
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80, 
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20, 
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10, 
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00, 
                                  //路边的野华不要采 
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C, 
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20, 
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20, 
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26, 
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20, 
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F, 
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20, 
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B, 
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20, 
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00, 
 
}; 
 
 
void delayms(uint xms) 
{ 
        uint i,j; 
        for(i=xms;i>0;i--) 
                for(j=110;j>0;j--); 
} 
 
/* 
延时子程序,经过软件调试,测得延时程序大概为55us. 
*/ 
void Delay_xMs(uint x) 
{ 
    uint i,j; 
    for(i=0; i<x; i++) 
    { 
        for(j=0; j<3; j++); 
    } 
} 
 
void init() 
{ 
                 
        P0=0xff; 
        beep=0; 
//        EA=1; 
//        EX0=1; 
//        EX1=1; 
        IT0=1; 
        IT1=1; 
 
        TMOD = 0x01;        //设置定时器方式 
        IE          = 0x87;        //开总中断,开定时器0中断,开外部中断0,开外部中断1 
        TH0  = 0xDC;        //定时器赋初值 
        TL0  = 0x00;        //定时器赋初值 
} 
 
/******************************************************************** 
* 名称 : Play_Song() 
* 功能 : 播放蜂鸣器控制程序 
* 输入 : i (选择播放哪首歌曲,0为“祝你平安”,1为“路边的野花你不要采” 
* 输出 : 无 
***********************************************************************/ 
void Play_Song(uchar i) 
{ 
        uchar Temp1,Temp2; 
        uint Addr; 
        Count = 0;                                                //中断计数器清0 
        Addr = i * 217; 
        while(1) 
        { 
                flag0=0; 
                flag1=0; 
                Temp1 = SONG[Addr++]; 
            if (Temp1 == 0xFF)          //休止符 
            { 
                    TR0 = 0; 
                    Delay_xMs(100); 
            } 
            else if (Temp1 == 0x00)          //歌曲结束符 
            { 
                //        P0=0x00; 
                        P 
                    return; 
            } 
            else 
            { 
                    Temp2 = SONG[Addr++]; 
                    TR0 = 1; 
                          while(1) 
                          { 
                            beep = ~beep; 
                            Delay_xMs(Temp1);   //给蜂鸣器固定频率 
                            if(Temp2 == Count)   //固定频率的延时 
                            { 
                                    Count = 0; 
                                    break; 
                            } 
                    } 
            } 
        } 
} 
 
void main() 
{ 
        init(); 
        while(1) 
        { 
                if(flag0==1) 
                {  
                        flag1=0; 
                        P0=aa; 
                        delayms(500); 
                        aa=_crol_(aa,1); 
                } 
                if(flag1==1) 
                { 
                        flag0=0; 
                        if(aa==0xfd)     //注意这里是0xfd,不是0xfe 
                        { 
                                Play_Song(0);                //播放歌曲:祝你平安 
                        } 
                        else 
                        { 
                                Play_Song(1);                //播放歌曲:路边野花不要采 
                        } 
                } 
        } 
} 
 
void exter0() interrupt 0 
{ 
        if(key1==0) 
        { 
                delayms(10); 
                if(key1==0) 
                { 
                        flag0=1; 
                } 
        } 
} 
 
void Time0_Int() interrupt 1 
{ 
        TH0 = 0xDC; 
        TL0 = 0x00; 
        Count++;                        //长度加1 
} 
 
void exter1() interrupt 2 
{ 
        if(key2==0) 
        { 
                delayms(10); 
                if(key2==0) 
                { 
                        flag1=1; 
                } 
        } 
}
 |