• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 從零開始51單片機教程 —— 29 單片機音樂程序設計

    從零開始51單片機教程 —— 29 單片機音樂程序設計

    作者: 時間:2012-02-16 來源:網絡 收藏

    利用

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

    單片機的基本發音實驗

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

    例如,要產生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



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 桓台县| 绍兴县| 洛阳市| 江西省| 彭水| 新平| 隆化县| 普定县| 黄大仙区| 天台县| 彩票| 安多县| 三台县| 乐昌市| 宜都市| 沽源县| 潼南县| 漾濞| 瑞昌市| 海阳市| 安化县| 夏河县| 营口市| 麻城市| 陆川县| 凤庆县| 邛崃市| 江都市| 台州市| 宁夏| 赞皇县| 灌阳县| 张家港市| 望城县| 醴陵市| 垣曲县| 象州县| 孟村| 响水县| 普定县| 西昌市|