标题: 可编程乐曲演奏器 [打印本页]

作者: zd2333    时间: 2018-6-14 10:51
标题: 可编程乐曲演奏器
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit tone=P2^6;

unsigned char timer0h,timer0l,time;
uchar code key[]={
    0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf   
};

uchar code tab[]={
    0xfc,0x43,
    0xfc,0xab,
    0xfd,0x08,
    0xfd,0x32,
    0xfd,0x81,
    0xfd,0xc7,
    0xfe,0x05,
};               

code unsigned char yf[]={
    3,2,2,6,2,2,7,2,2,5,2,2,3,2,2,6,2,2,7,2,2,5,2,2,7,2,2,1,3,2,2,3,4,
    7,2,2,1,3,2,2,3,1,2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,
    2,3,1,3,3,1,2,3,1,1,3,1,7,2,2,5,2,2,6,2,2,2,2,2,5,2,4,6,2,2,2,2,2,5,2,4,
    0,0,0};      

code unsigned char FREQH[]={
    0xF2,0xF3,0xF5,0xF6,0xF7,0xF8,
    0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,
    0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
    0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};   

code unsigned char FREQL[]={
    0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
    0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
    0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
    0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};   

uchar j;     
void delay0()
{
    uchar a,b,c;
    for(a=5;a>0;a--)
        for(b=100;b>0;b--)
        for(c=100;c>0;c--);
}
void delay(unsigned char t)
{
    unsigned char t1;
    unsigned long t2;
    for(t1=0;t1<t;t1++)
    {
        for(t2=0;t2<2000;t2++);
    }
    TR0=0;
}

void song()
{
    TH0=timer0h;
    TL0=timer0l;
    TR0=1;
    delay(time);
}
void main()
{
    unsigned char k,i;
    P1=0xff;
    P3=0x00;
    TR0=0;
    if(P1==0x7f)
    {
        TR0=1;
        TMOD=0x01;
        EA=1;
        ET0=1;
        while(1)
        {
            i=0;
            while(i<55){
                k=yf[i]+7*yf[i+1]-1;
                                timer0h=FREQH[k];
                timer0l=FREQL[k];
                time=yf[i+2];
                i=i+3;
                song();
            }
        }
    }
    else{
        TMOD=0x10;
        EA=1;
        ET1=1;
        P1=0xff;
        while(P1!=0xff)
        {
            delay0();
            for(j=0;j<7;j++)
                if(P1==key[j])
            {
                break;
            }
            TH1=tab[2*j];
            TL1=tab[2*j+1];
            TR1=1;
            while(P1!=0xff);
            TR1=0;
        }
    }
}

void t0int()interrupt 1   
{
    TR0=0;
    tone=!tone;
    TH0=timer0h;
    TL0=timer0l;
    TR0=1;
}

void t1int()interrupt 3   
{
    TH1=tab[2*j];
    TL1=tab[2*j+1];
    tone=!tone;
}







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1