北郵單片機實驗報告簡易電子琴_第1頁
北郵單片機實驗報告簡易電子琴_第2頁
北郵單片機實驗報告簡易電子琴_第3頁
北郵單片機實驗報告簡易電子琴_第4頁
北郵單片機實驗報告簡易電子琴_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2014年小學(xué)期單片機設(shè)計實驗報告題目:基于單片機的電子音樂發(fā)生器班 級: 班內(nèi)序號: 實驗組號: 學(xué)生姓名: 指導(dǎo)教師: 基于單片機的電子音樂發(fā)生器實驗摘要此次本組制作的基于PIC單片機的電子音樂發(fā)生器是具有LCD顯示屏提示的音樂簡單演奏、播放、存儲等功能的演示作品,擁有以下4種功能:1按鍵演奏:即“電子琴”功能,可以用鍵盤上的“1”到“A”鍵演奏從低音sol到高音do等11個音;2點歌功能:即按動“B”“C”鍵分別演奏兩首樂曲(可以表現(xiàn)準確的音高和音長)。3.存儲音樂功能:即按右下角“F存儲”鍵,然后按鍵演奏并存儲,隨后按“E”鍵結(jié)束,之后按“D鍵”就可以播放存儲的樂曲了;4.液晶顯示功能

2、:即在開始時顯示“hello!”,在點播時分別顯示“song b”、“song c”,在存儲時顯示“saving”。電子音樂發(fā)生器采用以Microchip公司的PIC16F877芯片為核心的簡單控制系統(tǒng),外部電路連接有喇叭、鍵盤、LCD液晶顯示屏以及其他必要系統(tǒng)調(diào)節(jié)元件。軟件設(shè)計中涉及PORTBPORTCPORTDPORTE用作普通數(shù)字I/O腳功能。本實驗用單片機PORTBD接收來自鍵盤輸入的指令信息,由此確定LCD液晶屏幕顯示以及喇叭播放內(nèi)容,再通過PORTCDE輸出聲音或字幕信息。關(guān)鍵字單片機microcontroller 芯片CMOS chip 音樂發(fā)生器music generator

3、分頻fractional frequency一、實驗論證與比較本設(shè)計的核心器件是單片機芯片和音頻功放芯片。單片機采用以Microchip公司的PIC16F87X系列中的PIC16F877芯片為核心構(gòu)建簡單控制系統(tǒng),它完全可以滿足本設(shè)計功能的需要。此音樂發(fā)生器設(shè)計利用單片機的輸入輸出功能,當按下播放功能鍵時,單片機的輸出功能使外部電路連接的喇叭和LCD液晶顯示屏同時播放聲音及顯示文字,從而實現(xiàn)各種復(fù)雜音樂播放器的功能。在嵌入式系統(tǒng)設(shè)計中,揚聲器等是常用的輸出設(shè)備,它具有使用方便、價格便宜、電路接口簡單等優(yōu)點,因此,在嵌入式系統(tǒng)中被廣泛使用。同時隨著單片機的發(fā)展,其功能越來越強大,技術(shù)也越來越成熟

4、,由此生產(chǎn)的音樂播放器越來越受到人們的喜愛。因此,在技術(shù)性操作、社會因素和經(jīng)濟方面都具有良好的可行性。我在實驗中負責(zé)了全部軟件設(shè)計,代碼的編寫,電路圖的設(shè)計,以及部分硬件焊接。其中,困難的部分在于,理論上認為電子音樂發(fā)生器模擬真正樂器的仿真實現(xiàn)方法,與現(xiàn)實電路實現(xiàn)起來有著一定的差別,在長音、樂譜存儲播放上,以及存儲功能的代碼編寫都有一定的難度。 二、系統(tǒng)總體設(shè)計1、系統(tǒng)模塊總體框圖2、系統(tǒng)整體流程圖3、發(fā)音原理播放一段音樂需要的是兩個元素,一個是音調(diào),另一個是音符。首先要了解對應(yīng)的音調(diào),音調(diào)主要由聲音的頻率決定,同時也與聲音強度有關(guān)。對一定強度的純音,音調(diào)隨頻率的升降而升降;對一定頻率的純音、

5、低頻純音的音調(diào)隨聲強增加而下降,高頻純音的音調(diào)卻隨強度增加而上升。另外,音符的頻率有所不同?;谏厦娴膬?nèi)容,這樣就對發(fā)音的原理有了一些初步的了解。將相應(yīng)音高的分頻值存儲在寄存器里,并將其與對應(yīng)的按鍵進行關(guān)聯(lián),通過鍵盤掃描子程序?qū)?yīng)的分頻值送入單音播放子程序即可產(chǎn)生相應(yīng)頻率的電壓方波,再將其輸出到喇叭即可產(chǎn)生對應(yīng)的音高實現(xiàn)電子琴功能。將音符按音高和音長直接存儲在數(shù)據(jù)存儲器里并與按鍵相關(guān)聯(lián),調(diào)用自動演奏子程序產(chǎn)生相應(yīng)頻率和時長的方波電壓輸出到喇叭即可。三、硬件連接1、鍵盤和單片機的連接選擇用4*4行列式鍵盤完成輸入。4*4行列式鍵盤又稱為矩陣鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線

6、組成的鍵盤。在行線和列線的每一個交叉點上,設(shè)置一個按鍵。這樣鍵盤中按鍵的個數(shù)是4×4個。這種行列式鍵盤結(jié)構(gòu)能夠有效地提高單片機系統(tǒng)中I/O口的利用率。引腳號所連接的單片機的管腳引腳號所連接的單片機的管腳1RD45RB02RD56RB13RD67RB24RD78RB32、LCD和單片機的連接采用型號為RT1602C的液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字、圖形,顯示多樣,清晰可見, 與傳統(tǒng)的陰極射線管相比,液晶顯示屏具有占用空間小、低功耗、低輻射、無閃爍、降低視覺疲勞等優(yōu)點。字符型液晶屏是一種用5*7點陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個字、2行

7、16個字、2行20個字等,最常用的為2行16個字。型號為RT1602C的液晶顯示屏就是2行16個字。它有16個管腳,分別有電源地、電源正、偏壓信號、讀寫控制、使能控制、I/O接口、背光控制等功能。它的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。腳號符號管腳功能及接發(fā)腳號符號管腳功能及接發(fā)1VSS電源地9DB2數(shù)據(jù)I/O RD22VDD電源正10DB3數(shù)據(jù)I/O RD33VO對比調(diào)整電壓11DB4數(shù)據(jù)I/O RD44RS數(shù)據(jù)/命令控制 RE012DB5數(shù)據(jù)I/O RD55R/W讀/寫控制13DB6數(shù)據(jù)I/O RD66E使能信號 RE114DB7數(shù)據(jù)I/O RD77DBO數(shù)據(jù)I/O RD0

8、15BLA背光源正8DBI數(shù)據(jù)I/O RD116BLK背光源負3、揚聲器和單片機的連接揚聲器的連接方法較前面的容易很多。起初是將喇叭的正極直接連接在RE0上,負極接地,但我們發(fā)現(xiàn)這樣發(fā)出的聲音很小,音色也不好,于是在喇叭和單片機之間增加了一E個功率放大模塊,這樣聲音就放大、穩(wěn)定了很多。四、調(diào)試過程1、軟件程序部分我們首先在大體上對音樂播放器的功能按幾個部分進行了劃分,其中包括鍵盤掃描、單鍵演奏、鍵盤點播樂曲、音樂輸入存儲及播放、液晶顯示等幾個部分。 1)、音樂的存儲和演奏:起初我們設(shè)想把音樂的聲調(diào)高低這些信息用不同的電壓代表。通過AD轉(zhuǎn)換存儲到內(nèi)存單元里,而這不同的電壓正可以通過不同的按鍵實現(xiàn)

9、,后來在具體編程時發(fā)現(xiàn)有困難,于是在網(wǎng)上查到相應(yīng)音高的分頻值存儲在寄存器里,并將其與對應(yīng)的按鍵進行關(guān)聯(lián),通過鍵盤掃描子程序?qū)?yīng)的分頻值送入單音播放子程序即可產(chǎn)生相應(yīng)頻率的電壓方波,再將其輸出到喇叭即可產(chǎn)生對應(yīng)的音高實現(xiàn)電子琴功能。將音符按音高和音長直接存儲在數(shù)據(jù)存儲器里并與按鍵相關(guān)聯(lián),調(diào)用自動演奏子程序產(chǎn)生相應(yīng)頻率和時長的方波電壓輸出到喇叭即可。2)、液晶顯示:應(yīng)用了查表功能按四位16進制顯示在液晶屏上。3)、鍵盤掃描:鍵盤掃描子程序是根據(jù)實驗板的布線,先讓行輸出高電平,列為低電平,如有鍵按下則此鍵所在行也變成低電平,由此取得行碼;同理取得列碼,將兩個碼首尾相接取得鍵位碼,并且事先將據(jù)此設(shè)計

10、好的鍵位碼存在寄存器里,通過地址指針不斷將取得的鍵位碼與預(yù)置的鍵位碼比較從而確定出哪個鍵被按下了。4)、音樂存儲及播放部分:用F鍵將標志位置1后進入存儲狀態(tài),將按下的鍵逐一存到一串連續(xù)的地址中去,可是fsr指針只有一個,鍵盤掃描時用到了,所以在存儲時只好在每次存儲前重新對fsr賦值。自動播放子程序因為知道了音長是按幾分音符來控制的,而且都是倍數(shù)關(guān)系,于是我又加了一個計數(shù)器用來控制音長。(1)存儲功能流程圖(2)單音獨奏功能流程圖(3)重放功能流程圖 2、硬件部分硬件部分的完成分為:電路圖的設(shè)計、實驗板的焊接、實際電路的整體連接三部分。在實驗開始前的開題報告中,我組還準備加入藍牙模塊,可以通過手

11、機控制音樂的播放。因為知道PIC16F877單片機有USART端口(RC6,RC7),可以進行串行通信,只需借助有USART端口的藍牙模塊,就可以通過藍牙模塊來與藍牙設(shè)備進行通信,這樣就可以手機來控制單片機來產(chǎn)生調(diào)用相應(yīng)的程序來產(chǎn)生一定頻率的聲音,并且PIC16F877的串行通信模塊,在接收緩沖寄存器滿時,在中斷使能的情況下可以產(chǎn)生中斷,這樣就可以跳入中斷子程序,從而就能夠?qū)崟r控制單片機,來實時彈奏音樂。所以藍牙電子琴是可行的。在前面的過程基本完成并測試穩(wěn)定后,我們開始了對藍牙模塊的研究,研究過程并不順利,首先在器材上我們的購買的藍牙芯片只有連接凹槽,沒有連接管腳,這一時讓我們犯了難。后來通過

12、向老師求助,拿到了一個可以引出插孔的小電路板,但是焊接有一些困難。原本老師想要幫助我們,我們最后還是決定自己完成,通過多次練習(xí)和謹慎的焊接之后,我們終于成功的自己焊接上了。后面面臨的困難卻沒有這么容易克服了,不但編程燒入后LED燈的點亮情況一直不正確,也不能用手機搜索到該藍牙設(shè)備,在反復(fù)調(diào)試失敗和驗收時間迫近的情況下,我們不得不選擇放棄使用藍牙模塊。這是我們這次實驗的一個遺憾。五、參考文獻PIC單片機實用教程基礎(chǔ)篇 (五號 宋體)李學(xué)海北京航空航天大學(xué)出版社使用說明:的確是一本不可或缺的教材,本書列舉了很多實用的具有實戰(zhàn)意義的例子,單片機入門就是通過把這本書里的好例子一字一行敲進電腦去來實現(xiàn)的

13、。PIC單片機實用教程提高篇李學(xué)海北京航空航天大學(xué)出版社使用說明:繼承了前面基礎(chǔ)篇的風(fēng)格,例子也具有實戰(zhàn)意義,主要講RA、TMR2的使用和CCP模塊的PWM脈寬調(diào)制功能。六、實驗心得體會小學(xué)期的第一周基本上是泡在實驗室,一日三餐基本上是在實驗室解決的。在這一周里,一直在看書,也就是在這一周里看了快兩本有關(guān)PIC單片機相關(guān)的資料書。感覺相當?shù)某鋵崳瑫r也學(xué)到了很多東西,幾乎是從零開始,一點點地學(xué)習(xí)匯編語言,一點點地學(xué)學(xué)PIC16F877的知識,到現(xiàn)在每一個管腳都還在腦海中。硬件也是自己動手,從電路的設(shè)計到電路的焊接。 現(xiàn)在來看這個小學(xué)期學(xué)到了許多東西。剛開始是感覺挺難的,通過耐心的學(xué)習(xí),我從不甚

14、了解到編出自己的程序,到調(diào)試成功,真的是學(xué)到了很多。開始時心里一點底也沒有,直到鍵盤掃描和單鍵演奏程序編出來后才逐漸有了信心,當我們按下鍵盤喇叭第一次發(fā)出音階時,我真是激動極了,那種成就感真的是難以言表。雖然實驗過程中遇到很多困難比如自動播放子程序開始編的程序在演奏時只表現(xiàn)音高而沒有表現(xiàn)音長,所以放出來的樂曲效果很差,還有存儲代碼想了好久,但是我都通過自己思考以及查閱資料或詢問老師將問題解決了,我不僅了解到了自學(xué)的樂趣和重要性,同時也鍛煉了實驗中的動手能力,了解了匯編語言,更重要的是這次合作式的小學(xué)期也讓我體會出團隊的團結(jié)、相互的默契和彼此的信任在團隊(盡管這個團隊也許只有兩三個人)的協(xié)作中是

15、多么重要,同時也為我們步入社會、參加工作提供了一次很好的“演練”機會。 雖然已經(jīng)完成了本次小學(xué)期的任務(wù),但最后的結(jié)果相較于最初的預(yù)期還是有一定的差距,這是自身能力尚且不足的體現(xiàn)。其實在學(xué)校要學(xué)的不僅是書本上的東西,更重要的是自學(xué)的能力、獨立思考的能力和動手的能力。要想在競爭異常激烈的現(xiàn)代社會立足,就必須有實力。在學(xué)校的時間是最好的學(xué)習(xí)機會,一定要珍惜好這有限的時間,多學(xué)知識,盡量充實自己,為以后進入社會多做準備。附代碼:;*變量定義區(qū)*indfequ00htmr0 equ 01h pclequ02hstatusequ03hc equ 0 zequ2rp0equ5rp1equ6fsrequ04h

16、fsr2equ05hportbequ06htrisbequ86hportcequ07htriscequ87hportdequ08htrisdequ88hporte equ 09h trise equ 89h pclathequ0ahintcon equ 0bh t0if equ 2 t0ie equ 5 pir1equ0ch;定義第一中斷標志寄存器pie1equ8ch;定義第一中斷使能寄存器tmr1lequ0eh;定義定時器1低位寄存器地址tmr1hequ0fh;定義定時器1高位寄存器地址t1conequ10h;定義tmr1控制寄存器rcstaequ18htxstaequ98htxregequ

17、19hspbrgequ99hrcregequ1ahgieequ7peieequ6rcifequ5rcieequ5txifequ4option_regequ81hrbpuequ7delMequ20h;定義兩個延時變量寄存器delNequ21hdelKequ0ffh;定義一個內(nèi)層循環(huán)延時常數(shù)valueequ22h;暫存按鍵列碼和位置碼w_temp equ 23h ;定義備份w的地址 countequ 24h;定義循環(huán)次數(shù)寄存器地址portc_pequ 25h;定義緩沖端口c的數(shù)據(jù)寄存器地址rdelay equ 26h;定義音樂延時寄存器地址flag1equ 27h;定義復(fù)選標志寄存器的地址flag

18、2equ28h;定義二次復(fù)選寄存器的地址count2equ29hindf2equ2ahtmp1equ2fh ;定義臨時寄存器地址tmr1lbequ30htmr1hbequ31hadcon1equ9fhdoequ50h;定義音符reequ51hmiequ52hfaequ53hsolequ54hlaequ55hsiequ56hHdoequ57hLsolequ58hLlaequ59hLsiequ5ahHreequ5bhHmiequ5chHfaequ5dhp1lequ60h ;定義拍節(jié)寄存器地址p1hequ 61hp2lequ62hp2hequ63hp3lequ64hp3hequ65hp4lequ 6

19、6hp4hequ67hp05lequ 68hp05hequ 69hp15lequ6ahp15hequ 6bhp025lequ6chp025hequ 6dhp075lequ6ehp075hequ 6fh;*數(shù)據(jù)寄存器寫入welcome*resetorg0000h nopcalllcdinitmovlw77h;wbsfporte,0calllcdsendmovlw65h;ecalllcdsendmovlw6ch;lcalllcdsendmovlw63h;ccalllcdsendmovlw6fh;ocalllcdsendmovlw6dh;mcalllcdsend movlw65h;ecalllcds

20、endmovlwb'10100000' calllcdsendmovlwb'01110100'calllcdsendmovlwb'01101111'calllcdsendmovlwb'10100000'calllcdsendmovlwb'01110101'usecalllcdsendmovlwb'01110011'calllcdsendmovlwb'01100101'calllcdsendbcf porte,0;nextrowmovlwb'11000000'calll

21、cdsendmovlwb'00000001'movwfportemovlw b01000010 call lcdsendmovlwb'01000011'calllcdsendmovlwb'00111010'calllcdsendmovlw53h;sbsfporte,0calllcdsendmovlw4fh;ocalllcdsendmovlw4eh;ncalllcdsendmovlw47h;gcalllcdsend movlw b01000110 call lcdsend movlw73h;sbsfporte,0calllcdsendmovlw61

22、h;acalllcdsendmovlw76h;vcalllcdsendmovlw65h;ecalllcdsend;*主程序*mainbsfstatus,5 ;設(shè)置文件寄存器的體1 movlw 00h ;將端口c的方向控制碼00h先送w movwf trisc ;再轉(zhuǎn)到方向寄存器,將其設(shè)為輸出movlw 07hmovwf adcon1movlw 00hmovwf trise movlw 0ffh ;同理,將端口b設(shè)置為輸入 movwf trisb ; movlw 0ffh ;將端口d設(shè)置為輸入 movwf trisd ;bsfpie1,0;開放tmr1中斷使能位 bcf status,5 ;恢復(fù)

23、文件寄存器的體0movlw34h;設(shè)置控制寄存器內(nèi)容:暫時不打開tmr1movwft1con;預(yù)分頻器設(shè)為“1:8“clrfportcgotohz;*音高分頻值對應(yīng)表*hzmovlwd'100' movwfdomovlwd'117'movwfremovlwd'132'movwfmimovlwd'139'movwffamovlwd'152'movwfsolmovlwd'163'movwflamovlwd'173'movwfsimovlwd'178'movwfHdomov

24、lwd'48'movwfLsolmovlwd'70'movwfLlamovlwd'91'movwfLsi;*音符延時對應(yīng)表*movlw85h;1p分頻初始值movwfp1hmovlw0eehmovwfp1lmovlw00bhmovwfp2hmovlw0dchmovwfp2lmovlw0c2hmovwfp05hmovlw0f7hmovwfp05lmovlw48hmovwfp15hmovlw0e5hmovwfp15lmovlw0e1hmovwfp025hmovlw7bhmovwfp025lmovlw0a4hmovwfp075hmovlw72hmovw

25、fp075l;*在ram中建立鍵位碼表* movlw 77h ;1 movwf 40h ; movlw 7bh ;2 movwf 41h ; movlw 7dh ;3 movwf 42h ; movlw 7eh ;4 movwf 43h ; movlw 0b7h ;5 movwf 44h ; movlw 0bbh ;6 movwf 45h ; movlw 0bdh ;7 movwf 46h ; movlw 0beh ;8 movwf 47h ; movlw 0d7h ;9 movwf 48h ; movlw 0dbh ;0 movwf 49h ; movlw 0ddh ;a movwf 4ah

26、 ; movlw 0deh ;b movwf 4bh ; movlw 0e7h ;c movwf 4ch ; movlw 0ebh ;d movwf 4dh ; movlw 0edh ;e movwf 4eh ; movlw 0eeh ;f movwf 4fh ;checkbcfflag2,0 call kbscan ;調(diào)用鍵盤掃描子程序comfvalue,0;位置碼取反送wbtfscstatus,2;測試有鍵按否?有!跳過下條指令gotocheck;無!則循環(huán)檢測movlw.13;預(yù)置外循環(huán)變量movwfdelM;以便產(chǎn)生10ms延時calldelay;調(diào)用延時子程序消除抖動call kbs

27、can;再次調(diào)用鍵盤掃描子程序btfscstatus,2;測試有鍵按否?有!跳過下條指令gotocheck;無!則循環(huán)檢測gototrans;調(diào)用鍵值翻譯子程序gotocheck;*鍵盤掃描和按鍵識別子程序*kbscan bsf status,5 ;設(shè)置文件寄存器的體1 bcf status,6 ; bcfoption_reg,rbpu movlw0fh;rb的低四位列信號為輸入movwftrisbmovlw0fh;rd的高四位行信號為輸出movwftrisdbcfstatus,rp0movlw00h;4條行線全部輸出0movwfportdnopmovfportb,0andlw0fhmovwf

28、value;得到的列碼暫存到VALUE寄存器中xorlw0fhbtfscstatus,z;列碼不是全部為1則有鍵按下gotonokeybsfstatus,rp0movlw0f0hmovwftrisb;改變低四位為輸出movlw0f0hmovwftrisd;改變高四位為輸入bcfstatus,rp0movlw00hmovwfportbnopmovfportd,0andlw0f0hiorwfvalue,1;將行碼和列碼首尾相連送入valuereturnnokeymovlw0ffhmovwfvaluereturn;*鍵值翻譯子程序*transmovlw40hmovwffsrloopt1movf0,0

29、xorwfvalue,0;與位置碼比較btfscstatus,z;不相等則跳一步gotoloopt2incffsr,1;地址指針FSR遞增btfssfsr,4;夠16次則跳一步gotoloopt1gotocheckreturnloopt2bcffsr,6;等效于fsr-40hmovffsr,0;將fsr存進w寄存器xorlw00h;比較fsr與預(yù)存鍵值,是否相等btfscstatus,2;gotokey1;是,進入按鍵1子程序movffsr,0;否,恢復(fù)w到fsr值,繼續(xù)向下查詢xorlw01hbtfscstatus,2gotokey2movffsr,0xorlw02hbtfscstatus,

30、2gotokey3movffsr,0xorlw03hbtfscstatus,2gotokey4movffsr,0xorlw04hbtfscstatus,2gotokey5movffsr,0xorlw05hbtfscstatus,2gotokey6movffsr,0xorlw06hbtfscstatus,2gotokey7movffsr,0xorlw07hbtfscstatus,2gotokey8movffsr,0xorlw08hbtfscstatus,2gotokey9movffsr,0xorlw09hbtfscstatus,2gotokey0movffsr,0xorlw00ahbtfscst

31、atus,2gotokeyamovffsr,0xorlw00bhbtfscstatus,2gotokeybmovffsr,0xorlw00chbtfscstatus,2gotokeycmovffsr,0xorlw00dhbtfscstatus,2gotokeydmovffsr,0xorlw00ehbtfscstatus,2gotokeyemovffsr,0xorlw00fhbtfscstatus,2gotokeyfkey1movlw 01hmovwfportc_pmovlwd'100'gototonekey2movlw 02hmovwfportc_pmovlwd'117

32、'gototonekey3movlw 04hmovwfportc_pmovlwd'132'gototonekey4movlw 08hmovwfportc_pmovlwd'139'gototonekey5movlw 10hmovwfportc_pmovlwd'152'gototonekey6movlw 20hmovwfportc_pmovlwd'163'gototonekey7movlw 40hmovwfportc_pmovlwd'173'gototonekey8movlw 80hmovwfportc_pmo

33、vlwd'178'gototonekey9movlw 03hmovwfportc_pmovlwd'48'gototonekey0movlw 06hmovwfportc_pmovlwd'70'gototonekeyamovlw 0chmovwfportc_pmovlwd'91'gototonekeybmovlw 18hmovwfportc_pcallsong_bgotomusic1keycmovlw 30hmovwfportc_pcallsong_c gotomusic2keydmovlw 60hmovwfportc_pbsffla

34、g2,0movlw70hmovwffsrcallreplaykeyemovlw 90hmovwfportc_pbcfflag1,0gotocheckkeyfcallsavemovlw 7fhmovwfportc_pmovlw 0movwfcount2bsfflag1,0callkeepgotocheck;*單鍵發(fā)音子程序*tone movwf w_temp ;備份當前w值bsfstatus,5 bcf status,6 ;設(shè)置文件寄存器的體1movlw0;將端口c的方向控制碼00h先送wmovwf trisc;將rc設(shè)為輸出 movlw 0 ;將端口e的方向控制碼00h先送w movwf tr

35、ise ;在轉(zhuǎn)到方向寄存器,re設(shè)為輸出 movlw 02h ;設(shè)置選項寄存器 movwf option_reg ;分頻器給TMR0;分頻值0設(shè)為1:8 bcf status,5 ;恢復(fù)到文件寄存器的體0 clrf porte ;re端口清零tlop bcf intcon,2 ;清除tmr0溢出中斷標志位 movf w_temp,0 ;給tmr0裝入初始值,并啟動定時器 movwftmr0;there btfss intcon,2 ;定時器溢出否 goto there ;否!循環(huán)檢測 movlw b'00000100' ;只將bit2置位 xorwf porte,0 ;只將re

36、2腳電平反轉(zhuǎn),其余不變movwfporte;movfportc_p,0;燈值送顯movwfportc;callkbscan;檢測按鍵是否按起comfvalue,0;將value取反存入wbtfssstatus,2;測試按鍵全部釋放否?是,跳過下條指令goto tlop ;否!循環(huán)檢測clrfportcbtfssflag1,0goto check;掃描鍵盤return;*液晶初始化*lcdinitbcfstatus,rp1;選定文件寄存體1bsfstatus,rp0clrftrisdclrftrisemovlw07h;設(shè)置選項寄存器地址,將分頻比movwfoption_reg;設(shè)為1:256mo

37、vlw06h;設(shè)置為數(shù)字控制 movwfadcon1bcfstatus,rp0;恢復(fù)到文件寄存體0clrfportdclrfportemovlw30h;等待calllcdsendmovlw30h;等待calllcdsendmovlw30h;等待calllcdsendmovlw38h;功能設(shè)置:calllcdsendmovlw08hcalllcdsend;關(guān)顯示movlw01hcalllcdsend;清屏movlw06hcalllcdsend;設(shè)定輸入方式為增量方式顯示,不移位movlw0fh;液晶顯示calllcdsend;*顯示調(diào)用子程序*lcdsendmovwfportdbsfporte,

38、1bcfporte,1calldelayreturn;*曲目b*song_bcalllcdinitmovlw53h;sbsfporte,0calllcdsendmovlw4fh;ocalllcdsendmovlw4eh;ncalllcdsendmovlw47h;gcalllcdsendmovlw20h;空格calllcdsendmovlw42h;bcalllcdsendreturn;*曲目c*song_ccalllcdinitmovlw53h;sbsfporte,0calllcdsendmovlw4fh;ocalllcdsendmovlw4eh;ncalllcdsendmovlw47h;gca

39、lllcdsendmovlw20h;空格calllcdsendmovlw43h;ccalllcdsendreturn;*saving顯示*savecalllcdinitmovlw73h;sbsfporte,0calllcdsendmovlw61h;acalllcdsendmovlw76h;vcalllcdsendmovlw65h;ecalllcdsendmovlw69h;icalllcdsendmovlw6eh;ncalllcdsendmovlw67h;gcalllcdsendreturn;*自動播放子程序*autoplaymovfportc_p,0;燈值送顯movwfportc;gotocheck;檢查復(fù)選鍵;*歌譜存儲子程序*keepcallcheckmovlw70hmovwffsrmovfw_temp,0movwfindfincfcount2,1callcheckmovlw71hmovwff

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論