shuzhi EQU 3fh ; 選曲目的地址
song EQU p1.2 ; 揚聲器播放
play EQU p3.0 ; 播放停止鍵
addone EQU p3.1 ; 曲目加一鍵
subone EQU p3.2 ; 曲目減一鍵
dul EQU P1 ;段選
wel EQU P2 ;位選
ORG 0000H
LJMP START
ORG 000BH ; 定時器 0 溢出中斷入口地址AJMP cont
ORG 0013H ; 外部中斷一入口地址AJMP pause ; 指向外部中斷程序 ORG 0100H
START:
MOV SP,#50H
MOV TH0,#0DBH ; 定時器賦初值MOV TL0,#0FFH
MOV TMOD,#01H ;設定 T1 工作于方式 2
MOV IE,#86H ; 開中斷MOV TCON,#00H
MOV R0,#00H
MOV shuzhi,#00H ;( 是否順序播放音樂 )
MAIN:
JNB play,first ; 判斷 P3.0 鍵是否按下SJMP MAIN
first:
ACALL del20
JNB play,first
MOV shuzhi,#00H
MOV dul,#06H ; 共陰數碼管顯示 1
MOV wel,#80H
MOV DPTR,#dat1 ;dat1 首地址賦給 DPTR
ACALL music0
ACALL next
RET
next:
INC shuzhi
MOV A,shuzhi
CJNE A,#01,LOOP3 ;A 是否=1, 不等就跳轉到 LOOP3 MOV DPTR,#dat2 ; 表 2 首地址送 DPTR
MOV dul,#5BH ; 顯示數值 2
MOV wel,#80H
ACALL music0
INC A
LOOP3:
CJNE A,#02,LOOP4 ;A 是否=2, 不等就跳轉到 LOOP4 MOV DPTR,#dat3 ; 表 3 首地址送 DPTR
MOV dul,#4FH ; 顯示數值 3
MOV wel,#80H
ACALL music0
INC A
LOOP4:
CJNE A,#03,next
ACALL first
RET
;(按鍵播放上一首音樂)
last:
DEC shuzhi
MOV a,shuzhi
CJNE a,#02,last1
MOV dptr,#dat3
MOV dul,#4Fh
MOV wel,#80h
ACALL music0
last1:
cjne a,#01,last2
MOV dptr,#dat2
MOV dul,#5Bh
MOV wel,#80h
ACALL music0
last2:
cjne a,#00,last
MOV dptr,#dat1
MOV dul,#06h
MOV wel,#80h
ACALL music0
RET
music0:
MOV 20h,#00h ; 中斷計數單元清 0
music1:
clr a
MOVC a,@a+dptr ; 查表取音階常數JZ end0 ; 累加器判 0 看是否是結束符單片機課程設計報告10
CJNE a,#0ffh,music5 ; 是休止符 ?
LJMP music3 ; 產生 100ms停頓
music5:
NOP
key:
JNB play,k0 ; 判斷 P3.0 鍵是否按下JNB addone,k1 ; 判斷 P3.2 鍵是否按下JNB subone,k2 ; 判斷 P3.1 鍵是否按下MOV r6,a ; 音階常數送 R6
INC dptr ;DPTR+1
MOV a,#0
MOVC a,@a+dptr ; 取常數送 R7
MOV r7,a
SETB tr0 ; 啟動定時器 T0
music2:
nop
CJNE r0,#0,$
CPL song ; 輸出電平取反MOV a, r6
MOV r3,a ; 音階常數送 R3 LCALL del20
MOV a, r7 ; 節拍常數送 A
CJNE a,20h,music2 ; 節拍時間到否MOV 20h,#00h ; 為取下一音階作準備INC DPTR
LJMP music1
music3:
NOP ; 休止 100ms
CLR tr0 ; 關閉定時器MOV r2, #14h
music4:
NOP
MOV r3, #250 ;R3=250
LCALL del20
DJNZ r2, music4
INC dptr ; 為取下一音階作準備LJMP music1 end0: MOV r2, #200 ; 歌曲結束后 , 延時 1s 后繼續
music6:
MOV r3, #250
LCALL del20
DJNZ r2,music6 ;(按鍵選擇)
k1:
ACALL del20 ; 調用延時子程序
JNB addone,k1 ; 判斷 P3.2 鍵是否釋放ACALL next
k2:
ACALL del20
JNB subone,k2 ; 判斷 P3.1 鍵是否釋放ACALL last
k0:
ACALL del20
JNB play,k0 ;判斷 3.0 鍵是否釋放LJMP start
RET
del20:
MOV r4,#05h ;延時子程序
del4:
NOP
DJNZ r4,del4
DJNZ r3,del20
RET
cont:
INC 20h ; 計數單元 +1
MOV th0,#0dbh ; 重新 10ms定時初值MOV tl0,#0ffh
RETI ; 跳出中斷(停止播放)pause: ACALL del20 JNB p3.0,pause ; 判斷 P3.0 鍵是否有釋放MOV a,r0 ; 把 R0的值給 A
CPL a ;A 值取反MOV r0,a
RETI
dat1:
db 3bh,20h,3bh,20h,30h,20h,33h,20h,3bh,80h,0ffh
db 3bh,20h,3bh,20h,26h,20h,2bh,20h,26h,80h,0ffh
db 26h,20h,26h,20h,20h,20h,26h,20h,2bh,20h,2bh,20h,30h,20h,33h,10h,33h,10h
db 3bh,60h,40h,20h,4ch,80h,0ffh
db 3bh,20h,3bh,20h,30h,20h,33h,20h,3bh,80h,0ffh
db 3bh,20h,3bh,20h,26h,20h,2bh,20h,26h,80h,0ffh
db 26h,20h,26h,20h,20h,20h,26h,20h,2bh,20h,2bh,20h,2bh,20h,30h,20h
db 33h,20h,3bh,20h,3bh,20h,40h,2bh,3bh,80h,0ffh
db 19h,20h,1ch,40h,26h,20h,19h,20h,1ch,40h,26h,20h,0ffh
db 20h,20h,1ch,20h,1ch,20h,20h,20h,26h,80h,0ffh
db 19h,20h,1ch,40h,26h,20h,19h,20h,1ch,40h,26h,20h,0ffh
db 20h,20h,1ch,20h,1ch,20h,20h,20h,26h,80h,0ffh
db 2bh,20h,2bh,40h,3bh,20h,2bh,20h,2bh,40h,2bh,20h,0ffh
db 26h,20h,2bh,20h,2bh,20h,30h,20h,2bh,80h,0ffh
db 2bh,20h,2bh,40h,3bh,20h,30h,20h,30h,40h,2bh,20h,0ffh
db 33h,20h,3bh,20h,3bh,20h,40h,20h,3bh,80h,0ffh,0ffh
dat2:
db 18h,30h,1ch,10h,20h,40h,1ch,10h
db 18h,10h,20h,10h,1ch,10h,18h,40h
db 1ch,20h,20h,20h,1ch,20h,18h,20h
db 20h,80h,0ffh,20h,30h,1ch,10h,18h
db 20h,15h,20h,1ch,20h,20h,20h,26h
db 40h,20h,20h,2bh,20h,26h,20h,20h
db 20h,30h,80h,0ffh,20h,20h,1ch,10h
db 18h,10h,20h,20h,26h,20h,2bh,20h
db 30h,20h,2bh,40h,20h,20h,1ch,10h
db 18h,10h,20h,20h,26h,20h,2bh,20h
db 30h,20h,2bh,40h,20h,30h,1ch,10h
db 18h,20h,15h,20h,1ch,20h,20h,20h
db 26h,40h,20h,20h,2bh,20h,26h,20h
db 20h,20h,30h,80h,20h,30h,1ch,10h
db 20h,10h,1ch,10h,20h,20h,26h,20h
db 2bh,20h,30h,20h,2bh,40h,20h,15h
db 1fh,05h,20h,10h,1ch,10h,20h,20h
db 26h,20h,2bh,20h,30h,20h,2bh,40h
db 20h,30h,1ch,10h,18h,20h,15h,20h
db 1ch,20h,20h,20h,26h,40h,20h,20h
db 2bh,20h,26h,20h,20h,20h,30h,30h
db 20h,30h,1ch,10h,18h,40h,1ch,20h
db 20h,20h,26h,40h,13h,60h,18h,20h
db 15h,40h,13h,40h,18h,80h,00h
dat3:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00h
END
|