導航:首頁 > 操作系統 > 單片機音樂匯編

單片機音樂匯編

發布時間:2023-08-26 21:16:41

A. 求51單片機 數字音樂盒 匯編語言代碼

Z8279
EQU
8701H
D8279
EQU
8700H
LO
EQU
30H
HI
EQU
31H
ORG
0000H
AJMP
START
ORG
000BH
LJMP
T0_INT
START:
MOV
SP,#60H
MOV
P3,#0FFH
MOV
TMOD,#00000000B
MOV
IE,#10000010B
LCALL
F8279
;;8279的初始化
LCALL
LO_KEY
;;判斷是否有下壓鍵
PAN1:
MOV
DPTR,Z8279
MOVX
A,@DPTR
ANL
A,#3FH
MOV
R2,A
;
;保存鍵值
ANL
A,#01H
;;鍵值1
JNZ
S_1
JZ
P_1
S_1:
LCALL
SONG_1
P_1:
MOV
A,R2
ANL
A,#02H
;;鍵值2
JNZ
S_2
JZ
P_2
S_2:
LCALL
SONG_2
P_2
MOV
A,R2
ANL
A,#03H
;;鍵值3
JNZ
S_3
JZ
P_3
S_3:
LCALL
SONG_3
P_3
MOV
A,R2
ANL
A,#04H
;;鍵值4
JNZ
S_4
JZ
P_4
S_4
LCALL
SONG_4
P_4
MOV
A,R2
ANL
A,#05H
;;鍵值5
JNZ
S_5
JZ
PAN1
S_5:
LCALL
SONG_5
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SONG_1:
;//歌曲1
MOV
R4,#15
LOOP1:
LCALL
VALUE1
SETB
TR0
MOV
R5,#20
LCALL
DELAY
CLR
TR0
MOV
R5,#20
LCALL
DELAY
LCALL
P_KEY
DJNZ
R4,LOOP1
LCALL
SONG_2
RET
SONG_2:
;//歌曲2
MOV
R4,#15
LOOP2:
LCALL
VALUE1
SETB
TR0
MOV
R5,#20
LCALL
DELAY
CLR
TR0
MOV
R5,#20
LCALL
DELAY
LCALL
P_KEY
DJNZ
R4,LOOP2
LCALL
SONG_3
RET
SONG_3:
;//歌曲3
MOV
R4,#15
LOOP3:
LCALL
VALUE1
SETB
TR0
MOV
R5,#20
LCALL
DELAY
CLR
TR0
MOV
R5,#20
LCALL
DELAY
LCALL
P_KEY
DJNZ
R4,LOOP3
LCALL
SONG_4
RET
SONG_4:
;//歌曲4
MOV
R4,#15
LOOP4:
LCALL
VALUE1
SETB
TR0
MOV
R5,#20
LCALL
DELAY
CLR
TR0
MOV
R5,#20
LCALL
DELAY
LCALL
P_KEY
DJNZ
R4,LOOP4
LCALL
SONG_5
RET
SONG_5:
;//歌曲5
MOV
R4,#15
LOOP5:
LCALL
VALUE1
SETB
TR0
MOV
R5,#20
LCALL
DELAY
CLR
TR0
MOV
R5,#20
LCALL
DELAY
LCALL
P_KEY
DJNZ
R4,LOOP5
LCALL
SONG_1
RET
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
VALUE1:
;//歌曲1的頻率設置
MOV
DPTR,#FREH1
MOV
A,R4
MOVC
A,@A+DPTR
MOV
HI,A
MOV
DPTR,#FREL1
MOV
A,R4
MOVC
A,@A+DPTR
MOV
LO,A
MOV
R4,#1*****************************************
RET
VALUE2:
;/;/歌曲2的頻率設置
MOV
DPTR,#FREH2
MOV
A,R4
MOVC
A,@A+DPTR
MOV
HI,A
MOV
DPTR,#FREL2
MOV
A,R4
MOVC
A,@A+DPTR
MOV
LO,A
MOV
R4,#1
RET
VALUE3:
;//歌曲3的頻率設置
MOV
DPTR,#FREH3
MOV
A,R4
MOVC
A,@A+DPTR
MOV
HI,A
MOV
DPTR,#FREL3
MOV
A,R4
MOVC
A,@A+DPTR
MOV
LO,A
MOV
R4,#1
RET
VALUE4:
;//歌曲4的頻率設置
MOV
DPTR,#FREH4
MOV
A,R4
MOVC
A,@A+DPTR
MOV
HI,A
MOV
DPTR,#FREL4
MOV
A,R4
MOVC
A,@A+DPTR
MOV
LO,A
MOV
R4,#1
RET
VALUE5:
;//歌曲5的頻率設置
MOV
DPTR,#FREH5
MOV
A,R4
MOVC
A,@A+DPTR
MOV
HI,A
MOV
DPTR,#FREL5
MOV
A,R4
MOVC
A,@A+DPTR
MOV
LO,A
MOV
R4,#1
RET
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
T0_INT:
MOV
TL0,LO
MOV
TH0,HI
CPL
P3.4
RETI
DELAY:
MOV
R6,#50
D1:
MOV
R7,#100
DJNZ
R7,$
DJNZ
R6,D1
DJNZ
R5,DELAY
RET
F8279:
MOV
DPTR,Z8279
MOV
A,#10H
MOVX
@DPTR,A
MOV
A,#34H
MOVX
@DPTR,A
MOV
A,#0D1H
MOVX
@DPTR,A
LCALL
DELAY
MOV
A,#80H
MOVX
@DPTR,A
MOV
A,#40H
MOVX
@DPTR,A
RET
LO_KEY:
MOV
DPTR,Z8279
MOVX
A,@DPTR
ANL
A,#0FH
JZ
LO_KEY
RET
P_KEY:
MOV
DPTR,Z8279
MOVX
A,@DPTR
ANL
A,#0FH
JNZ
SIGN1
JZ
SIGN2
SIGN1:
LJMP
PAN1
SIGN2:
RET
FREH1
DB
0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL1
DB
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH2
DB
0,236,229,232,233,226,230,240,231,246,244,234,236,247,248
FREL2
DB
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH3
DB
0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL3
DB
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH4
DB
0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL4
DB
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
FREH5
DB
0,226,229,232,233,236,238,240,241,242,244,244,246,247,248
FREL5
DB
0,4,13,10,20,3,8,6,2,23,5,26,1,4,3
END

B. 怎麼用單片機編寫音樂程序

單片機比如51系列都有定時器,因此可以利用它來控制揚聲器按一定頻率發聲,以下就是一個常式,用按鍵的按下和抬起來模擬電子琴的控製程序。

T0H EQU 30H

T0L EQU 31H

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV SP,#5FH

MOV TMOD,#01H

SETB ET0

SETB EA

LOOP:

MOV DPTR,#FREQ

MOV A,P2 ;控制高中低音區

MOV R1,#0

ANL A,#03H

JB ACC.0,LOOP01

MOV R1,#14

SJMP LOOP0

LOOP01:

JB ACC.1,LOOP0

MOV R1,#28

LOOP0:

JB P0.0,LOOP1 ;控制音頻1234567

MOV A,R1

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP1:

JB P0.1,LOOP2

MOV A,R1

ADD A,#2

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

ADD A,#2

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP2:

JB P0.2,LOOP3

MOV A,R1

ADD A,#4

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

ADD A,#4

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP3:

JB P0.3,LOOP4

MOV A,R1

ADD A,#6

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

ADD A,#6

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP4:

JB P0.4,LOOP5

MOV A,R1

ADD A,#8

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

ADD A,#8

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP5:

JB P0.5,LOOP6

MOV A,R1

ADD A,#10

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

ADD A,#10

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP6:

JB P0.6,LOOP7

MOV A,R1

ADD A,#12

MOVC A,@A+DPTR

MOV T0H,A

INC DPTR

MOV A,R1

ADD A,#12

MOVC A,@A+DPTR

MOV T0L,A

LJMP LOOP

LOOP7:

CLR TR0

LJMP LOOP

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

T0ISR:

CLR TR0

MOV TH0,T0H

MOV TL0,T0L

SETB TR0

CPL P3.0

RETI

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

FREQ:

DB 0F2H,03DH ;低音1

DB 0F3H,0BDH ;低音2

DB 0F5H,014H ;低音3

DB 0F5H,0B1H ;低音4

DB 0F6H,0D0H ;低音5

DB 0F7H,0D1H ;低音6

DB 0F8H,0B5H ;低音7


DB 0F9H,01EH ;中音1

DB 0F9H,0DEH ;中音2

DB 0FAH,08AH ;中音3

DB 0FAH,0D8H ;中音4

DB 0FBH,068H ;中音5

DB 0FBH,0E8H ;中音6

DB 0FCH,05AH ;中音7

DB 0FCH,08FH ;高音1

DB 0FCH,0EFH ;高音2

DB 0FDH,045H ;高音3

DB 0FDH,06CH ;高音4

DB 0FDH,0B4H ;高音5

DB 0FDH,0F4H ;高音6

DB 0FEH,029H ;高音7

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

END


C. 單片機 音樂程序編寫 歌曲《小星星》

只有音樂發聲匯編程序,沒有加入LED燈,供參考。數據代碼已改為小星星發聲
;**********************************************
ORG
0000H
SJMP
MAIN
ORG
0BH
AJMP
TIME0
;*************主程序************************
MAIN:
MOV
SP,#60
MOV
TMOD,#01H
;T0定時工作方式
MOV
IE,#82H
;CPU
中斷允許,T0中斷允許
START0:
MOV
30H,#00H
;TABLE
相對地址指針
NEXT:
MOV
A,30H

MOV
DPTR,#TABLE
;到TABLE處取
簡譜碼
節拍

MOVC
A,@A+DPTR
MOV
R2,A
;取到的簡譜碼
節拍碼
暫存於R2中
JZ
ENDF
;取到
00
結束
ANL
A,#0FH
;否,取低四位
節拍

MOV
R5,A
;將節拍碼存於R5中
MOV
A,R2
;簡譜碼
節拍

給A
SWAP
A
;高4位

低4位
交換
ANL
A,#0FH
;取簡譜

JNZ
SING
;取到的簡譜
碼不是0,則去發聲
CLR
TR0
;取到0
則不發聲
SJMP
DLY1
;節拍延時子程序(
隨節拍碼變化,延時時間不同)
;---------------發聲-----------------------
SING:
DEC
A
;取到的簡譜碼減1
;(簡譜碼計數值16位數據存儲首地址從TABLE1
《相對地址》0處開始放起,所以要減1)
MOV
22H,A
;存入(22H)中
RL
A
;乘2
因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
MOV
DPTR,#TABLE1
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC
A,@A+DPTR
;到TABLE1取相應的高位元組計數值
MOV
TH0,A
;高位元組計數值存入TH0和(21H)中
MOV
21H,A
MOV
A,22H
;減1的簡譜碼給A
RL
A
;乘2
因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
INC
A
;A
增加
取下一個位元組計數值
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC
A,@A+DPTR
;到TABLE1取相應的低位元組計數值
MOV
TL0,A
;低位元組計數值存入TL0和(20H)中
MOV
20H,A
SETB
TR0
;啟動T0定時器讓喇叭發出不同頻率聲音
;---------------節拍延時-------------------
DLY1:
ACALL
DELAY
;基本單位時間為1/4拍
187ms
INC
30H
;取下一個簡譜碼
節拍

SJMP
NEXT
;---------------歌放完結束---------------
ENDF:
CLR
TR0
;關閉T0定時器
AJMP
START0
;反復循環
;****T0中斷子程序(用來驅動喇叭發出不同頻率聲音)**************
TIME0:
PUSH
ACC
PUSH
PSW
MOV
TL0,20H
;重裝計數值
MOV
TH0,21H
CPL
P3.7
;驅動發聲
POP
PSW
POP
ACC
RETI
;******************節拍延時187ms****************************
DELAY:
MOV
R7,#187
;187ms延時子程序
DLY2:
MOV
R4,#02
DLY3:
MOV
R3,#248
DJNZ
R3,$
DJNZ
R4,DLY3
DJNZ
R7,DLY2
DJNZ
R5,DELAY
RET
;*******音符T值表(用來讓定時器發出不同的頻率)**DW
表示一個
計數值
占兩個位元組存儲單元***************
TABLE1:
DW
64260,64400,64524,64580,64684
;低音SO
低音LA
低音SI
/中音DO
中音RE
DW
64777,64820,64898,64968,65030
;中音MI
中音FA
中音SO
中音LA
中音SI
DW
65058,65110,65157,65178,65217
;高音DO
高音RE
高音MI
高音FA
高音SO
;*********簡譜碼
節拍碼(高4位簡譜碼
,低4位節拍碼)*************
TABLE:
DB
44H,44H,84H,84H

;
1
1
5
5
DB
094H,094H,88h

;
6
6
5
-
DB
74H,74H,63H,63H;
4
4
3
3
DB
52H,52H,48h
;
2
2
1-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h;
3
3
2-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h
;
3
3
2-
DB
44H,44H,84H,84H

;
1
1
5
5
DB
094H,094H,88h;
6
6
5
-


DB
74H,74H,63H,63H;
4
4
3
3
DB
52H,52H,48h;
2
2
1-
END
加入了LED燈,水平有限,效果有點不太好
;**********************************************
ORG
0000H
SJMP
MAIN
ORG
0BH
AJMP
TIME0
;*************主程序************************
MAIN:
MOV
SP,#60
MOV
TMOD,#01H
;TO定時工作方式
MOV
IE,#82H
;CPU
中斷允許,TO中斷允許
START0:
MOV
30H,#00H
;TABLE
相對地址指針
NEXT:
MOV
A,30H

MOV
DPTR,#TABLE
;到TABLE處取
簡譜碼
節拍

MOVC
A,@A+DPTR
MOV
R2,A
;取到的簡譜碼
節拍碼
暫存於R2中
JZ
ENDF
;取到
00
結束
ANL
A,#0FH
;否,取低四位
節拍

MOV
R5,A
;將節拍碼存於R5中
MOV
A,R2
;簡譜碼
節拍

給A
SWAP
A
;高4位

低4位
交換
ANL
A,#0FH
;取簡譜

JNZ
SING
;取到的簡譜
碼不是0,則去發聲
CLR
TR0
;取到0
則不發聲
SJMP
DLY1
;節拍延時子程序(
隨節拍碼變化,延時時間不同)
;---------------發聲-----------------------
SING:
DEC
A
;取到的簡譜碼減1
;(簡譜碼計數值16位數據存儲首地址從TABLE1
《相對地址》0處開始放起,所以要減1)
MOV
22H,A
;存入(22H)中
RL
A
;乘2
因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
MOV
DPTR,#TABLE1
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC
A,@A+DPTR
;到TABLE1取相應的高位元組計數值
MOV
TH0,A
;高位元組計數值存入TH0和(21H)中
MOV
21H,A
MOV
A,22H
;減1的簡譜碼給A
RL
A
;乘2
因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
INC
A
;A
增加
取下一個位元組計數值
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC
A,@A+DPTR
;到TABLE1取相應的低位元組計數值
MOV
TL0,A
;低位元組計數值存入TL0和(20H)中
MOV
20H,A
SETB
TR0
;啟動T0定時器讓喇叭發出不同頻率聲音
;---------------節拍延時-------------------
DLY1:
ACALL
DELAY
;基本單位時間為1/4拍
187ms
INC
30H
;取下一個簡譜碼
節拍

CPL
P1.0
LED燈
閃爍
CPL
P1.1

CPL
P1.2
CPL
P1.3
CPL
P1.4
CPL
P1.5
CPL
P1.6
CPL
P1.7
SJMP
NEXT
;---------------歌放完結束---------------
ENDF:
CLR
TR0
;關閉T0定時器
AJMP
START0
;反復循環
;****T0中斷子程序(用來驅動喇叭發出不同頻率聲音)**************
TIME0:
PUSH
ACC
PUSH
PSW
MOV
TL0,20H
;重裝計數值
MOV
TH0,21H
CPL
P3.7
;驅動發聲
POP
PSW
POP
ACC
RETI
;******************節拍延時187ms****************************
DELAY:
MOV
R7,#187
;187ms延時子程序
DLY2:
MOV
R4,#02
DLY3:
MOV
R3,#248
DJNZ
R3,$
DJNZ
R4,DLY3
DJNZ
R7,DLY2
DJNZ
R5,DELAY
RET
;*******音符T值表(用來讓定時器發出不同的頻率)**DW
表示一個
計數值
占兩個位元組存儲單元***************
TABLE1:
DW
64260,64400,64524,64580,64684
;低音SO
低音LA
低音SI
/中音DO
中音RE
DW
64777,64820,64898,64968,65030
;中音MI
中音FA
中音SO
中音LA
中音SI
DW
65058,65110,65157,65178,65217
;高音DO
高音RE
高音MI
高音FA
高音SO
;*********簡譜碼
節拍碼(高位簡譜碼
,低位節拍碼)*************
TABLE:
DB
44H,44H,84H,84H

;
1
1
5
5
DB
094H,094H,88h
;
6
6
5
--表示有節拍
DB
74H,74H,63H,63H
;
4
4
3
3
DB
52H,52H,48h
;
2
2
1-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h
;
3
3
2-
DB
84H,84H,74H,74H
;
5
5
4
4
DB
64H,64H,58h
;
3
3
2-
DB
44H,44H,84H,84H

;
1
1
5
5
DB
094H,094H,88h
;
6
6
5
-


DB
74H,74H,63H,63H
;
4
4
3
3
DB
52H,52H,48h
;
2
2
1-
END

D. 怎樣用stc89c52單片機控制蜂鳴器發出音樂的c語言程序

#include #include //本例採用89C52,晶振為11.0592MHZ //關於如何編制音樂代碼,其實十分簡單,各位可以看以下代碼. //頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍; //所以拿出譜子,試探編吧! sbitBeep=P1^5; unsignedcharn=0;//n為節拍常數變數 unsignedcharcodemusic_tab[]={ 0x18,0x30,0x1C,0x10,//格式為:頻率常數,節拍常數,頻率常數,節拍常數, 0x20,0x40,0x1C,0x10, 0x18,0x10,0x20,0x10, 0x1C,0x10,0x18,0x40, 0x1C,0x20,0x20,0x20, 0x1C,0x20,0x18,0x20, 0x20,0x80,0xFF,0x20, 0x30,0x1C,0x10,0x18, 0x20,0x15,0x20,0x1C, 0x20,0x20,0x20,0x26, 0x40,0x20,0x20,0x2B, 0x20,0x26,0x20,0x20, 0x20,0x30,0x80,0xFF, 0x20,0x20,0x1C,0x10, 0x18,0x10,0x20,0x20, 0x26,0x20,0x2B,0x20, 0x30,0x20,0x2B,0x40, 0x20,0x20,0x1C,0x10, 0x18,0x10,0x20,0x20, 0x26,0x20,0x2B,0x20, 0x30,0x20,0x2B,0x40, 0x20,0x30,0x1C,0x10, 0x18,0x20,0x15,0x20, 0x1C,0x20,0x20,0x20, 0x26,0x40,0x20,0x20, 0x2B,0x20,0x26,0x20, 0x20,0x20,0x30,0x80, 0x20,0x30,0x1C,0x10, 0x20,0x10,0x1C,0x10, 0x20,0x20,0x26,0x20, 0x2B,0x20,0x30,0x20, 0x2B,0x40,0x20,0x15, 0x1F,0x05,0x20,0x10, 0x1C,0x10,0x20,0x20, 0x26,0x20,0x2B,0x20, 0x30,0x20,0x2B,0x40, 0x20,0x30,0x1C,0x10, 0x18,0x20,0x15,0x20, 0x1C,0x20,0x20,0x20, 0x26,0x40,0x20,0x20, 0x2B,0x20,0x26,0x20, 0x20,0x20,0x30,0x30, 0x20,0x30,0x1C,0x10, 0x18,0x40,0x1C,0x20, 0x20,0x20,0x26,0x40, 0x13,0x60,0x18,0x20, 0x15,0x40,0x13,0x40, 0x18,0x80,0x00 }; voidint0()interrupt1//採用中斷0控制節拍 {TH0=0xd8; TL0=0xef; n--; } voiddelay(unsignedcharm)//控制頻率延時 { unsignedi=3*m; while(--i); } voiddelayms(unsignedchara)//豪秒延時子程序 { while(--a);//採用while(--a)不要採用while(a--);各位可編譯一下看看匯編結果就知道了! } voidmain() {unsignedcharp,m;//m為頻率常數變數 unsignedchari=0; TMOD&=0x0f; TMOD|=0x01; TH0=0xd8;TL0=0xef; IE=0x82; play: while(1) { a:p=music_tab[i]; if(p==0x00){i=0,delayms(1000);gotoplay;}//如果碰到結束符,延時1秒,回到開始再來一遍 elseif(p==0xff){i=i+1;delayms(100),TR0=0;gotoa;}//若碰到休止符,延時100ms,繼續取下一音符 else{m=music_tab[i++],n=music_tab[i++];}//取頻率常數和節拍常數 TR0=1;//開定時器1 while(n!=0)Beep=~Beep,delay(m);//等待節拍完成,通過P1口輸出音頻(可多聲道哦!) TR0=0;//關定時器1 } } 你參考這個吧

E. 單片機設計音樂播放器程序和模擬圖(用匯編語言)急求~謝謝!!!

NUMEQU30H
UPEQUP3.6
DNEQUP3.7
ORG0000H
AJMPSTART;Fosc=12MHz
ORG000BH;T0中斷入口地址
AJMPINT_T0
ORG001BH;T1中斷入口地址
AJMPINT_T1

START:
MOVSP,#60H
MOVTMOD,#11H
MOVIE,#8AH
MOVIP,#08H ;T1中斷優先於T0中斷
MOV TH1,#3CH
MOV TL1,#0BH ;以上為系統初始化,T=60ms

W1: MOV P2,#01110001B;等待提示"F" ,01110001
LCALL GETKEY
CJNEA,#0FFH,W1
MOVA,B
CJNEA,#0AH,W2
LCALLKEY_A;輸入鍵是'A',轉KEY_A
SJMP W1

W2: CJNE A,#0BH,W3
LCALLKEY_B;輸入鍵是'B',轉KEY_B

W3: CJNE A,#0CH,W4
LCALLKEY_C;輸入鍵是'C',轉KEY_C
W4: CJNE A,#0DH,W5
LCALLKEY_D
SJMP W1;輸入鍵是'D',轉KEY_D
W5: CJNEA,#0EH,W6 ;下一首
INCNUM
MOVA,NUM
CJNEA,#4,W51
W51:
JCW52
MOVNUM,#0
W52:
MOVA,NUM
SJMPD0
W6: CJNEA,#0FH,W7 ;上一首
MOVA,NUM
JNZW61
MOVNUM,#4
W61:
DECNUM
MOVA,NUM
SJMPD0
W7:
SJMP W1
KEY_A:;從1~4按順序播放
LCALL MUSIC1;樂曲《我和你》
LCALL MUSIC2;樂曲《萬水千山總是情》
LCALL MUSIC3;樂曲《送別》
LCALL MUSIC4;樂曲《北京歡迎您》
RET
KEY_B:;從1~4循環播放
T11: LCALL KEY_A
SJMP T11
RET
KEY_C:;循環播放某一樂曲
T3: LCALL GETWORD
CJNE A,#0FFH,T3
MOV A,B
D0:
JNZD1
SJMP E0
D1: DECA
JNZD2
SJMP E1
D2: DECA
JNZE3
SJMP E2
E0: LCALL MUSIC1;樂曲《我和你》
SJMP E0
E1: LCALL MUSIC2;樂曲《萬水千山總是情》
SJMP E1
E2: LCALL MUSIC3;樂曲《送別》
SJMP E2
E3: LCALL MUSIC4;樂曲《北京歡迎您》
SJMP E3
RET
KEY_D:;從某一樂曲開始播放,播放完後停止
T2: LCALL GETWORD
CJNE A,#0FFH,T2
MOV A,B
CJNE A,#00H,B1
SJMP C0
B1: CJNE A,#01H,B2
SJMP C1
B2: CJNE A,#02H,C3
SJMP C2
C0: LCALL MUSIC1;樂曲《我和你》
C1: LCALL MUSIC2;樂曲《萬水千山總是情》
C2: LCALL MUSIC3;樂曲《送別》
C3: LCALL MUSIC4;樂曲《北京歡迎您》
RET
MUSIC1:;第一首《我和你》
MOVP2,#00000110B ;顯示1,00000110
MOVR5,#11111001B
MOV52H,#HIGHTABLE10
MOV53H,#LOWTABLE10
MOVNUM,#0
LCALLmusic
RET
MUSIC2: ;第二首《萬水千山總是情》
MOV P2,#01011011B ;顯示2,01011011
MOV R5,#10100100B
MOV52H,#HIGHTABLE20
MOV53H,#LOWTABLE20
MOVNUM,#1
LCALL music
RET
MUSIC3: ;第三首《送別》
MOV P2,#01001111B ;顯示3,01001111
MOV R5,#10110000B
MOV52H,#HIGHTABLE30
MOV53H,#LOWTABLE30
MOVNUM,#2
LCALL music
RET
MUSIC4: ;第四首《北京歡迎您》
MOV P2,#01100110B ;顯示4,01100110
MOV R5,#10011001B
MOV52H,#HIGHTABLE40
MOV53H,#LOWTABLE40
MOVNUM,#3
LCALL music
RET
music: MOVR3,#00H ;音樂解碼器
NEXT20:
MOVA,P3
ORLA,#0C0H
MOVP3,A
MOVA,P3
CPLA
ANLA,#0C0H
JZNEXT21
POPACC
POPACC
LJMPW1
RET
NEXT21:
MOVA,R3
MOV DPH,52H
MOV DPL,53H
MOVC A,@A+DPTR
MOV R2,A
JZ STOP
ANL A,#0FH
MOV R1,A
MOV A,R2
SWAP A
ANL A,#0FH
JNZ SING
CLR TR0
JMP W11
;----------------------------------------------------------
SING:
DEC A
MOV22H,A
RL A
MOVDPTR,#TABLE00
MOVC A,@A+DPTR
MOV TH0,A
MOV 21H,A
MOV A,22H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 20H,A
SETB TR0
SETB TR1
W11:
LCALL DELAY3
INC R3
LJMP NEXT20
;-----------------------------------------------------------
STOP:
CLR TR0
CLR TR1
RET
;***************************************************
;定時器0中斷子程序
;***************************************************
INT_T0:
CLR TR0
MOV TL0,20H
MOV TH0,21H
CPL P3.0
SETB TR0
RETI
;***************************************************
;定時器1中斷子程序
;***************************************************
INT_T1:
CLRTR1
CLRTR0
LCALL KEY_E
MOVTH1,#3CH
MOVTL1,#0BH
DJNZ 60H,OUT
MOV 60H,#20
OUT:
SETB TR1
RETI
KEY_E:
JB P3.1,L2 ;中斷鍵盤檢測
LCALL DELAY2 ;消除抖動
JB P3.1,L2 ;如果是高電平就跳到L2
JNBP3.1,$ ;如果仍然是低電平就執行中斷程序
MOV P2,#0111100B ;讓LED顯示E,01111001
L3: JB P3.1,$ ;檢測低電平,直到低電平時才跳出該指令
LCALL DELAY2
JB P3.1,L3
JNBP3.1,$ ;如果再來一個高電平才跳出中斷
MOV P2,R5
L2: SETBTR0
RET
GETKEY: ;讀ABCD鍵盤子程序
SA: JB P1.0,SB ;讀A,是高電平表示沒有按鍵,跳轉到SB
LCALL DELAY2
JB P1.0,SA
JNB P1.0,$
MOV P2,#01110111B ;顯示A,01110111
MOV R5,#10001000B
MOV A,#0FFH
MOV B,#0AH
RET
SB: JB P1.1,C11 ;讀B,是高電平表示沒有按鍵按下,跳轉到C11
LCALL DELAY2
JB P1.1,SB
JNB P1.1,$
MOV P2,#01111100B ;顯示B,01111100
MOV R5,#10000011B
MOV A,#0FFH
MOV B,#0BH
RET
C11:JB P1.2,ED1 ;讀C
LCALL DELAY2
JB P1.2,C11
JNBP1.2,$
MOV P2,#00111001B ;顯示C,00111001
MOV R5,#11000110B
MOV A,#0FFH
MOV B,#0CH
RET
ED1:
JB P1.3,L0 ;讀D
LCALL DELAY2
JB P1.3,ED1
JNBP1.3,$
MOV P2,#01011110B ;顯示D,01011110
MOV R5,#10100001B
MOV A,#0FFH
MOV B,#0DH
L0: JBUP,L01
LCALLDELAY2
JBUP,L01
JNBUP,$
MOVA,#0FFH
MOVB,#0EH
RET
L01:
JBDN,L02
LCALLDELAY2
JBDN,L02
JNBDN,$
MOVA,#0FFH
MOVB,#0FH
L02:
RET
GETWORD:;讀音樂序號子程序
S1: JB P1.4,S2 ;讀1鍵
LCALL DELAY2
JB P1.4,S1
JNB P1.4,$
MOV P2,#00000110B ;顯示1
MOV R5,#11111001B
MOV A,#0FFH
MOV B,#00H
RET
S2: JB P1.5,S3 ;讀2鍵
LCALL DELAY2
JB P1.5,S2
JNB P1.5,$
MOV P2,#01011011B ;顯示2
MOV R5,#10100100B
MOV A,#0FFH
MOV B,#01H
RET
S3: JB P1.6,S4 ;讀3鍵
LCALL DELAY2
JB P1.6,S3
JNB P1.6,$
MOV P2,#01001111B ;顯示3
MOV R5,#10110000B
MOV A,#0FFH
MOV B,#02H
RET
S4: JB P1.7,L1 ;讀4鍵
LCALL DELAY2
JB P1.7,S1
JNB P1.7,$
MOV P2,#01100110B ;顯示4
MOV R5,#10011001B
MOV A,#0FFH
MOV B,#03H
L1: RET
DELAY:;延時子程序
PUSH0;保存現場
PUSH1
MOV0,#0H
DELAY1:MOV1,#0H
DJNZ1,$
DJNZ0,DELAY1
POP1;恢復現場
POP0
RET
DELAY2: MOV 41H,#100 ;延時子程序2
F1: MOV 42H,#250
DJNZ 42H,$
DJNZ 41H,F1
RET
DELAY3: ;延時子程序3
MOV R7,#2
W22: MOV R4,#125
W33: MOV R0,248
DJNZ R0,$
DJNZ R4,W33
DJNZ R7,W22
DJNZ R1,DELAY3
RET
TABLE00: ;頻率表
DW64260,64400,64524,64580;簡碼值低音5,低音6,低音7,1
DW64684,64777,64820,64898;簡碼值2,3,4,5
DW64968,65030,65058,65110;簡碼值6,7,高音1,高音
DW65157,65178,65217;簡碼值高音3,高音4,高音5
;--------------------------------------------------------------------
;第一首《我和你》
;--------------------------------------------------------------------
TABLE10:DB64H,82H,42H,48H
DB54H,64H,18H
DB44H,54H,64H,84H
DB5CH
DB64H,84H,44H,04H,42H
DB54H,64H,28H
DB54H,14H,54H,64H
DB4CH
DB98H,88H
DB98H,48H
DB64H,24H,64H,84H
DB5CH
DB64H,82H,42H,48H
DB54H,64H,28H
DB54H,14H,54H,34H
DB4CH
DB00H
;--------------------------------------------------------------------
;第二首《萬水千山總是情》
;--------------------------------------------------------------------
TABLE20: DB64H,74H,84H,04H,82H,94H,84H,6CH
DB54H,44H,04H,62H,54H,44H,2CH
DB24H,18H,44H,54H,64H,84H,94H,64H,5CH
DB64H,74H,84H,04H,82H,94H,84H,6CH
DB54H,44H,04H,62H,54H,44H,2CH
DB24H,18H,44H,64H,54H,04H,42H,24H,44H,4CH
DB64H,84H,9CH,0A4H,94H,74H,84H,04H,92H,8CH,64H,88H
DB64H,84H,9CH,0A4H,0A4H,94H,84H,64H,5CH
DB64H,74H,84H,04H,82H,94H,84H,6CH
DB54H,44H,04H,62H,54H,44H,2CH
DB24H,18H,44H,64H,54H,42H,24,44H,4CH
DB00H
;--------------------------------------------------------------------
;第三首《送別》
;--------------------------------------------------------------------
TABLE30:DB84H,62H,82H,0B8H
DB94H,0B2H,92H,88H
DB84H,42H,52H,64H,52H,44H
DB5CH
DB84H,62H,82H,0B4H,04H,82H
DB94H,0B4H,88H
DB84H,52H,62H,74H,04H,32H
DB4CH
DB94H,0B4H,0B8H
DB0A4H,92H,0A2H,0B8H
DB92H,0A2H,0B2H,92H,92H,82H,62H,42H
DB5CH
DB84H,62H,82H,0B4H,04H,0A2H
DB94H,0B4H,88H
DB84H,52H,62H,74H,04H,32H
DB4CH
DB00H
;--------------------------------------------------------------------
;第四首《北京歡迎您》
;--------------------------------------------------------------------
TABLE40:DB62H,82H,62H,52H,12H
DB62H,52H,12H,64H
DB62H,52H,22H,42H
DB62H,54H
DB52H,42H,22H,42H
DB52H,62H,82H,52H
DB62H,92H,82H,12H
DB52H,44H
DB52H,42H,22H,42H
DB52H,62H,82H,52H
DB62H,92H,82H,82H
DB68H
DB52H,62H,52H,42H
DB82H,92H,64H
DB22H,62H,64H
DB54H,64H
DB64H,84H
DB0B2H,82H,94H
DB02H,92H,82H,62H
DB62H,82H,88H
DB00H
END

閱讀全文

與單片機音樂匯編相關的資料

熱點內容
php怎麼轉換頁面 瀏覽:544
我的世界買了伺服器之後怎麼開服 瀏覽:826
r1234yf汽車空調壓縮機 瀏覽:143
ftp伺服器地址欄 瀏覽:898
linux圖形分區 瀏覽:963
安徽到遼寧源碼 瀏覽:575
libs安卓的文件夾叫什麼 瀏覽:869
生意圈app是什麼意思 瀏覽:395
linuxarcgisserver 瀏覽:234
加密pdf怎麼修改文件 瀏覽:138
紅米刷機無命令怎麼辦 瀏覽:356
啥叫美國谷歌外包程序員 瀏覽:260
雲伺服器管家婆 瀏覽:440
發郵件命令 瀏覽:354
程序員好做嗎工作好嗎 瀏覽:886
雲電腦伺服器維護一個月多少錢 瀏覽:882
有沒有什麼app數學題型較多 瀏覽:341
政策pdf 瀏覽:295
有什麼好玩的文娛app 瀏覽:811
python教學合集 瀏覽:959