单片机电子琴源代码及电路图设计
KEY: MOV R3,#00H ; KEY子程序,判断有键按下否?第几个键?
MOV R1,#0FFH
MOV R0,#00H
MOV A,R1
MOV P2,A
MOV A,P2
CLR C
CPL C ;利用标志位CY来判断是哪个键按下
MOV R2,#08H
WAIT3: RLC A ;移位判断
JNC STORE
INC R0
DJNZ R2,WAIT3
STORE: MOV 22H,R0 ;将按键号存22H,R3=0有键按下
MOV R3,#00H
RET
BREAK: PUSH ACC ; 中断产生方波,从P1.0口输出
PUSH PSW
MOV TL0,20H
MOV TH0,21H
CPL P1.0
POP PSW
POP ACC
RETI
TABLE2: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1
END
START : MOV TMOD,#00010000B ;设TIMER1在MODE1
SETB EA ;中断使能
SETB ET1 ; 设置定时器1中断
SETB TR1 ; 启动定时器1
START0: MOV 30H,#00 ;取简谱码指针
NEXT: MOV A,30H ;简谱码指针载入A
MOV DPTR,#TABLE0 ;至TABLE0取简谱码
MOVC A,@A+DPTR
MOV R2,A ;取到的简谱码暂存于R2
JZ END0 ;是否取到00(结束码)?
ANL A,#0FH ;不是,则取低4位(节拍码)
MOV R5,A ;将节拍码存入R5
MOV A,R2 ;将取到的简谱码再载入A
SWAP A; ;高低4位交换
ANL A,#0FH ;取低4位(音符码)
JNZ SING ;取到的音符码是否为0?
CLR TR1 ;是,则不发音
JMP D1 ;跳至D1
SING: DEC A ;取到的音符减1(不含0)
MOV 22H,A ;存入(22H)
RL A ;乘2
MOV DPTR,#TABLE1 ;至TALE1取相对的高位字节计数
值
MOVC A,@A+DPTR
MOV TH1,A ;取到的高位字节存入TH1
MOV 21H,A ;取到的高位字节存入(21H)
MOV A,22H ;再载入取到的音符码
RL A ;乘2
INC A ;加1
MOVC A,@A+DPTR ;至TABLE1取相对的低位字节计
数值
MOV TL1,A ;取到的低位字节存入TL1
MOV 20H,A ;取到的低位字节存入(20H)
SETB TR1 ;启动TIMER1
D1: CALL DELAY ;基本单位时间1/4拍187毫秒
INC 30H ;取简谱码指针加1
JMP NEXT ;取下一个码
END0: CLR TR1 ;停止TIMER1
JMP START0 ;重复循环
TIM0: PUSH ACC ;将A的值暂存于堆栈
PUSH PSW ;将PSW的值暂存于堆栈
MOV TL1,20H ;重设计数值
MOV TH1,21H
CPL P1.0 ;将P1.0位反相
POP PSW ;至堆栈取回PSW的值
POP ACC ;到堆栈取回A的值
RETI ;返回主程序
DELAY: MOV R7,#02 ;125毫秒
D2: MOV R4,#125
上一页 [1] [2] [3] [4] 下一页
单片机电子琴源代码及PCB板电路图设计 第3页下载如图片无法显示或论文不完整,请联系qq752018766