找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机制作的简易DIY电子琴电路图与源码

[复制链接]
跳转到指定楼层
楼主
用单片机制作的简易DIY电子琴,矩阵键盘图片见附件,代码附下:

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit K1=P3^2;
  6. sbit beep=P3^7;
  7. sbit beep2=P2^7;

  8. sbit p20=P2^0;//切换音乐
  9. sbit p21=P2^1;//播放模式/键盘模式
  10. sbit p22=P2^2;//(录音)

  11. uchar i,ri;
  12. uchar song_Index=0,Tone_Index=0;
  13. uchar *song_Tone,*song_Time;
  14. const LED_tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
  15. 0x82,0xF8,0x80,0x90,0xFF};

  16. uint code Tone_tab[]={
  17. 63773,63965,64137,64215,64360,64488,64603,
  18. 64654,64751,64836,63036,63148,63212,10,65535,64892,64952};
  19. uint recordi[]={0,1,2,3,4,5,6,7};
  20. unsigned keymode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};


  21. //矩阵式键盘
  22. uchar buff;
  23. void delay1ms(void){
  24. uchar i;
  25. for(i=200;i>0;i--);
  26. }

  27. void key_scan(void){
  28. uchar hang,lie;
  29. P1=0xf0;
  30. if((P1&0xf0)!=0xf0) //行码为0,列码为1
  31. {delay1ms();    //消抖动
  32. if((P1&0xf0)!=0xf0){//有键按下,列码为0
  33. hang=0xfe;     //逐行扫描

  34. while((hang&0x08)!=0)//扫描完各行后跳出

  35. //while((hang&0x10)!=0)//4X4
  36. {
  37. P1=hang;
  38. if((P1&0xf0)!=0xf0)//本行有键按下

  39. {lie=(P1&0xf0)|0x0f;
  40. buff=((~hang)+(~lie));
  41. switch(buff){
  42. case 0x11:Tone_Index=0;break;
  43. case 0x21:Tone_Index=1;break;
  44. case 0x41:Tone_Index=2;break;
  45. case 0x81:Tone_Index=3;break;

  46. case 0x12:Tone_Index=4;break;
  47. case 0x22:Tone_Index=5;break;
  48. case 0x42:Tone_Index=6;break;
  49. case 0x82:Tone_Index=7;break;

  50. case 0x14:Tone_Index=8;break;
  51. case 0x24:Tone_Index=9;break;
  52. case 0x44:Tone_Index=15;break;
  53. case 0x84:Tone_Index=16;break;

  54. //case 0x18:Tone_Index=12;break;
  55. //case 0x28:Tone_Index=0;break;
  56. //case 0x48:Tone_Index=1;break;
  57. //case 0x88:Tone_Index=2;break;
  58. }
  59. }
  60. else hang=(hang<<1)|0x01;
  61. }
  62. }
  63. }
  64. }




  65. /*
  66. uint code Tone_tab[]={
  67. 62018,62401,62491,62895,63184,63441,63506,
  68. 63773,63965,64137,64215,64360,64488,64603,
  69. 64654,64751,64836,64876,64948,65012,65067,65535};

  70. uchar code song1_Tone[]={
  71. 11,9,11,14,12,14,12,11,11,7,8,9,8,7,8,
  72. 11,9,11,14,13,12,14,11,11,7,8,9,6,7,
  73. 12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8,
  74. 11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};
  75. uchar code song1_Time[]={
  76. 4,2,2,8,4,2,2,8,4,2,2,4,2,2,12,
  77. 4,2,2,4,2,4,4,8,4,2,2,4,2,12,
  78. 4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16,
  79. 4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff};
  80. */
  81. uchar code song1_Tone[]={//两只老虎
  82. 13,0,13,1,13,2,13,0,13,0,13,1,13,2,13,0,13,2,13,3,13,4,13,13,13,2,13,3,13,4,13,13,13,4,5,4,3,2,13,0,13,4,5,4,3,2,13,0,13,2,13,11,13,0,13,13,2,13,11,13,0,13,13,0xff};
  83. uchar code song1_Time[]={
  84. 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};

  85. uchar code song2_Tone[]={//小星星
  86. 13,0,0,4,4,5,5,4,13,3,3,2,2,1,1,0,13,4,4,3,3,2,2,1,13,4,4,3,3,2,2,1,0xff};
  87. uchar code song2_Time[]={
  88. 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0xff};

  89. uchar code song3_Tone[]={//欢乐颂
  90. 13,2,2,3,4,4,3,2,1,0,0,1,2,2,1,1,13,2,2,3,4,4,3,2,1,0,0,1,2,1,13,0,0,13,1,1,2,0,1,3,2,0,1,3,2,1,0,1,12,13,0xff};
  91. uchar code song3_Time[]={
  92. 3,3,3,3,3,3,3,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0xff};

  93. uchar code song4_Tone[]={//生日快乐
  94. 13,4,4,5,13,4,13,7,13,6,13,13,4,4,5,13,4,13,8,13,7,13,13,0xff};
  95. uchar code song4_Time[]={
  96. 2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};

  97. uchar code song5_Tone[]={//两只老虎
  98. 13,0,13,1,13,2,13,0,13,0,13,1,13,2,13,0,13,2,13,3,13,4,13,13,13,2,13,3,13,4,13,13,13,4,5,4,3,2,13,0,13,4,5,4,3,2,13,0,13,2,13,11,13,0,13,13,2,13,11,13,0,13,13,0xff};
  99. uchar code song5_Time[]={
  100. 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0xff};



  101. void delayms(uint ms)
  102. {uchar a;
  103. while(ms--)
  104. {
  105. for(a=2300;a>0;a--);
  106. }
  107. }
  108. void Timer0() interrupt 1  //中断函数
  109. {
  110. TH0=Tone_tab[Tone_Index]/256;
  111. TL0=Tone_tab[Tone_Index]%256;
  112. beep=~beep;
  113. }

  114. void select(void)
  115. {
  116. if(song_Index==0)
  117. {
  118. song_Tone=song1_Tone;
  119. song_Time=song1_Time;
  120. }
  121. if(song_Index==1)
  122. {
  123. song_Tone=song2_Tone;
  124. song_Time=song2_Time;
  125. }
  126. if(song_Index==2)
  127. {
  128. song_Tone=song3_Tone;
  129. song_Time=song3_Time;
  130. }
  131. if(song_Index==3)
  132. {
  133. song_Tone=song4_Tone;
  134. song_Time=song4_Time;
  135. }
  136. if(song_Index==4)
  137. {
  138. song_Tone=song5_Tone;
  139. song_Time=song5_Time;
  140. }
  141. }

  142. void int_init(void){
  143. TMOD=0X01;
  144. ET0=1;
  145. EX0=1;
  146. IT0=1;
  147. EA=1;
  148. TR0=0;
  149. }

  150. void display(void){
  151. delay1ms();
  152. if(P1!=0xf0) TR0=1;
  153. else TR0=0;

  154. }

  155. void recordplay(void){
  156. uint i=0;
  157. while(i<8&&p22==0){
  158. Tone_Index=recordi[i];
  159. TR0=1;
  160. delayms(150);
  161. TR0=0;
  162. i++;
  163. }
  164. }

  165. void record(void){
  166. recordi[ri]=Tone_Index;
  167. delayms(10);
  168. ri++;

  169. }


  170. void main(void)
  171. {
  172. int_init();
  173. song_Tone=song1_Tone;
  174. song_Time=song1_Time;
  175. i=0;
  176. while(1)
  177. {

  178. if(p20==0){
  179. delayms(100);
  180. song_Index++;
  181. i=0;
  182. if(song_Index==5) song_Index=0;

  183. select();
  184. }

  185. if(p21==0){

  186. if(p22==0){
  187. if(p20==1&&P1!=0xf0) record();//录音
  188. if(p20==0) {recordplay();ri=0;}//录音播放
  189. }

  190. key_scan();
  191. display();
  192. }

  193. else{
  194. P0=LED_tab[song_Index];
  195. TR0=1;
  196. Tone_Index=song_Tone[i];

  197. if(Tone_Index==0xff){
  198. i=0;
  199. TR0=0;}
  200. TR0=1;
  201. delayms(song_Time[Tone_Index]*60);
  202. TR0=0;
  203. i++;
  204. }
  205. }
  206. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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