微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机电子琴C代码

51单片机电子琴C代码

时间:11-27 来源:互联网 点击:

    ,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,-1},//《洋娃娃和小熊跳舞》

    };

    uint code tab[]=

    {

    0,63628,63835,64021,64103,64260,64400,64524,

    64580,64684,64777,64820,64898,64968,65030,

    65058,65110,65157,65178,65217,65252,65283

    };

    void delay1(uint ms) //播放歌曲时实现节拍的延时函数

    {

    uchar t;

    while(ms--) for (t=0;t<120;t++);

    }

    void delay(void)

    {

    uchar i;

    for (i=300;i>0;i--);

    }

    void EX0_INT() interrupt 0

    {

    FY=0; LED1=0; LED2=1; STL0=STL0;

    }

    void EX1_INT() interrupt 2

    {

    FY=1; LED1=1; LED2=0;LED3=1;LED4=1;LED5=1;P2=0xff; Tone_Index=-1;Tone_Index++;

    STH0=(tab[Song[k][Tone_Index]])/256;

    STL0=(tab[Song[k][Tone_Index]])%6;

    }

    void time0_int(void) interrupt 1 using 0

    {

    TH0 = STH0;

    TL0 = STL0;

    SPK=!SPK; // 反相,产生输出脉冲

    if(FY==0)

    {P2=~DSY_CODE[k] ;}

    else {if(FY==1) {P2=~GE_CODE[k];}}

    }

    void main(void)

    { LED1=0;

    LED2=1;

    LED3=1;LED4=1;LED5=1;

    P2=0xff;

    IE=0x87;

    TMOD=0x01;

    IT0=1;

    IT1=1;

    while(1)

    {

    if (KeyDown())

    {

    k = KeyNum(); // 调用键盘扫描函数

    if(FY==0)

    {

    STH0 = tab[k]/256;

    STL0 = tab[k]%6;

    TR0 = 1; // 开始计数

    while (KeyUp()==0); // 若没有松开按键,则等待,等待期间弹奏该音符

    TR0 = 0; // 若按键松开,则停止计数,不产生脉冲输出

    }

    else

    {

    while (FY==1)

    {

    if (Song[k][Tone_Index]==-1)

    Tone_Index=0;

    STH0=(tab[Song[k][Tone_Index]])/256;

    STL0=(tab[Song[k][Tone_Index]])%6;

    P2=~GE_CODE[Song[k][Tone_Index]] ;

    TR0 = 1;

    delay1(150*Len[k][Tone_Index]);

    Tone_Index++;

    TR0 = 0;

    }

    }

    if(k>=1&&(k<=7)){LED3=0;LED4=1;LED5=1;}

    else

    {if(k>=8&&(k<=14)){LED3=1;LED4=0;LED5=1;}

    else

    {if (k==0){LED3=1;LED4=1;LED5=1;}

    else

    {LED3=1;LED4=1;LED5=0;}} }

    }

    }

    }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top