单片机简易程序, 电子琴 内附图 有说明

单片机简易程序, 电子琴 内附图 有说明,第1张

自己写的程序,多谢支持!给点分,我在Keil上试过了。

ORG 0000H

LJMP START

ORG 000BH

LJMP TIMER

START:CLR TR0

MOV SP,#70H

MOV TMOD,#01H

MOV IE,#82H

MOV P0,#0FFH

XUANZ:

MOV A,P2

CJNE A,#0FFH,BOFANG

KEY:MOV R0,#00H

JB P10,KEY1

LJMP KEYIN

KEY1:INC R0

JB P11,KEY2

LJMP KEYIN

KEY2:INC R0

JB P12,KEY3

LJMP KEYIN

KEY3:INC R0

JB P13,KEY4

LJMP KEYIN

KEY4: INC R0

JB P14,KEY5

LJMP KEYIN

KEY5:INC R0

JB P15,KEY6

LJMP KEYIN

KEY6:INC R0

JB P16,KEY7

LJMP KEYIN

KEY7:INC R0

JB P17,XUANZ

KEYIN:

LCALL DELAY1

MOV A,R0

MOV B,#02H

MUL AB

MOV 33H,A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV 30H,A

MOV TH0,A

INC 33H

MOV A,33H

MOVC A,@A+DPTR

MOV 31H,A

MOV TL0,A

SETB TR0

SK:

MOV A,P1

CJNE A,#0FFH,SK

LJMP START

BOFANG:

JB P20,K1

MOV DPTR,#TABLE2

LJMP KS

K1:JB P22,K2

MOV DPTR,#TABLE3

LJMP KS

K2:JB P25,XUANZ

MOV DPTR,#TABLE4

KS: MOV 40H,#00H

NEXT:MOV A,40H

MOVC A ,@A+DPTR

MOV R2,A

JZ STOP

ANL A,#0FH

MOV R5,A

MOV A,R2

SWAP A

ANL A,#0FH

JNZ SING

CLR TR0

LJMP W1

SING:DEC A

MOV 22H,A

RL A

MOV DPTR,#TABLE1

MOVC A,@A+DPTR

MOV TH0,A

MOV 30H,A

MOV A,22H

RL A

INC A

MOVC A,@A+DPTR

MOV TL0,A

MOV 31H,A

SETB TR0

W1:LCALL DELAY

INC 40H

LJMP NEXT

STOP:CLR TR0

LJMP START

DELAY1:MOV R7,#40

D1:MOV R6,#200

DJNZ R6,$

DJNZ R7,D1

RET

DELAY:MOV R7,#2

W2:MOV R4,#187

W3:MOV R3,#248

DJNZ R3,$

DJNZ R4,W3

DJNZ R7,W2

DJNZ R5,DELAY

RET

TIMER:PUSH ACC

PUSH PSW

MOV TL0,31H

MOV TH0,30H

CPL P07

POP PSW

POP ACC

RETI

TABLE1:DW 64580,64684,64777,64820

DW 64898,64968,65030,65058

TABLE2:DB 82H,01H,81H,94H,84H ;生日快乐

DB 0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,0F4H,0D4H

DB 0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,94H,84H

DB 0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H

DB 0C4H,0B4H,04H

DB 82H,01H,81H,0F4H,0D4H

DB 0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H

DB 0C4H,0B4H,04H

DB 00H

TABLE3:DB 72H,62H,52H,42H,32H,22H,12H,02H,00H ;这里可以装入你喜欢的音乐代码库,我这里没有了

TABLE4:DB 02H,12H,22H,32H,42H,52H,62H,72H,00H ;这里可以装入你喜欢的音乐代码库,我这里没有了

END

//  8键电子琴C程序 自己根据音节做个与简谱对应的表就可以了。

#include <AT89X51H>

sbit SPEAKER = P3^7;

#define KEY P1

unsigned char MUSIC;

unsigned char STH0;

unsigned char STL0;

unsigned int code tab[]={

64021,64103,64260,64400,//低音3开始

64524,64580,64684,64777,

64820,64898,64968,65030,

65058,65110,65157,65178

};

void main(void){

TMOD=0x01;

ET0=1;

EA=1;

KEY = 0xff;

while(1){

if(KEY != 0xff){

switch (~KEY){//显示的列位置

case 0x01://

MUSIC = 7;

break;//

case 0x02://

MUSIC = 6;

break;//

case 0x04://

MUSIC = 5;

break;//

case 0x08://

MUSIC = 4;

break;//

case 0x10://

MUSIC = 3;

break;//

case 0x20://

MUSIC = 2;

break;//

case 0x40://

MUSIC = 1;

break;//

case 0x80://

MUSIC = 0;

break;//

}

STH0=tab[MUSIC]/256;

STL0=tab[MUSIC]%256;

TR0=1;

}else{

SPEAKER = 1;

TR0=0;

}

}

}

void t0(void) interrupt 1 using 0{

TH0=STH0;

TL0=STL0;

SPEAKER=~SPEAKER;

}

;R5音调延时值;R6从内存中读到的数据

;9H--TABLE1~11数据;20H--TL1初值;21H--TH1初值;22H--修正后的按键值;30H--TABLE1~11地址计数器

;0AH--d奏音调延时值;0BH--内存地址;0CH--读写到内存的数据;0DH--按键值;0EH--内存器件地址

PORT1   EQU   P1

PORT2   EQU   P2

SCK     BIT   P30

SDA  BIT   P31

ORG   0H

SJMP  MAIN

ORG   0BH

LJMP  TIME0

ORG   1BH

LJMP  TIME1

ORG   30H

;--------------------------------------------------------------------------

MAIN:   CLR   TR0

CLR   TR1

MOV   SP,#4FH

MOV   R0,#100

CLR   P34

LCALL DELAY5

MOV   9H,#0

MOV   0AH,#0

MOV   0BH,#0

MOV   0CH,#0

MOV   TMOD,#11H

MOV   IE,#8AH

MOV   0DH,#88H

;------------扫描放歌和d奏建------------------------------------

XIAN:   JB    P32,QT1    ;没按下放歌建跳qt1

SETB  P34    ;按下放歌建LED发光

LCALL DELAY1

LCALL DELAY1

JNB   P32,$   ;放歌建没释放原地等待

LCALL DELAY1

LCALL DELAY1

Q1:     LCALL SAO

CJNE  R0,#0,Q11

SJMP  Q1

Q11:    LCALL TRANF

JZ    MAIN

MOV   0DH,A    ;0DH=按键值

LJMP  SING0

QT1:    JB    P33,QT4      ;没按d奏建跳QT3

SETB  P34

LCALL DELAY1

LCALL DELAY1

JNB   P33,$   ;d奏键没释放原地等待

LCALL DELAY1

LCALL DELAY1

QT2:    LCALL SAO

CJNE  R0,#0,QT3

SJMP  QT2

QT3:    LCALL TRANF

CJNE  A,#0BH,QT11 ;若按键值=11转(B键)MAIN;!=11键转QT11

LJMP  MAIN

QT11:   JC    MAIN   ;若按键值<11转MAIN;>11继续

CJNE  A,#0CH,M4  ;若按键值!=12转M1;=12(C键)继续 ;即C键没按下转M1

MOV   PORT1,#11101111B

JNB   P13,$   ;若C键没释放原地等待

MOV   0BH,#0

LJMP  LOOP    ;输入乐曲存储并演奏

M4:  LCALL DELAY1

LCALL DELAY1

LCALL RWX80     ;擦写内存数据;全部为1

LJMP  MAIN

QT4:    LJMP  XIAN    ;返回重新扫描放歌和d奏建

;--------------------------------------------------------------------------

RWX80:  CJNE  A,#0DH,MM2  ;A!=13(D键)转M2;若为D键继续;D键没按下转M2

MOV   0EH,#0A2H  ;0EH=162=10100010B;0EH为24c16页地址

SJMP  MM

MM2:     CJNE  A,#0EH,MM3  ;A!=14(E键)转M3;E键没按下转M3

MOV   0EH,#0A4H  ;0EH=164=10100100B

SJMP  MM

MM3:     MOV   0EH,#0A6H  ;F键按下;0EH=166=10100110B

MM:     MOV   0BH,#0

MOV   0CH,#0H

RWX801: LCALL RKX02

LCALL WKX02

INC   0BH

INC   0BH

INC   0BH

INC   0BH

MOV   A,0BH

CJNE  A,#0FFH,MM4

MOV   0BH,#0

MM4:    INC   0CH

INC   0CH

INC   0CH

INC   0CH

CJNE   A,#0H,RWX801

RET

;--------读数据------------------------------

RKX02:

LCALL START

MOV   A,#0A0H     ;24C16寻址10100000写

LCALL WRBYT

LCALL TACK

MOV   A,0BH     ;发送24c16子地址

LCALL WRBYT

LCALL TACK

LCALL START

MOV   A,#0A1H    ;24C16寻址10100001读

LCALL WRBYT

LCALL TACK

;LCALL WRBYT

;LCALL TACK

MOV   10H,R6

LCALL RDBYT

LCALL NOTACK

;LCALL WRBYT

;LCALL TACK

MOV   11H,R6

LCALL RDBYT

LCALL NOTACK

;LCALL WRBYT

;LCALL TACK

MOV   12H,R6

LCALL RDBYT

LCALL TACK

MOV   13H,R6

LCALL NOTACK

LCALL STOP

RET

;---------写数据-----------------------

WKX02:

MOV   R1,#10H

LCALL START

MOV   A,#0A0H

LCALL WRBYT

LCALL TACK

MOV   A,0BH

LCALL WRBYT

LCALL TACK

MOV   A,0CH

LCALL WRBYT

LCALL TACK

MOV   R0,#4

WKX021: MOV   A,@R1

LCALL WRBYT

LCALL TACK

INC   R1

DJNZ  R0,WKX021

LCALL STOP

LCALL DELAY5

LCALL DELAY5

RET

;-------输入乐曲存储并演奏--------------------------------------------

LOOP:   CLR   TR0

CLR   TR1

AAA:    JB    P33,LOOP4 ;d奏键按下 向下执行存储乐曲并演奏 否则转LOOP4继续输入乐曲

LCALL DELAY1

LCALL DELAY1

MOV   0CH,#0

LCALL WBAY    ;存00结束乐谱

LCALL DELAY1

MOV   0DH,#12

LJMP  SING0     ;播放d奏的乐曲

LOOP4:  LCALL   SAO

CJNE    R0,#0,KEYIN

LJMP    LOOP

KEYIN:  LCALL TRANF

SWAP  A

MOV   09H,A

SWAP  A

CJNE  A,#0,ZZZ     ;非0键转ZZZ

CLR   TR1

CLR   TR0

LJMP  ZZZZ      ;0键转ZZZZ

ZZZ: DEC   A    ;A为按键值;因从1键值音调序号对应TABLE频率表0位置;故减1

MOV   22H,A   ;22H存修正后(A=A-1)的按键值

CLR   C

RLC   A    ;A2因TABLE一个单元为2字节(1字),指向该单元的第1个字节

MOV   DPTR,#TABLE

MOVC  A,@A+DPTR

MOV   TH1,A   ;TH1赋初值

MOV   21H,A   ;TH1初值存21H

MOV   A,22H

CLR   C

RLC   A    ;A2因TABLE一个单元为2字节(1字)

INC   A    ;指向该单元的第2个字节

MOVC  A,@A+DPTR

MOV   TL1,A  ;TL1赋初值

MOV   20H,A  ;TL1初值存20H

MOV   TH0,#0C2H

MOV   TL0,#0F6H

SETB  TR0

SETB  TR1

ZZZZ:   MOV   A,PORT1

ORL   A,#0F0H

CJNE  A,#0FFH,ZZZZ

CLR   TR0

CLR   TR1

MOV   A,0AH     ;d奏乐谱频率延迟值赋A

CLR   C

RRC   A

CLR   C

RRC   A

CLR   C

RRC   A   ;d奏乐谱频率延迟值/8

CJNE  A,#0FH,NODE

SJMP  DDD

NODE:   JC    DDD

MOV   A,#0FH  ;d奏乐谱频率延迟值/8后;若>15则=15

DDD:    ORL   09H,A   ;

MOV   0AH,#0

>

MOV   0CH,A

LCALL WBAY

LCALL DELAY5

INC   0BH

LJMP  LOOP

;-----频率延时-----------------------------------------

DELAY:  MOV   R7,#125

DLY2:   MOV   R4,#02

DLY3:   MOV   R3,#248

DJNZ  R3,$

DJNZ  R4,DLY3

DJNZ  R7,DLY2

DJNZ  R5,DELAY

RET

;---------延时----------------------

DELAY1: MOV   R7,#30

MOV   R6,#0

S1:     DJNZ  R6,$

DJNZ  R7,S1

RET

DELAY5: MOV   R7,#10

MOV   R6,#0

S5:     DJNZ  R6,$

DJNZ  R7,S5

RET

;-----扫描按键子程序----------

SAO:    MOV   R0,#4

MOV   R3,#11101111B

MOV   R2,#11111111B

NLINE1: MOV   A,R3

MOV   PORT1,A

MOV   A,PORT1

ORL   A,#0F0H

CJNE  A,#0FFH,KEYIN1

MOV   A,R3

RL    A

MOV   R3,A

DJNZ  R0,NLINE1

RET

KEYIN1: LCALL DELAY1

LCALL DELAY1

LCALL DELAY1

LCALL NOPEN

RET

;-----按键延时-------------

NOPEN:  MOV   A,PORT1

MOV   R2,A

ORL   A,#0F0H

CJNE  A,#0FFH,NOPEN1

SJMP  NOPEN

NOPEN1: LCALL DELAY1

LCALL DELAY1

RET

;----------键盘码转换为按键值-----------------

TRANF:  MOV   B,#0

MOV   A,R2

C1:     RRC   A

JNC   C2 ;C=0跳C2

INC   B

INC   B

INC   B

INC   B  ;B=B+4

LJMP  C1

C2:     MOV   A,R2

RR    A

RR    A

RR    A

RR    A

C3:     RRC   A

JNC   C4

INC   B

LJMP  C3

C4:     MOV   A,B  ;B为按键值

RET

;---------按键值散转表-------------------

SING0:

MOV   30H,#00H   ;30H为TABLE1~11地址计数器

NEXT:   MOV   A,0DH

CJNE  A,#1,NN1

MOV   DPTR,#TABLE1

LJMP  WW

NN1:    CJNE  A,#2,NN2

MOV   DPTR,#TABLE2

LJMP  WW

NN2:    CJNE  A,#3,NN3

MOV   DPTR,#TABLE3

LJMP  WW

NN3:    CJNE  A,#4,NN4

MOV   DPTR,#TABLE4

LJMP  WW

NN4:    CJNE  A,#5,NN5

MOV   DPTR,#TABLE5

LJMP  WW

NN5:    CJNE  A,#6,NN6

MOV   DPTR,#TABLE6

LJMP  WW

NN6:    CJNE  A,#7,NN7

MOV   DPTR,#TABLE7

LJMP  WW

NN7:    CJNE  A,#8,NN8

MOV   DPTR,#TABLE8

LJMP  WW

NN8:    CJNE  A,#9,NN9

MOV   DPTR,#TABLE9

LJMP  WW

NN9:    CJNE  A,#10,NN10

MOV   DPTR,#TABLE10

LJMP  WW

NN10:   CJNE  A,#11,NN11

MOV   DPTR,#TABLE11

LJMP  WW

NN11:   CJNE  A,#12,NN12

MOV   0EH,#0A1H

MOV   0BH,#0

LJMP  NN

NN12:   CJNE  A,#13,NN13

;MOV   0EH,#0A3H

;MOV   0BH,#0H

LJMP  MAIN

NN13:   CJNE  A,#14,NN14

;MOV   0EH,#0A5H

;MOV   0BH,#0H

LJMP  MAIN

NN14:   CJNE  A,#15,NN

;MOV   0EH,#0A7H

;MOV   0BH,#00H

LJMP  MAIN

;--------------------------------

NN:     LCALL RBAY   ;读内存

NNT:    MOV   A,R6   ;R6为从内存中读到的数据

LJMP  IIC

;-----------奏乐--------------------------------------------

WW:     MOV   A,30H

JZ    WW0

MOVC  A,@A+DPTR

SJMP  IIC

WW0:    MOVC  A,@A+DPTR

MOV   30H,#1

MOV   31H,A

SJMP  WW

IIC:    MOV   R2,A

JZ    ENDF  ;A=00 结束标志跳ENDF程序重新开始

ANL   A,#0FH  ;低4位为延时值

MOV   R5,A   ;R5延时值;频率延时(DELAY)程序用

MOV   A,R2

SWAP  A

ANL   A,#0FH  ;高4位为音调序号若

JNZ   SING   ;为0则

CLR   TR1   ;为休止符

SJMP  DLY1

SING:   DEC   A    ;频率表从0位置开始,音调序号表从1位置开始,0位置数据是解密数据

PUSH  ACC

MOV   A,0DH

CJNE  A,#11,BD  ;若>11(B)键,即为C~F键转BD0;若<=11(B)键转DE,音调序号+31H

POP   ACC

SJMP  DE

BD:     POP   ACC

JNC   BD0

DE:     ADD   A,31H

BD0:    MOV   22H,A

RL    A

MOV   DPTR,#TABLE

MOVC  A,@A+DPTR

MOV   TH1,A

MOV   21H,A

MOV   A,22H

RL    A

INC   A

MOVC  A,@A+DPTR

MOV   TL1,A

MOV   20H,A

SETB  TR1

DLY1:   INC   R5

ACALL DELAY

INC   30H

INC   0BH

MOV   A,0DH    ;取按键值;判断是读内存键还是读乐谱序号键

CJNE  A,#0BH,NNBD  ;若按键值<11取下1个乐谱;若按键值为12~15(C~F)转NNBD读内存

NEXT1:  LJMP  NEXT

NNBD:   JC    NEXT1

LJMP  NN   ;读内存

;--------程序重新开始---------------------------------------

ENDF:   CLR   TR1

LJMP  MAIN

;--------T0中断服务d奏频率延迟时间---------------------------------------------

TIME0:  INC   0AH    ;d奏乐谱频率延迟值

MOV   TH0,#0C2H

MOV   TL0,#0F6H    ;定时初值 =49910    计数次数为 2^16(65536)-49910=15626=16ms

RETI

;--------T1中断服务发声-----------------------

TIME1:  PUSH  ACC

PUSH  PSW

MOV   TL1,20H

MOV   TH1,21H

CPL   P37

POP   PSW

POP   ACC

RETI

;--------读数据--------------------

RBAY:   LCALL START

MOV   A,#0A0H

LCALL WRBYT

LCALL TACK

MOV   A,0BH

LCALL WRBYT

LCALL TACK

LCALL START

MOV   A,0EH

LCALL WRBYT

LCALL TACK

LCALL RDBYT

LCALL NOTACK

LCALL STOP

RET

;-------写数据-------------------

WBAY:   LCALL START

MOV   A,#0A0H

LCALL WRBYT

LCALL TACK

MOV   A,0BH

LCALL WRBYT

LCALL TACK

MOV   A,0CH

LCALL WRBYT

LCALL TACK

LCALL STOP

RET

;---------写数据---------------

;WKX03:  MOV   R1,#10H

;LCALL START

;MOV   A,#0A2H

;LCALL WRBYT

;LCALL TACK

;MOV   A,0CH

;LCALL WRBYT

;LCALL TACK

;MOV   R0,#4

;WKX031: MOV   A,@R1

;LCALL WRBYT

;LCALL TACK

;INC   R1

;DJNZ  R0,WKX031

;LCALL STOP

;LCALL DELAY1

;LCALL DELAY1

;RET

;-------启动24C16读写时序------------------

START:  SETB  SDA

NOP

NOP

NOP

NOP

SETB  SCK

NOP

NOP

NOP

NOP

CLR   SDA

NOP

NOP

NOP

NOP

CLR   SCK

NOP

NOP

NOP

NOP

RET

;-------停止信号------------------

STOP:   CLR   SDA

NOP

NOP

NOP

NOP

SETB  SCK

NOP

NOP

NOP

NOP

SETB  SDA

NOP

NOP

NOP

NOP

;CLR   SCK

;NOP

;NOP

;NOP

;NOP

RET

;-------应答信号-----------------

TACK: SETB  SDA

;CLR   SDA

NOP

NOP

NOP

NOP

SETB  SCK

NOP

NOP

NOP

NOP

CLR   SCK

NOP

NOP

NOP

NOP

;SETB  SDA

;NOP

;NOP

;NOP

;NOP

RET

;-------------------------

CHACK:  SETB  SDA

NOP

NOP

NOP

NOP

SETB  SCK

NOP

NOP

NOP

NOP

MOV   C,SDA

CLR   SCK

NOP

NOP

NOP

NOP

RET

;-----------------------------

NOTACK: ;NOP

SETB  SDA

NOP

NOP

NOP

NOP

SETB  SCK

NOP

NOP

NOP

NOP

CLR   SCK

NOP

NOP

NOP

NOP

RET

;------读IIC-24C16------------------

RDBYT:  MOV   R7,#8

SETB  SDA

NOP

NOP

NOP

NOP

RDBYT1: SETB  SCK

NOP

NOP

NOP

NOP

NOP

NOP

MOV   C,SDA

MOV   A,R6

RLC   A

MOV   R6,A

CLR   SCK

NOP

NOP

NOP

NOP

NOP

NOP

DJNZ  R7,RDBYT1

RET

;------写IIC-24C16---------------

WRBYT:  MOV   R7,#8

WRBYT1: RLC   A

MOV   SDA,C

;JC    WRBYT2

;CLR   SDA

;NOP

;NOP

;NOP

;NOP

SETB  SCK

NOP

NOP

NOP

NOP

NOP

NOP

CLR   SCK

NOP

NOP

NOP

NOP

NOP

NOP

DJNZ  R7,WRBYT1

RET

;WRBYT2: SETB  SDA

;NOP

;NOP

;NOP

;NOP

;SETB  SCK

;NOP

;NOP

;NOP

;NOP

;CLR   SCK

;NOP

;NOP

;NOP

;NOP

;CLR   SDA

;NOP

;NOP

;NOP

;NOP

;DJNZ  R7,WRBYT1

RET

;-------;TABLE为频率值  -------------------------------------

TABLE:  DW 0F88CH,0F95BH,0FA15H,0FA67H,0FB04H,0FB90H,0FC0CH ;低音1~7

DW 0FC44H,0FCACH,0FD09H,0FD34H,0FD82H,0FDC8H,0FE06H ;中音1~7

DW 0FE22H,0FE56H,0FE85H,0FE9AH,0FEC1H,0FEE4H,0FF03H ;高音1~7

;--------TABLE1~11为音调序号和音调延时表调;数据高4位是-----------------------------------

;--------音调序号;低4位是音调延时值-----------------------------------------------------------------

;--------;兰花草---------------------------------------

TABLE1: DB 02H,42H,82H,82H,82H,84H,02H,72H,62H,72H,62H

DB 52H,48H,0B2H,0B2H,0B2H,0B2H,0B4H,02H,0A2H

DB 12H,0A2H,0D2H,92H,88H,82H,0B2H,0B2H,0A2H,84H

DB 02H,72H,62H,72H,62H,52H,44H,02H,12H,12H,62H

DB 62H,52H,44H,02H,82H,72H,62H,52H,32H,48H,00

;-------;哈巴--------------------------------------------

TABLE2: DB 04H,42H,42H,42H,52H,64H,04H,62H,62H,62H,72H,84H,04H

DB 92H,92H,82H,72H,64H,04H,82H,82H,52H,62H,44H,04H

DB 42H,42H,42H,52H,64H,04H,62H,62H,62H,72H,84H,04H

DB 92H,92H,82H,72H,64H,04H,82H,82H,52H,62H,44H,04H,00H

;-------;生日快乐---------------------------------------

TABLE3: DB 04H,82H,01H,81H,94H,84H,0B4H,0A4H,04H

DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H

DB 82H,01H,0F4H,0D4H,0B4H,0A4H,94H

DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00H

;-------;不倒翁--------------------------------------------

TABLE4: DB 04H,84H,94H,88H,64H,54H,68H,84H,64H

DB 54H,44H,62H,82H,42H,62H,58H;1

DB 84H,94H,88H,64H,54H,68H,84H,64H;2

DB 54H,44H,52H,42H,52H,62H,48H,00

;-------;妹妹背着洋娃娃---------------------------------------

TABLE5: DB 04H,84H,02H,82H,64H,54H,64H,54H,48H,64H

DB 02H,52H,44H,24H,14H,24H,18H;1

DB 24H,02H,22H,42H,24H,44H,54H,68H,54H;2

DB 02H,52H,84H,84H,54H,64H,48H,00

;-------;两只老虎-------------------------------------------------

TABLE6: DB 04H,44H,54H,64H,44H,44H,54H,64H,44H,64H,74H,88H,64H,74H,88H;1

DB 82H,92H,82H,72H,64H,44H,82H,92H,82H

DB 72H,64H,44H,44H,84H,48H,44H,14H,48H,00

;-------;三只小猫----------------------------------------------

TABLE7: DB 04H,62H,82H,82H,62H,98H,92H,0B2H,0B2H,82H,98H

DB 2H,82H,82H,52H,68H,92H,0B2H,0B2H,82H,98H

DB 62H,82H,82H,62H,92H,92H,94H

DB 92H,0B2H,0B2H,92H,84H,94H,0B8H,0B4H,04H,00

;-------;绿-------------------------------------------------------

TABLE8: DB 02H,42H,82H,82H,82H,84H,02H,72H,62H,72H,62H,52H,48H

DB 0B2H,0B2H,0B2H,0B2H,0B4H,02H,0A2H

DB 12H,0A2H,0D2H,92H,88H,82H,0B2H,0B2H,0A2H,84H

DB 02H,72H,62H,72H,62H,52H,44H,02H,12H

DB 12H,62H,62H,52H,44H,02H,82H,72H,62H,52H,32H,48H,00

;-------;绿岛小夜曲-----------------------------------------------

TABLE9: DB 00H,0C2H,0D2H,0F2H,0D2H,0C4H,0D2H,0F2H

DB 0D2H,0C2H,0A2H,92H,0A8H

DB 92H,0A2H,0C2H,0A2H,92H,82H,62H,82H,58H,58H

DB 0C4H,22H,0D2H,0C4H,0A4H,92H,0A2H,92H,82H,92H,0A4H,092H

DB 84H,82H,32H,54H,22H,62H,052H,058H

DB 64H,22H,52H,64H,84H,92H,0A2H,92H,82H,92H,0A4H,0C2H

DB 92H,94H,0A2H,0C4H,22H,0D2H,0C8H,0C8H

DB 0D2H,0D4H,0C2H,0A2H,0A2H,92H,82H,92H,0A2H,0C2H,0A8H

DB 92H,94H,82H,62H,52H,52H,82H,98H,98H

DB 0A2H,0A4H,92H,0A2H,0C2H,0A4H,92H,0A2H,92H,82H,68H

DB 52H,0C2H,0A2H,0F2H,0C2H,0D2H,0A2H,92H,88H,88H

DB 0D2H,0D2H,0D2H,0C2H,0A2H,0A2H,22H

DB 92H,94H,82H,62H,52H,62H,82H,98H,98H

DB 0C2H,0D2H,0C2H,92H,0A2H,0A4H,0A2H

DB 92H,94H,82H,64H,84H,0C8H,0D1H,0C1H,0A2H,0C2H,0D4H,0D2H,0E2H

DB 0C2H,0D2H,0C2H,0A2H,98H

DB 0A4H,92H,82H,64H,22H,82H,92H,0A1H,91H,82H,92H,0A4H,22H,0C2H

DB 0D4H,22H,0A2H,94H,0A2H,92H,88H,88H,00

;---------------------------------------------------------------------------

TABLE10:DB 00H,04H,42H,52H,62H,42H,42H,52H,62H,42H,62H,72H,86H,62H,72H,86H;1

DB 82H,92H,82H,72H,62H,42H,82H,92H,82H

DB 72H,62H,42H,42H,82H,46H,42H,12H,48H,00

;----------------------------------------------------------------------------

TABLE11:DB 00H,23H,01H,63H,01H,51H,61H,41H,51H

DB 64H,22H,92H,51H,61H,72H,64H

DB 04H,63H,01H,93H,01H,81H,91H,0A1H,0A1H

DB 94H,53H,61H,41H,51H,41H,31H,24H,04H

DB 53H,61H,41H,51H,41H,31H,24H,04H,53H,61H,82H

DB 92H,0AAH,02H,93H,0A1H,91H,81H,98H,04H,91H

DB 81H,92H,04H,61H,51H,62H,04H,56H,42H,12H

DB 22H,32H,32,28H,08H,00

;--------------------------------------------------------------------------

;TABLE12:

;DB 01H,00H

;---------------------

END

#include<AT89X51H>unsigned char table[]={0x3f,0x60,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;}

//本程序的单片机晶振采用110592M

#include <reg51h>

sbit speaker=P1^2;

unsigned char timer0h,timer0l,time;

//世上只有妈妈好数据表

code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,

6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,

6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,

5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,

2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0

};

// 音阶频率表 高八位

code unsigned char FREQH[]={

0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,

0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i

0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,

0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,

} ;

// 音阶频率表 低八位

code unsigned char FREQL[]={

0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,

0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i

0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,

0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,

};

void delay(unsigned char t)

{

unsigned char t1;

unsigned long t2;

for(t1=0;t1<t;t1++)

{

for(t2=0;t2<8000;t2++)

{

;

}

}

TR0=0;

}

void t0int() interrupt 1

{

TR0=0;

speaker=!speaker;

TH0=timer0h;

TL0=timer0l;

TR0=1;

}

void song()

{

TH0=timer0h;

TL0=timer0l;

TR0=1;

delay(time);

}

void main(void)

{

unsigned char k,i;

TMOD=1; //置CT0定时工作方式1

EA=1;

ET0=1;//IE=0x82 //CPU开中断,CT0开中断

while(1)

{

i=0;

while(i<100){ //音乐数组长度 ,唱完从头再来

k=sszymmh[i]+7sszymmh[i+1]-1;

timer0h=FREQH[k];

timer0l=FREQL[k];

time=sszymmh[i+2];

i=i+3;

song();

}

}

}

自己改改吧。。你说的不太清。。是不是还要用到键盘作为电子琴按键。。。。提问也有技巧的。。下次说清要求 所要结果 需要语言。。。

以上就是关于单片机简易程序, 电子琴 内附图 有说明全部的内容,包括:单片机简易程序, 电子琴 内附图 有说明、51单片机简谱编码、单片机简易电子琴程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9290655.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存