找回密码
 立即注册

QQ登录

只需一步,快速开始

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

绝对干货 单片机8键电子琴设计(源码+仿真)

  [复制链接]
跳转到指定楼层
楼主
当初的设计亲自试验,可用,欢迎需要的小伙伴下载

制作出来的实物图如下:



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


单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. sbit beep  = P2^5;           //蜂鸣器定义

  5. sbit K1=P1^0;//给P1^0定义,控制DO的发音
  6. sbit K2=P1^1;//给P1^1定义,控制XI的发音
  7. sbit K3=P1^2;//给P1^2定义,控制LA的发音
  8. sbit K4=P1^3;//给P1^3定义,控制SO的发音
  9. sbit K5=P3^4;//给P3^4定义,控制FA的发音
  10. sbit K6=P3^5;//给P3^5定义,控制MI的发音
  11. sbit K7=P3^6;//给P3^6定义,控制RE的发音
  12. sbit K8=P3^7;//给P3^7定义,控制DO的发音

  13. sbit K9=P2^0;//音乐播放按键
  14. uchar flag_en = 0;           //开始放歌
  15. uchar flag_i = 0;

  16. //数码管段选定义       0    1    2    3   4           5        6         7          8           9        
  17. uchar code smg_du[]={0xde,0x90,0xcd,0xd9,0x93,0x5b,0x5f,0xd0,0xdf,0xdb
  18. //                                           A        B         C          D           E   F        不显示
  19.                                          };         //断码        

  20. uchar m,n;
  21. uchar code T[49][2]={{0,0},
  22. {0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},
  23. {0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},
  24. {0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},
  25. {0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}
  26. };
  27. uchar code music1[][2]={{0,4},           //青花瓷
  28. {0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},{0,4},{17,4},{19,4},{21,4},
  29. {24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,16},{0,4},
  30. {17,4},{19,4},{17,4},{17,4},{19,4},{17,4},{19,4},{19,4},{21,8},{24,4},{21,4},{21,12},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},{0,4},{24,4},{24,4},{21,4},
  31. {19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},{0,4},{17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,12},{12,4},{21,8},{19,4},{19,8},{17,16},
  32. {0xFF,0xFF}};

  33. uchar code music2[][2]={{0,4},          //生日快乐
  34. {17,6},{17,2},{19,8},{17,8},{22,8},{21,16},
  35. {17,6},{17,2},{19,8},{17,8},{24,8},{22,16},{17,6},{17,2},{29,8},{26,8},{22,8},{21,8},{19,8},{27,6},{27,2},{26,8},{22,8},{24,8},{22,16},
  36. {0xFF,0xFF}};

  37. uchar code music3[][2]={{0,4},         //爱情买卖
  38. {22,4},{22,4},{17,4},{15,4},{15,4},{17,12},
  39. {15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},{0,4},
  40. {20,4},{20,4},{20,4},{17,4},{20,4},{20,4},{20,4},{17,4},
  41. {22,4},{17,4},{17,4},{15,4},{15,4},{17,12},
  42. {22,4},{22,4},{17,4},{15,4},{15,4},{17,12},
  43. {15,4},{15,2},{17,2},{15,4},{13,4},{13,4},{15,12},
  44. {20,4},{20,4},{20,2},{17,2},{17,4},{20,4},{20,4},{20,2},{17,2},{17,2},{17,2},
  45. {24,4},{20,4},{20,2},{17,2},{17,4},{20,4},{22,12},
  46. {17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8},
  47. {24,4},{22,2},{24,2},{22,4},{20,4},{15,4},{17,12},
  48. {15,4},{15,4},{15,4},{10,4},{15,4},{17,4},{20,8},
  49. {17,4},{24,4},{24,4},{20,4},{15,4},{17,12},
  50. {17,4},{22,4},{25,4},{25,4},{17,4},{22,4},{25,8},
  51. {29,4},{27,2},{29,2},{27,4},{25,4},{25,4},{27,12},
  52. {29,4},{29,2},{27,4},{25,4},{27,6},{27,2},{25,4},{24,4},
  53. {20,4},{20,2},{17,2},{20,4},{20,2},{22,2},{22,16},
  54. {0xFF,0xFF}};
  55. void delay(uchar p)
  56. {
  57.     uchar i,j;
  58.     for(;p>0;p--)
  59.     for(i=181;i>0;i--)
  60.     for(j=181;j>0;j--);
  61. }

  62. void pause()
  63. {
  64.     uchar i,j;
  65.     for(i=150;i>0;i--)
  66.     for(j=150;j>0;j--);
  67. }


  68. /***********************1ms延时函数*****************************/
  69. void delay_1ms(uint q)
  70. {
  71.         uint i,j;
  72.         for(i=0;i<q;i++)
  73.                 for(j=0;j<120;j++);
  74. }

  75. /******************按键程序*************************/
  76. void key()          //按键程序
  77. {
  78.         if(K1==0)
  79.         {
  80.                 delay_1ms(10);         //按键去抖动
  81.                 if(K1==0)
  82.                 {
  83.                         P0=smg_du[0];//使数码管显示该音调的字符
  84.                         while(!K1)
  85.                         {
  86.                                 m = 8;
  87.                                 TR0 = 1;           //打开定时器
  88.                         }//使蜂鸣器发出相应频率的声音;
  89.                         TR0 = 0;              //关闭定时器
  90.                 }
  91.         }
  92.         if(K2==0)
  93.         {
  94.                 delay_1ms(10);         //按键去抖动
  95.                 if(K2==0)
  96.                 {
  97.                         P0=smg_du[1];//使数码管显示该音调的字符
  98.                         while(!K2)
  99.                         {
  100.                                 m = 9;
  101.                                 TR0 = 1;           //打开定时器
  102.                         }//使蜂鸣器发出相应频率的声音;
  103.                         TR0 = 0;              //关闭定时器
  104.                 }
  105.         }
  106.         if(K3==0)
  107.         {
  108.                 delay_1ms(10);         //按键去抖动
  109.                 if(K3==0)
  110.                 {
  111.                         P0=smg_du[2];//使数码管显示该音调的字符
  112.                         while(!K3)
  113.                         {
  114.                                 m = 10;
  115.                                 TR0 = 1;           //打开定时器
  116.                         }//使蜂鸣器发出相应频率的声音;
  117.                         TR0 = 0;              //关闭定时器
  118.                 }
  119.         }
  120.         if(K4==0)
  121.         {
  122.                 delay_1ms(10);         //按键去抖动
  123.                 if(K4==0)
  124.                 {
  125.                         P0=smg_du[3];//使数码管显示该音调的字符               
  126.                         while(!K4)
  127.                         {
  128.                                 m = 11;
  129.                                 TR0 = 1;           //打开定时器
  130.                         }//使蜂鸣器发出相应频率的声音;
  131.                         TR0 = 0;              //关闭定时器
  132.                 }
  133.         }
  134.         if(K5==0)
  135.         {
  136.                 delay_1ms(10);         //按键去抖动
  137.                 if(K5==0)
  138.                 {
  139.                         P0=smg_du[4];//使数码管显示该音调的字符
  140.                         while(!K5)               
  141.                         {
  142.                                 m = 12;
  143.                                 TR0 = 1;           //打开定时器
  144.                         }//使蜂鸣器发出相应频率的声音;
  145.                         TR0 = 0;              //关闭定时器
  146.                 }
  147.         }
  148.         if(K6==0)
  149.         {
  150.                 delay_1ms(10);         //按键去抖动
  151.                 if(K6==0)
  152.                 {
  153.                         P0=smg_du[5];//使数码管显示该音调的字符
  154.                         while(!K6)         
  155.                         {
  156.                                 m = 13;
  157.                                 TR0 = 1;           //打开定时器
  158.                         }//使蜂鸣器发出相应频率的声音;
  159.                         TR0 = 0;              //关闭定时器
  160.                 }
  161.         }
  162.         if(K7==0)
  163.         {
  164.                 delay_1ms(10);         //按键去抖动
  165.                 if(K7==0)
  166.                 {
  167.                         P0=smg_du[6];//使数码管显示该音调的字符
  168.                         while(!K7)
  169.                         {
  170.                                 m = 14;
  171.                                 TR0 = 1;           //打开定时器
  172.                         }//使蜂鸣器发出相应频率的声音;
  173.                         TR0 = 0;              //关闭定时器
  174.                 }
  175.         }
  176.         if(K8==0)
  177.         {
  178.                 delay_1ms(10);         //按键去抖动
  179.                 if(K8==0)
  180.                 {
  181.                         P0=smg_du[7];//使数码管显示该音调的字符
  182.                         while(!K8)
  183.                         {
  184.                                 m = 15;
  185.                                 TR0 = 1;           //打开定时器
  186.                         }//使蜂鸣器发出相应频率的声音;
  187.                         TR0 = 0;              //关闭定时器
  188.                 }
  189.         }
  190.         P0 = 0x20;
  191.         K9 = 1;           
  192.         if(K9==0)
  193.         {
  194.                 delay_1ms(10);         //按键去抖动
  195.                 if(K9==0)
  196.                 {
  197.                         flag_en ++;
  198.                         flag_i = 0;
  199.                         if(flag_en > 3)
  200.                         {
  201.                                 flag_en = 0;        
  202.                                 TR0 = 0;
  203.                         }        
  204.                         while(!K9)
  205.                         {
  206.                         }//使蜂鸣器发出相应频率的声音;
  207.                 }
  208.         }
  209. }


  210. /******************主程序**********************/           
  211. void main()
  212. {
  213.         P0 = P1 = P2 = P3 = 0xff;
  214.         TMOD=0x01;  EA=1; ET0=1;    //定时器0初始化
  215.         while(1)
  216.         {
  217.                 key();          //按键程序
  218.                 if(flag_en == 1)         //青花瓷
  219.                 {
  220.                         m=music1[flag_i][0];n=music1[flag_i][1];            //放歌
  221.                         P0 = smg_du[m % 8];          //显示
  222.                         if(m==0x00)
  223.                         {
  224.                                 TR0=0;
  225.                                 beep = 1;
  226.                                 delay(n);
  227.                                 flag_i++;
  228.                         }
  229.                         else if(m==0xFF)                                 //放歌结束
  230.                         {
  231.                                 TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
  232.                         else if(m==music1[flag_i+1][0])
  233.                                 {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
  234.                         else
  235.                                 {TR0=1;delay(n);flag_i++;}
  236.                 }
  237.                 else
  238.                         beep = 1 ;

  239.                 if(flag_en == 2)         //生日歌
  240.                 {
  241.                         m=music2[flag_i][0];n=music2[flag_i][1];            //放歌
  242.                         P0 = smg_du[m % 8];          //显示
  243.                         if(m==0x00)
  244.                         {
  245.                                 TR0=0;
  246.                                 beep = 1;
  247.                                 delay(n);
  248.                                 flag_i++;
  249.                         }
  250.                         else if(m==0xFF)                                 //放歌结束
  251.                         {
  252.                                 TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
  253.                         else if(m==music2[flag_i+1][0])
  254.                                 {TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
  255.                         else
  256.                                 {TR0=1;delay(n);flag_i++;}
  257.                 }
  258.                 else
  259. ……………………

  260. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

程序等资料51hei附件下载:
单片机8键电子琴.7z (1.46 MB, 下载次数: 751)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:449377 发表于 2018-12-30 18:18 | 只看该作者
有没有16键的啊
回复

使用道具 举报

板凳
ID:483705 发表于 2019-3-4 09:49 | 只看该作者

真的会唱好多歌曲!!!酷毙了啊!!!
回复

使用道具 举报

地板
ID:497882 发表于 2019-4-1 19:45 | 只看该作者
楼主你的这个可以直接放8节音吗?doremifa这几个就够了的。
回复

使用道具 举报

5#
ID:531751 发表于 2019-5-9 17:13 | 只看该作者
赞一个!!!
回复

使用道具 举报

6#
ID:531751 发表于 2019-5-9 20:25 来自手机 | 只看该作者
左下角是啥呀?
回复

使用道具 举报

7#
ID:182775 发表于 2019-6-12 23:00 | 只看该作者
谢谢楼主,很有用!!!!!!!!!!!
回复

使用道具 举报

8#
ID:621345 发表于 2019-10-9 20:25 | 只看该作者
可以,很有帮助,谢谢
回复

使用道具 举报

9#
ID:624669 发表于 2019-10-31 14:50 来自手机 | 只看该作者
开始参考,坐等焊接
回复

使用道具 举报

10#
ID:624669 发表于 2019-10-31 14:50 来自手机 | 只看该作者
感谢大佬!都是现成的
回复

使用道具 举报

11#
ID:624669 发表于 2019-10-31 15:06 | 只看该作者
这个电路图貌似在哪家店见过
回复

使用道具 举报

12#
ID:624669 发表于 2019-10-31 15:12 | 只看该作者
这个是可以直接播放音乐的吗,也可以通过按键发声音
回复

使用道具 举报

13#
ID:624669 发表于 2019-10-31 15:24 | 只看该作者
仿真软件用multisim可以吗
回复

使用道具 举报

14#
ID:539658 发表于 2019-11-2 20:56 | 只看该作者
厉害,谢谢
回复

使用道具 举报

15#
ID:634898 发表于 2019-11-3 20:19 | 只看该作者
这个真的酷毙了,感谢楼主分享
回复

使用道具 举报

16#
ID:634994 发表于 2019-11-3 21:00 | 只看该作者
酷毙了  好多歌都能弄出来
回复

使用道具 举报

17#
ID:642523 发表于 2019-11-19 14:18 | 只看该作者
感谢楼主
回复

使用道具 举报

18#
ID:659058 发表于 2019-12-8 20:12 | 只看该作者
感谢楼主
回复

使用道具 举报

19#
ID:24810 发表于 2019-12-23 11:23 | 只看该作者
以前看到一个程序,用STC15K单片机,可以存 真实音色进去,通过DA转换出来的,声音更真实。
回复

使用道具 举报

20#
ID:423971 发表于 2019-12-24 11:35 | 只看该作者
赞!!下载来看看 多谢楼主
回复

使用道具 举报

21#
ID:672981 发表于 2019-12-25 14:57 | 只看该作者
请问大佬 有原理图讲解视频吗?很需要哦
回复

使用道具 举报

22#
ID:781068 发表于 2020-6-16 15:14 | 只看该作者
下下来看看
回复

使用道具 举报

23#
ID:783877 发表于 2020-6-19 10:14 | 只看该作者
大佬厉害 向大佬学习
回复

使用道具 举报

24#
ID:784300 发表于 2020-6-20 19:07 | 只看该作者
836219677 发表于 2019-11-3 21:00
酷毙了  好多歌都能弄出来

可以播放吗?为啥我下载了播放不出来啊
回复

使用道具 举报

25#
ID:855035 发表于 2020-12-5 23:33 来自手机 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

26#
ID:888052 发表于 2021-3-3 15:45 | 只看该作者
厉害呀楼主,不错不错,学到了
回复

使用道具 举报

27#
ID:935529 发表于 2021-6-9 17:17 | 只看该作者
沃德哇咔 发表于 2019-12-25 14:57
请问大佬 有原理图讲解视频吗?很需要哦

有讲解吗?
回复

使用道具 举报

28#
ID:936280 发表于 2021-7-30 19:45 | 只看该作者
仿真怎么打开呀?
回复

使用道具 举报

29#
ID:561301 发表于 2021-8-5 10:53 | 只看该作者
刚学单片机,学着搞一个玩
回复

使用道具 举报

30#
ID:350104 发表于 2021-8-9 11:26 | 只看该作者
很好的应用 推荐一下
回复

使用道具 举报

31#
ID:976016 发表于 2021-11-29 13:26 | 只看该作者
这个板子还在吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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