八種聲音:友誼天長地久、梁祝、蘭花草、小草、千里之外、救護車、叮咚門鈴、嘀嘀聲。
單片機源程序如下:
- ;//*****************************************************
- ;文件名: 八音盒.asm
- ;描 述: 八音盒,P1選擇音樂,低電平有效,P3.0音樂輸出口。
- ; 本程序使用的寄存器有R1至R7,40H,41H,42H單元。
- ; 標號TAB1處為T0的定時常數數據表。
- ;//*****************************************************
- Speaker BIT P3.4
- FLAG1 BIT 20H
- FLAG2 BIT 21H
- ORG 0000H
- LJMP Start
-
- ORG 0003H
- LJMP EXINT0
- ORG 000BH
- LJMP INT_T0
- ORG 0013H
- LJMP EXINT1
- ORG 001BH
- DJNZ R4,GOON ;中斷次數不夠,繼續。
- CLR ET1 ;持續時間到,該音符停止。
- CLR ET0
- SJMP RE01
- GOON: MOV TL1,40H
- MOV TH1,41H
- RE01: RETI
- INT_T0: MOV C,FLAG1
- JC TORET
- DJNZ R0,TORET
- MOV R0,#6
- MOV C,FLAG2
- JC TOADD
- SJMP TOSUB
- TOADD: MOV A,R3
- CJNE A,#0FEH,ADD1
- CLR FLAG2
- SJMP TORET
- ADD1: MOV A,R2
- ADD A,#1
- MOV R2,A
- MOV A,R3
- ADDC A,#0
- MOV R3,A
- SJMP TORET
- TOSUB: MOV A,R3
- CJNE A,#0FBH,SUB1
- SETB FLAG2
- SJMP TORET
- SUB1: MOV A,R2
- SUBB A,#1
- MOV R2,A
- MOV A,R3
- SUBB A,#0
- MOV R3,A
- TORET: MOV TL0,R2
- MOV TH0,R3
- CPL Speaker ;音樂輸出口.
- RETI
- ORG 0080H
- EXINT0:
- CLR ET0
- CLR ET1
- CLR A
- PUSH ACC
- PUSH ACC
- RETI
- EXINT1:
- CLR ET0
- CLR ET1
- CLR A
- PUSH ACC
- PUSH ACC
- RETI
- Start:
- mov TCON, #05h ; 外部中斷0下降沿觸發
- SETB EX0 ; 打開外部中斷允許位(EX0)及總中斷允許位(EA)
- SETB EX1
- SETB EA
-
- MOV A,P1
- JNB ACC.0,Voice0
- JNB ACC.1,Voice1
- JNB ACC.2,Voice2
- JNB ACC.3,Voice3
- JNB ACC.4,Voice4
- JNB ACC.5,Voice5
- JNB ACC.6,Voice6
- JNB ACC.7,Voice7
- Sjmp Start
- Voice0: MOV DPTR,#tab_0 ;樂曲數據表的表頭
- Sjmp Main
- Voice1: MOV DPTR,#tab_1 ;樂曲數據表的表頭
- Sjmp Main
- Voice2: MOV DPTR,#tab_2 ;樂曲數據表的表頭
- Sjmp Main
- Voice3: MOV DPTR,#tab_3 ;樂曲數據表的表頭
- Sjmp Main
- Voice4: LJMP Main2
- ;MOV DPTR,#tab_4 ;樂曲數據表的表頭
- ;Sjmp Main
- Voice5: MOV DPTR,#tab_5 ;樂曲數據表的表頭
- Sjmp Main
- Voice6: MOV DPTR,#tab_6 ;樂曲數據表的表頭
- Sjmp Main
- Voice7: MOV DPTR,#tab_7 ;樂曲數據表的表頭
- Main: MOV TMOD,#11H
- MOV IP,#02H
- MOV 41H,#4CH ;T1初值放在41H,40H單元
- MOV 40H,#0B0H ;值越大,演奏越快
- SETB EA
- SETB FLAG1
- CLR A
- MOV R1,A ;R1作為音符指針
- L1: MOVC A,@A+DPTR
- INC R1 ;指向音符的拍數字節
- MOV R6,A ;音級字節暫存入R6
- JZ L3
- ACALL TONE
- MOV TH0,R3
- MOV TL0,R2
- SETB TR0
- SETB ET0
- MOV A,R1
- MOVC A,@A+DPTR
- INC R1
- CJNE R1,#00H,L2
- MOV DPTR,#0400H ;表指針溢出,更改表頭
- L2: ACALL LONG ;
- MOV A,R1
- AJMP L1 ;
- L3: MOV A,R1
- MOVC A,@A+DPTR
- MOV R7,A
- INC R1
- CJNE R1,#00H,L4
- MOV DPTR,#0400H
- L4: ACALL LONG ;
- MOV A,R1
- CJNE R7,#0FH,L1
- LJMP Main ;重復播放
- ORG 0200H
- TONE: MOV A,R6 ;取出音級字節
- RL A ;乘2,定時常數為雙字節
- MOV 42H,A ;暫存入42H單元
- ADD A,#05H ;距離數表有7個字節,使查表正確
- MOVC A,@A+PC ;取出TH0
- MOV R3,A
- MOV A,42H
- INC A
- MOVC A,@A+PC ;取出TL0
- MOV R2,A ;
- RET
-
- TAB1: DB 0F8H,8EH,0F8H,0F9H,0F9H,5EH
- DB 0F9H,0BEH,0FAH,18H,0FAH,6DH
- DB 0FAH,0BEH,0FBH,09H,0FBH,51H
- DB 0FBH,95H,0FBH,0D4H,0FCH,11H
- DB 0FCH,49H,0FCH,7FH,0FCH,0B2H
- DB 0FCH,0E1H,0FDH,0FH,0FDH,39H
- DB 0FDH,61H,0FDH,87H,0FDH,0ABH
- DB 0FDH,0CDH,0FDH,0EDH,0FEH,0BH
- DB 0FEH,27H,0FEH,42H,0FEH,5BH
- DB 0FEH,73H,0FEH,8AH,0FEH,9FH
- DB 0FEH,0B3H,0FEH,0C6H,0FEH,0D8H
- DB 0FEH,0E9H,0FEH,0F9H,0FFH,08H
- DB 0FFH,16H,0FFH,24H,0FFH,30H
- DB 0FFH,3CH,0FFH,47H,0FFH,52H
- DB 0FFH,5CH,0FFH,66H,0FFH,6FH
- DB 0FFH,77H,0FFH,7FH,0FFH,86H
- ORG 0300H ;音長子程序
- LONG: ADD A,#0FH ;使查表正確
- MOVC A,@A+PC ;取出定時器T1應中斷的次數
- MOV R4,A ;T1應中斷的次數存入R4中
- MOV TH1,41H
- MOV TL1,40H
- SETB TR1
- SETB ET1
- CJNE R4,#00H,$
- RET
- ;音長子程序結束
- TAB2: DB 01,02,04,06 ;應中斷的次數
- DB 08,10,12,14
- DB 16,20,24,28
- DB 32,40,48,64
- Main2: CLR FLAG1
- MOV TMOD,#01H
- MOV R3,#0FCH ; T1初值放在41H,40H單元
- MOV R2,#000H ;值越大,演奏越快
- MOV TL0,R2
- MOV TH0,R3
- SETB FLAG2
- SETB ET0
- SETB EA
- SETB TR0
- MOV R0,#6
- sjmp $
- TAB_0: ;《友誼天長地久》
- DB 00H,04H,00H,04H,08H,04H,0DH,08H,0DH,04H
- DB 0DH,08H,11H,04H,0FH,08H,0DH,04H
- DB 0FH,08H,11H,02H,0FH,02H,0DH,08H,0DH,04H
- DB 11H,08H,14H,04H,16H,0DH,16H,04H
-
- TAB_4: ;《千里之外》
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
八音盒.zip
(2.46 KB, 下載次數: 66)
2017-11-28 15:00 上傳
點擊文件名下載附件
|