打印
[范例教程]

51单片机电子琴

[复制链接]
890|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rosemoore|  楼主 | 2023-11-20 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


各部分软件分析
延时子函数
//延时子函数
void delay(uint z)
{
    uint x,y;
    for(x=z; x>0; x--)
        for(y=340; y>0; y--);
}
初始化子函数
//初始化子函数
void init()
{
    beep=0;
    D1=1;
    D2=0;
    EA=1;//开总中断
    TCON=0x01;//外部中断0设置为边沿触发
    EX0=1;//开外部中断0
    ET0=1;
    ET1=1;
    TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
}
数码管显示子函数
//数码管显示子函数
void display1()
{
    in(table1[aa]); //再传段码
    out();
    W1=0;;
    delay(1); //延迟时间2ms以内
    W1=1;
    in(table1[cc+1]); //再传段码
    out();
    W2=0;
    delay(1); //延迟时间2ms以内
    W2=1;
}
高低音选择子函数
//高低音选择子函数
void yinjie()
{
    if(k10==0)
    {
        delay(5);
        if(k10==0)
        {
            aa=10;
            bb=0;//返回10为seg[10]显示C
        }
    }
    if(k9==0)
    {
        delay(5);
        if(k9==0)
        {
            aa=11;
            bb=1;//返回11为seg[11]显示L
        }
    }
    if(k11==0)
    {
        delay(5);
        if(k11==0)
        {
            aa=12;
            bb=2;//返回12为seg[12]显示H
        }
    }
    if(aa==0)
    {
        aa=13;
    }
}
播放音乐子函数
//播放音乐子函数
void display_music()
{
    TH0=table2[table4[i]-1];
    TL0=table3[table4[i]-1];
    while(flag==0)
    {
        if(i<32)
        {
            TR0=1;
            delay(57*table5[i]);
            i++;
        }
        if(i==32)
        {
            i=0;
        }
    }
}
演奏模式子函数
//演奏模式子函数
void display_play()
{
    TR0=0;
    TR1=0;
    yinjie();
    WE2=1;//关数码管2
    WE1=0;//开数码管1
    P0=table1[aa];
    if(aa!=13&&flag==1)
    {
        if(k1==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k1==0)
            {
                cc=0;
                display1();
            }
        }
        if(k2==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k2==0)
            {
                cc=1;
                display1();
            }
        }
        if(k3==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k3==0)
            {
                cc=2;
                display1();
            }
        }
        if(k4==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k4==0)
            {
                cc=3;
                display1();
            }
        }
        if(k5==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k5==0)
            {
                cc=4;
                display1();
            }
        }
        if(k6==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k6==0)
            {
                cc=5;
                display1();
            }
        }
        if(k7==0)
        {
            TH1=table2[7*bb+cc];
            TL1=table3[7*bb+cc];
            TR1=1;
            while(k7==0)
            {
                cc=6;
                display1();
            }
        }
    }
}
外部0中断子函数
//外部0中断子函数
void wb0() interrupt 0
{
    if(k8==0)
    {
        delay(5);
        while(k8==0);
        flag=~flag;
        D1=~D1;
        D2=~D2;
    }
}
定时器0中断子函数
//定时器0中断子函数
void t0() interrupt 1
{
    TR0=0;
    TH0=table2[table4[i]-1];
    TL0=table3[table4[i]-1];
    beep=~beep;
    TR0=1;
}
3.2.9 定时器1中断子函数
//定时器1中断子函数
void t1() interrupt 3
{
    TR1=0;
    TH1=table2[7*bb+cc];
    TL1=table3[7*bb+cc];
    beep=~beep;
    TR1=1;
}
3.2.10 主函数
//主函数
void main()
{
    init();
    while(1)
    {
        if(flag==0)
            display_music();
        else
            display_play();
    }
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

1363

帖子

2

粉丝