返回列表 回復 發帖

單片機演奏音樂

利用單片機演奏音樂大概是單片機愛好者感興趣的問題之一。這裏我們用網站提供的實驗板來做這個實驗,並且瞭解單片機演奏音樂的基本原理,和相關的根源程式。

  首先來完成必要的硬體部分,硬體部分比較簡單,如下圖:

  

  AT89C51單片機的P2.5口控制一個8550的三極管,三極管控制電磁蜂鳴器的電源通斷。

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

  例如,要產生200HZ的音頻信號,200HZ音頻的變化週期為1/200秒,即5ms。這樣,當P2.5的高電平或低電平的持續時間為2.5ms時就能發出200HZ的音調。

  樂曲中,每一音符對應著確定的頻率,我們將每一音符的時間常數和其相應的節拍常數作為一組,按順序將樂曲中的所有常數排列成一個表,然後由查表程式依次取出,產生音符並控制節奏,就可以實現演奏效果。

  此外,結束符和體止符可以分別用代碼00H和FFH來表示,若查表結果為00H,則表示曲子終了;若查表結果為FFH,則產生相應的停頓效果。

  為了產生手彈的節奏感,在某些音符(例如兩個相同音符)音插入一個時間單位的頻率略有不同的音符。

  程式框圖如圖2所示。

  

  下麵給出程式序請單,可直接在51實驗板上進行演奏。本程式演奏的是民歌“八月桂花遍地開”,C調,節奏為94拍/分。網友也可以自行找出一首歌,將樂曲翻譯成碼表輸入機器,而程式不變。本實驗方法簡便,即使不懂音樂的人,將一首陌生的曲子翻譯成代碼也是易事,和著機器的演奏學唱一首歌曲,其趣味無窮。

  ;標題 ’八月桂花香’發聲程式

  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

  MUSIC1:

  NOP

  CLR A ;A清零

  MOVC A,@A+DPTR ;查表取代碼

  JZ END0 ;是00H,則結束

  CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下執行

  LJMP MUSIC3

  MUSIC5:

  NOP

  MOV R6,A ;R6=18H音符的頻率

  INC DPTR DPTR加一

  MOV A,#0

  MOVC A,@A+DPTR ;取節拍代碼送R7

  MOV R7,A ;R7=30H音符發音的時間

  SETB TR0 ;啟動計數

  MUSIC2:

  NOP

  CPL P2.5 ;P2.5是音樂輸出引腳

  MOV A,R6

  MOV R3,A ;R3=R6=18H

  LCALL DEL

  MOV A,R7

  CJNE A,20H,MUSIC2 ;中斷計數器(20H)=R7否?

  ;不等,則繼續迴圈

  MOV 20H,#00H ;等於,則取下一代碼

  INC DPTR

  LJMP MUSIC1

  MUSIC3:

  NOP ;休止100毫秒

  CLR TR0

  MOV R2,#0DH ;R2=13

  MUSIC4:

  NOP

  MOV R3,#0FFH ;R3=255

  LCALL DEL

  DJNZ R2,MUSIC4

  INC DPTR

  LJMP MUSIC1

  END0:

  NOP

  MOV R2,#0FFH ;歌曲結束,延時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

  這是上面程式彙編以後獲得的編程器燒寫檔: 202.hex

  下載燒寫檔的方法:將滑鼠移到燒寫檔的超級鍵連處,點擊滑鼠的右鍵,選擇“目標另存為(A)...”保存檔類型中不要選擇“文本檔”,應該選擇“所有檔”,這樣就能獲得*.hex檔了。
返回列表