基于單片機的電子琴發(fā)聲控制系統(tǒng)_第1頁
基于單片機的電子琴發(fā)聲控制系統(tǒng)_第2頁
基于單片機的電子琴發(fā)聲控制系統(tǒng)_第3頁
基于單片機的電子琴發(fā)聲控制系統(tǒng)_第4頁
基于單片機的電子琴發(fā)聲控制系統(tǒng)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、河南理工大學(xué)本科課程設(shè)計報告2011年11月 25 日摘要本設(shè)計是基于單片機的模擬電子琴發(fā)聲控制系統(tǒng),該控制系統(tǒng)的主要控制部件是AT89S52,晶振頻率為11.0592MHz,發(fā)聲部件為蜂鳴器,顯示部件為七段數(shù)碼管,十個按鍵作為輸入端。設(shè)計內(nèi)容:設(shè)置8個音符按鍵發(fā)出1(do) 、2(re)、3(mi)、4(fa)、5(so)、6(la)、7(xi)、1(do),為一組八度音階;設(shè)置1個按鍵調(diào)節(jié)音調(diào)高低(低八度音階為一組,中八度音階為一組,高八度音階為一組),通過識別按鍵的次數(shù)來調(diào)出一組八度音階,供人們演奏,在按鍵按下的同時由數(shù)碼管輸出對應(yīng)的音階數(shù)值;另外設(shè)置一個播放按鍵,當判斷按鍵按下時,自動

2、播放內(nèi)存的音樂,可以隨時中斷音樂。設(shè)計方法:軟件部分由掃描按鍵發(fā)聲并顯示和音樂自動播放兩部分構(gòu)成,故本設(shè)計通過判斷一個按鍵的兩種狀態(tài)而在兩個部分之間進行切換,每種狀態(tài)對應(yīng)一個指定部分,從而保證兩種狀態(tài)的正常切換。按鍵的掃描采用4*2矩陣形式,節(jié)省了輸出端口。硬件部分的設(shè)計主要包括按鍵排列、數(shù)碼管顯示和蜂鳴器部分,本設(shè)計P1口用作對按鍵的掃描,P2口用作數(shù)碼管顯示,所以矩陣按鍵和數(shù)碼管的排列均就近I/O口焊接,布局合理。數(shù)碼管顯示部分通過限流電阻接P2口,無譯碼器,考慮到輸出的數(shù)值,本部分設(shè)計由軟件部分實現(xiàn)指定數(shù)值輸出。蜂鳴器通過PNP型三極管8550接P3口,8550可以實現(xiàn)音頻的放大。蜂鳴器

3、與數(shù)碼管就近排列,以達到輸出一致的效果。設(shè)計成果:按照本設(shè)計的設(shè)計理念,設(shè)計成功!該控制系統(tǒng)能準確實現(xiàn)按鍵掃描,音符、音階的調(diào)用準確無誤,同時能顯示音符和音階數(shù)值,但受數(shù)碼管限制,無法同時顯示音符1和高一階音符1(本設(shè)計中以8代替);能實現(xiàn)按鍵控制音樂的自動播放,當檢測到控制按鍵按下時,即可啟動音樂自動播放。本設(shè)計簡單實用,方便操作,系統(tǒng)穩(wěn)定,編程簡單,能滿足單片機初學(xué)者對單片機技術(shù)的追求,也能滿足音樂初學(xué)者學(xué)習(xí)樂器的的基本需求。- 29 -河南理工大學(xué)本科課程設(shè)計報告目錄摘要11 概述11.1 課題簡介11.2 仿真技術(shù)與軟硬件技術(shù)的結(jié)合11.3 單片機簡介12 系統(tǒng)總體方案及硬件設(shè)計32.

4、1 總體方案32.2 按鍵矩陣42.3 數(shù)碼管顯示42.4 蜂鳴器模塊43 軟件設(shè)計53.1 播放音樂部分53.2 掃描按鍵部分73.3 數(shù)碼管顯示104 Proteus軟件仿真124.1 鍵盤部分設(shè)計124.2 蜂鳴器部分仿真124.3 數(shù)碼管部分仿真124.4 整體仿真設(shè)計125課程設(shè)計體會145.1 設(shè)計成果145.2 心得體會14參考文獻- 0 -書、專著:- 0 -電子文獻:- 0 -附錄1 源程序代碼- 1 -附錄2 系統(tǒng)原理圖12 附錄3 音樂簡譜13 1 概述1.1 課題簡介單片微型計算機室大規(guī)模集成電路技術(shù)發(fā)展的產(chǎn)物,屬于第四代電子計算機它具有高性能、高速度、體積小、價格低廉

5、、穩(wěn)定可靠、應(yīng)用廣泛的特點。它的應(yīng)用必定導(dǎo)致傳統(tǒng)的控制技術(shù)從根本上發(fā)生變革。因此,單片機的開發(fā)應(yīng)用已成為高科技和工程領(lǐng)域的一項重大課題。電子琴是現(xiàn)代電子科技與音樂結(jié)合的產(chǎn)物,是一種新型的鍵盤樂器。它在現(xiàn)代音樂扮演重要的角色,單片機具有強大的控制功能和靈活的編程實現(xiàn)特性,它已經(jīng)溶入現(xiàn)代人們的生活中,成為不可替代的一部分。本課題的主要內(nèi)容是用AT89S52單片機為核心控制元件,設(shè)計一個電子琴。以單片機作為主控核心,與鍵盤、揚聲器等模塊組成核心主控制模塊,在主控模塊上設(shè)有8個按鍵,2個控制按鍵和1個復(fù)位按鍵。一首音樂是許多不同的音階組成的,而每個音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組

6、合,構(gòu)成我們想演奏的那首曲目。對于單片機來說產(chǎn)生不同的頻率非常方便,我們可以利用單片機的定時/計數(shù)器T0或T1來產(chǎn)生這樣的方波頻率信號,因此,我們只要把一首歌曲的音符對應(yīng)頻率關(guān)系編寫正確,就可以達到我們想要的曲目。1.2 仿真技術(shù)與軟硬件技術(shù)的結(jié)合本設(shè)計中用到了軟件Proteus,該軟件是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是目前世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPI

7、C33、AVR、ARM、8086和MSP430等。在編譯方面,它也支持IAR、Keil和MPLAB等多種編譯,給我們做電路設(shè)計提供方便快捷的仿真效果。在編譯的過程中用到了Keil uVision3, Keil C51是51系列兼容單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVision)將這些部分組合在一起。其方便易用的集成環(huán)境、強大的軟件仿真調(diào)試工具令我們事半功倍。1.3 單片機簡介AT89S52 是一種低功

8、耗、高性能CMOS 8位微控制器,具有8K在系統(tǒng)可編程Flash存儲器。使用Atmel公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51產(chǎn)品指令和引腳完全兼容。AT89S52具有以下標準功能:8k字節(jié)Flash,256字節(jié)RAM,32位I/O口線,看門狗定時器,2個數(shù)據(jù)指針,三個16位定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口,片內(nèi)晶振及時鐘電路。另外,AT89S52可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)

9、位為止。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使得AT89S52在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣泛應(yīng)用。 圖1.30圖1.31AT89S52引腳圖AT89S52實物圖2 系統(tǒng)總體方案及硬件設(shè)計2.1 總體方案圖2.1 總體方案流程圖本設(shè)計在音樂播放與鍵盤掃描之間切換,蜂鳴器能發(fā)出共計22個音符,共分三個八度音階,數(shù)碼管可顯示0-8,由于數(shù)碼管限制,此處用8代替高一級音符do。當系統(tǒng)運行時,默認進入鍵盤掃描,并不發(fā)音,數(shù)碼管顯示默認值1,即鍵盤默認可調(diào)用低八度音符。當音樂播放鍵(PLAY)按下時,音樂自動播放,數(shù)碼管

10、顯示0,此間可按下復(fù)位鍵終止音樂。當播放停止時,跳出程序段,默認回到鍵盤掃描狀態(tài),數(shù)碼管顯示返回值1。每當音階轉(zhuǎn)換控制鍵(SWITCH)按下時,數(shù)碼管顯示的數(shù)值加1,設(shè)置最大顯示值是3,循環(huán)顯示;此處1代表可調(diào)用低八度音符,2代表可調(diào)用中八度音符,3代表可調(diào)用高八度音符。當矩陣鍵盤有鍵按下時,掃描的鍵值由數(shù)碼管輸出,顯示1-8,代表do、re、mi、fa、so、la、xi、do(高一階),按鍵與音符一一對應(yīng)。這樣有效地利用了4*2矩陣鍵盤,可以實現(xiàn)22個音符的輸出,簡潔而高效。2.2 按鍵矩陣本設(shè)計采用4*2矩陣非編碼按鍵,由4*4矩陣修改而成,這樣不但可以節(jié)省程序掃描,也可以節(jié)省端口的占用率

11、,從而達到簡潔高效的效果。鍵盤為各自獨立按鍵,只簡單地提供按鍵開關(guān)。有關(guān)按鍵的識別、鍵碼的確定與輸入、消除抖動等功能均由軟件完成。鍵盤矩陣圖與仿真圖相同,見圖4.1。對按鍵矩陣的掃描由P1.0P1.5口共同完成。2.3 數(shù)碼管顯示本設(shè)計的數(shù)碼管部分使用了共陽極數(shù)碼管,數(shù)碼管公共端接高電平,Led輸入端通過200歐的限流電阻接P2.0-P2.6,數(shù)字的輸出由軟件完成。見圖2.3。2.4 蜂鳴器模塊本設(shè)計的蜂鳴器模塊由PNP三極管8550作為音頻放大,200歐的限流電阻,聲音的輸出在P3.6口。見圖2.4。圖2.3 數(shù)碼管顯示原理圖 圖2.4 蜂鳴器焊接原理圖3 軟件設(shè)計3.1 播放音樂部分圖3.

12、1 聲音頻率及定時初值表音樂的播放要進行音符的識別和準確調(diào)用,音符的自然頻率是固定的,我們可以根據(jù)自然頻率計算出其半周期,由此計算出單片機在12MHz下的定時初值,具體計算如圖3.1。因此可以設(shè)置低音do到超高音do的定時初值表程序段如下:unsigned int code tab= /音符初值表低音1超高音163627,63835,64021,64103, /低音1 2 3 464260,64400,64524,64580,/低音5 6 7 中音164684,64777,64820,64898,/中音2 3 4 564968,65030,65058,65110,/中音6 7 高音1 2 65

13、157,65178,65217,65252,/高音3 4 5 6 65283,65297 /高音7 超高音1;在音樂的播放中節(jié)拍的控制由延時控制來實現(xiàn):void delay(unsigned char t) /延時函數(shù),控制發(fā)音的時間長度unsigned char t1;unsigned long t2;for(t1 = 0; t1 < t; t1+) /雙重循環(huán), 共延時t個半拍for(t2 = 0; t2 < 8000; t2+);TR1 = 0; /關(guān)閉T1, 停止發(fā)音 節(jié)拍的長短由設(shè)定的數(shù)值來實現(xiàn),此處設(shè)定1代表16分音符,2代表8分音符,3代表4分音符,4代表2分音符,音

14、樂的設(shè)置如下:code unsigned char mid = /春江花月夜 簡譜 6,2,2,6,2,1,6,2,1,1,3,2,2,3,1,6,2,1,5,2,4,5,2,0,5,2,2,5,2,1,5,2,1,6,2,2,1,3,1,2,3,1,3,2,4,3,2,0,3,2,2,2,2,1,3,2,1,5,2,2,3,2,1,5,2,1,6,2,3,1,3,1,2,3,3,3,3,2,1,3,2,2,3,1,3,3,1,2,3,1,1,3,1,6,2,2,5,2,4,5,2,0,5,2,1,1,3,1,5,2,1,1,3,1,2,3,4,6,2,1,1,3,1,5,2,1,2,2,1,

15、3,2,4,3,2,0,3,2,2,6,2,1,1,3,1,5,2,1,6,2,1,5,2,1,3,2,1,2,2,3,3,2,1,2,2,1,1,2,1,2,2,1,3,2,1,1,2,1,2,2,4,0,0,0,; 讀出的每個音符由三個數(shù)字構(gòu)成,第一個數(shù)字代表音符;第二個數(shù)字代表音高,默認1代表低八度,2代表中八度,3代表高八度;第三個數(shù)代表節(jié)拍,此處用1代表16分音符,2代表8分音符,3代表4分音符,4代表2分音符,而0用來表示停頓,以區(qū)分連音。音樂播放函數(shù)的定義需要一個定時器中斷,而這個中斷與鍵盤掃描部分不能用一個中斷,故設(shè)中斷1,工作方式1:void song() /演奏一個音符函數(shù)

16、 TH1 = timerh; /控制音調(diào)TL1 = timerl;TR1 = 1; /啟動T1, 由T1輸出方波去發(fā)音delay(time); /控制時間長度音符掃描并播放函數(shù)段如下:while(midi!=0) /只要有音符,就持續(xù)執(zhí)行k = midi + 7 * (midi + 1-1) - 1;/第i個是音符, 第i+1個是第幾個八度timerh = tabk/256; /從數(shù)據(jù)表中讀出定時器計數(shù)值timerl = tabk%256; /計數(shù)值低位time = midi + 2; /讀出時間長度數(shù)值i += 3;/每隔三個數(shù)讀一個音符if(midi+2= 0 ) /設(shè)置發(fā)音時長為0時停頓

17、delay10ms();song(); /發(fā)出一個音符在音樂播放完畢之后,自動跳出該程序段,進入按鍵掃描程序段。3.2 掃描按鍵部分對按鍵的掃描,包括輸入消抖和鍵值計算,消抖部分由一個延時函數(shù)來完成:void delay10ms(void)/延時10ms函數(shù) for(i=50;i>0;i-) for(j=198;j>0;j-);/*每個指令12個機器周期,即1us,延時計算50*(198+2)+2=10002us延時精確計算匯編程序如下:MOV i,#032HMOV j,#0C6HDJNZ jDJNZ iRET */鍵盤矩陣為4*2,P1.4、P1.5為行,P1.0、P1.1、P1

18、.2、P1.3為列,將列置高電平,行置低電平,進行掃描,如有按鍵按下,按鍵所在列就會被拉成低電平,此處默認P1.4為第一行,因此P1.4所在行的按鍵鍵值依照P1.3、P1.2、P1.1、P1.0的順序為0、1、2、3,同理P1.5行所在的按鍵鍵值依照P1.3、P1.2、P1.1、P1.0依次為4、5、6、7,鍵值的計算程序段如下例:P1=0xff;P1_4=0;/從第1行開始掃描鍵盤temp=P1;temp=temp&0x0f;if(temp!=0x0f)/掃描控制 delay10ms();temp=P1;temp=temp&0x0f;if(temp!=0x0f)temp=P1

19、;temp=temp&0x0f;switch(temp) /讀取按鍵值 case 0x07: /判定P1.3key=0;Display(0xf9);/數(shù)碼管顯示1break;case 0x0b: /判定P1.2key=1;Display(0xa4);/數(shù)碼管顯示2break;case 0x0d: /判定P1.1key=2;Display(0xb0);/數(shù)碼管顯示3break;case 0x0e: /判定P1.0key=3;Display(0x99);/數(shù)碼管顯示4break;temp=P1;P3_6=P3_6;/準備發(fā)音STH0=tabkey/256; /計算音符對應(yīng)的定時器計數(shù)值ST

20、L0=tabkey%256;/計數(shù)值低位TR0=1;/T0計時器開始工作temp=temp&0x0f;while(temp!=0x0f)/掃描循環(huán)temp=P1;temp=temp&0x0f;TR0=0;/T0計時器關(guān)閉P3_6=1;/關(guān)閉揚聲器,防止電流噪音P1=0xff; /對P1口置高P1_5=0; /掃描P1.5行temp=P1;temp=temp&0x0f;if(temp!=0x0f) /掃描控制 delay10ms();temp=P1;temp=temp&0x0f;if(temp!=0x0f)temp=P1;temp=temp&0x0f;sw

21、itch(temp) /讀取按鍵值case 0x07: /判定P1.3key=4;Display(0x92);/數(shù)碼管顯示5break;case 0x0b: /判定P1.2key=5;Display(0x82);/數(shù)碼管顯示6break;case 0x0d: /判定P1.1key=6;Display(0xf8);/數(shù)碼管顯示7break;case 0x0e: /判定P1.0key=7;Display(0x80);/數(shù)碼管顯示8,此處8代表高一級音符1break;temp=P1;P3_6=P3_6; /準備發(fā)音STH0=tabkey/256;/計算音符對應(yīng)的定時器計數(shù)值STL0=tabkey%2

22、56;/計數(shù)值低位TR0=1; /開T0中斷temp=temp&0x0f;while(temp!=0x0f) /循環(huán)掃描temp=P1;temp=temp&0x0f;TR0=0; /關(guān)閉中斷T0P3_6=1; /關(guān)閉蜂鳴器,防止噪音Display(0xf9); /數(shù)碼管顯示1,代表可調(diào)用低八度break; 3.3 數(shù)碼管顯示共陽極數(shù)碼管的數(shù)字顯示,并不通過譯碼器,因此需要在軟件里面設(shè)置對應(yīng)的代碼,此時的代碼并不具有規(guī)律性,因此只能對其輸出做指定設(shè)置,09的對應(yīng)字形碼如下表3.3:(共陰極的數(shù)碼管所用代碼并不一樣)“0”0xc0“5”0x92“1”0xf9“6”0x82“2”0x

23、a4“7”0xf8“3”0xb0“8”0x80“4”0x99“9”0x90表3.3 數(shù)碼管輸出字型碼表對應(yīng)調(diào)用函數(shù)如下:void Display(unsigned char m) /定義數(shù)碼管顯示函數(shù)P2 = m;/顯示需要顯示的數(shù)值在輸出時只需設(shè)置對應(yīng)的代碼即可。4 Proteus軟件仿真4.1 鍵盤部分設(shè)計獨立式按鍵按照4*2矩陣排列。圖4.1 鍵盤仿真電路圖4.2 蜂鳴器部分仿真此處用了無源蜂鳴器,在仿真時無需接三極管進行音頻放大,使得仿真電路圖簡潔明了。圖4.2 蜂鳴器仿真電路圖4.3 數(shù)碼管部分仿真基于Protues的基本功能,對數(shù)碼管的仿真無需外接限流電阻即可實現(xiàn),具體實現(xiàn)如圖4.

24、3:圖4.3 數(shù)碼管仿真電路圖4.4 整體仿真設(shè)計基于單片機的最小系統(tǒng),對外圍電路的開發(fā)做了簡單的配置,數(shù)碼管接P2.0P2.6口,矩陣鍵盤接P1.0P1.5口,模式轉(zhuǎn)換鍵在P3.0口控制輸入,音階轉(zhuǎn)換鍵在P3.7口控制輸入,蜂鳴器發(fā)聲接P3.6口,具體見圖4.4:圖4.4 仿真電路總圖5課程設(shè)計體會5.1 設(shè)計成果本次設(shè)計的最終結(jié)果與仿真完全吻合,能夠?qū)崿F(xiàn)高低音符的自由切換,也能夠?qū)崿F(xiàn)音符的準確調(diào)用及音樂的自動播放。系統(tǒng)啟動時,數(shù)碼管顯示默認值1,此時可以調(diào)用低八度音符。當按下SW(SWITCH)鍵一次的時候,數(shù)碼管顯示2,此時可以調(diào)用中八度音符;當按下SW鍵二次的時候,數(shù)碼管顯示3,此時可

25、以調(diào)用高八度音符;如此循環(huán)往復(fù)。矩陣鍵盤對應(yīng)按鍵(C、D、E、F、G、A、B、C)按下的時候,數(shù)碼管顯示1、2、3、4、5、6、7、8,發(fā)音do、re、mi、fa、so、la、xi、do。無論數(shù)碼管顯示何值,當按下P(PLAY)鍵的時候,音樂自動播放,數(shù)碼管顯示0;按下RE(RESET)鍵的時候,終止播放,數(shù)碼管恢復(fù)顯示默認值1。5.2 心得體會通過本次電子設(shè)計訓(xùn)練,我們復(fù)習(xí)了很多專業(yè)知識,也讓我們感悟頗多,具體起來有以下幾點:1、 團隊合作遠比一個人的力量大得多,在這次的實訓(xùn)中,我們的分工與合作讓我體會到了團隊的重要性。2、 實踐操作遠比理論學(xué)習(xí)進步快得多,在這短暫的幾天里,我對專業(yè)知識的理

26、解突飛猛進地更進了一層,尤其是對51單片機、編程、PNP三極管、數(shù)碼管顯示以及蜂鳴器輸出有了更詳細地了解,考慮以后會踏入工作崗位,本次實訓(xùn)更是一次難得的鍛煉機會。3、 知識的靈活運用遠比知識的掌握更重要。在借鑒學(xué)習(xí)的過程中,發(fā)現(xiàn)矩陣的掃描可以逐行設(shè)置代碼進行掃描,也可以通過循環(huán)函數(shù)對已知的端口設(shè)定掃描過程,程序簡潔而實用。4、 努力重要,技巧更重要。在焊接的過程中,P1,P2,P3口作為I/O口,此時的焊接我們依據(jù)按鍵的功能進行了劃分,分組排列,整齊而美觀;數(shù)碼管輸出和蜂鳴器輸出的排列,均在輸出部分,采用就近接口的方式,同時考慮輸出的一致性,將二者就近排列,達到了人性化的設(shè)計效果;對P1、P2

27、端口的使用,我們又對端口進行了延伸,從而實現(xiàn)了排線連接,達到了美觀的效果。5、 學(xué)習(xí)要認真,做事需細心。在設(shè)計軟件仿真時和硬件焊接時,我們曾出過一些微小的錯誤,例如軟件關(guān)閉中斷之后需要軟件關(guān)閉蜂鳴器,否則就會出現(xiàn)噪音。但在仔細檢查過之后,作以修改,就能到達消除噪音的目的。參考文獻書、專著:1張元良,王建軍等.單片機開發(fā)技術(shù)實例.北京:機械工業(yè)出版社,2010.82徐愛鈞.單片機原理與應(yīng)用 基于Protues的虛擬仿真技術(shù).北京:機械工業(yè)出版社,2010電子文獻:1 做而論道.基于51單片機的4*4矩陣鍵盤電子琴. 2010-08-052做而論道.單片機播放音樂的基本知識附錄1 源程序代碼/本程

28、序采用AT89S52 晶振頻率11.0592MHz#include<reg52.h>/頭文件unsigned char temp,key,k,i,j,ID;/自定義字符變量unsigned char STH0,STL0;/自定義暫存變量unsigned char timerh, timerl, time;/自定義暫存變量sbit P1_4=P14;/定義行P1.4sbit P1_5=P15;/定義行P1.5sbit P3_0=P30;/定義音樂播放鍵sbit P3_6=P36;/定義揚聲器輸出口P3.6sbit P3_7=P37;/定義音符切換鍵unsigned int code

29、tab= /音符表低音1超高音163627,63835,64021,64103, /低音1 2 3 464260,64400,64524,64580,/低音5 6 7 中音164684,64777,64820,64898,/中音2 3 4 564968,65030,65058,65110,/中音6 7 高音1 2 65157,65178,65217,65252,/高音3 4 5 6 65283,65297 /高音7 超高音1;code unsigned char mid = /春江花月夜 簡譜 6,2,2,6,2,1,6,2,1,1,3,2,2,3,1,6,2,1,5,2,4,5,2,0,5,

30、2,2,5,2,1,5,2,1,6,2,2,1,3,1,2,3,1,3,2,4,3,2,0,3,2,2,2,2,1,3,2,1,5,2,2,3,2,1,5,2,1,6,2,3,1,3,1,2,3,3,3,3,2,1,3,2,2,3,1,3,3,1,2,3,1,1,3,1,6,2,2,5,2,4,5,2,0,5,2,1,1,3,1,5,2,1,1,3,1,2,3,4,6,2,1,1,3,1,5,2,1,2,2,1,3,2,4,3,2,0,3,2,2,6,2,1,1,3,1,5,2,1,6,2,1,5,2,1,3,2,1,2,2,3,3,2,1,2,2,1,1,2,1,2,2,1,3,2,1,1,

31、2,1,2,2,4,0,0,0,; /每個音符有三個數(shù)字構(gòu)成,第一個數(shù)代表音符,第二個數(shù)代表音高 /默認1代表低音,2代表中音,3代表高音,第三個數(shù)代表節(jié)拍,此處用1代表16分音/符,2代表8分音符,3代表4分音符,4代表2分音符。void t1() interrupt 3 /T1中斷程序,控制音樂發(fā)音的音調(diào)TR1 = 0; /先關(guān)閉T1P3_6=P3_6; /發(fā)音TH1 = timerh; /下次的中斷時間, 這個時間, 控制音調(diào)高低TL1 = timerl; /音調(diào)時間長度TR1 = 1; /啟動定時器T1void t0(void) interrupt 1/T0中斷程序,控制按鍵發(fā)音 TH

32、0=STH0; /控制音調(diào)高低TL0=STL0; /音調(diào)時間長度P3_6=P3_6; /發(fā)音void delay10ms(void)/延時10ms函數(shù) for(i=50;i>0;i-) for(j=198;j>0;j-);/*每個指令12個機器周期,即1us,延時計算50*(198+2)+2=10002us延時精確計算匯編程序如下:*/MOV i,#032H/MOV j,#0C6H/DJNZ j/DJNZ i/RET void delay(unsigned char t) /延時函數(shù),控制發(fā)音的時間長度unsigned char t1;unsigned long t2;for(t1

33、 = 0; t1 < t; t1+) /雙重循環(huán), 共延時t個半拍for(t2 = 0; t2 < 8000; t2+);TR1 = 0; /關(guān)閉T1, 停止發(fā)音 void Display(unsigned char m) /定義數(shù)碼管顯示函數(shù)P2 = m;/顯示需要顯示的數(shù)值void song() /演奏一個音符函數(shù) TH1 = timerh; /控制音調(diào)高低TL1 = timerl;/音調(diào)時間長度TR1 = 1; /啟動T1, 由T1輸出方波去發(fā)音delay(time); /控制時間長度void main(void) /主程序 while(1)if(P3_0=0) /判斷P3.

34、0口為低電平時,執(zhí)行音樂播放程序Display(0xc0);/執(zhí)行播放程序時數(shù)碼管顯示0TMOD = 0x10; /置T1定時器的工作方式1ET1 = 1; /開T1中斷EA = 1; /開CPU中斷TR1=1; /定時器T1開始工作i = 0; /從開始處讀音符表while(midi!=0) /只要有音符,就循環(huán)執(zhí)行k = midi + 7 * (midi + 1-1) - 1;/第i個是音符, 第i+1個是第幾個八度timerh = tabk/256; /從數(shù)據(jù)表中讀出定時器計數(shù)值timerl = tabk%256; /計數(shù)值低位time = midi + 2; /讀出時間長度數(shù)值i +=

35、 3;/每隔三個數(shù)為一個音符if(midi+2= 0 ) /設(shè)置音調(diào)時長為0時停頓delay10ms();song(); /發(fā)出一個音符 else if(P3_0=1)/當P3.1口電平為高時,執(zhí)行掃描按鍵程序TMOD=0x01;/設(shè)置T0定時器,工作方式1ET0=1;/開T0中斷EX0=1;EA=1;/開總中斷if(P3_7=0)/判斷P3.7口的按鍵次數(shù) delay10ms();/延時消抖if(P3_7=0)/P3.7初值為0 ID+;/每有按鍵按下,計數(shù)加1if(ID=3)/設(shè)定最高值,每當值為3時返回值0,重新循環(huán)ID=0;while(P3_7=0);/循環(huán)設(shè)定switch(ID) /

36、根據(jù)ID的值判斷音域范圍case 0: /ID為0時P1=0xff;P1_4=0;/從第1行開始掃描鍵盤temp=P1;temp=temp&0x0f;if(temp!=0x0f)/掃描控制,含消抖 delay10ms();temp=P1;temp=temp&0x0f;if(temp!=0x0f)temp=P1;temp=temp&0x0f;switch(temp) /讀取按鍵值 case 0x07: /判定P1.3key=0;Display(0xf9);/數(shù)碼管顯示1break;case 0x0b: /判定P1.2key=1;Display(0xa4);/數(shù)碼管顯示2b

37、reak;case 0x0d: /判定P1.1key=2;Display(0xb0);/數(shù)碼管顯示3break;case 0x0e: /判定P1.0key=3;Display(0x99);/數(shù)碼管顯示4break;temp=P1;P3_6=P3_6;/準備發(fā)音STH0=tabkey/256; /計算音符對應(yīng)的定時器計數(shù)值STL0=tabkey%256; /計數(shù)值低位TR0=1; /T0計時器開始工作temp=temp&0x0f;while(temp!=0x0f) /掃描循環(huán)temp=P1;temp=temp&0x0f;TR0=0;/T0計時器關(guān)閉P3_6=1;/關(guān)閉揚聲器,防止

38、電流噪音P1=0xff; /對P1口置高P1_5=0;/掃描P1.5行temp=P1;temp=temp&0x0f;if(temp!=0x0f) /掃描控制 delay10ms();temp=P1;temp=temp&0x0f;if(temp!=0x0f)temp=P1;temp=temp&0x0f;switch(temp) /讀取按鍵值case 0x07: /判定P1.3key=4;Display(0x92);/數(shù)碼管顯示5break;case 0x0b: /判定P1.2key=5;Display(0x82);/數(shù)碼管顯示6break;case 0x0d: /判定P1

39、.1key=6;Display(0xf8);/數(shù)碼管顯示7break;case 0x0e: /判定P1.0key=7;Display(0x80);/數(shù)碼管顯示8(代表中音1)break;temp=P1;P3_6=P3_6; /準備發(fā)音STH0=tabkey/256;/計算音符對應(yīng)的定時器計數(shù)值STL0=tabkey%256;/計數(shù)值低位TR0=1; /開T0中斷temp=temp&0x0f;while(temp!=0x0f) /循環(huán)掃描temp=P1;temp=temp&0x0f;TR0=0; /關(guān)閉中斷T0P3_6=1; /關(guān)閉蜂鳴器,防止噪音Display(0xf9);/數(shù)

40、碼管顯示1,代表可調(diào)用低八度音階break; case 1: /ID為1時P1=0xff; /對P1口置高P1_4=0; /從P1.4行開始掃描鍵盤temp=P1;temp=temp&0x0f;if(temp!=0x0f) /掃描控制 delay10ms();temp=P1;temp=temp&0x0f;if(temp!=0x0f)temp=P1;temp=temp&0x0f;switch(temp)/讀取按鍵值 case 0x07: /判定P1.3key=0;Display(0xf9);/數(shù)碼管顯示1break;case 0x0b: /判定P1.2key=1;Disp

41、lay(0xa4);/數(shù)碼管顯示2break;case 0x0d: /判定P1.1key=2;Display(0xb0);/數(shù)碼管顯示3break;case 0x0e: /判定P1.0key=3;Display(0x99);/數(shù)碼管顯示4break;temp=P1;P3_6=P3_6;/準備發(fā)音STH0=tabkey+7/256;/計算中八度音符的定時器計數(shù)值STL0=tabkey+7%256;/計數(shù)值低位TR0=1;/開中斷T0temp=temp&0x0f;while(temp!=0x0f)/循環(huán)掃描temp=P1;temp=temp&0x0f;TR0=0; /關(guān)閉中斷T0P3_6=1;/關(guān)閉蜂鳴器,防止噪音P1=0xff; /P1口置高P1_5=0; /掃描P1.5行temp=P1;temp=temp&0x0f;if(temp!=0x0f) /掃描控制 delay10ms();temp=P1;temp=temp&0x0f;if(temp!=0x0f)temp=P1;temp=temp&0x0f;switch(temp) /讀取按鍵值case 0x07: /判定P1.3key=4;Display(0x92);/數(shù)碼管顯示5break;case 0x0b: /判定P1.2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論