基于單片機的電子琴和音樂播放器設(shè)計_第1頁
基于單片機的電子琴和音樂播放器設(shè)計_第2頁
基于單片機的電子琴和音樂播放器設(shè)計_第3頁
基于單片機的電子琴和音樂播放器設(shè)計_第4頁
基于單片機的電子琴和音樂播放器設(shè)計_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京郵電大學(xué)基于單片機的電子琴和音樂播放器設(shè)計實驗報告 學(xué)院:信息與通信工程學(xué)院指導(dǎo)老師:葛順明摘要電子琴是現(xiàn)代電子科技與音樂結(jié)合的產(chǎn)物,是一種新型的鍵盤樂器。它在現(xiàn)代音樂扮演著重要的角色,單片機具有強大的控制功能和靈活的編程實現(xiàn)特性,它已經(jīng)溶入現(xiàn)代人們的生活中,成為不可替代的一部分。本文的主要內(nèi)容設(shè)計為一個基于PIC32MX795F512L單片機的電子琴與音樂播放器,利用單片機上的按鍵來選擇相應(yīng)功能,利用鍵盤按鍵來選擇彈奏某一音調(diào)或播放某首曲子。能夠?qū)崟r將數(shù)據(jù)傳至液晶屏顯示。根據(jù)單片機的工作原理,通過硬件電路制作和軟件編譯,設(shè)計出一個能夠自由彈奏樂曲及流暢播放內(nèi)置音樂的電子琴與音樂播放器。該

2、系統(tǒng)主要由液晶顯示模塊、鍵盤模塊、喇叭模塊組成。設(shè)計利用MPLAB軟件對源程序進行編譯和調(diào)試。關(guān)鍵詞: PIC32MX795F512L單片機,模塊一 實驗?zāi)康?.通過學(xué)習(xí)使用單片機PIC32,使學(xué)生增進對單片機的感性認識,加深對單片機理論方面的理解。2. 使學(xué)生掌握單片機的內(nèi)部功能模塊的功能和應(yīng)用,如定時器/計數(shù)器、中斷、I/O口等。 3使學(xué)生理解和掌握單片機應(yīng)用系統(tǒng)的軟件硬件設(shè)計過程、方法及實現(xiàn),為以后設(shè)計和實現(xiàn)單片機應(yīng)用系統(tǒng)打下良好基礎(chǔ)。二 實驗分工本次實驗我的隊友主要負責(zé)的部分是XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX過程期

3、間出現(xiàn)的問題是由我們兩個人共同查閱資料完成的,整體合作協(xié)調(diào)很好,完成的較為順利。三功能簡介1.設(shè)計一個電子琴。所能實現(xiàn)的功能如下:(1).能夠?qū)崿F(xiàn)舒適化菜單,由按鍵選擇菜單中的兩個功能:播放樂曲和彈奏樂曲,并實現(xiàn)其功能;(2).播放樂曲:又初始化菜單選擇進入,進入后屏幕提示”SONGPLAYING”,同時事先在程序中存入了8首不同的樂曲,可以一次通過鍵盤的按鍵來選擇播放各首樂曲。在播放曲目中設(shè)置了暫停鍵,按下即暫停,不按下則繼續(xù)播放循環(huán)播放。(3).自行彈奏:設(shè)計鍵盤上的13個鍵能夠發(fā)出低音部5,6,7,中音部1,2,3,4,5,6,7,高音部1,2,3總共14個音,要求按下按鍵發(fā)聲,松開延時

4、一段時間停止,中間再換按其他鍵則發(fā)另一音調(diào)的聲音。(4).走馬燈:設(shè)計了4個藍光走馬燈配合播放音樂和演奏時閃爍。2當(dāng)系統(tǒng)掃描到有鍵被按下,則快速檢測出是哪一個鍵被按下,然后單片機的定時器被啟動,發(fā)出一定頻率的脈沖,該頻率的脈沖輸入到蜂鳴器后,就會發(fā)出相應(yīng)的音調(diào)如果在前一個按下的鍵發(fā)聲的同時另一個鍵被按下,則啟動中斷系統(tǒng),前面鍵的發(fā)音停止,轉(zhuǎn)到后按的發(fā)音程序,發(fā)出后按的鍵的音調(diào)。 四實驗原理4.1 音頻脈沖的產(chǎn)生 一首音樂是許多不同的音階組成的,而每個音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對于單片機來產(chǎn)生不同的頻率非常方便,我們可以利

5、用單片機的定時/計數(shù)器來產(chǎn)生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系弄正確即可。 若要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),再將此周期除以2,即為半周期的時間。利用定時器計時半周期時間,每當(dāng)計時終止后就將相應(yīng)的端口反相,然后重復(fù)計時再反相。就可在各對應(yīng)的引腳上得到此頻率的脈沖。   我們小組利用PIC32MX795F512L的80M主頻,運用delay函數(shù),改變delay的時間以產(chǎn)生不同頻率的方法產(chǎn)生不同音階。由于主頻較高,沒有一個音符的頻率可以參考,于是我們小組是利用自己的樂理知識將每個音校正。  &

6、#160;  每個音與delay時間對應(yīng)如下表所示:音符Delay音符Delay中音Do8876高音Re2446中音Re7476高音Mi1936中音Mi6456高音Fa1666中音Fa5886高音So1186中音So5036高音La766中音La4036高音Xi376中音Xi3236高音Do186高音Do30064.2音樂節(jié)拍的產(chǎn)生 每個音符使用1個字節(jié),字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍,表1-2為節(jié)拍與節(jié)拍碼的對照表。如果1拍為0.4s,1/4拍是0.1s,只要設(shè)定延時時間就可求得節(jié)拍的時間。假設(shè)1/4拍為1DELAY,那么1拍應(yīng)為4DELAY,以此類推。

7、所以只要求得1/4拍的DELAY,其余的節(jié)拍就是它的倍數(shù),表1-3為1/4和1/8拍的時間設(shè)定。本小組的節(jié)拍是由while函數(shù)實現(xiàn)的,在每個節(jié)拍delay的時間中播放對應(yīng)的音符,1/8為1,1/4為2,以此類推。而while循環(huán)的時間為節(jié)拍*310,這是我們經(jīng)過反復(fù)試驗確定的最佳的節(jié)拍延時。五方案設(shè)計5.1硬件設(shè)計輸出模塊:LCD RT1602C5.1.1電路設(shè)計框圖PIC32MX795F512L芯片輸出模塊:喇叭輸入模塊:4*4鍵盤輸出模塊:走馬燈5.1.2 硬件概述本電路是由PIC32MX795F512L單片機為控制核心,具有鍵盤輸入、液晶顯示屏輸出和三極管驅(qū)動的喇叭構(gòu)成的簡易電子琴電路。

8、1.單片機PIC32MX795F512L型號單片機具有USB、CAN 和以太網(wǎng)的高性能32 位閃存,其所擁有的主要資源有: ² 80MHz的主頻,1.56DMIPS/MHz,總線32位;² USB 2.0 接口;² 2個帶1024緩存的CAN 2.0接口;² 8通道DMA通道;² 5級流水線,哈佛架構(gòu);² 1個以太網(wǎng)接口;² 512K的Flash,外加12k的啟動Flash;² 128K的RAM;² 可編程中斷向量控制器;² 16個10位AD轉(zhuǎn)換器;² UART/SPI/IIC等串行通

9、信方式;² 帶JTAG調(diào)試口,具有休眠功能,節(jié)省能耗。2.輸入模塊(鍵盤)一個簡易的電子琴需要鍵盤15個按鍵,選擇用4*4行列式鍵盤完成輸入。4*4行列式鍵盤又稱為矩陣鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設(shè)置一個按鍵。這樣鍵盤中按鍵的個數(shù)是4×4個。這種行列式鍵盤結(jié)構(gòu)能夠有效地提高單片機系統(tǒng)中I/O口的利用率。而鍵盤應(yīng)具有以下幾個基本功能:(1)去抖動:每個按鍵在按下或松開時,都會產(chǎn)生短時間的抖動。抖動的持續(xù)時間與鍵的質(zhì)量相關(guān),一般為520mm。所謂抖動是指在識別被按鍵是必須避開抖動狀態(tài),只有處在穩(wěn)定接通或穩(wěn)定斷開

10、狀態(tài)才能保證識別正確無誤。去抖問題可通過軟件延時或硬件電路解決。  (2)被按鍵識別:如何識別被按鍵是接口解決的主要問題,一般可通過軟硬結(jié)合的方法完成。常用的方法有行掃描法和線反轉(zhuǎn)法兩種。行掃描法的基本思想是,由程序?qū)︽I盤逐行掃描,通過檢測到的列輸出狀態(tài)來確定閉合鍵,為此,需要設(shè)置入口、輸出口一個,該方法在微機系統(tǒng)中被廣泛使用。本實驗采用掃描法。(3)鍵碼產(chǎn)生:為了從鍵的行列坐標編碼得到反映鍵功能的鍵碼,一般在內(nèi)存區(qū)中建立一個鍵盤編碼表,通過查表獲得被按鍵的鍵碼。RE0RG14RG1RD3RE1 RD4 RE3 RE23.輸出模塊(顯示屏)采用型號為RT1602C的液晶顯示

11、屏,液晶顯示屏的顯示功能強大,可顯示大量文字、圖形,顯示多樣,清晰可見, 與傳統(tǒng)的陰極射線管相比,液晶顯示屏具有占用空間小、低功耗、低輻射、無閃爍、降低視覺疲勞等優(yōu)點。字符型液晶屏是一種用5*7點陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個字、2行16個字、2行20個字等,最常用的為2行16個字。型號為RT1602C的液晶顯示屏就是2行16個字。它有16個管腳,分別有電源地、電源正、偏壓信號、讀寫控制、使能控制、I/O接口、背光控制等功能。它的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。VO為顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高。為了簡化電路以及

12、獲得最好的顯示效果,將VO端口直接接地。R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。GND接電源,VDD接正電源。RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器,低電平時選擇指令寄存器。源代碼中write_cmd函數(shù)為向LCD寫入指令的函數(shù),因此會有RS=0;write_date函數(shù)為向LCD寫入數(shù)據(jù)的函數(shù),因此會有RS=1。E端為使能端,當(dāng)E端由高電平跳變成低電平,也就是下降沿時,LCD模塊進行命令執(zhí)行。BL1和BL2為設(shè)置LCD背光,分別接了電源與地。DOD7八個為數(shù)據(jù)I/O口,按照表格內(nèi)的接法相連。腳號符號引腳功能以及接法腳號符號引腳功能以及接法1GND電源地9D2RF132V

13、DD電源正10D3RB123V0顯示偏壓信號11D4RB134RS數(shù)據(jù)/命令控制 RA712D5RB145R/W讀/寫控制 RA613D6RB86E使能信號 RF414D7 RB97D0數(shù)據(jù)I/O RF515BL1背光源正8D1RF1216BL2背光源負4.輸出模塊(喇叭)將一固定端口通過三極管PNP放大再連接喇叭構(gòu)成我們的輸出音頻模塊。喇叭一端接電源一端接發(fā)射極,當(dāng)有方波送入時,喇叭便發(fā)出相應(yīng)頻率的響聲。5.輸出模塊(走馬燈)將四個發(fā)光二極管與四個端口相連,另外一端通過小電阻接地,通過控制四個端口依次為高電平使得四個燈依次點亮,實現(xiàn)走馬燈的效果。5.2 軟件設(shè)計5.2.1程序流程圖開始判斷L

14、CD按鍵SW3SW1播放功能彈奏功能鍵盤掃描鍵盤掃描根據(jù)按鍵值在相應(yīng)數(shù)組中尋找對應(yīng)鍵值的音符頻率根據(jù)按鍵值含有七首曲子的二維數(shù)組中尋找對應(yīng)鍵值的曲目相應(yīng)曲目節(jié)拍與音調(diào)通過同一參數(shù)一一對應(yīng)喇叭播放對應(yīng)音符喇叭播放相應(yīng)曲子結(jié)束5.2.2 各模塊具體軟件實現(xiàn)1.鍵盤模塊運用行掃描的方式來判斷是否有鍵按下及按下的是哪一鍵。首先令行都為輸出并置為零,列為輸入且都為高電位,則只要有一列為低就是有鍵按下。再依次令每一行為低電平其他行為高電平,檢查每一列是否為低電平,行和列均為低電平所對應(yīng)的交匯處即為按鍵按下的地方。#include "KEYBOARD.h"/時延函數(shù)void delay(

15、uint ms)uint x,y;for(x=ms;x>0;x-)for(y=10;y>0;y-);uchar keyboard() /判斷按下哪一鍵while(1)delay(100); /將R行全部設(shè)置為輸出為低電平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClea

16、rBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /將C列全部設(shè)置為輸入為高電平1PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 );PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 );delay(1);/第一列R0=0;R1=1;R2=1;R3=1; /第一行if(C0=0) /

17、第一列delay(10);if(C0=0) return 1; if(C1=0)delay(10);if(C1=0) return 2;if(C2=0)delay(10);if(C2=0) return 3;if(C3=0)delay(10);if(C3=0) return 4;/第二列R0=1;R1=0;R2=1;R3=1;if(C0=0)delay(10);if(C0=0)return 5;if(C1=0)delay(10);if(C1=0) return 6;if(C2=0)delay(10);if(C2=0) return 7;if(C3=0)delay(10);if(C3=0) re

18、turn 8;/第三列R0=1;R1=1;R2=0;R3=1;if(C0=0)delay(10);if(C0=0) return 9;if(C1=0)delay(10);if(C1=0) return 10;if(C2=0)delay(10);if(C2=0) return 11;if(C3=0)delay(10);if(C3=0) return 12;/第四列R0=1;R1=1;R2=1;R3=0;if(C0=0)delay(10);if(C0=0)return 13;if(C1=0)delay(10);if(C1=0) return 14;if(C2=0)delay(10);if(C2=0

19、)return 15;if(C3=0)delay(10);if(C3=0) return 16;uchar presskey() /判斷是否有鍵按下delay(100); /將R行全部設(shè)置為輸出為低電平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D,

20、 BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /將C列全部設(shè)置為輸入為高電平1PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 ); PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 ); delay(1); R0=0;R1=0;R2=0;R3=0; if(C0=0)delay(10);if(C0=0)retu

21、rn 1;if(C1=0)delay(10);if(C1=0) return 1 ;if(C2=0)delay(10);if(C2=0)return 1;if(C3=0)delay(10);if(C3=0) return 1; return 0;2.LCD模塊(本模塊為組員xx主要編寫,此處不再敘述)3.喇叭播放模塊通過將不同頻率的方波輸送到喇叭的端口來使其發(fā)出聲音。在彈奏時,若一直按著按鍵,就會一直發(fā)出相應(yīng)鍵值的音調(diào)。在播放音樂時,首先通過鍵盤選擇一首樂曲,通過同一參數(shù)將節(jié)拍和音調(diào)結(jié)合,在第一個音調(diào)的節(jié)拍長度中播放第一個音,直到節(jié)拍結(jié)束,令Tone_Index加1,繼續(xù)下一個音的相應(yīng)節(jié)拍中的

22、發(fā)聲,以此類推,直到播完一首曲子。同時我們還通過設(shè)置中斷實現(xiàn)了暫停的功能,只要按下單片機上的SW2,就可以暫停音樂的播放。while(1) if(FY=0) / 若沒有松開按鍵,則等待,等待期間彈奏該音符 while ( presskey()=1) k= keyboard(); uint x=tabk; d(x); SPK=!SPK; if (h=499) h=1; run (h); h+; else k= keyboard(); while (1) if (SongkTone_Index=-1) Tone_Index=0; uint ms=310*LenkTone_Index; while(

23、ms-) int x=2600+tabSongkTone_Index; d(x); SPK=!SPK; if (h=499) h=1; run (h); h+; ; Tone_Index+; d(200000); void _ISR(_CHANGE_NOTICE_VECTOR, ipl2) ChangeNotice_Handler(void) /讀取D端口的bit7的數(shù)據(jù),放到全局變量dummy緩存中 dummy = PORTReadBits(IOPORT_D, BIT_7); /清空中斷標志位,目的是使其能產(chǎn)商第二次中斷 mCNClearIntFlag(); /按鈕按著則燈一直亮 if(du

24、mmy = BIT_7) /D端口的bit1位清0,即LED2燈滅 PORTClearBits(IOPORT_D, BIT_1); / turn off LED2 LCD_Initialize(); /初始化LCD LCD_ShowString(0,0,"2.SONGS PLAY"); else /D端口的bit1位置1,即LED2燈亮 PORTSetBits(IOPORT_D, BIT_1); / turn on LED2 while( PORTReadBits(IOPORT_D, BIT_7)=0) LCD_Initialize(); /初始化LCD LCD_ShowS

25、tring(0,0,"PAUSE"); d(2000000); 4.走馬燈模塊通過控制四個端口依次為高電平使得四個燈依次點亮,實現(xiàn)走馬燈的效果。由于系統(tǒng)主頻較快,因此每一個燈亮的時間為100個系統(tǒng)周期,這樣才能看清依次的變化。#include "lighting.h"#define uchar unsigned charvoid run (int h) PORTSetPinsDigitalOut(IOPORT_A, BIT_10 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_4 ); PORTSetPinsDigitalO

26、ut(IOPORT_D, BIT_5 ); PORTSetPinsDigitalOut(IOPORT_G, BIT_13 ); if(h>0)&(h<100) L1=1;L2=0;L3=0;L4=0; if(h>99)&(h<200) L1=0;L2=1;L3=0;L4=0; if(h>199)&(h<300) L1=0;L2=0;L3=1;L4=0; if(h>299)&(h<500) L1=0;L2=0;L3=0;L4=1; ;六實驗問題及心得體會6.1出現(xiàn)的問題1.定時器小學(xué)期的前五天我和我的隊友四處搜集關(guān)于

27、PIC單片機的資料,綜合老師課上提供的數(shù)據(jù)手冊使用說明,得知單片機有五個定時器,按理說依照說明在我們發(fā)聲的部分正確書寫代碼就可以提供出我們相應(yīng)音色的頻率,并且我們發(fā)出聲音的模塊想要頻率為1MHz的定時器來完成,這樣無論從計數(shù)的計算上還是程序的編寫上都十分方便,但是在讀說明書和函數(shù)說明中出現(xiàn)了很多問題,很多地方不很清晰,英文版說明也給閱讀帶來了一定的障礙,經(jīng)過三番五次向老師詢問,寫出的代碼編譯時總是不能完好通過,所以最終無奈之下我們放棄了這一方法,僅僅使用延時函數(shù)及自己的樂理知識來校準的每一個音,增加了不少工作量,而沒有好好運用定時器也是這次小學(xué)期試驗的一個遺憾,在以后的學(xué)習(xí)中一定會加深認識定時

28、器并盡量學(xué)會應(yīng)用。2.顯示屏的調(diào)試顯示屏的調(diào)試是我們班整體遇到的最大的問題,直到驗收前一天顯示屏還沒有達到很好的效果。剛開始拿到硬件連接之后,我們的顯示屏連背光都沒有亮,經(jīng)檢查連接無誤后想可能是顯示屏本身出了問題,正好班上其他同學(xué)的顯示屏也都存在著一定的錯誤,于是我們集體換了一批顯示屏。新的顯示屏拿來后背光是亮了,但是依舊沒有字顯示,經(jīng)過代碼的各種調(diào)試與更改終于能實現(xiàn)一行字的顯示,但在我們想實現(xiàn)按鍵顯示屏做出相應(yīng)變化的功能時,發(fā)現(xiàn)顯示屏根本沒有變化,于是又回去調(diào)試它。經(jīng)過老師的直到我們發(fā)現(xiàn)成功顯示的那一句代碼是放在設(shè)置主頻之前的,而在主頻之下我們的LCD代碼就失效了,我們短暫的成功只是偶然性的

29、。于是這次我們就先設(shè)置好主頻,然后回去更改LCD 中延時的長度,經(jīng)過多次嘗試后終于能顯示出字并實現(xiàn)刷新顯示了。這之后又出現(xiàn)一個小問題,就是字符串不是一下子全顯示出來,而是有那種漸變的效果,思考一下發(fā)現(xiàn)是延時太長,于是改短寫數(shù)據(jù)的延時后問題迎刃而解。LCD調(diào)試是個漫長需要耐心的工作,一旦成功,就會發(fā)現(xiàn)這一切努力都沒有白費。3.喇叭的調(diào)試在網(wǎng)上查閱關(guān)于喇叭的連接方法和注意事項之后我們將喇叭焊在了板子上,第一次測驗時隨意取了一個機器頻率測試是否能夠正常發(fā)聲,可是沒有成功,喇叭沒有聲音而且變燙,我們迅速停止調(diào)試檢查問題,發(fā)現(xiàn)三極管損壞,于是我們又換了一個PNP管并重新設(shè)計電路,采用共集放大電路并將喇叭

30、一端接電源,此時喇叭發(fā)出了聲音,但頻率很低,我們又回去調(diào)整了頻率和延時才得到了較為滿意的結(jié)果。4.鍵盤的調(diào)試小學(xué)期的第二天就在網(wǎng)上查閱資料弄懂了鍵盤的掃描輸入原理,后來通過幾天的修改將代碼程序?qū)懞弥鬁y試時是成功的,但是又過了幾天待全部發(fā)聲代碼編寫完成再次測試的時候有兩個鍵按下時發(fā)聲頻率不正確,一個鍵按下后不論怎樣調(diào)試頻率沒有變化,另一個鍵發(fā)聲和相鄰的鍵始終保持一致,后來通過不斷地改代碼調(diào)試發(fā)現(xiàn)第一個鍵出了問題,另一個鍵的接頭接觸不良,我們換了一個接口后差強解決了相鄰鍵發(fā)聲相同的問題。6.2實驗感悟這次小學(xué)期是我和隊友第一次接觸單片機,對單片機之前沒有任何接觸和認識,所以剛上手時非常困惑,一來

31、是不清楚單片機究竟什么構(gòu)造和具有什么功能,二來不清楚選作哪個題目,于是第一天和第二天我和室友大致掃視了一遍數(shù)據(jù)手冊,又通過上網(wǎng)查閱相關(guān)資料對于單片機有了一個大致的了解,之后去網(wǎng)上搜索各種單片機設(shè)計題目,因為我們兩個人之前都懂一些音樂樂理,對音樂很感興趣所以挑了這個電子琴發(fā)聲器的題目,初次編寫代碼時一頭霧水,不知從何下手,后來漸漸弄懂了電子琴發(fā)聲的原理,通過開題報告做了流程圖和模塊分解,再加上老師的分析,開始嘗試分模塊編寫代碼。編寫代碼后調(diào)試過程中耗費了很長時間,不斷修改代碼編譯通過之后上機調(diào)試中又出現(xiàn)各種各樣的問題,有的問題像LCD和發(fā)聲問題花了好長時間調(diào)整修改,過程中很痛苦,但是每當(dāng)問題解決

32、看到成品時心情都是非常的愉悅。最后在驗收前四天我們把基本功能全部能夠?qū)崿F(xiàn)了,為了豐富我們的成果,我找了四只藍色發(fā)光二極管,在原有代碼上補充了一個跑馬燈類似的函數(shù),讓聲音發(fā)出來的同時四只小燈泡循環(huán)一次閃亮,給我們的電子琴增加了一點絢麗的效果。6.1實驗總結(jié) 總體來說這次小學(xué)期我們圓滿完成了電子琴所涉及的所有功能,對于單片機有了第一次的嘗試和理解,唯一遺憾的是對于定時器的掌握和使用還是存在問題。在小學(xué)期過程中尤其感謝葛順明老師的悉心指導(dǎo),尤其是在小學(xué)期前半階段,總是有各種問題麻煩老師,有的時候都不好意思去問,但是葛老師還是每次都認真的解答我們的問題,這次實驗的成功離不開老師的指導(dǎo)和幫助。對于我們存

33、在的問題,在大三大四階段還會進一步學(xué)習(xí)和注意,進一步深入了解單片機。六參考文獻1 PIC單片機實用教程-基礎(chǔ)篇 北京航空航天大學(xué)出版社 82317024 李學(xué)海2 PIC32系列手冊七程序源代碼Keyboard.h:*#include <p32xxxx.h>#include <plib.h>#define R0 PORTGbits.RG1#define R1 PORTDbits.RD3#define R2 PORTEbits.RE0#define R3 PORTGbits.RG14#define C0 PORTEbits.RE1#define C1 PORTDbits.

34、RD4#define C2 PORTEbits.RE3#define C3 PORTEbits.RE2#define uchar unsigned char#define uint unsigned intuchar keyboard();void delay(uint ms);uchar presskey();keyboard.c*#include "KEYBOARD.h"/時延函數(shù)void delay(uint ms)uint x,y;for(x=ms;x>0;x-)for(y=10;y>0;y-);uchar keyboard()while(1)delay

35、(100); /將R行全部設(shè)置為輸出為低電平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /將C列全部設(shè)置為輸入為高電平1PORTSetPinsD

36、igitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 );PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 );delay(1);/第一列R0=0;R1=1;R2=1;R3=1; /第一行if(C0=0) /第一列delay(10);if(C0=0) return 1; if(C1=0)delay(10);if(C1=0) return 2;if(C2=0)delay(10);if(C2=0)

37、 return 3;if(C3=0)delay(10);if(C3=0) return 4;/第二列R0=1;R1=0;R2=1;R3=1;if(C0=0)delay(10);if(C0=0)return 5;if(C1=0)delay(10);if(C1=0) return 6;if(C2=0)delay(10);if(C2=0) return 7;if(C3=0)delay(10);if(C3=0) return 8;/第三列R0=1;R1=1;R2=0;R3=1;if(C0=0)delay(10);if(C0=0) return 9;if(C1=0)delay(10);if(C1=0)

38、return 10;if(C2=0)delay(10);if(C2=0) return 11;if(C3=0)delay(10);if(C3=0) return 12;/第四列R0=1;R1=1;R2=1;R3=0;if(C0=0)delay(10);if(C0=0)return 13;if(C1=0)delay(10);if(C1=0) return 14;if(C2=0)delay(10);if(C2=0)return 15;if(C3=0)delay(10);if(C3=0) return 16;uchar presskey()delay(100); /將R行全部設(shè)置為輸出為低電平0;

39、PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /將C列全部設(shè)置為輸入為高電平1PORTSetBits(IOPORT_E, BIT_1 | BIT_2 |

40、 BIT_3); PORTSetBits(IOPORT_D, BIT_4 ); PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 ); delay(1); R0=0;R1=0;R2=0;R3=0; if(C0=0)delay(10);if(C0=0)return 1;if(C1=0)delay(10);if(C1=0) return 1 ;if(C2=0)delay(10);if(C2=0)return 1;if(C3=0)delay(10);if(C3=0)

41、return 1; return 0;LCD.c*/-/ 名稱: LCD1602.c液晶控制與顯示程序/-#include <plib.h>#include "LCD.h"/*- LCD RS-RG13 RWRG12 ERG14-*/void Delay_1ms(void) /1ms延時函數(shù) unsigned int i; for (i=0;i<1000;i+); void Delay_nms(unsigned int n) /N ms延時函數(shù) unsigned int j=0; for (j=0;j<n;j+) Delay_1ms(); /* 寫L

42、CD命令*/void Write_LCD_Command(INT8U cmd) PORTClearBits(IOPORT_A, BIT_7); /RS=0; PORTClearBits(IOPORT_A, BIT_6); /RW=0; PORTFbits.RF5 = (cmd)%2; PORTFbits.RF12 = (cmd/2)%2; PORTFbits.RF13 = (cmd/2)/2)%2; PORTBbits.RB12 = (cmd/2)/2)/2)%2; PORTBbits.RB13 = (cmd/2)/2)/2)/2)%2; PORTBbits.RB14 = (cmd/2)/2)

43、/2)/2)/2)%2; PORTBbits.RB8 = (cmd/2)/2)/2)/2)/2)/2)%2; PORTBbits.RB9 =(cmd/2)/2)/2)/2)/2)/2)/2)%2; Delay_nms(50); PORTSetBits(IOPORT_F, BIT_4); /E=1;Delay_nms(50); PORTClearBits(IOPORT_F, BIT_4); /E=0; Delay_nms(50); /LCD忙等待/* void Write_LCD_Data(INT8U dat) 寫LCD命令*/void Write_LCD_Data(INT8U dat) POR

44、TSetBits(IOPORT_A, BIT_7); /RS=1; PORTClearBits(IOPORT_A, BIT_6); /RW=0; PORTFbits.RF5 = (dat)%2; PORTFbits.RF12 = (dat/2)%2; PORTFbits.RF13 = (dat/2)/2)%2; PORTBbits.RB12= (dat/2)/2)/2)%2; PORTBbits.RB13 = (dat/2)/2)/2)/2)%2; PORTBbits.RB14 = (dat/2)/2)/2)/2)/2)%2; PORTBbits.RB8= (dat/2)/2)/2)/2)/2)/2)%2; PORTBbits.RB9 =(dat/2)/2)/2)/2)/2)/2)/2)%2; Delay_nms(5); PORTSetBits(IOPORT_F, BIT_4); /E=1;Delay_nms(5); PORTClearBits(IOPORT_F, BIT_4); /E=0; Delay_nms(5); /LCD忙等待/* void LCD_Initialize()

溫馨提示

  • 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論