基于51系列单片机设计的简易电子琴 程序电路原理图

资料下载地址:基于51系列单片机设计的简易电子琴 程序电路原理图

概要

系统使用STC12C5A60S2单片机作为主控芯片,PCB采用贴片设计,板子做到纤小精致。
系统拥有两种模式:
一种为弹奏模式,可以弹奏Do~Si 7个音,还有低中高三种音的切换。
一种为播放模式,可以播放保存在单片机内的歌曲段码,且有播放停止、上一首、下一首切换功能。
系统通过OLED显示,使用I2C协议,显示当前模式以及弹奏音符名和播放歌曲名称。
压缩包内附含嘉立创工程文件,Proteus仿真文件,Keil5工程文件

电路原理图

仿真图

部分程序

void main(void)
{
        uint8_t i;
    INIT();
        Led_Init();
        OLED_Init();
        Piano_Display_ON();                              //显示弹奏模式
        Piano_Note();                                          //显示低中高音
    while(1)
    {
        if(!play_flag){
                        Piano_Display_ON();                //弹奏模式
                        Piano_Note();                        
            Piano_Player();                        
                }
        else{
                        Music_Display_ON();                //音乐模式
            Music_Player();                        
                }
    }

}


void INT_0(void) interrupt 0
{   
        Piano_Scale();                                        //四个中断按键函数
}


void Timer0(void) interrupt 1
{
    TR0=0;
        if(music_number==0)
    {
                TH0=table1[music_table1[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table1[i]-1];
        }
        else if(music_number==1)
    {
                TH0=table1[music_table2[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table2[i]-1];
        }
        else if(music_number==2)
    {
                TH0=table1[music_table3[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table3[i]-1];
        }
        else if(music_number==3)
    {
                TH0=table1[music_table4[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table4[i]-1];
        }
        else if(music_number==4)
    {
                TH0=table1[music_table5[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table5[i]-1];
        }
        else if(music_number==5)
    {
                TH0=table1[music_table6[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table6[i]-1];
        }
        else if(music_number==6)
    {
                TH0=table1[music_table7[i]-1];  //取频率常数 和 节拍常数  
                TL0=table2[music_table7[i]-1];
        }
        beep=!beep;
        TR0=1;
}


void Timer1(void) interrupt 3
{
    TR1=0;
    TH1=table1[7*T1_flag    +   PressTime];
    TL1=table2[7*T1_flag    +   PressTime];
    beep=!beep;
    TR1=1;
}
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森旺电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值