用AT89C51单片机做比较简单配上按键键盘,三极管驱动一个喇叭就能实现,下面是我调试过的单片机程序供参考;DIAN ZI QIN 电子琴 SPK EQU FKEY EQU 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