|
- 只有音樂發(fā)聲匯編程序,沒有加入LED燈,供參考。數(shù)據(jù)代碼已改為小星星發(fā)聲
- ;**********************************************
- ORG 0000H
- SJMP MAIN
- ORG 0BH
- AJMP TIME0
- ;*************主程序************************
- MAIN: MOV SP,#60
- MOV TMOD,#01H ;T0定時(shí)工作方式
- MOV IE,#82H ;CPU 中斷允許,T0中斷允許
- START0: MOV 30H,#00H ;TABLE 相對(duì)地址指針
- NEXT: MOV A,30H
- MOV DPTR,#TABLE ;到TABLE處取 簡(jiǎn)譜碼 節(jié)拍 碼
- MOVC A,@A+DPTR
- MOV R2,A ;取到的簡(jiǎn)譜碼 節(jié)拍碼 暫存于R2中
- JZ ENDF ;取到 00 結(jié)束
- ANL A,#0FH ;否,取低四位 節(jié)拍 碼
- MOV R5,A ;將節(jié)拍碼存于R5中
- MOV A,R2 ;簡(jiǎn)譜碼 節(jié)拍 碼 給A
- SWAP A ;高4位 與 低4位 交換
- ANL A,#0FH ;取簡(jiǎn)譜 碼
- JNZ SING ;取到的簡(jiǎn)譜 碼不是0,則去發(fā)聲
- CLR TR0 ;取到0 則不發(fā)聲
- SJMP DLY1 ;節(jié)拍延時(shí)子程序( 隨節(jié)拍碼變化,延時(shí)時(shí)間不同)
- ;---------------發(fā)聲-----------------------
- SING: DEC A ;取到的簡(jiǎn)譜碼減1
- ;(簡(jiǎn)譜碼計(jì)數(shù)值16位數(shù)據(jù)存儲(chǔ)首地址從TABLE1 《相對(duì)地址》0處開始放起,所以要減1)
- MOV 22H,A ;存入(22H)中
- RL A ;乘2 因?yàn)槿〉臄?shù)據(jù)占兩字節(jié)(16位)
- ;所以指針增加量要乘2
- MOV DPTR,#TABLE1
- ;...........簡(jiǎn)譜碼轉(zhuǎn)換為相應(yīng)定時(shí)器16位計(jì)數(shù)值.............
- MOVC A,@A+DPTR ;到TABLE1取相應(yīng)的高字節(jié)計(jì)數(shù)值
- MOV TH0,A ;高字節(jié)計(jì)數(shù)值存入TH0和(21H)中
- MOV 21H,A
- MOV A,22H ;減1的簡(jiǎn)譜碼給A
- RL A ;乘2 因?yàn)槿〉臄?shù)據(jù)占兩字節(jié)(16位)
- ;所以指針增加量要乘2
- INC A ;A 增加 取下一個(gè)字節(jié)計(jì)數(shù)值
- ;...........簡(jiǎn)譜碼轉(zhuǎn)換為相應(yīng)定時(shí)器16位計(jì)數(shù)值.............
- MOVC A,@A+DPTR ;到TABLE1取相應(yīng)的低字節(jié)計(jì)數(shù)值
- MOV TL0,A ;低字節(jié)計(jì)數(shù)值存入TL0和(20H)中
- MOV 20H,A
- SETB TR0 ;啟動(dòng)T0定時(shí)器讓喇叭發(fā)出不同頻率聲音
- ;---------------節(jié)拍延時(shí)-------------------
- DLY1: ACALL DELAY ;基本單位時(shí)間為1/4拍 187ms
- INC 30H ;取下一個(gè)簡(jiǎn)譜碼 節(jié)拍 碼
- SJMP NEXT
- ;---------------歌放完結(jié)束---------------
- ENDF: CLR TR0 ;關(guān)閉T0定時(shí)器
- AJMP START0 ;反復(fù)循環(huán)
- ;****T0中斷子程序(用來驅(qū)動(dòng)喇叭發(fā)出不同頻率聲音)**************
- TIME0: PUSH ACC
- PUSH PSW
- MOV TL0,20H ;重裝計(jì)數(shù)值
- MOV TH0,21H
- CPL P3.7 ;驅(qū)動(dòng)發(fā)聲
- POP PSW
- POP ACC
- RETI
- ;******************節(jié)拍延時(shí)187ms****************************
- DELAY: MOV R7,#187 ;187ms延時(shí)子程序
- DLY2: MOV R4,#02
- DLY3: MOV R3,#248
- DJNZ R3,$
- DJNZ R4,DLY3
- DJNZ R7,DLY2
- DJNZ R5,DELAY
- RET
- ;*******音符T值表(用來讓定時(shí)器發(fā)出不同的頻率)**DW 表示一個(gè) 計(jì)數(shù)值 占兩個(gè)字節(jié)存儲(chǔ)單元***************
- 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
- ;*********簡(jiǎn)譜碼 節(jié)拍碼(高4位簡(jiǎn)譜碼 ,低4位節(jié)拍碼)*************
- 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
復(fù)制代碼
|
|