单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:693|回复:1

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

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

电路原理图如下:
SCH_Schematic1_1-P1_2023-12-13.png


3D图.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真图.png


单片机源程序如下:
  1. #include< STC12C5A60S2.H>
  2. #include "MusicPlayer.h"

  3. sbit beep=P2^2;

  4. void INIT(void)
  5. {
  6.    beep   = 1   ;
  7. //       AUXR       = 0x00 ;
  8.        TMOD   = 0x11 ;
  9.        TH1=table1[7*T1_flag   +   PressTime];
  10.    TL1=table2[7*T1_flag   +   PressTime];
  11.        IT0           = 0         ;
  12.        ET0           = 1         ;      
  13.        ET1           = 1   ;
  14.    EX0           = 1   ;
  15.        EA           = 1   ;
  16.       
  17. }

  18. void main(void)
  19. {
  20.        uint8_t i;
  21.    INIT();
  22.        Led_Init();
  23.        OLED_Init();
  24.        Piano_Display_ON();                     //显示弹奏模式
  25.        Piano_Note();                             //显示低中高音
  26.    while(1)
  27.    {
  28.        if(!play_flag){
  29.                  Piano_Display_ON();           //弹奏模式
  30.                  Piano_Note();                
  31.          Piano_Player();                
  32.            }
  33.        else{
  34.                  Music_Display_ON();           //音乐模式
  35.          Music_Player();                
  36.            }
  37.    }

  38. }


  39. void INT_0(void) interrupt 0
  40. {  
  41.        Piano_Scale();                           //四个中断按键函数
  42. }


  43. void Timer0(void) interrupt 1
  44. {
  45.    TR0=0;
  46.        if(music_number==0)
  47.    {
  48.            TH0=table1[music_table1[i]-1];  //取频率常数 和 节拍常数  
  49.            TL0=table2[music_table1[i]-1];
  50.        }
  51.        else if(music_number==1)
  52.    {
  53.            TH0=table1[music_table2[i]-1];  //取频率常数 和 节拍常数  
  54.            TL0=table2[music_table2[i]-1];
  55.        }
  56.        else if(music_number==2)
  57.    {
  58.            TH0=table1[music_table3[i]-1];  //取频率常数 和 节拍常数  
  59.            TL0=table2[music_table3[i]-1];
  60.        }
  61.        else if(music_number==3)
  62.    {
  63.            TH0=table1[music_table4[i]-1];  //取频率常数 和 节拍常数  
  64.            TL0=table2[music_table4[i]-1];
  65.        }
  66.        else if(music_number==4)
  67.    {
  68.            TH0=table1[music_table5[i]-1];  //取频率常数 和 节拍常数  
  69.            TL0=table2[music_table5[i]-1];
  70.        }
  71.        else if(music_number==5)
  72.    {
  73.            TH0=table1[music_table6[i]-1];  //取频率常数 和 节拍常数  
  74.            TL0=table2[music_table6[i]-1];
  75.        }
  76.        else if(music_number==6)
  77.    {
  78.            TH0=table1[music_table7[i]-1];  //取频率常数 和 节拍常数  
  79.            TL0=table2[music_table7[i]-1];
  80.        }
  81.        beep=!beep;
  82.        TR0=1;
  83. }


  84. void Timer1(void) interrupt 3
  85. {
  86.    TR1=0;
  87.    TH1=table1[7*T1_flag   +   PressTime];
  88.    TL1=table2[7*T1_flag   +   PressTime];
  89.    beep=!beep;
  90.    TR1=1;
  91. }
复制代码

仿真程序与立创工程: 电子琴-STC12C5A60S2.7z(2.83 MB, 下载次数: 20)

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

ID:1119420发表于 2024-5-11 09:34|显示全部楼层
这个怎么解压呀

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

Powered by 单片机教程网