单片机AT89C51电子琴设计??

2024-12-20 13:03:17
推荐回答(2个)
回答1:

  需要的话留下邮箱 我给你全部的入门实验材料
  音乐产生的方法;
  一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示
  音符 频率(HZ)简谱码(T值) 音符 频率(HZ)简谱码(T值)
  低1 DO 262 63628 # 4 FA# 740 64860
  #1 DO# 277 63731 中 5 SO 784 64898
  低2 RE 294 63835 # 5 SO# 831 64934
  #2 RE# 311 63928 中 6 LA 880 64968
  低 3 M 330 64021 # 6 932 64994
  低 4 FA 349 64103 中 7 SI 988 65030
  # 4 FA# 370 64185 高 1 DO 1046 65058
  低 5 SO 392 64260 # 1 DO# 1109 65085
  # 5 SO# 415 64331 高 2 RE 1175 65110
  低 6 LA 440 64400 # 2 RE# 1245 65134
  # 6 466 64463 高 3 M 1318 65157
  低 7 SI 494 64524 高 4 FA 1397 65178
  中 1 DO 523 64580 # 4 FA# 1480 65198
  # 1 DO# 554 64633 高 5 SO 1568 65217
  中 2 RE 587 64684 # 5 SO# 1661 65235
  # 2 RE# 622 64732 高 6 LA 1760 65252
  中 3 M 659 64777 # 6 1865 65268
  中 4 FA 698 64820 高 7 SI 1967 65283
  下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据
  低音0-19之间,中音在20-39之间,高音在40-59之间
  TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
  DW 0,63731,63928,0,64185,64331,64463,0,0,0
  DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
  DW 0,64633,64732,0,64860,64934,64994,0,0,0
  DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
  DW 0,65085,65134,0,65198,65235,65268,0,0,0
  DW 0
  音乐的音拍,一个节拍为单位(C调)
  曲调值 DELAY 曲调值 DELAY
  调4/4 125ms 调4/4 62ms
  调3/4 187ms 调3/4 94ms
  调2/4 250ms 调2/4 125ms
  #include
  unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  unsigned char temp;
  unsigned char key;
  unsigned char i,j;
  unsigned char STH0;
  unsigned char STL0;
  unsigned int code tab[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178};
  void main(void)
  {TMOD=0x01;ET0=1;EA=1;while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}temp=P3;P1_0=~P1_0;P0=table[key];STH0=tab[key]/256;STL0=tab[key]%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}TR0=0;}}P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}temp=P3;P1_0=~P1_0;P0=table[key];STH0=tab[key]/256;STL0=tab[key]%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}TR0=0;}}P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:key=10;break;case 0x07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key];STH0=tab[key]/256;STL0=tab[key]%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}TR0=0;}}P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f;switch(temp){case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}temp=P3;P1_0=~P1_0;P0=table[key];STH0=tab[key]/256;STL0=tab[key]%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f){temp=P3;temp=temp & 0x0f;}TR0=0;}}}}void t0(void) interrupt 1 using 0{TH0=STH0;TL0=STL0;P1_0=~P1_0;}

回答2:

http://hi.baidu.com/wxmmyz/blog/item/8208e5a72b2d0590d1435835.html
这个。呵呵