回覆列表
  • 1 # 使用者3098613971747

    只有音樂發聲彙編程式,沒有加入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

  • 中秋節和大豐收的關聯?
  • 金牛座的愛情能回頭嗎?