电子琴的设计原理

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-09-13
单片机AT89C51电子琴设计的原理图和c程序???

#include
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口取出
P3_4=0; //使P3_4为低电平,这样可以判断第一竖排有没有键按下
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;
}
你自己看下程序吧,我也不愿意注释。
这个是能发出16个音符声音的

你是上理的吧?

22. 电子琴
1. 实验任务
(1. 由4X4组成16个按钮矩阵,设计成16个音。
(2. 可随意弹奏想要表达的音乐。
2. 电路原理图

图4.22.1
3. 系统板硬件连线
(1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;
(2. 把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
4. 相关程序内容
(1. 4X4行列式键盘识别;
(2. 音乐产生的方法;
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器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
2、音乐的音拍,一个节拍为单位(C调)
曲调值 DELAY 曲调值 DELAY
调4/4 125ms 调4/4 62ms
调3/4 187ms 调3/4 94ms
调2/4 250ms 调2/4 125ms
对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。
下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。
在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。
5. 程序框图

图4.22.2
6. 汇编源程序
KEYBUF EQU 30H
STH0 EQU 31H
STL0 EQU 32H
TEMP EQU 33H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 ;T0中断入口
START: MOV TMOD,#01H ;T0工作方式1
SETB ET0
SETB EA
WAIT:
MOV P3,#0FFH ;输入口置1准备工作
CLR P3.4
MOV A,P3 ;读键盘
ANL A,#0FH ;保持低四位
XRL A,#0FH ;
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
LJMP DK1
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#1
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#2
LJMP DK1
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#3
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK1A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
CLR TR0
NOKEY1:
MOV P3,#0FFH
CLR P3.5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#7
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK2A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
CLR TR0
NOKEY2:
MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#8
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#9
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#11
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
CLR TR0
NOKEY3:
MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#12
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#13
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#14
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#15
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
CLR TR0
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
MOV TH0,STH0
MOV TL0,STL0
CPL P1.0
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END
7. C语言源程序
#include <AT89X51.H>
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;
}

用AT89C51单片机做比较简单配上按键键盘,三极管驱动一个喇叭就能实现,下面是我调试过的单片机程序供参考

;DIAN ZI QIN 电子琴
SPK EQU P1.0
FKEY EQU 20H.0
DI EQU 71H
GAO EQU 72H
KEY_NO EQU 73H
NO EQU 74H
TC EQU 75H
OUTBIT EQU 08002H
OUTSEG EQU 08004H
IN EQU 08001H

ORG 0000H
JMP BEGIN
ORG 0BH
JMP TO_INT

BEGIN:
MOV TMOD,#00000000B
MOV IE ,#10000010B
MOV R4,#1
MOV R3,#1
CALL PLAY

MOV R4,#2
MOV R3,#1
CALL PLAY

JMP RUN
JMP $

PLAY:
CALL LOAD_VALUE
CALL SOUND_ON
PL1:
MOV R5,#30
CALL DELAY
DJNZ R3,PL1
CALL SOUND_OFF
MOV R5,#3
CALL DELAY
RET

PLAY_SONG1:
MOV TC,#0
PA0:
MOV DPTR,#SONG1
MOV A,TC
MOVC A,@A+DPTR
MOV R4,A
CJNE A,#0FFH,PA1
RET
PA1:
MOV DPTR,#LEN
MOV A,TC
MOVC A,@A+DPTR
MOV R3,A
CALL PLAY
INC TC
JMP PA0
RET

PLAY_SONG2:
MOV TC,#0
PB0:
MOV DPTR,#SONG2
MOV A,TC
MOVC A,@A+DPTR
MOV R4,A
CJNE A,#0FFH,PB1
RET
PB1:
MOV DPTR,#LEN
MOV A,TC
MOVC A,@A+DPTR
MOV R3,A
CALL PLAY
INC TC
JMP PB0
RET

SOUND_ON:
SETB TR0
RET

SOUND_OFF:
CLR TR0
RET

LOAD_VALUE:
MOV DPTR,#HI_LIST
MOV A,R4
MOVC A,@A+DPTR
MOV GAO,A
MOV DPTR,#LO_LIST
MOV A,R4
MOVC A,@A+DPTR
MOV DI,A
RET

TO_INT:
MOV TL0,DI
MOV TH0,GAO
CPL SPK
RETI

HI_LIST:
DB 0,226,229,232,233,236,238,240
LO_LIST:
DB 0,4,13,10,20,3,8,6

SONG1: DB 1,2,3,4,5,6,7,0FFH
SONG2: DB 7,6,5,4,3,2,1,0FFH
LEN: DB 2,2,2,2,2,2,2,0FFH

DELAY:
MOV R6,#50
D1:MOV R7,#50
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET

TABLE_DIG:
DB 16H,15H,14H,0FFH
DB 13H,12H,11H,10H
DB 0DH,0CH,09H,0AH
DB 0EH,03H,06H,0FH
DB 08H,02H,05H,0BH
DB 00H,01H,04H,07H

SCAN:
MOV DPTR ,#OUTBIT
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#IN
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET

GET_KEY:
MOV DPTR,#OUTBIT
MOV P2,DPH
MOV R0,#LOW(IN)
MOV R1,#00100000B
MOV R2,#6
KLOOP:
MOV A,R1
CPL A
MOVX @DPTR,A
CPL A
RR A
MOV R1,A
MOVX A,@R0
CPL A
ANL A,#0FH
JNZ GOON1
DJNZ R2,KLOOP
MOV R2,#0FFH
SJMP EXIT
GOON1:
MOV R1,A
MOV A,R2
DEC A
RL A
RL A
MOV R2,A
MOV A,R1
MOV R1,#4
LOOPC:
RRC A
JC EXIT
INC R2
DJNZ R1,LOOPC
EXIT:
MOV A,R2
MOV DPTR,#TABLE_DIG
MOVC A,@A+DPTR
MOV R2,A
MOV KEY_NO,A
RET

SO:
MOV R3,#1
CALL PLAY
RET

SOP:
CJNE A,#1,A1
MOV R4,#1
CALL SO
RET
A1:
CJNE A,#2,A2
MOV R4,#2
CALL SO
RET
A2:
CJNE A,#3,A3
MOV R4,#3
CALL SO
RET
A3:
CJNE A,#4,A4
MOV R4,#4
CALL SO
RET
A4:
CJNE A,#5,A5
MOV R4,#5
CALL SO
RET
A5:
CJNE A,#6,A6
MOV R4,#6
CALL SO
RET
A6:
CJNE A,#7,A7
MOV R4,#7
CALL SO
RET
A7:
CJNE A,#0FH,A8
CALL PLAY_SONG1
RET
A8:
CJNE A,#0BH,A9
CALL PLAY_SONG2
RET
A9:
RET

RUN:
LOOP:
CALL SCAN
JZ LOOP
CALL GET_KEY
MOV A,KEY_NO
CALL SOP
LJMP LOOP
END

简单的说就是按键触发信号发给处理器,再由处理器调用音色库音色通过功放电路输出或者通过数码接口进行数字输出。控制面板上的按钮来选择处理器对音色、音量、输出方式、伴奏的控制。

玩具和简单的老式电子琴就简单得多,按键做为开关接通内部发声单元,进行固定频率的发声。或者由初级的单片机处理发声频率。

电子琴的工作原理一般有FM(调频)模式和PCM(采样)模式。

现在常用的电子琴的常见品牌有YANMAHA 和CASIO,海南的乐手比较喜欢使用YAMAHA的产品,因为它的设置比较合理,现场使用非常

方便;音色比较真实,使用效果更佳。

单独用一具电子琴,就可以现场作出类似一支完整乐队的效果。所以现在一些演出场合中,比较流行一具电子琴(有些会再加上一具合成器)的单人编制(简称单编),或一具电子琴和一把吉他的双人编制(简称双编)。搞单编需要乐手具备较高的电子琴操作和演奏水平。本版中的“啊方十指琴魔”就是这样的单编高手之一。搞单编或双编对电子琴的要求也较高,在YAMAHA的电子琴系列中,一般要PSR 410以上级别的产品才能达到乐手们常说的“能用”的水平。

电振荡乐

以电振荡作为激励声源的乐器,称为电振荡乐器


目前人们能见到的各种电子琴、电子合成器、电子鼓机等都属于电振荡
乐器。
说明:当演奏者按下键盘中的某一琴键时,琴键下面的电路就将信号传
送给振荡器
1
和振荡器2,产生相应的音高振荡频率;手指触键的力度信号
也会同时传给包络发生器
1
和包络发生器2,并通知滤波器和放大器产生相
应的音量及音色的变化;最后,声音信号通过放大器输出。图中低频振荡器
的作用,是能够根据演奏者的需要,对所有其它部分——振荡器、滤波器和
放大器——进行调制,从而使合成器能够发出颤音的效果。

目前,国外生产的电子合成器以及较高档的电子琴都有MIDI
接口,相互
间可串接使用。目前较流行的使用方法是用一台计算机通过MIDI
接口来控制
所有相关的电子乐器和音响效果发生器,从而能够方便地产生丰富多彩的音
乐音响效果。

用AT89C51单片机做比较简单配上按键键盘,三极管驱动一个喇叭就能实现,下面是我调试过的单片机程序供参考;DIANnbsp;ZInbsp;QINnbsp;电子琴nbsp;SPKnbsp;EQUnbsp;P1.0nbsp;FKEYnbsp;EQUnbsp;20H.0nbsp;DInbsp;EQUnbsp;71Hnbsp;GAOnbsp;EQUnbsp;72Hnbsp;KEY_NOnbsp;EQUnbsp;73Hnbsp;NOnbsp;EQUnbsp;74Hnbsp;TCnbsp;EQUnbsp;75Hnbsp;OUTBITnbsp;EQUnbsp;08002Hnbsp;OUTSEGnbsp;EQUnbsp;08004Hnbsp;INnbsp;EQUnbsp;08001Hnbsp;ORGnbsp;0000Hnbsp;JMPnbsp;BEGINnbsp;ORGnbsp;0BHnbsp;JMPnbsp;TO_INTnbsp;BEGIN:nbsp;MOVnbsp;TMOD,#00000000Bnbsp;MOVnbsp;IEnbsp;,#10000010Bnbsp;MOVnbsp;R4,#1nbsp;MOVnbsp;R3,#1nbsp;CALLnbsp;PLAYnbsp;MOVnbsp;R4,#2nbsp;MOVnbsp;R3,#1nbsp;CALLnbsp;PLAYnbsp;JMPnbsp;RUNnbsp;JMPnbsp;$nbsp;PLAY:nbsp;CALLnbsp;LOAD_VALUEnbsp;CALLnbsp;SOUND_ONnbsp;PL1:nbsp;MOVnbsp;R5,#30nbsp;CALLnbsp;DELAYnbsp;DJNZnbsp;R3,PL1nbsp;CALLnbsp;SOUND_OFFnbsp;MOVnbsp;R5,#3nbsp;CALLnbsp;DELAYnbsp;RETnbsp;PLAY_SONG1:nbsp;MOVnbsp;TC,#0nbsp;PA0:nbsp;MOVnbsp;DPTR,#SONG1nbsp;MOVnbsp;A,TCnbsp;MOVCnbsp;A,@A+DPTRnbsp;MOVnbsp;R4,Anbsp;CJNEnbsp;A,#0FFH,PA1nbsp;RETnbsp;PA1:nbsp;MOVnbsp;DPTR,#LENnbsp;MOVnbsp;A,TCnbsp;MOVCnbsp;A,@A+DPTRnbsp;MOVnbsp;R3,Anbsp;CALLnbsp;PLAYnbsp;INCnbsp;TCnbsp;JMPnbsp;PA0nbsp;RETnbsp;PLAY_SONG2:nbsp;MOVnbsp;TC,#0nbsp;PB0:nbsp;MOVnbsp;DPTR,#SONG2nbsp;MOVnbsp;A,TCnbsp;MOVCnbsp;A,@A+DPTRnbsp;MOVnbsp;R4,Anbsp;CJNEnbsp;A,#0FFH,PB1nbsp;RETnbsp;PB1:nbsp;MOVnbsp;DPTR,#LENnbsp;MOVnbsp;A,TCnbsp;MOVCnbsp;A,@A+DPTRnbsp;MOVnbsp;R3,Anbsp;CALLnbsp;PLAYnbsp;INCnbsp;TCnbsp;JMPnbsp;PB0nbsp;RETnbsp;SOUND_ON:nbsp;SETBnbsp;TR0nbsp;RETnbsp;SOUND_OFF:nbsp;CLRnbsp;TR0nbsp;RETnbsp;LOAD_VALUE:nbsp;MOVnbsp;DPTR,#HI_LISTnbsp;MOVnbsp;A,R4nbsp;MOVCnbsp;A,@A+DPTRnbsp;MOVnbsp;GAO,Anbsp;MOVnbsp;DPTR,#LO_LISTnbsp;MOVnbsp;A,R4nbsp;MOVCnbsp;A,@A+DPTRnbsp;MOVnbsp;DI,Anbsp;RETnbsp;TO_INT:nbsp;MOVnbsp;TL0,DInbsp;MOVnbsp;TH0,GAOnbsp;CPLnbsp;SPKnbsp;RETInbsp;HI_LIST:nbsp;DBnbsp;0,226,229,232,233,236,238,240nbsp;LO_LIST:nbsp;DBnbsp;0,4,13,10,20,3,8,6nbsp;SONG1:nbsp;DBnbsp;1,2,3,4,5,6,7,0FFHnbsp;SONG2:nbsp;DBnbsp;7,6,5,4,3,2,1,0FFHnbsp;LEN:nbsp;DBnbsp;2,2,2,2,2,2,2,0FFHnbsp;DELAY:nbsp;MOVnbsp;R6,#50nbsp;D1:MOVnbsp;R7,#50nbsp;DJNZnbsp;R7,$nbsp;DJNZnbsp;R6,D1nbsp;DJNZnbsp;R5,DELAYnbsp;RETnbsp;TABLE_DIG:nbsp;DBnbsp;16H,15H,14H,0FFHnbsp;DBnbsp;13H,12H,11H,10Hnbsp;DBnbsp;0DH,0CH,09H,0AHnbsp;DBnbsp;0EH,03H,06H,0FHnbsp;DBnbsp;08H,02H,05H,0BHnbsp;DBnbsp;00H,01H,04H,07Hnbsp;SCAN:nbsp;MOVnbsp;DPTRnbsp;,#OUTBITnbsp;MOVnbsp;A,#0nbsp;MOVXnbsp;@DPTR,Anbsp;MOVnbsp;DPTR,#INnbsp;MOVXnbsp;A,@DPTRnbsp;CPLnbsp;Anbsp;ANLnbsp;A,#0FHnbsp;RETnbsp;GET_KEY:nbsp;MOVnbsp;DPTR,#OUTBITnbsp;MOVnbsp;P2,DPHnbsp;MOVnbsp;R0,#LOW(IN)nbsp;MOVnbsp;R1,#00100000Bnbsp;MOVnbsp;R2,#6nbsp;KLOOP:nbsp;MOVnbsp;A,R1nbsp;CPLnbsp;Anbsp;MOVXnbsp;@DPTR,Anbsp;CPLnbsp;Anbsp;RRnbsp;Anbsp;MOVnbsp;R1,A

做这个比较费时间
可以找一个专业原创
的人帮你写

推荐一下,希望可以给你点参考,

加他为好友就行:











  • 有关电子琴的设计原理
    答:音量、输出方式、伴奏的控制;电子琴的工作原理一般有调频模式和采样模式,因为它的设置比较合理,现场使用非常方便;音色比较真实,使用效果更佳;单独用一具电子琴,
  • 电子琴的设计原理
    答:电子琴的工作原理一般有FM(调频)模式和PCM(采样)模式。 现在常用的电子琴的常见品牌有YANMAHA 和CASIO,海南的乐手比较喜欢使用YAMAHA的产品,因为它的设置比较合理,现场使用非常 方便;音色比较真实,使用效果更佳。 单独用一具电子琴,就可以现场作出类似一支完整乐队的效果。所以现在一些演出场合中,比较流行一具电子琴(...
  • 电钢琴和钢琴的区别是什么?
    答:电钢琴的发声原理是在原声乐器声音采样的基础上,将采集的声音转换成电子数码信号形成电声,再由电子元器件传感发声,与传统钢琴有了本质上的区别。音色上终究跟真实的钢琴有所差别,无法替代传统原声钢琴。三、结构设计不同 钢琴从外形上主要分成直立式钢琴和三角钢琴。三角钢琴是钢琴最原始的形态,现在一般...
  • 求关于单片机的电子琴C程序
    答:1. 实验任务 (1. 由4X4 组成16 个按钮矩阵,设计成16 个音。(2. 可随意弹奏想要表达的音乐。2. 电路原理图 图4.22.1 3. 系统板硬件连线 (1. 把“单片机系统”区域中的P1.0 端口用导线连接到“音频放大模块”区 域中的SPK IN 端口上;102 (2. 把“单片机系统“区域中的P3.0...
  • 请高手救急:555简易电子琴的设计原理和电路图 要很长的!!!采纳200分
    答:如图
  • 设计简易电子琴(微机原理课程设计)
    答:这个我可以帮你做,很简单
  • 单片机最小系统原理图,通俗易懂
    答:这就是一个单片机最小系统的原理图,包括时钟电路、复位电路,电源和单片机。
  • 选购电钢琴应该注意那些事项?
    答:2、杂牌数码钢琴,其实也就是劣质电子琴,最多加上钢琴的外观,手感就是玩具电子琴的手感,音色也就是廉价电子琴的音色,价格数百元至三千元。这一类有些唬人,不过你只要亲自弹一个键就会立刻识别出来了,当然这一类也绝对不能买; 3、国产正牌中低档数码钢琴,具有钢琴的外观,具有力度键盘(配重或不配重),手感接近钢琴...
  • 求八音电子琴课程设计
    答:;DIAN ZI QIN 电子琴 SPK EQU P1.0 FKEY EQU 20H.0 DI EQU 71H GAO EQU 72H KEY_NO EQU 73H NO EQU 74H TC EQU 75H OUTBIT EQU 08002H OUTSEG EQU 08004H IN EQU 08001H ORG 0000H JMP BEGIN ORG 0BH JMP TO_INT BEGIN:MOV...