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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

.PAGE.20XX小學期單片機設計實驗報告題目:基于單片機的電子音樂發(fā)生器班級:班內序號:實驗組號:學生姓名:指導教師:基于單片機的電子音樂發(fā)生器實驗摘要此次本組制作的基于PIC單片機的電子音樂發(fā)生器是具有LCD顯示屏提示的音樂簡單演奏、播放、存儲等功能的演示作品,擁有以下4種功能:1.按鍵演奏:即"電子琴"功能,可以用鍵盤上的"1”2.點歌功能:即按動"B""C"鍵分別演奏兩首樂曲〔可以表現準確的音高和音長。3.存儲音樂功能:即按右下角"F存儲"鍵,然后按鍵演奏并存儲,隨后按"E"鍵結束,之后按"D鍵"就可以播放存儲的樂曲了;4.液晶顯示功能:即在開始時顯示"hello!",在點播時分別顯示"songb"、"songc",在存儲時顯示"saving"。電子音樂發(fā)生器采用以Microchip公司的PIC16F877芯片為核心的簡單控制系統(tǒng),外部電路連接有喇叭、鍵盤、LCD液晶顯示屏以及其他必要系統(tǒng)調節(jié)元件。軟件設計中涉及PORTB\PORTC\PORTD\PORTE用作普通數字I/O腳功能。本實驗用單片機PORTB\D接收來自鍵盤輸入的指令信息,由此確定LCD液晶屏幕顯示以及喇叭播放內容,再通過PORTC\D\E輸出聲音或字幕信息。關鍵字單片機——microcontroller芯片——CMOSchip音樂發(fā)生器——musicgenerator分頻——fractionalfrequency一、實驗論證與比較本設計的核心器件是單片機芯片和音頻功放芯片。單片機采用以Microchip公司的PIC16F87X系列中的PIC16F877芯片為核心構建簡單控制系統(tǒng),它完全可以滿足本設計功能的需要。此音樂發(fā)生器設計利用單片機的輸入輸出功能,當按下播放功能鍵時,單片機的輸出功能使外部電路連接的喇叭和LCD液晶顯示屏同時播放聲音及顯示文字,從而實現各種復雜音樂播放器的功能。在嵌入式系統(tǒng)設計中,揚聲器等是常用的輸出設備,它具有使用方便、價格便宜、電路接口簡單等優(yōu)點,因此,在嵌入式系統(tǒng)中被廣泛使用。同時隨著單片機的發(fā)展,其功能越來越強大,技術也越來越成熟,由此生產的音樂播放器越來越受到人們的喜愛。因此,在技術性操作、社會因素和經濟方面都具有良好的可行性。我在實驗中負責了全部軟件設計,代碼的編寫,電路圖的設計,以及部分硬件焊接。其中,困難的部分在于,理論上認為電子音樂發(fā)生器模擬真正樂器的仿真實現方法,與現實電路實現起來有著一定的差別,在長音、樂譜存儲播放上,以及存儲功能的代碼編寫都有一定的難度。二、系統(tǒng)總體設計1、系統(tǒng)模塊總體框圖2、系統(tǒng)整體流程圖3、發(fā)音原理播放一段音樂需要的是兩個元素,一個是音調,另一個是音符。首先要了解對應的音調,音調主要由聲音的頻率決定,同時也與聲音強度有關。對一定強度的純音,音調隨頻率的升降而升降;對一定頻率的純音、低頻純音的音調隨聲強增加而下降,高頻純音的音調卻隨強度增加而上升。另外,音符的頻率有所不同?;谏厦娴膬热?這樣就對發(fā)音的原理有了一些初步的了解。將相應音高的分頻值存儲在寄存器里,并將其與對應的按鍵進行關聯,通過鍵盤掃描子程序將對應的分頻值送入單音播放子程序即可產生相應頻率的電壓方波,再將其輸出到喇叭即可產生對應的音高實現電子琴功能。將音符按音高和音長直接存儲在數據存儲器里并與按鍵相關聯,調用自動演奏子程序產生相應頻率和時長的方波電壓輸出到喇叭即可。三、硬件連接1、鍵盤和單片機的連接選擇用4*4行列式鍵盤完成輸入。4*4行列式鍵盤又稱為矩陣鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數是4×4個。這種行列式鍵盤結構能夠有效地提高單片機系統(tǒng)中I/O口的利用率。引腳號所連接的單片機的管腳引腳號所連接的單片機的管腳1RD45RB02RD56RB13RD67RB24RD78RB32、LCD和單片機的連接采用型號為RT1602C的液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字、圖形,顯示多樣,清晰可見,與傳統(tǒng)的陰極射線管相比,液晶顯示屏具有占用空間小、低功耗、低輻射、無閃爍、降低視覺疲勞等優(yōu)點。字符型液晶屏是一種用5*7點陣圖形來顯示字符的液晶顯示器,根據顯示的容量可以分為1行16個字、2行16個字、2行20個字等,最常用的為2行16個字。型號為RT1602C的液晶顯示屏就是2行16個字。它有16個管腳,分別有電源地、電源正、偏壓信號、讀寫控制、使能控制、I/O接口、背光控制等功能。它的讀寫操作、屏幕和光標的操作都是通過指令編程來實現的。腳號符號管腳功能及接發(fā)腳號符號管腳功能及接發(fā)1VSS電源地9DB2數據I/ORD22VDD電源正10DB3數據I/ORD33VO對比調整電壓11DB4數據I/ORD44RS數據/命令控制RE012DB5數據I/ORD55R/W讀/寫控制13DB6數據I/ORD66E使能信號RE114DB7數據I/ORD77DBO數據I/ORD015BLA背光源正8DBI數據I/ORD116BLK背光源負3、揚聲器和單片機的連接揚聲器的連接方法較前面的容易很多。起初是將喇叭的正極直接連接在RE0上,負極接地,但我們發(fā)現這樣發(fā)出的聲音很小,音色也不好,于是在喇叭和單片機之間增加了一E個功率放大模塊,這樣聲音就放大、穩(wěn)定了很多。四、調試過程1、軟件程序部分我們首先在大體上對音樂播放器的功能按幾個部分進行了劃分,其中包括鍵盤掃描、單鍵演奏、鍵盤點播樂曲、音樂輸入存儲及播放、液晶顯示等幾個部分。1、音樂的存儲和演奏:起初我們設想把音樂的聲調高低這些信息用不同的電壓代表。通過A\D轉換存儲到內存單元里,而這不同的電壓正可以通過不同的按鍵實現,后來在具體編程時發(fā)現有困難,于是在網上查到相應音高的分頻值存儲在寄存器里,并將其與對應的按鍵進行關聯,通過鍵盤掃描子程序將對應的分頻值送入單音播放子程序即可產生相應頻率的電壓方波,再將其輸出到喇叭即可產生對應的音高實現電子琴功能。將音符按音高和音長直接存儲在數據存儲器里并與按鍵相關聯,調用自動演奏子程序產生相應頻率和時長的方波電壓輸出到喇叭即可。2、液晶顯示:應用了查表功能按四位16進制顯示在液晶屏上。3、鍵盤掃描:鍵盤掃描子程序是根據實驗板的布線,先讓行輸出高電平,列為低電平,如有鍵按下則此鍵所在行也變成低電平,由此取得行碼;同理取得列碼,將兩個碼首尾相接取得鍵位碼,并且事先將據此設計好的鍵位碼存在寄存器里,通過地址指針不斷將取得的鍵位碼與預置的鍵位碼比較從而確定出哪個鍵被按下了。4、音樂存儲及播放部分:用F鍵將標志位置1后進入存儲狀態(tài),將按下的鍵逐一存到一串連續(xù)的地址中去,可是fsr指針只有一個,鍵盤掃描時用到了,所以在存儲時只好在每次存儲前重新對fsr賦值。自動播放子程序因為知道了音長是按幾分音符來控制的,而且都是倍數關系,于是我又加了一個計數器用來控制音長?!?存儲功能流程圖〔2單音獨奏功能流程圖〔3重放功能流程圖2、硬件部分硬件部分的完成分為:電路圖的設計、實驗板的焊接、實際電路的整體連接三部分。在實驗開始前的開題報告中,我組還準備加入藍牙模塊,可以通過手機控制音樂的播放。因為知道PIC16F877單片機有USART端口〔RC6,RC7,可以進行串行通信,只需借助有USART端口的藍牙模塊,就可以通過藍牙模塊來與藍牙設備進行通信,這樣就可以手機來控制單片機來產生調用相應的程序來產生一定頻率的聲音,并且PIC16F877的串行通信模塊,在接收緩沖寄存器滿時,在中斷使能的情況下可以產生中斷,這樣就可以跳入中斷子程序,從而就能夠實時控制單片機,來實時彈奏音樂。所以藍牙電子琴是可行的。在前面的過程基本完成并測試穩(wěn)定后,我們開始了對藍牙模塊的研究,研究過程并不順利,首先在器材上我們的購買的藍牙芯片只有連接凹槽,沒有連接管腳,這一時讓我們犯了難。后來通過向老師求助,拿到了一個可以引出插孔的小電路板,但是焊接有一些困難。原本老師想要幫助我們,我們最后還是決定自己完成,通過多次練習和謹慎的焊接之后,我們終于成功的自己焊接上了。后面面臨的困難卻沒有這么容易克服了,不但編程燒入后LED燈的點亮情況一直不正確,也不能用手機搜索到該藍牙設備,在反復調試失敗和驗收時間迫近的情況下,我們不得不選擇放棄使用藍牙模塊。這是我們這次實驗的一個遺憾。五、參考文獻PIC單片機實用教程——基礎篇〔五號宋體李學海北京航空航天大學出版社使用說明:的確是一本不可或缺的教材,本書列舉了很多實用的具有實戰(zhàn)意義的例子,單片機入門就是通過把這本書里的好例子一字一行敲進電腦去來實現的。PIC單片機實用教程——提高篇李學海北京航空航天大學出版社使用說明:繼承了前面基礎篇的風格,例子也具有實戰(zhàn)意義,主要講RA、TMR2的使用和CCP模塊的PWM脈寬調制功能。六、實驗心得體會小學期的第一周基本上是泡在實驗室,一日三餐基本上是在實驗室解決的。在這一周里,一直在看書,也就是在這一周里看了快兩本有關PIC單片機相關的資料書。感覺相當的充實,同時也學到了很多東西,幾乎是從零開始,一點點地學習匯編語言,一點點地學學PIC16F877的知識,到現在每一個管腳都還在腦海中。硬件也是自己動手,從電路的設計到電路的焊接。現在來看這個小學期學到了許多東西。剛開始是感覺挺難的,通過耐心的學習,我從不甚了解到編出自己的程序,到調試成功,真的是學到了很多。開始時心里一點底也沒有,直到鍵盤掃描和單鍵演奏程序編出來后才逐漸有了信心,當我們按下鍵盤喇叭第一次發(fā)出音階時,我真是激動極了,那種成就感真的是難以言表。雖然實驗過程中遇到很多困難比如自動播放子程序開始編的程序在演奏時只表現音高而沒有表現音長,所以放出來的樂曲效果很差,還有存儲代碼想了好久,但是我都通過自己思考以及查閱資料或詢問老師將問題解決了,我不僅了解到了自學的樂趣和重要性,同時也鍛煉了實驗中的動手能力,了解了匯編語言,更重要的是這次合作式的小學期也讓我體會出團隊的團結、相互的默契和彼此的信任在團隊〔盡管這個團隊也許只有兩三個人的協(xié)作中是多么重要,同時也為我們步入社會、參加工作提供了一次很好的"演練"機會。雖然已經完成了本次小學期的任務,但最后的結果相較于最初的預期還是有一定的差距,這是自身能力尚且不足的體現。其實在學校要學的不僅是書本上的東西,更重要的是自學的能力、獨立思考的能力和動手的能力。要想在競爭異常激烈的現代社會立足,就必須有實力。在學校的時間是最好的學習機會,一定要珍惜好這有限的時間,多學知識,盡量充實自己,為以后進入社會多做準備。附代碼:;****************************變量定義區(qū)***********************************indf equ 00htmr0equ01h pcl equ 02h status equ 03h cequ0z equ 2 rp0 equ 5 rp1 equ 6 fsr equ 04h fsr2 equ 05hportb equ 06h trisb equ 86h portc equ 07h trisc equ 87h portd equ 08h trisd equ 88h porteequ09htriseequ89hpclath equ 0ahintconequ0bht0ifequ2t0ieequ5pir1 equ 0ch ;定義第一中斷標志寄存器pie1 equ 8ch ;定義第一中斷使能寄存器tmr1l equ 0eh ;定義定時器1低位寄存器地址tmr1h equ 0fh ;定義定時器1高位寄存器地址t1con equ 10h ;定義tmr1控制寄存器rcsta equ 18h txsta equ 98htxreg equ 19hspbrg equ 99hrcreg equ 1ahgie equ 7peie equ 6rcif equ 5rcie equ 5txif equ 4option_reg equ 81h rbpu equ 7 delM equ 20h ;定義兩個延時變量寄存器delN equ 21h delK equ 0ffh ;定義一個內層循環(huán)延時常數value equ 22h ;暫存按鍵列碼和位置碼w_tempequ23h;定義備份w的地址count equ 24h ;定義循環(huán)次數寄存器地址portc_p equ 25h ;定義緩沖端口c的數據寄存器地址rdelayequ 26h ;定義音樂延時寄存器地址flag1 equ 27h ;定義復選標志寄存器的地址flag2 equ 28h ;定義二次復選寄存器的地址count2 equ 29hindf2 equ 2ahtmp1 equ 2fh ;定義臨時寄存器地址tmr1lb equ 30h tmr1hb equ 31hadcon1 equ 9fhdo equ 50h ;定義音符re equ 51hmi equ 52hfa equ 53hsol equ 54hla equ 55hsi equ 56hHdo equ 57hLsol equ 58hLla equ 59hLsi equ 5ahHre equ 5bhHmi equ 5chHfa equ 5dhp1l equ 60h ;定義拍節(jié)寄存器地址p1h equ 61h p2l equ 62hp2h equ 63hp3l equ 64hp3h equ 65hp4l equ 66hp4h equ 67hp05l equ 68hp05h equ 69hp15l equ 6ahp15h equ 6bhp025l equ 6chp025h equ 6dhp075l equ 6ehp075h equ 6fh;********************數據寄存器寫入welcome****************************reset org 0000h nop call lcdinit movlw 77h ;w bsf porte,0 call lcdsend movlw 65h ;e call lcdsend movlw 6ch ;l call lcdsend movlw 63h ;c call lcdsend movlw 6fh ;o call lcdsend movlw 6dh ;m call lcdsend movlw 65h ;e call lcdsend movlw b'10100000' call lcdsend movlw b'01110100' call lcdsend movlw b'01101111' call lcdsend movlw b'10100000' call lcdsend movlw b'01110101' ;use call lcdsend movlw b'01110011' call lcdsend movlw b'01100101' call lcdsend bcfporte,0 ;next row movlw b'11000000' call lcdsend movlw b'00000001' movwf porte movlwb’01000010’calllcdsendmovlw b'01000011' call lcdsend movlw b'00111010' call lcdsend movlw 53h ;s bsf porte,0 call lcdsend movlw 4fh ;o call lcdsend movlw 4eh ;n call lcdsend movlw 47h ;g call lcdsend movlwb’01000110’calllcdsendmovlw 73h ;s bsf porte,0 call lcdsend movlw 61h ;a call lcdsend movlw 76h ;v call lcdsend movlw 65h ;e call lcdsend ;*****************************主程序****************************main bsf status,5 ;設置文件寄存器的體1movlw 00h ;將端口c的方向控制碼00h先送wmovwf trisc ;再轉到方向寄存器,將其設為輸出 movlw 07h movwf adcon1 movlw 00h movwf trisemovlw 0ffh ;同理,將端口b設置為輸入movwf trisb ;movlw 0ffh ;將端口d設置為輸入movwf trisd ; bsf pie1,0 ;開放tmr1中斷使能位bcf status,5 ;恢復文件寄存器的體0 movlw 34h ;設置控制寄存器內容:暫時不打開tmr1 movwf t1con ;預分頻器設為"1:8" clrf portc goto hz;******************************音高分頻值對應表***************************hz movlw d'100' movwf do movlw d'117' movwf re movlw d'132' movwf mi movlw d'139' movwf fa movlw d'152' movwf sol movlw d'163' movwf la movlw d'173' movwf si movlw d'178' movwf Hdo movlw d'48' movwf Lsol movlw d'70' movwf Lla movlw d'91' movwf Lsi ;*****************************音符延時對應表**************************** movlw 85h ;1p分頻初始值 movwf p1h movlw 0eeh movwf p1l movlw 00bh movwf p2h movlw 0dch movwf p2l movlw 0c2h movwf p05h movlw 0f7h movwf p05l movlw 48h movwf p15h movlw 0e5h movwf p15l movlw 0e1h movwf p025h movlw 7bh movwf p025l movlw 0a4h movwf p075h movlw 72h movwf p075l;**************************在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 ; 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 ;check bcf flag2,0 callkbscan;調用鍵盤掃描子程序 comf value,0 ;位置碼取反送w btfsc status,2 ;測試有鍵按否?有!跳過下條指令 goto check ;無!則循環(huán)檢測 movlw .13 ;預置外循環(huán)變量 movwf delM ;以便產生10ms延時 call delay ;調用延時子程序消除抖動 call kbscan ;再次調用鍵盤掃描子程序 btfsc status,2 ;測試有鍵按否?有!跳過下條指令 goto check ;無!則循環(huán)檢測 goto trans ;調用鍵值翻譯子程序 goto check ;**************************鍵盤掃描和按鍵識別子程序*************************kbscan bsf status,5 ;設置文件寄存器的體1bcf status,6 ; bcf option_reg,rbpu movlw 0fh ;rb的低四位列信號為輸入 movwf trisb movlw 0fh ;rd的高四位行信號為輸出 movwf trisd bcf status,rp0 movlw 00h ;4條行線全部輸出0 movwf portd nop movf portb,0 andlw 0fh movwf value ;得到的列碼暫存到VALUE寄存器中 xorlw 0fh btfsc status,z ;列碼不是全部為1則有鍵按下 goto nokey bsf status,rp0 movlw 0f0h movwf trisb ;改變低四位為輸出 movlw 0f0h movwf trisd ;改變高四位為輸入 bcf status,rp0 movlw 00h movwf portb nop movf portd,0 andlw 0f0h iorwf value,1 ;將行碼和列碼首尾相連送入value return nokey movlw 0ffh movwf value return;******************************鍵值翻譯子程序********************************trans movlw 40h movwf fsr loopt1 movf 0,0 xorwf value,0 ;與位置碼比較 btfsc status,z ;不相等則跳一步 goto loopt2 incf fsr,1 ;地址指針FSR遞增 btfss fsr,4 ;夠16次則跳一步 goto loopt1 goto check return loopt2 bcf fsr,6 ;等效于fsr-40h movf fsr,0 ;將fsr存進w寄存器 xorlw 00h ;比較fsr與預存鍵值,是否相等 btfsc status,2 ; goto key1 ;是,進入按鍵1子程序 movf fsr,0 ;否,恢復w到fsr值,繼續(xù)向下查詢 xorlw 01h btfsc status,2 goto key2 movf fsr,0 xorlw 02h btfsc status,2 goto key3 movf fsr,0 xorlw 03h btfsc status,2 goto key4 movf fsr,0 xorlw 04h btfsc status,2 goto key5 movf fsr,0 xorlw 05h btfsc status,2 goto key6 movf fsr,0 xorlw 06h btfsc status,2 goto key7 movf fsr,0 xorlw 07h btfsc status,2 goto key8 movf fsr,0 xorlw 08h btfsc status,2 goto key9 movf fsr,0 xorlw 09h btfsc status,2 goto key0 movf fsr,0 xorlw 00ah btfsc status,2 goto keya movf fsr,0 xorlw 00bh btfsc status,2 goto keyb movf fsr,0 xorlw 00ch btfsc status,2 goto keyc movf fsr,0 xorlw 00dh btfsc status,2 goto keyd movf fsr,0 xorlw 00eh btfsc status,2 goto keye movf fsr,0 xorlw 00fh btfsc status,2 goto keyf key1 movlw 01h movwf portc_p movlw d'100' goto tone key2 movlw 02h movwf portc_p movlw d'117' goto tone key3 movlw 04h movwf portc_p movlw d'132' goto tone key4 movlw 08h movwf portc_p movlw d'139' goto tone key5 movlw 10h movwf portc_p movlw d'152' goto tone key6 movlw 20h movwf portc_p movlw d'163' goto tone key7 movlw 40h movwf portc_p movlw d'173' goto tone key8 movlw 80h movwf portc_p movlw d'178' goto tone key9 movlw 03h movwf portc_p movlw d'48' goto tone key0 movlw 06h movwf portc_p movlw d'70' goto tone keya movlw 0ch movwf portc_p movlw d'91' goto tone keyb movlw 18h movwf portc_p call song_b goto music1keyc movlw 30h movwf portc_p call song_cgoto music2 keyd movlw 60h movwf portc_p bsf flag2,0 movlw 70h movwf fsr call replaykeye movlw 90h movwf portc_p bcf flag1,0 goto check keyf call save movlw 7fh movwf portc_p movlw 0 movwf count2 bsf flag1,0 call keep goto check;***************************單鍵發(fā)音子程序*****************************tonemovwf w_temp ;備份當前w值 bsf status,5bcf status,6 ;設置文件寄存器的體1 movlw 0 ;將端口c的方向控制碼00h先送w movwftrisc ;將rc設為輸出movlw 0 ;將端口e的方向控制碼00h先送wmovwf trise ;在轉到方向寄存器,re設為輸出movlw 02h ;設置選項寄存器movwf option_reg ;分頻器給TMR0;分頻值0設為1:8bcf status,5 ;恢復到文件寄存器的體0clrf porte ;re端口清零tlopbcf intcon,2 ;清除tmr0溢出中斷標志位movf w_temp,0 ;給tmr0裝入初始值,并啟動定時器 movwf tmr0 ;therebtfss intcon,2 ;定時器溢出否goto there ;否!循環(huán)檢測movlw b'00000100' ;只將bit2置位xorwf porte,0 ;只將re2腳電平反轉,其余不變 movwf porte ; movf portc_p,0 ;燈值送顯 movwf portc ; call kbscan ;檢測按鍵是否按起 comf value,0 ;將value取反存入w btfss status,2 ;測試按鍵全部釋放否?是,跳過下條指令 goto tlop ;否!循環(huán)檢測 clrf portc btfss flag1,0 goto check ;掃描鍵盤 return;***************************液晶初始化*********************************lcdinit bcf status,rp1 ;選定文件寄存體1 bsf status,rp0 clrf trisd clrf trise movlw 07h ;設置選項寄存器地址,將分頻比 movwf option_reg ;設為1:256 movlw 06h ;設置為數字控制 movwf adcon1 bcf status,rp0 ;恢復到文件寄存體0 clrf portd clrf porte movlw 30h ;等待 call lcdsend movlw 30h ;等待 call lcdsend movlw 30h ;等待 call lcdsend movlw 38h ;功能設置: call lcdsend movlw 08h call lcdsend ;關顯示 movlw 01h call lcdsend ;清屏 movlw 06h call lcdsend ;設定輸入方式為增量方式顯示,不移位 movlw 0fh ;液晶顯示 call lcdsend ;**********************顯示調用子程序***********lcdsend movwf portd bsf porte,1 bcf porte,1 call delay return;*************************曲目b********************song_b call lcdinit movlw 53h ;s bsf porte,0 call lcdsend movlw 4fh ;o call lcdsend movlw 4eh ;n call lcdsend movlw 47h ;g call lcdsend movlw 20h ;空格 call lcdsend movlw 42h ;b call lcdsend return;*************************曲目c********************song_c call lcdinit movlw 53h ;s bsf porte,0 call lcdsend movlw 4fh ;o call lcdsend movlw 4eh ;n call lcdsend movlw 47h ;g call lcdsend movlw 20h ;空格 call lcdsend movlw 43h ;c call lcdsend return;*************************saving顯示********************save call lcdinit movlw 73h ;s bsf porte,0 call lcdsend movlw 61h ;a call lcdsend movlw 76h ;v call lcdsend movlw 65h ;e call lcdsend movlw 69h ;i call lcdsend movlw 6eh ;n call lcdsend movlw 67h ;g call lcdsend return ;***************************自動播放子程序********************************autoplay movf portc_p,0 ;燈值送顯 movwf portc ; goto check ;檢查復選鍵;***************************歌譜存儲子程序********************************keep call check movlw 70h movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 71h movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 72h movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 73h movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 74h movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 75h movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 76 movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 77 movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 78 movwf fsr movf w_temp,0 movwf indf incf count2,1 call check movlw 79 movwf fsr movf w_temp,0 movwf indf incf count2,1 goto check ;**************************存儲歌譜重放子程序********************************replay movlw 70h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 71h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 72h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 73h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 74h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 75h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 76h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 77h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 78h movwf fsr movf indf,0 movwf w_temp call play decf count2,1 movf count2,0 btfsc status,2 goto check movlw 79h movwf fsr movf indf,0 movwf w_temp call play goto check ;********************************自動演奏子程序********************************playbsf status,5 ;設置文件寄存器的體1 movlw 0 ;將端口c的方向控制碼00h先送w movwftrisc ;將rc設為輸出movlw 0 ;將端口e的方向控制碼00h先送wmovwf trise ;在轉到方向寄存器,re設為輸出 movlw 02h ;設置選項寄存器movwf option_reg ;分頻器給TMR0;分頻值0設為1:8bcf status,5 ;恢復到文件寄存器的體0 clrf porte ;re端口清零 bcf pir1,0 ;清除tmr1中斷標志位 clrf portc movf w_temp,0 movwf portc movf tmr1hb,0 ;設置溢出初始值 movwf tmr1h movf tmr1lb,0 movwf tmr1l bsf t1con,0 ;tmr1開啟 loop bcf intcon,2 ;清除tmr0溢出中斷標志位movf w_temp,0 ;給tmr0裝入初始值,并啟動定時器 movwf tmr0 ;herebtfss intcon,2 ;定時器溢出否goto here ;否!循環(huán)檢測movlw b'00000100' ;只將bit0置位xorwf porte,1 ;只將re0腳電平反轉,其余不變recover btfss pir1,0 ;tmr1溢出嗎?是,跳一步 goto loop ;否!循環(huán)檢測 clrf portc return ;是!返回;****************************延時子程序***************************delaylp0 movlw delK movwf delNlp1 decfsz delN,1 goto lp1 decfsz delM,1 goto lp0 return;***************************備選曲目*******************************music1 ;songbbsf status,5 movlw 07h movwf adcon1 movlw 00h movwf trisd movwf trise bcf status,5 movlw .1 ;預置外循環(huán)變量 movwf delM ;以便產生10ms延時 call delay bcf porte,0 movlw 01h ;清屏 movwf portd call song_bpot1 call song1 movlw 0c0h movwf portd goto m1song1 clrf countm1 movf Hdo,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf Hdo,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf Hdo,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf re,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf re,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf Hdo,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf Hdo,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf Hdo,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf re,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf la,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p1l,0 movwf tmr1lb movf p1h,0 movwf tmr1hb call play movf mi,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf sol,0 movwf w_temp movf p05l,0 movwf tmr1lb movf p05h,0 movwf tmr1hb call play movf la,0 movwf w_tem

溫馨提示

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

評論

0/150

提交評論