(玩電子) 電子技術學習與研究
                      當前位置:單片機教程網 >> 基礎教程 >> 瀏覽文章

                      28課:單片機音樂程序設計

                      作者:佚名   來源:本站原創   點擊數:x  更新時間:2007年08月14日   【字體:

                      利用單片機(或單板機)奏樂大概是無線電愛好者感興趣的問題之一。本文從單片機的基本發間實驗出發,談談音樂程序的設計原理,并給出具體實例,以供參考。

                      單片機的基本發音實驗

                      我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機某個口線的“高”電平或低電平,則在該口線上就能產生一定頻率的矩形波,接上喇叭就能發出一定頻率的聲音,若再利用延時程序控制“高”“低”電平的持續時間,就能改變輸出頻率,從而改變音調。

                      例如,要產生200HZ的音頻信號,按圖1接入喇叭(若屬臨時實驗,也可將喇叭直接接在P1口線上),實驗程序為:

                      其中子程序DEL為延時子程序,當R3為1時,延時時間約為20us,R3中存放延時常數,對200HZ音頻,其周期為1/200秒,即5ms。這樣,當P1.4的高電平或低電平的持續時間為2.5ms,即R3的時間常數取2500/20=125(7DH)時,就能發出200HZ的音調。將上述程序鍵入學習機,并持續修改R3的常數能感到音調的變化。樂曲中,每一音符對應著確定的頻率,表1給出C調時各音符頻率及其對應的時間常數。讀者能根據表1所供給的常數,將其16進制代碼送入R3,反復練習體會。根據表1能奏出音符。僅這還不夠,要準確奏出一首曲子,必須準確地控制樂曲節奏,即一音符的持續時間。

                      音符的節拍我們能用定時器T0來控制,送入不一樣的初值,就能產生不一樣的定時時間。便如某歌曲的節奏為每分鐘94拍,即一拍為0.64秒。其它節拍與時間的對應關系見表2。

                      但時,由于T0的最大定時時間只能為131毫秒,因此不可能直接用改變T0的時間初值來實現不一樣節拍。我們能用T0來產生10毫秒的時間基準,然后設置一個中斷計數器,通過判別中斷計數器的值來控制節拍時間的長短。表2中也給出了各種節拍所對應的時間常數。例如對1/4拍音符,定時時間為0.16秒,對應的時間常數為16(即10H);對3拍音符,定時時間為1.92秒,對應時間長數為192(即C0H)。

                      我們將每一音符的時間常數和其對應的節拍常數作為一組,按次序將樂曲中的所有常數排列成一個表,然后由查表程序依次取出,產生音符并控制節奏,就能實現演奏效果。此外,結束符和體止符能分別用代碼00H和FFH來表示,若查表結果為00H,則表示曲子終了;若查表結果為FFH,則產生對應的停頓效果。為了產生手彈的節奏感,在某些音符(例如兩個相同音符)音插入一個時間單位的頻率略有不一樣的音符。

                      下面給出程序序清單,可直接在TD-III型學習機上演奏,對其它不一樣型號的學習機,只需對應地改變一下地址即可。本程序演奏的是民歌“八月桂花遍地開”,C調,節奏為94拍/分。讀者也能自行找出一首歌,按表1和表2給定的常數,將樂曲翻譯成碼表輸入機器,而程序不變。本實驗辦法簡便,即使不懂音樂的人,將一首陌生的曲子翻譯成代碼也是易事,和著機器的演奏學唱一首歌曲,其趣味無窮。

                      程序清單(略,請參看源程序的說明)。

                      程序框圖如圖2所示。


                      <單片機音樂程序的設計圖>

                      本課由單片機教程網提供,有問題指出.

                      硬件連接說明:

                      隨便找一個仿真機或者什么單片機實驗板,只要能工作的就行,將程序輸入,運行,然后找個音箱(你計算機旁邊應當就有一對吧)撥出插頭,插頭的前端接在P1。0上,后面部分找根線接單片機的地,就應當有聲了,然后怎么改進硬件連接就是你的事了。。。。

                      音樂程序匯編代碼代碼1 -------------Voice.asm--------------------------

                              ORG     0000H
                              LJMP    START
                              ORG     000BH
                              INC     20H     ;中斷服務,中斷計數器加1
                              MOV     TH0,#0D8H
                              MOV     TL0,#0EFH  ;12M晶振,形成10毫秒中斷
                              RETI
                      START: 
                              MOV     SP,#50H
                              MOV     TH0,#0D8H
                              MOV     TL0,#0EFH
                              MOV     TMOD,#01H
                              MOV     IE,#82H
                      MUSIC0:
                              NOP
                              MOV     DPTR,#DAT      ;表頭地址送DPTR
                              MOV     20H,#00H        ;中斷計數器清0
                              MOV     B,#00H          ;表序號清0
                      MUSIC1:
                              NOP
                              CLR     A
                              MOVC    A,@A+DPTR       ;查表取代碼
                              JZ      END0     ;是00H,則結束
                              CJNE    A,#0FFH,MUSIC5
                              LJMP    MUSIC3
                      MUSIC5:
                              NOP
                              MOV     R6,A
                              INC     DPTR
                              MOV     A,B
                              MOVC    A,@A+DPTR       ;取節拍代碼送R7
                              MOV     R7,A
                              SETB    TR0             ;啟動計數
                      MUSIC2:
                              NOP
                              CPL     P1.0
                              MOV     A,R6
                              MOV     R3,A
                              LCALL   DEL
                              MOV     A,R7
                              CJNE    A,20H,MUSIC2    ;中斷計數器(20H)=R7否?
                                                      ;不等,則繼續循環
                              MOV     20H,#00H        ;等于,則取下一代碼
                              INC     DPTR
                      ;        INC     B
                              LJMP    MUSIC1
                      MUSIC3:
                              NOP
                              CLR     TR0     ;休止100毫秒
                              MOV     R2,#0DH
                      MUSIC4:
                              NOP
                              MOV     R3,#0FFH
                              LCALL   DEL
                              DJNZ    R2,MUSIC4
                              INC     DPTR
                              LJMP    MUSIC1
                      END0:
                              NOP
                              MOV     R2,#64H ;歌曲結束,延時1秒后繼續
                      MUSIC6:
                              MOV     R3,#00H
                              LCALL   DEL
                              DJNZ    R2,MUSIC6
                              LJMP    MUSIC0
                      DEL:
                              NOP
                      DEL3:                 
                              MOV     R4,#02H
                      DEL4:  
                              NOP
                              DJNZ    R4,DEL4
                              NOP
                              DJNZ    R3,DEL3
                              RET
                              NOP
                      DAT:
                       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

                      音樂程序匯編代碼代碼2 -------------Voice1.asm--------------------------

                      ;標題    '八月桂花香'發聲程序       
                      ;摘要    詳見'無線電'92年3期
                      ;作者    周振安
                        ORG     0000H
                              LJMP    START
                              ORG     000BH
                              INC     20H     ;中斷服務,中斷計數器加1
                              MOV     TH0,#0D8H
                              MOV     TL0,#0EFH  ;12M晶振,形成10毫秒中斷
                              RETI
                      START: 
                              MOV     SP,#50H
                              MOV     TH0,#0D8H
                              MOV     TL0,#0EFH
                              MOV     TMOD,#01H
                              MOV     IE,#82H
                      MUSIC0:
                              NOP
                              MOV     DPTR,#DAT      ;表頭地址送DPTR
                              MOV     20H,#00H        ;中斷計數器清0
                              MOV     B,#00H          ;表序號清0
                      MUSIC1:
                              NOP
                              CLR     A
                              MOVC    A,@A+DPTR       ;查表取代碼
                              JZ      END0     ;是00H,則結束
                              CJNE    A,#0FFH,MUSIC5
                              LJMP    MUSIC3
                      MUSIC5:
                              NOP
                              MOV     R6,A
                              INC     DPTR
                              MOV     A,B
                              MOVC    A,@A+DPTR       ;取節拍代碼送R7
                              MOV     R7,A
                              SETB    TR0             ;啟動計數
                      MUSIC2:
                              NOP
                              CPL     P1.0
                              MOV     A,R6
                              MOV     R3,A
                              LCALL   DEL
                              MOV     A,R7
                              CJNE    A,20H,MUSIC2    ;中斷計數器(20H)=R7否?
                                                      ;不等,則繼續循環
                              MOV     20H,#00H        ;等于,則取下一代碼
                              INC     DPTR
                      ;        INC     B
                              LJMP    MUSIC1
                      MUSIC3:
                              NOP
                              CLR     TR0     ;休止100毫秒
                              MOV     R2,#0DH
                      MUSIC4:
                              NOP
                              MOV     R3,#0FFH
                              LCALL   DEL
                              DJNZ    R2,MUSIC4
                              INC     DPTR
                              LJMP    MUSIC1
                      END0:
                              NOP
                              MOV     R2,#64H ;歌曲結束,延時1秒后繼續
                      MUSIC6:
                              MOV     R3,#00H
                              LCALL   DEL
                              DJNZ    R2,MUSIC6
                              LJMP    MUSIC0
                      DEL:
                              NOP
                      DEL3:                 
                              MOV     R4,#02H
                      DEL4:  
                              NOP
                              DJNZ    R4,DEL4
                              NOP
                              DJNZ    R3,DEL3
                              RET
                              NOP
                      DAT:  
                              DB      18H,     30H,     1CH,     10H
                              DB      20H,     40H,     1CH,     10H    
                              DB      18H,     10H,     20H,     10H
                              DB      1CH,     10H,     18H,     40H
                              DB      1CH,     20H,     20H,     20H
                              DB      1CH,     20H,     18H,     20H    
                              DB      20H,     80H,     0FFH,    20H
                              DB      30H,     1CH,     10H  ,   18H
                              DB      20H,     15H,     20H ,    1CH
                              DB      20H,     20H,     20H ,    26H
                              DB      40H,     20H ,    20H ,    2BH
                              DB      20H,     26H,     20H ,    20H    
                              DB      20H,     30H ,    80H ,    0FFH
                              DB      20H,     20H,     1CH ,    10H
                              DB      18H,     10H,     20H ,    20H
                              DB      26H,     20H ,    2BH ,    20H
                              DB      30H,     20H ,    2BH ,    40H
                              DB      20H,     20H  ,   1CH  ,   10H
                              DB      18H,     10H,     20H,     20H
                              DB      26H,     20H ,    2BH,     20H
                              DB      30H,     20H,     2BH ,    40H
                              DB      20H,     30H,     1CH ,    10H
                              DB      18H,     20H ,    15H ,    20H
                              DB      1CH,     20H ,    20H ,    20H
                              DB      26H,     40H,     20H ,    20H    
                              DB      2BH,     20H,     26H ,    20H    
                              DB      20H,     20H,     30H ,    80H
                              DB      20H,     30H,     1CH ,    10H
                              DB      20H,     10H,     1CH ,    10H
                              DB      20H,     20H,     26H  ,   20H
                              DB      2BH,     20H,     30H  ,   20H
                              DB      2BH,     40H,     20H   ,  15H
                              DB      1FH,     05H,     20H    , 10H
                              DB      1CH,     10H,     20H ,    20H
                              DB      26H,     20H,     2BH ,    20H
                              DB      30H,     20H,     2BH ,    40H
                              DB      20H,     30H,     1CH  ,   10H
                              DB      18H,     20H ,    15H  ,   20H
                              DB      1CH,     20H ,    20H  ,   20H
                              DB      26H,     40H,     20H  ,   20H
                              DB      2BH,     20H,     26H   ,  20H
                              DB      20H,     20H,     30H,     30H     
                              DB      20H,     30H,     1CH,     10H
                              DB      18H,     40H,     1CH,     20H
                              DB      20H,     20H,     26H,     40H
                              DB      13H,     60H,     18H ,    20H
                              DB      15H,     40H,     13H ,    40H
                              DB      18H,     80H,     00H
                      end

                      發表評論】【告訴好友】【收藏此文】【關閉窗口

                      文章評論

                      相關文章

                      富二代国产视频