電子琴電路圖.PNG (93.02 KB, 下載次數: 61)
下載附件
電子琴電路圖
2018-5-10 14:20 上傳
源程序
SPEAKE BIT P3.0;接到蜂鳴器
MAINLED BIT P3.1
AUTOSING BIT P2.0
SINGLED BIT P3.2
AUTOSTOP BIT P2.1
PLAYSING BIT P2.2
PLAYLED BIT P3.3
PLAYSTOP BIT P2.3
FAST BIT P2.4
FASTLED BIT P3.4
FASTFLAG BIT 00H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIM0;TIMER0的中斷服務程序
ORG 1000H
MAIN:
MOV SP,#60H;初始化堆棧
MOV TMOD,#01H;計數器工作在MODE1,16位計數器
SETB ET0;開定時/計數器0允許
SETB EA;允許單片機總中斷
MOV P3,#0FCH;讓除了MAIN以外的燈滅
MOV 40H,#83;設置初始速度
MOV 30H,#00H;初始化偏移量
START0:
JB AUTOSING,PLAY1/*若按下p2.0,表示想要自動播放歌曲*/
SETB MAINLED
CLR SINGLED
JMP SONG1
PLAY1:
JB PLAYSING,START0/*若按下PLAYSING表示想要彈琴*/
SETB MAINLED
CLR PLAYLED
LJMP PLAY2
;播放歌曲的程序段
SONG1:
MOV A,30H;將偏移量傳入A
MOV DPTR,#SONG;取得歌曲表的首地址
MOVC A,@A+DPTR;取得相應音符
JZ OVER;若8位全為0表示播放歌曲結束
MOV R2,A
ANL A,#0FH;從低4位取出節拍
MOV R5,A;存入R5,用于定時器的中斷服務程序
MOV A,R2;再導入R2
SWAP A
ANL A,#0FH;取出頻率向量
JNZ SING;若為0表示無聲
CLR TR0 ;不記數
JMP D1
;取出頻率(計數值)的程序段
SING:
DEC A;減1,因為要從0位置開始
RL A;在計數值表中以字存儲,乘2才得到正確位置
MOV 22H,A;將位置暫存
MOV DPTR,#TAB1;計數值表
MOVC A,@A+DPTR
MOV TH0,A;取到的高位放入TH0
MOV 21H,A;暫存到21H,用于中斷程序
MOV A,22H
INC A;取低位地址
MOVC A,@A+DPTR
MOV TL0,A;放入TL0
MOV 20H,A;暫存到20H,用于中斷程序
SETB TR0;計數器開始計數
D1:
ACALL DELAY
INC 30H;播放完一個音符后將偏移量加1
JMP SONG1
OVER:
SETB SINGLED
CLR MAINLED
LJMP MAIN
;以下是電子琴的程序段
PLAY2:
MOV A,#0FH ;先給p1的高4位置1,低4位置0,判斷是哪行
MOV P1,A
MOV R3,#00H
MOV R4,#00H
PLAY3:
ACALL DELAY20;加上這個就不會有串音的現象了
JB PLAYSTOP,PL0;若按下退出電子琴鍵則跳回
SETB PLAYLED
CLR MAINLED
LJMP START0
;以下是判斷矩陣鍵盤的按鍵
;判斷是哪行按下
PL0:
MOV A,P1
JB ACC.0,PL1
MOV R3,#0
SJMP LINE
PL1:
JB ACC.1,PL2
MOV R3,#1
SJMP LINE
PL2:
JB ACC.2,PL3
MOV R3,#2
SJMP LINE
PL3:
JB ACC.3,PLAY3
MOV R3,#3
;判斷是哪列
LINE:
MOV A,#0F0H;這次給低位置1,高位置0
MOV P1,A
MOV A,P1
LINE4:
JB ACC.4,LINE5
MOV R4,#0
SJMP PLAY4
LINE5:
JB ACC.5,LINE6
MOV R4,#4
SJMP PLAY4
LINE6:
JB ACC.6,LINE7
MOV R4,#8
SJMP PLAY4
LINE7:
JB ACC.7,PLAY3
MOV R4,#12
;這樣就可以用R4+R3得出是哪個鍵被按下
PLAY4:
MOV A,R3
ADD A,R4
ACALL YOUPLAY;得出按鍵后就調出頻率發聲就行了
LOOP:;將這個地方做做修改
MOV A,P1
ORL A,#0FH
CPL A
JZ OFF
JMP LOOP
OFF:CLR TR0
LJMP PLAY2
;定時計數器0中斷服務程序
TIM0:
PUSH ACC
PUSH PSW
MOV TL0,20H;將暫存的計數值再放進去
MOV TH0,21H
CPL SPEAKE;取反
POP PSW
POP ACC
RETI
;彈琴的子程序
YOUPLAY:
RL A
MOV 22H,A;將位置暫存
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV 21H,A
INC 22H
MOV A,22H
MOVC A,@A+DPTR
MOV 20H,A
MOV TH0,21H
MOV TL0,20H
SETB TR0
RET
;延時20ms,用于防抖
DELAY20:
mov r1,#50h
del0:mov r2,#7dh
del1:djnz r2,del1
djnz r1,del0
RET
;節拍延時函數,用于產生每個音符的節拍,延時187ms
DELAY:
MOV R7,#02
D2:MOV R4,#187
D3:MOV R3,40H
TEST:
JB FAST,TEST1;若沒有按下快進鍵直接去檢測是否按下暫停鍵
JB FASTFLAG,FASTSTOP;FAST為0表示可以快進,FAST為1表示已經在快進狀態
SETB FASTFLAG
CLR FASTLED
MOV 40H,#30;用30使播放速度變快
LJMP DELAY
FASTSTOP:
CLR FASTFLAG
SETB FASTLED
MOV 40H,#83
LJMP DELAY
TEST1:
JB AUTOSTOP,GO_ON
CLR TR0
SETB SINGLED
CLR MAINLED
LJMP START0
GO_ON:
DJNZ R3,TEST
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
;計數表
TAB1:
DW 64580,64684,64777,64820
DW 64898,64968,65030,65058
DW 64260,64400,64524,65217
DW 65252,65283,65300,65330
;歌曲表,高位是頻率,低位是節拍
SONG:
;洋娃娃和小熊跳舞
/*
DB 12H,22H,32H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,54H
DB 12H,22H,32H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,14H
DB 62H,62H,61H,51H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,54H
DB 62H,62H,61H,51H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,14H,00H
*/
/*
;東風破
;一個小節是一行;9,A,B
DB 22H,12H,22H,33H,21H,22H,12H
DB 22H,12H,12H,0A2H,28H
DB 02H,22H,12H,22H,33H,21H,21H,11H,12H
DB 22H,12H,11H,0A1H,0A1H,91H,98H
DB 02H,52H,52H,52H,32H,32H,32H,42H
DB 53H,41H,42H,4AH
DB 02H,22H,22H,32H,21H,11H,12H,0A2H,12H
DB 62H,62H,62H,52H,58H
;反復記號后面
DB 02H,32H,32H,32H,33H,21H,22H,12H
DB 22H,32H,22H,12H,26H,32H
DB 02H,22H,0A2H,12H,23H,11H,12H,22H
DB 32H,52H,52H,32H,58H
DB 02H,52H,52H,52H,63H,51H,32H,42H
DB 54H,62H,4AH
DB 02H,22H,22H,12H,32H,22H,12H,0A2H
DB 22H,12H,22H,1AH
;括號里面的
DB 61H,31H,51H,21H,31H,21H,11H,0A1H,91H,0A1H,11H,21H,31H,51H,61H,81H
*/
;括號后面的反復記號
DB 02H,52H,52H,52H,63H,71H,62H,52H
DB 32H,32H,32H,22H,24H
DB 02H,52H,52H,52H,32H,22H,22H,12H
DB 22H,12H,22H,32H,34H
DB 02H,0B2H,12H,22H,32H,22H,32H,52H
DB 32H,22H,12H,22H,0A4H,04H
DB 02H,12H,12H,22H,32H,22H,32H,52H
DB 62H,52H,52H,32H,32H,32H,32H,22H
;重復
DB 02H,52H,52H,52H,63H,71H,62H,52H
DB 32H,32H,32H,22H,24H
DB 02H,52H,52H,52H,32H,22H,22H,12H
DB 22H,12H,22H,32H,34H
DB 02H,0B2H,12H,22H,32H,22H,32H,52H
DB 62H,52H,52H,32H,54H
DB 02H,62H,62H,52H,33H,51H,32H,22H
DB 02H,22H,22H,12H,32H,22H,12H,0A2H
DB 22H,1EH
;第二個括號里面
DB 3AH,22H,32H,0A2H
DB 16H,21H,31H,54H
DB 02H,32H,32H,32H,32H,61H,51H,33H,21H
DB 32H,51H,3DH
DB 6AH,32H,23H,31H
DB 21H,11H,0A6H,0A6H,21H,31H
DB 24H,22H,11H,0A1H,92H,0A1H,11H,14H,14H
DB 00H
END
|