找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18021|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

28課:單片機(jī)音樂程序設(shè)計

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1 發(fā)表于 2013-6-3 23:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用單片機(jī)(或單板機(jī))奏樂大概是無線電愛好者感興趣的問題之一。本文從單片機(jī)的基本發(fā)間實驗出發(fā),談?wù)勔魳烦绦虻脑O(shè)計原理,并給出具體實例,以供參考。
單片機(jī)的基本發(fā)音實驗
我們知道,聲音的頻譜范圍約在幾十到幾千赫茲,若能利用程序來控制單處機(jī)某個口線的“高”電平或低電平,則在該口線上就能產(chǎn)生一定頻率的矩形波,接上喇叭就能發(fā)出一定頻率的聲音,若再利用延時程序控制“高”“低”電平的持續(xù)時間,就能改變輸出頻率,從而改變音調(diào)。
例如,要產(chǎn)生200HZ的音頻信號,按圖1接入喇叭(若屬臨時實驗,也可將喇叭直接接在P1口線上),實驗程序為:
其中子程序DEL為延時子程序,當(dāng)R3為1時,延時時間約為20us,R3中存放延時常數(shù),對200HZ音頻,其周期為1/200秒,即5ms。這樣,當(dāng)P1.4的高電平或低電平的持續(xù)時間為2.5ms,即R3的時間常數(shù)取2500/20=125(7DH)時,就能發(fā)出200HZ的音調(diào)。將上述程序鍵入學(xué)習(xí)機(jī),并持續(xù)修改R3的常數(shù)能感到音調(diào)的變化。樂曲中,每一音符對應(yīng)著確定的頻率,表1給出C調(diào)時各音符頻率及其對應(yīng)的時間常數(shù)。讀者能根據(jù)表1所供給的常數(shù),將其16進(jìn)制代碼送入R3,反復(fù)練習(xí)體會。根據(jù)表1能奏出音符。僅這還不夠,要準(zhǔn)確奏出一首曲子,必須準(zhǔn)確地控制樂曲節(jié)奏,即一音符的持續(xù)時間。
音符的節(jié)拍我們能用定時器T0來控制,送入不一樣的初值,就能產(chǎn)生不一樣的定時時間。便如某歌曲的節(jié)奏為每分鐘94拍,即一拍為0.64秒。其它節(jié)拍與時間的對應(yīng)關(guān)系見表2。
但時,由于T0的最大定時時間只能為131毫秒,因此不可能直接用改變T0的時間初值來實現(xiàn)不一樣節(jié)拍。我們能用T0來產(chǎn)生10毫秒的時間基準(zhǔn),然后設(shè)置一個中斷計數(shù)器,通過判別中斷計數(shù)器的值來控制節(jié)拍時間的長短。表2中也給出了各種節(jié)拍所對應(yīng)的時間常數(shù)。例如對1/4拍音符,定時時間為0.16秒,對應(yīng)的時間常數(shù)為16(即10H);對3拍音符,定時時間為1.92秒,對應(yīng)時間長數(shù)為192(即C0H)。
我們將每一音符的時間常數(shù)和其對應(yīng)的節(jié)拍常數(shù)作為一組,按次序?qū)非械乃谐?shù)排列成一個表,然后由查表程序依次取出,產(chǎn)生音符并控制節(jié)奏,就能實現(xiàn)演奏效果。此外,結(jié)束符和體止符能分別用代碼00H和FFH來表示,若查表結(jié)果為00H,則表示曲子終了;若查表結(jié)果為FFH,則產(chǎn)生對應(yīng)的停頓效果。為了產(chǎn)生手彈的節(jié)奏感,在某些音符(例如兩個相同音符)音插入一個時間單位的頻率略有不一樣的音符。
下面給出程序序清單,可直接在TD-III型學(xué)習(xí)機(jī)上演奏,對其它不一樣型號的學(xué)習(xí)機(jī),只需對應(yīng)地改變一下地址即可。本程序演奏的是民歌“八月桂花遍地開”,C調(diào),節(jié)奏為94拍/分。讀者也能自行找出一首歌,按表1和表2給定的常數(shù),將樂曲翻譯成碼表輸入機(jī)器,而程序不變。本實驗辦法簡便,即使不懂音樂的人,將一首陌生的曲子翻譯成代碼也是易事,和著機(jī)器的演奏學(xué)唱一首歌曲,其趣味無窮。
程序清單(略,請參看源程序的說明)。
程序框圖如圖2所示。

<單片機(jī)音樂程序的設(shè)計圖>
本課由單片機(jī)教程網(wǎng)提供,有問題指出.
硬件連接說明:
隨便找一個仿真機(jī)或者什么單片機(jī)實驗板,只要能工作的就行,將程序輸入,運行,然后找個音箱(你計算機(jī)旁邊應(yīng)當(dāng)就有一對吧)撥出插頭,插頭的前端接在P1。0上,后面部分找根線接單片機(jī)的地,就應(yīng)當(dāng)有聲了,然后怎么改進(jìn)硬件連接就是你的事了。。。。
音樂程序匯編代碼代碼1 -------------Voice.asm--------------------------
        ORG     0000H
        LJMP    START
        ORG     000BH
        INC     20H     ;中斷服務(wù),中斷計數(shù)器加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        ;中斷計數(shù)器清0
        MOV     B,#00H          ;表序號清0
MUSIC1:
        NOP
        CLR     A
        MOVC    A,@A+DPTR       ;查表取代碼
        JZ      END0     ;是00H,則結(jié)束
        CJNE    A,#0FFH,MUSIC5
        LJMP    MUSIC3
MUSIC5:
        NOP
        MOV     R6,A
        INC     DPTR
        MOV     A,B
        MOVC    A,@A+DPTR       ;取節(jié)拍代碼送R7
        MOV     R7,A
        SETB    TR0             ;啟動計數(shù)
MUSIC2:
        NOP
        CPL     P1.0
        MOV     A,R6
        MOV     R3,A
        LCALL   DEL
        MOV     A,R7
        CJNE    A,20H,MUSIC2    ;中斷計數(shù)器(20H)=R7否?
                                ;不等,則繼續(xù)循環(huán)
        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 ;歌曲結(jié)束,延時1秒后繼續(xù)
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--------------------------
;標(biāo)題    '八月桂花香'發(fā)聲程序        
;摘要    詳見'無線電'92年3期
;作者    周振安
  ORG     0000H
        LJMP    START
        ORG     000BH
        INC     20H     ;中斷服務(wù),中斷計數(shù)器加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        ;中斷計數(shù)器清0
        MOV     B,#00H          ;表序號清0
MUSIC1:
        NOP
        CLR     A
        MOVC    A,@A+DPTR       ;查表取代碼
        JZ      END0     ;是00H,則結(jié)束
        CJNE    A,#0FFH,MUSIC5
        LJMP    MUSIC3
MUSIC5:
        NOP
        MOV     R6,A
        INC     DPTR
        MOV     A,B
        MOVC    A,@A+DPTR       ;取節(jié)拍代碼送R7
        MOV     R7,A
        SETB    TR0             ;啟動計數(shù)
MUSIC2:
        NOP
        CPL     P1.0
        MOV     A,R6
        MOV     R3,A
        LCALL   DEL
        MOV     A,R7
        CJNE    A,20H,MUSIC2    ;中斷計數(shù)器(20H)=R7否?
                                ;不等,則繼續(xù)循環(huán)
        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 ;歌曲結(jié)束,延時1秒后繼續(xù)
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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂2 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:58052 發(fā)表于 2013-12-20 22:06 | 只看該作者
怎么用計算機(jī)仿真?能說詳細(xì)點不?
回復(fù)

使用道具 舉報

板凳
ID:73847 發(fā)表于 2015-2-24 16:18 | 只看該作者
謝謝分享,好好學(xué)習(xí)。
回復(fù)

使用道具 舉報

地板
ID:79996 發(fā)表于 2015-5-16 12:55 | 只看該作者
厲害,可惜我只會用C寫
回復(fù)

使用道具 舉報

5#
ID:85033 發(fā)表于 2015-8-4 20:25 來自手機(jī) | 只看該作者
QAQ終于尼瑪幣看完了,感謝老師
回復(fù)

使用道具 舉報

6#
ID:89508 發(fā)表于 2015-9-6 18:15 | 只看該作者
很贊,很好,簡單易懂
回復(fù)

使用道具 舉報

7#
ID:89508 發(fā)表于 2015-9-6 18:16 | 只看該作者
很贊,很好,簡單易懂
回復(fù)

使用道具 舉報

8#
ID:93449 發(fā)表于 2015-10-27 12:39 | 只看該作者
恩,,,自己學(xué)習(xí)吧
回復(fù)

使用道具 舉報

9#
ID:142996 發(fā)表于 2016-10-16 22:52 | 只看該作者
謝謝樓主,思密達(dá)
回復(fù)

使用道具 舉報

10#
ID:146740 發(fā)表于 2016-11-8 22:53 | 只看該作者
云往這邊飄 發(fā)表于 2013-12-20 22:06
怎么用計算機(jī)仿真?能說詳細(xì)點不?

protues 中仿真   
回復(fù)

使用道具 舉報

11#
ID:152317 發(fā)表于 2016-12-6 08:06 | 只看該作者
下來試試看
回復(fù)

使用道具 舉報

12#
ID:153199 發(fā)表于 2016-12-24 12:58 | 只看該作者
請問樓主dat用什么軟件生成
回復(fù)

使用道具 舉報

13#
ID:220342 發(fā)表于 2017-8-7 13:46 | 只看該作者
厲害,如果用C語言寫就更好了,方便初學(xué)者理解
回復(fù)

使用道具 舉報

14#
ID:93625 發(fā)表于 2018-6-27 10:06 | 只看該作者
看來把這課給漏學(xué)了,補(bǔ)上
回復(fù)

使用道具 舉報

15#
ID:381034 發(fā)表于 2018-7-30 20:38 | 只看該作者
謝謝                                 
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表