单片机电子琴设计 第2页
3 软件设计
1.延时程序的编写
1/4拍的延时时间=187毫秒,这个时间由歌曲本身来决定,歌曲不同这个1/4拍的时间也不同,这里1/4拍的时间就取为187毫秒。
DELAY: MOV R7,#02
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4, D3
DJNZ R7, D2
DJNZ R5, DELAY
RET
R5表示为1/4拍的倍数。
2.T值表的建立
T值表建立在TABLE1中:
TABLE1:DW 63628,63731,63835,63928,64021,64103
DW 64185,64260,64331,64400,64463,64524
DW 64580,64633,64684,64732,64777,64820
DW 64860,64898,64934,64968,64994,65030
DW 65058,65085,65110,65134,65157,65178
DW 65198,65217,65235,65252,65268,65283
3.键盘扫描程序的编写
KEY: MOV R3, #00H /R3中的数表示是那个键按下/
JNB P2.0, LOOP
INC R3
JNB P2.1, LOOP
INC R3
JNB P2.2, LOOP
INC R3
JNB P2.3, LOOP
INC R3
JNB P2.4, LOOP
INC R3
JNB P2.5, LOOP
INC R3
JNB P2.6, LOOP
INC R3
JNC P2.7, LOOP
SETB F0 /没有键按下则F0=0/
SJMP DO
LOOP:CLR F0 /有键按下则F0=1/
DO: NOP
RET
此程序可以判断是那个键按下,如果有键按下则F0=0,没有键按下则F0=1。按键数存放在R3中。这样就可以根据按键来发音了。如果是按键8按下则表示是要唱一首完整的歌曲。可以通过设定中断来实现它。当按键 8按下时产生中断,系统马上响应中断进入中断服务程序,进行查表TABLE可以得到歌曲的简谱码和节拍数然后按照歌曲的规律进行下去,这样就可以唱出一首完整的歌曲了。TABLE表格的建立,,每个音符先编音符码然后编节拍数,音符码和节拍数各占一个字节。程序如下:
ORG 0000H
SJMP BEGIN
ORG 000BH
SJMP TIM0
BEGIN: MOV TMOD, #01H /设TIMER在MODE1/
MOV IE, #82H /中断使能/
REPE: MOV 30H, #00H /取简谱码指针/
NEXT: MOV A, 30H /简谱码指针存入A/
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV R2, A /音符码存入R2中/
CJNE A,#0FFH,GOOT /是否取到了规定的结束码 “FFH”/
SJMP END0
GOOT: INC 30H
MOV A, 30H
MOVC A, @A+DPTR
MOV R5, A /节拍数存放在R5中/
MOV A, R2 /音符码存入A中/
CJNE A, #24H, SING /取到的音符码是否为“24H”/
CLR TR0 /是,则不发音/
JMP D1
SING: MOV 31H, A /音符码存入31H中/
RL A
MOV DPTR, #TABLE1
MOVC A,@DPTR+A /找到TABLE1中对应的T值/
MOV 32H, A /取到T值的高字节存入32H中/
MOV TH0, A
MOV A,31H
RL A
INC A
MOVC A,@DPTR+A
MOV 33H, A /取到T值的高字节存入33H中/
MOV TL0, A
SETB TR0 /启动TIMER0/
D1: CALL DELAY
INC 30H
SJMP NEXT
END0: CLR TR0
SJMP REPE
TIM0: PUSH ACC
PUSH PSW
MOV TH0,32H
MOV TL0,33H
CPL P1.0
POP ACC
POP PSW
RETI
DELAY: MOV R7,#02
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4, D3
DJNZ R7, D2
DJNZ R5, DELAY
RET
TABLE1:DW 63628,63731,63835,63928,64021,64103
DW 64185,64260,64331,64400,64463,64524
DW 64580,64633,64684,64732,64777,64820
DW 64860,64898,64934,64968,64994,65030
DW 65058,65085,65110,65134,65157,65178
DW 65198,65217,65235,65252,65268,65283
TABLE: 13H, 02H, 24H, 01H, 13H, 01H, 15H, 04H 13H, 04H, 18H, 04H, 17H, 04H
24H, 04H, 13H, 02H, 24H, 01H, 13H, 01H, 15H, 04H, 13H, 04H, 1AH, 04H
18H, 04H, 24H, 04H, 13H, 02H, 24H, 01H, 13H, 01H, 1FH, 04H, 1CH, 04H
0FFH
END
对于不同的歌曲只要根据歌曲来建立TABLE即可。上TABLE表是根据生日快乐歌曲建立的。按键发音的过程,首先进行键盘扫描,判断是那个键按下,记下键数,存入R3中,然后查表得到相应的T值,并载入到定时器0中同时启动定时器,继续进行键盘扫描,判断是否有键按下,有则表示键一直是按下的,继续发音(因为扫描的时间很短最多也只有几十微秒,所以可以认为是同一个键按下的)。没有则进行循环扫描。
ORG 0000H
SJMP COOM
ORG 000BH
SJMP TIMOY
COOM: MOV TMOD,#01H
MOV IE,#82H
L1: CALL KEY
JB F0, L1 /没有键按下则继续扫描/
MOV A,R3
CJNE A,#07H, SOPP
SJMP ##### /这里是为下面两个程序综合准备/
SOPP: MOV DPTR,#TABLE2
MOVC A,@A+DPTR
MOV 35H, A / T值高字节放入35H中/
MOV TH0, A
MOV A, R3
RL A
INC A
MOVC A, @A+DPTR
MOV 36H, A / T值高字节放入36H中/
MOV TL0, A
SETB TR0
L2: CALL KEY
JB F0, L3
SJMP L2
L3: CPL TR0
SJMP L1
KEY: MOV R3, #00H /R3中的数表示是那个键按下/
JNB P2.0, LOOP
INC R3
JNB P2.1, LOOP
INC R3
JNB P2.2, LOOP
INC R3
JNB P2.3, LOOP
INC R3
JNB P2.4, LOOP
INC R3
JNB P2.5, LOOP
INC R3
JNB P2.6, LOOP
INC R3
JNC P2.7, LOOP
SETB F0
SJMP DO
LOOP:CLR F0
上一页 [1] [2] [3] [4] 下一页
单片机电子琴设计 第2页下载如图片无法显示或论文不完整,请联系qq752018766