找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1418|回复: 0
打印 上一主题 下一主题
收起左侧

可编程乐曲演奏器

[复制链接]
跳转到指定楼层
楼主
ID:351679 发表于 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;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表