電子琴的仿真我在本科階段的一個課程設計題目,以51單片機為核心,電子琴按鍵是4乘4的矩陣式鍵盤,代碼是用匯編語言寫的,都是原創。
QQ圖片20170517142030.png (17.12 KB, 下載次數: 64)
下載附件
仿真
2017-5-19 17:46 上傳
QQ圖片20170519174912.png (23.28 KB, 下載次數: 75)
下載附件
代碼
2017-5-19 17:49 上傳
0.png (68.85 KB, 下載次數: 62)
下載附件
2017-5-19 17:59 上傳
51單片機源程序:
- //附錄一 程序清單
- BUFF EQU 30H
- STH0 EQU 31H
- STL0 EQU 32H
- TEMP EQU 33H
- ORG 0000H
- LJMP START
- ORG 000BH
- LJMP INT_T0
- ORG 001BH
- LJMP TIM1
- START:MOV TMOD,#01H
- SETB ET0
- SETB EA
- MAIN:MOV P1,#0FFH ;置為高電平
- CLR P1.4 ;掃第一行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY1 ;為零無鍵按下轉移
- LCALL DELY10MS
- MOV A,P1 ;到底有沒有鍵按下啊,去抖
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY1
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK1 ;相等說明這回是真有鍵按下了,不騙人 00001110第一列
- MOV BUFF,#0 ;給個鍵值
- LJMP NDK1 ;終于出聲音了巴拉巴拉巴拉巴拉
- KK1:CJNE A,#0DH,KK2 ;第二列00001101
- MOV BUFF,#1
- LJMP NDK1
- KK2:CJNE A,#0BH,KK3 ;第三列00001011
- MOV BUFF,#2
- LJMP NDK1
- KK3:CJNE A,#07H,KK4 ;第四列0000 0111
- MOV BUFF,#3
- LJMP NDK1
- KK4:NOP ;空
- ;下面都是一樣的套路掃描第二三四行,復制三遍OK
- KKEY1:MOV P1,#0FFH
- CLR P1.5 ;掃第二行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY2
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY2
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK5
- MOV BUFF,#4
- LJMP NDK1
- KK5:CJNE A,#0DH,KK6
- MOV BUFF,#5
- LJMP NDK1
- KK6:CJNE A,#0BH,KK7
- MOV BUFF,#6
- LJMP NDK1
- KK7:CJNE A,#07H,KK8
- MOV BUFF,#7
- LJMP NDK1
- KK8:NOP
- KKEY2:MOV P1,#0FFH
- CLR P1.6 ;掃第三行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY3
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY3
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK9
- MOV BUFF,#8
- LJMP NDK1
- KK9:CJNE A,#0DH,KK10
- MOV BUFF,#9
- LJMP NDK1
- KK10:CJNE A,#0BH,KK11
- MOV BUFF,#10
- LJMP NDK1
- KK11:CJNE A,#07H,KK12
- MOV BUFF,#11
- LJMP NDK1
- KK12:NOP
- KKEY3:MOV P1,#0FFH
- CLR P1.7 ;掃第四行
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY4
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0FH
- XRL A,#0FH
- JZ KKEY4
- MOV A,P1
- ANL A,#0FH
- CJNE A,#0EH,KK13
- MOV BUFF,#12
- LJMP NDK1
- KK13:CJNE A,#0DH,KK14
- MOV BUFF,#13
- LJMP NDK1
- KK14:CJNE A,#0BH,KK15
- MOV BUFF,#14
- LJMP NDK1
- KK15:CJNE A,#07H,KK16
- MOV BUFF,#15
- LJMP NDK1
- KK16:NOP
- NDK1: MOV A,BUFF ;給鍵值
- MOV DPTR,#TABLE
- MOVC A,@A+DPTR ;到表里找到它段碼
- MOV P0,A ;給數碼管數碼管
- MOV A,BUFF
- RL A
- MOV TEMP,A
- MOV DPTR,#TABLE1
- MOVC A,@A+DPTR ;到表里找到它的T/2
- MOV STH0,A
- MOV TH0,A
- INC TEMP
- MOV A,TEMP
- MOVC A,@A+DPTR
- MOV STL0,A
- MOV TL0,A ;給定時器高低位
- SETB TR0
- NDK1A: MOV A,P1 ;松手了嗎親 ,不松手繼續出聲
- ANL A,#0FH
- XRL A,#0FH
- JNZ NDK1A
- CLR TR0
- KKEY4: MOV A,#0FFH
- MOV P2,A
- MOV A,P2
- JB ACC.0,KKEY5 ;中斷按下了嗎,按下就唱歌了,想好了再按
- LCALL DELY10MS
- MOV A,P2
- JB ACC.0,KKEY5
- MOV BUFF,#16
- MOV P0,#7FH
- LJMP START22
- START22:MOV A,BUFF
- CJNE A,#16,KKEY5
- LJMP START2
- KKEY5: LJMP MAIN
- START2:MOV TMOD,#10H ;準備播放音樂
- MOV IE,#88H
- START0: MOV 30H,#00
- NEXT: MOV A,30H
- MOV DPTR,#TAB ;拿到簡譜碼表
- MOVC A,@A+DPTR
- MOV R2,A
- JZ EN0
- ANL A,#0FH
- MOV R5,A ;節拍放入R5
- MOV A,R2
- SWAP A
- ANL A,#0FH
- JNZ SING
- CLR TR1
- LJMP D1
- SING: DEC A
- MOV 23H,A
- RL A
- MOV DPTR,#TAB1
- MOVC A,@A+DPTR
- MOV TH1,A
- MOV 24H,A
- MOV A,23H
- RL A
- INC A
- MOVC A,@A+DPTR
- MOV TL1,A
- MOV 25H,A
- SETB TR1
- D1: CALL DELAY1
- INC 30H
- JMP NEXT
- EN0: CLR TR1
- LJMP START
- TIM1: PUSH ACC
- PUSH PSW
- MOV TL1,25H
- MOV TH1,24H
- CPL P3.0
- CPL P3.1
- POP PSW
- POP ACC
- RETI
- DELAY1: MOV R4,#02 ;187MS
- DELAY2: MOV R3,#187
- DELAY3: MOV R2,#248
- DJNZ R2,$
- DJNZ R3,DELAY3
- DJNZ R4,DELAY2
- DJNZ R5,DELAY1
- RET
- DELY10MS:MOV R6,#10 ;10MS
- D10: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D10
- RET
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
全部資料下載地址:
電子琴仿真及程序代碼.rar
(329.4 KB, 下載次數: 84)
2017-5-19 17:47 上傳
點擊文件名下載附件
仿真及程序代碼 下載積分: 黑幣 -5
|