按鍵或者串口驅(qū)動(dòng)蜂鳴器播放編制音樂_第1頁
按鍵或者串口驅(qū)動(dòng)蜂鳴器播放編制音樂_第2頁
按鍵或者串口驅(qū)動(dòng)蜂鳴器播放編制音樂_第3頁
按鍵或者串口驅(qū)動(dòng)蜂鳴器播放編制音樂_第4頁
按鍵或者串口驅(qū)動(dòng)蜂鳴器播放編制音樂_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1 / 18 微機(jī)接口與應(yīng)用課程設(shè)計(jì)結(jié)題報(bào)告按鍵或者串口驅(qū)動(dòng)蜂鳴器播放編制音樂1. 項(xiàng)目簡(jiǎn)介本設(shè)計(jì)是在 linux系統(tǒng)下以 arm s3c2440芯片的電路為基礎(chǔ),利用開發(fā)板上的蜂鳴器,通過軟件編程對(duì)蜂鳴器進(jìn)行發(fā)音頻率、時(shí)間等的控制,進(jìn)而利用按鍵或者串口驅(qū)動(dòng)蜂鳴器來播放音樂。本設(shè)計(jì)播放的為編制音樂,即對(duì)音樂先進(jìn)行解碼后再播放。2. 系統(tǒng)軟、硬件結(jié)構(gòu)設(shè)計(jì)系統(tǒng)通過開發(fā)板上相應(yīng)的定時(shí)器,產(chǎn)生不同的頻率信號(hào),驅(qū)動(dòng)蜂鳴器發(fā)出不同的音頻信號(hào)。通過按鍵或鍵盤輸入,選擇播放不同的音樂。整體設(shè)計(jì)框架如圖 1 所示。2 / 18 圖 1:系統(tǒng)整體設(shè)計(jì)2.1 系統(tǒng)硬件組成本設(shè)計(jì)利用 kdlab-i型微機(jī)原理與接口技

2、術(shù)實(shí)驗(yàn)裝置arm 部分, 由核心板、主板、底板共同構(gòu)成。其中蜂鳴器的位置如圖2 所示:圖 2:arms3c2440開發(fā)板3 / 18 蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器與共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構(gòu)成。當(dāng)接通電源后,多諧振蕩器起振,輸出1.5-2.5khz的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片與外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)。振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性的振動(dòng)發(fā)聲。本實(shí)驗(yàn)開發(fā)板使用的蜂鳴器為

3、電磁式蜂鳴器。其中主板上的蜂鳴器是通過pwm 來控制的,原理圖如圖3 所示。圖 3:蜂鳴器原理圖蜂鳴器是通過 gpb0io 口使用 pwm 信號(hào)來驅(qū)動(dòng)工作的,其中g(shù)pb0可通過軟件設(shè)置為pwm 輸出。 pwm 即脈沖寬度調(diào)制,是靠改變脈沖寬度來控制輸出電壓,通過改變周期來控制其輸出頻率。 由 s3c2440手冊(cè)可知,s3c2440內(nèi)部有 5 個(gè) 16 位定時(shí)器,定時(shí)器 0、1、2、3 都帶有脈沖寬度調(diào)制功能,定時(shí)器0、1 共享一個(gè)時(shí)鐘分頻器,定時(shí)器2、3、4 共享一個(gè)時(shí)鐘4 / 18 分頻器,這兩個(gè)時(shí)鐘分頻器都能產(chǎn)生5 種不同的分頻信號(hào)值, 即 1/2 、 1/4 、1/8 、1/16和 tc

4、lk 。每個(gè)定時(shí)器模塊從時(shí)鐘分頻器接收自己的時(shí)鐘信號(hào),其分頻器從相應(yīng)的預(yù)分頻器接收時(shí)鐘。預(yù)標(biāo)定器是可以編程且根據(jù)裝載的值來分頻 pclk 的。改變定時(shí)器中的分頻器值即可產(chǎn)生不同的頻率,因此pwm 可利用芯片內(nèi)部的定時(shí)器電路很方便產(chǎn)生。2.2 系統(tǒng)軟件組成程序的開發(fā)是在 linuxfedora9系統(tǒng)的 arm-linux-gcc-4.3.2編譯環(huán)境進(jìn)行的,主要包括音樂播放部分和鍵盤控制部分。軟件整體設(shè)計(jì)思路如圖4所示。圖 4:系統(tǒng)整體設(shè)計(jì)5 / 18 2.2.1 音樂播放軟件設(shè)計(jì)要利用蜂鳴器播放出音樂,必須知道音樂構(gòu)成中的音調(diào)和相應(yīng)的節(jié)拍。一首樂曲是由很多音符組成的,將每個(gè)音符中包含的音調(diào)和節(jié)拍

5、信息進(jìn)行編碼,作用于蜂鳴器上即可產(chǎn)生動(dòng)聽的音樂。樂曲簡(jiǎn)譜中 1、2、3、4、5、6、7,即 do 、re、mi、fa、so、la、si,不同的低音、中音、高音對(duì)應(yīng)的頻率如表1 所示:表 1:不同音調(diào)對(duì)應(yīng)的頻率表低音頻率中音頻率高音頻率do 262 do 523 do 1046 re 294 re 587 re 1175 mi 330 mi 659 mi 1318 fa 349 fa 698 fa 1397 so 392 so 784 so 1568 la 440 la 880 la 1760 si 494 si 988 si 1976 利用數(shù)組將對(duì)應(yīng)的高低頻率存儲(chǔ)下來,int freq=262

6、,294,330,349,392,440,494, 523,587,659,698,784,880,988, 1046,1175,1318,1397,1568,1760,1976,則當(dāng)使用某一音調(diào)時(shí)調(diào)用相應(yīng)數(shù)組中的元素即可。將一首歌的簡(jiǎn)譜中的音調(diào)和節(jié)拍信息按照一個(gè)音符三個(gè)數(shù)字進(jìn)行編碼,其中第一位代表do 、re、mi 、fa、so、la、si 不同的音調(diào),第二位代表低、中、高音,第三位代表半拍數(shù)。 如 1,1,2 代表 2 個(gè)半拍的低音 do,3,2,3 代表 3 個(gè)半拍的中音 mi ,7,3,4 代表 4 個(gè)半拍的高音 si 。則利用該編碼方式則可將一首歌如新年好編碼如下,歌曲以音符0,0,

7、0 代6 / 18 表結(jié)束。double music=1,2,1, 1,2,1, 1,2,2, 5,1,5, 3,2,1, 3,2,1, 3,2,2, 1,2,5, 1,2,1, 3,2,1, 5,2,2, 5,2,5, 4,2,1, 3,2,1, 2,2,6, 2,2,1, 3,2,1, 4,2,2, 4,2,5, 3,2,1, 2,2,1, 3,2,2, 1,2,5, 1,2,1, 3,2,1, 2,2,2, 5,1,5, 7,1,1, 2,2,1, 1,2,6, 0,0,0;/歌曲新年好播放音樂的主要程序如下:double beats=0.5; /半拍的時(shí)間int i=0; int j=

8、0; while(musici0) /未到歌曲結(jié)尾時(shí)循環(huán) j=musici+(musici+1-1)*7-1; /計(jì)算音符對(duì)應(yīng)頻率數(shù)組中的位置open_buzzer(); /打開蜂鳴器set_buzzer_freq(freqj); /設(shè)置蜂鳴器工作頻率為對(duì)應(yīng)音符的頻率delay(musici+2); /播放相應(yīng)的節(jié)拍數(shù)close_buzzer(); /關(guān)閉蜂鳴器delay(beats); /暫停一個(gè)半拍,準(zhǔn)備下一個(gè)音符的播放7 / 18 i=i+3; /下一個(gè)音符對(duì)應(yīng)開始的位置 2.2.2 鍵盤控制軟件設(shè)計(jì)鍵盤控制播放部分可以利用開發(fā)板上的按鍵進(jìn)行播放控制,或者利用電腦的鍵盤通過串口傳輸驅(qū)動(dòng)進(jìn)

9、行控制。利用開發(fā)板上的按鍵進(jìn)行控制主要是利用對(duì)按下鍵進(jìn)行判斷,若條件滿足則播放相應(yīng)的歌曲,核心程序如下:char buttons6 = 0, 0, 0, 0, 0, 0;/初始鍵盤狀態(tài)for (;) char current_buttons6;/當(dāng)前鍵盤狀態(tài)int i; for (i = 0; i 2)exit(0);/當(dāng) k5 、k6 、k7 任意鍵按下時(shí)退出程序 利用串口驅(qū)動(dòng)進(jìn)行控制時(shí),首先將系統(tǒng)和開發(fā)板進(jìn)行串口連接,主要是利用條件滿足時(shí),進(jìn)行串口傳輸控制播放相應(yīng)的編曲,核心程序如下:while( 1 ) int key; key = getch();/獲取鍵盤上輸入的字符switch(k

10、ey) case 1:/當(dāng)輸入為1時(shí)playmusic(music1);/播放編曲一break; case 2:/當(dāng)輸入為2時(shí)playmusic(music2);/播放編曲二9 / 18 break; case 3:/當(dāng)輸入為3時(shí)playmusic(music3);/播放編曲三break; case esc_key: case eof: stop_buzzer();/停止蜂鳴器exit(0);/退出程序default: break; 3. 系統(tǒng)功能與其實(shí)現(xiàn)本系統(tǒng)設(shè)計(jì)的功能主要包括利用開發(fā)板上的按鍵或電腦鍵盤進(jìn)行控制開發(fā)板蜂鳴器播放相應(yīng)的編制音樂。具體功能包括運(yùn)行程序pwm_test后,按下開發(fā)

11、板上按鍵k2 播放新年好,按下開發(fā)板上按鍵k3 播放小蘋果,按下開發(fā)板上按鍵k3 播放梁祝 。運(yùn)行程序 pwm 后,用鍵盤輸入 1 將播放新年好,輸入 2 將播放小蘋果,輸入 3 將播放梁祝。具體程序?qū)崿F(xiàn)參見附錄。4. 系統(tǒng)功能測(cè)試10 / 18 系統(tǒng)設(shè)計(jì)完成后,運(yùn)行程序測(cè)試時(shí),按不同的鍵或輸入不同的值將播放不同的樂曲,播放效果良好,歌曲很容易識(shí)別。5. 結(jié)語通過本次課程設(shè)計(jì),我對(duì)于linux系統(tǒng)、 arms3c2440、蜂鳴器、鍵盤等的工作原理有了很多的了解,初步掌握了 linux嵌入式系統(tǒng)開發(fā)的方法和技巧。在實(shí)驗(yàn)過程中,出現(xiàn)過播放的音樂完全不像、按鍵測(cè)試沒有出現(xiàn)預(yù)期結(jié)果、程序運(yùn)行就會(huì)死機(jī)等

12、很多問題,最終都調(diào)試解決了。但在最后對(duì)程序優(yōu)化時(shí),欲將兩個(gè)程序合成一個(gè),遇到各種各樣的問題,比如考慮用多線程解決兩種按鍵可同時(shí)工作的問題,最終測(cè)試時(shí)發(fā)現(xiàn)測(cè)試一些輸入輸出時(shí)多線程能夠正常工作,但將輸入輸出替換為播放音樂就始終無法正常工作,最終由于時(shí)間不夠,暫停了合并的想法。從中我學(xué)到了很多東西,掌握了處理問題和調(diào)試的方法,熟悉了系統(tǒng)開發(fā)的流程,對(duì)于音樂編碼等也有了一定的了解。參考文獻(xiàn)1kdlab-i型微機(jī)原理與接口技術(shù)實(shí)驗(yàn)裝置(arm 部分)實(shí)驗(yàn)指導(dǎo)書2基于單片機(jī)的音樂盒設(shè)計(jì),xx 理工學(xué)院畢業(yè)設(shè)計(jì)3譚浩強(qiáng) .c 語言程序設(shè)計(jì)(第二版)m , :清華大學(xué), 1991. 11 / 18 附錄:程序

13、源代碼1按鍵測(cè)試程序pwm_test #include #include #include #include #include #include #include #include #include #include #include #define pwm_ioctl_set_freq 1 12 / 18 #define pwm_ioctl_stop 0 #defineesc_key 0 x1b static int fd = -1; static void close_buzzer(void); static void open_buzzer(void) fd = open(/dev/pw

14、m, 0); if (fd = 0) ioctl(fd, pwm_ioctl_stop); close(fd); fd = -1; #include #include #include #include #include #include #include static void set_buzzer_freq(int freq) / this ioctl mand is the key to set frequency int ret = ioctl(fd, pwm_ioctl_set_freq, freq); if(ret 0) perror(set the frequency of th

15、e buzzer); exit(1); static void stop_buzzer(void) int ret = ioctl(fd, pwm_ioctl_stop); if(ret 0) while(ii0) ii-; i-; void playmusic(double music) int freq=262,294,330,349,392,440,494, 523,587,659,698,784,880,988, 1046,1175,1318,1397,1568,1760,1976; double beats=0.5; int i=0; int j=0; while(musici0)

16、j=musici+(musici+1-1)*7-1; open_buzzer(); set_buzzer_freq(freqj); delay(musici+2); close_buzzer(); delay(beats); i=i+3; int main(int argc, char *argv) double music1=1,2,1, 1,2,1, 1,2,2, 5,1,5, 3,2,1, 3,2,1, 3,2,2, 1,2,5, 1,2,1, 3,2,1, 5,2,2, 5,2,5, 4,2,1, 3,2,1, 2,2,6, 2,2,1, 3,2,1, 4,2,2, 4,2,5, 3,

17、2,1, 2,2,1, 3,2,2, 1,2,5, 1,2,1, 3,2,1, 2,2,2, 5,1,5, 7,1,1, 2,2,1, 1,2,6, 0,0,0;/xinninahao 14 / 18 double music2=3,2,2, 1,2,2, 2,2,2, 6,1,4, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 6,1,6, 3,2,2, 1,2,2, 2,2,2, 2,2,4, 5,2,1, 3,2,1, 7,1,2, 1,2,4, 1,2,1, 7,1,5, 6,1,2, 7,1,1, 1,2,1, 2,2,2, 5,1,4, 6,2,1, 5,2,1, 3,2

18、,2, 3,2,3, 2,2,4, 1,2,2, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,0.5, 5,2,4.5, 5,2,2, 5,2,1, 5,2,1, 5,2,1, 5,2,1, 5,2,6, 3,2,2, 1,2,2, 2,2,2, 6,1,4, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 6,1,6, 3,2,2, 1,2,2, 2,2,2, 2,2,4, 5,2,1, 3,2,1, 7,1,4, 1,2,2, 1,2,1, 7,1,5, 6,1,2, 7,1,1, 1,2,1, 2,2,2, 5,1,4, 6,2,1, 5,2,1

19、, 3,2,2, 3,2,3, 2,2,4, 1,2,2, 2,2,1, 3,2,1, 2,2,1, 5,1,4, 6,1,2, 6,1,1, 1,2,1, 6,1,6, 0,0,0;/xiaopingguo double music3=7,1,8, 2,2,6, 3,2,2, 5,2,6, 6,2,2, 3,2,2, 5,2,2, 2,2,8, 2,3,6, 5,3,2, 3,3,2, 2,3,2, 7,2,2, 2,3,2, 6,2,12, 6,2,4, 6,2,2, 7,2,2, 4,2,4, 3,2,4, 2,2,6, 3,2,2, 5,2,4, 6,2,4, 7,1,5, 5,2,4

20、, 3,2,2, 2,2,2, 3,2,2, 5,2,2, 2,2,12, 7,2,6, 2,3,2, 4,2,2, 6,2,4, 3,2,2, 5,2,2, 2,2,10, 7,1,3, 2,2,1, 7,1,4, 2,2,3, 3,2,1, 4,2,2, 6,2,2, 3,2,10, 2,2,2, 3,2,2, 5,2,6, 6,2,2, 2,3,4, 7,2,4, 6,2,4, 7,2,2, 6,2,2, 5,2,4, 3,2,2, 2,2,2, 7,1,9, 5,2,9, 3,2,3, 5,2,3, 3,2,2, 2,2,2, 7,1,2, 2,2,2, 3,2,2, 5,2,2, 2

21、,2,16, 0,0,0;/liangzhu int buttons_fd; char buttons6 = 0, 0, 0, 0, 0, 0; buttons_fd = open(/dev/buttons, 0); if (buttons_fd 0) perror(open device buttons); exit(1); for (;) char current_buttons6; int i; if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) perror(r

22、ead buttons:); exit(1); for (i = 0; i 2)exit(0); close(buttons_fd); return 0; exit(0); 15 / 18 2鍵盤輸入測(cè)試程序pwm #include #include #include #include #define pwm_ioctl_set_freq 1 #define pwm_ioctl_stop 0 #define esc_key 0 x1b static int getch(void) struct termios oldt,newt; int ch; if (!isatty(stdin_filen

23、o) fprintf(stderr, this problem should be run at a terminaln); exit(1); / save terminal setting if(tcgetattr(stdin_fileno, &oldt) 0) perror(save the terminal setting); exit(1); / set terminal as need newt = oldt; newt.c_lflag &= ( icanon | echo ); if(tcsetattr(stdin_fileno,tcsanow, &newt

24、) 0) perror(set terminal); exit(1); ch = getchar(); / restore termial setting if(tcsetattr(stdin_fileno,tcsanow,&oldt) 0) perror(restore the termial setting); exit(1); return ch; static int fd = -1; static void close_buzzer(void); static void open_buzzer(void) fd = open(/dev/pwm, 0); if (fd = 0)

25、 ioctl(fd, pwm_ioctl_stop); close(fd); fd = -1; static void set_buzzer_freq(int freq) / this ioctl mand is the key to set frequency int ret = ioctl(fd, pwm_ioctl_set_freq, freq); if(ret 0) perror(set the frequency of the buzzer); exit(1); static void stop_buzzer(void) int ret = ioctl(fd, pwm_ioctl_s

26、top); if(ret 0) while(ii0) ii-; i-; 17 / 18 void playmusic(double music) int freq=262,294,330,349,392,440,494, 523,587,659,698,784,880,988, 1046,1175,1318,1397,1568,1760,1976; double beats=0.5; int i=0; int j=0; while(musici0) j=musici+(musici+1-1)*7-1; open_buzzer(); set_buzzer_freq(freqj); delay(m

27、usici+2); close_buzzer(); delay(beats); i=i+3; int main(int argc, char *argv) printf( press 1,2,3 to choose different songsn ) ; printf( press esc key to exit this programnn ); double music1=1,2,1, 1,2,1, 1,2,2, 5,1,5, 3,2,1, 3,2,1, 3,2,2, 1,2,5, 1,2,1, 3,2,1, 5,2,2, 5,2,5, 4,2,1, 3,2,1, 2,2,6, 2,2,

28、1, 3,2,1, 4,2,2, 4,2,5, 3,2,1, 2,2,1, 3,2,2, 1,2,5, 1,2,1, 3,2,1, 2,2,2, 5,1,5, 7,1,1, 2,2,1, 1,2,6, 0,0,0;/xinninahao double music2=3,2,2, 1,2,2, 2,2,2, 6,1,4, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 6,1,6, 3,2,2, 1,2,2, 2,2,2, 2,2,4, 5,2,1, 3,2,1, 7,1,2, 1,2,4, 1,2,1, 7,1,5, 6,1,2, 7,1,1, 1,2,1, 2,2,2, 5,1,4, 6,2,1, 5,2,1, 3,2,2, 3,2,3, 2,2,4, 1,2,2, 2,2,1, 3,2,1, 2,2,1, 3,2,1, 2,2,1, 3,2,0.5, 5,2,4.5, 5,2,2, 5,2,1, 5,2,1, 5,2,1, 5,2,1, 5,2,6, 3,2,2, 1,2,2, 2,2,2, 6,1,4, 3,2,1, 2,2,1, 1,2,1, 2,2,1, 6,1,6, 3,2,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論