單片機(jī)音樂(lè)播放實(shí)驗(yàn)報(bào)告.doc
《單片機(jī)音樂(lè)播放實(shí)驗(yàn)報(bào)告.doc》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《單片機(jī)音樂(lè)播放實(shí)驗(yàn)報(bào)告.doc(11頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
課 程 設(shè) 計(jì) 課程名稱(chēng) 微機(jī)原理與單片機(jī)技術(shù)實(shí)踐 題目名稱(chēng) 單片機(jī)制作與音樂(lè)播放 學(xué)生學(xué)院 自動(dòng)化學(xué)院 專(zhuān)業(yè)班級(jí) 電子(2) 學(xué) 號(hào) 學(xué)生姓名 指導(dǎo)教師 張學(xué)習(xí) 2013 年 5 月 24 日 單片機(jī)制作與音樂(lè)播放 一、課程設(shè)計(jì)的內(nèi)容 1.用面包板焊一塊PIC單片機(jī)最小系統(tǒng),包括晶振,復(fù)位電路,按鈕,LED燈。 2.自主添加新模塊。 3.寫(xiě)程序驅(qū)動(dòng)單片機(jī)工作。 二、課程設(shè)計(jì)的要求與數(shù)據(jù) 1.焊板所需原理圖: LED燈 蜂鳴器 復(fù)位 晶振 AD轉(zhuǎn)換 按鈕 2.音樂(lè)播放所需資料。 摘要:16F877A單片機(jī)原理和控制理論來(lái)設(shè)計(jì)音樂(lè)盒的硬件電路,并利用16單片機(jī)語(yǔ)言進(jìn)行程序設(shè)計(jì)。通過(guò)控制單片機(jī)內(nèi)部的定時(shí)器來(lái)產(chǎn)生不同頻率的方波,驅(qū)動(dòng)喇叭發(fā)出不同音調(diào)的音樂(lè),再利用延遲來(lái)控制發(fā)音時(shí)間的長(zhǎng)短。該程序通過(guò)把樂(lè)譜轉(zhuǎn)化成相應(yīng)的定時(shí)常數(shù)來(lái)驅(qū)動(dòng)發(fā)音設(shè)備演奏出悅耳動(dòng)聽(tīng)的音樂(lè)。這種控制電路結(jié)構(gòu)簡(jiǎn)單,可靠性高,應(yīng)用性強(qiáng);軟件程序適應(yīng)范圍廣,對(duì)于不同的音樂(lè)只需要改變相應(yīng)的定時(shí)常數(shù)即可。 音樂(lè)產(chǎn)生的方法: 一首音樂(lè)是許多不同的音階組成的,而每個(gè)音階對(duì)應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂(lè)了,當(dāng)然對(duì)于單片機(jī)來(lái)產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來(lái)產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對(duì)應(yīng)頻率關(guān)系弄正確即可。現(xiàn)在以單片機(jī)12MHZ晶振為例,例出高中低音符與單片機(jī)計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如下表4.1所示: 表4.1 高中低音符與單片機(jī)計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值 音符 對(duì)應(yīng)的PR2值 音符 對(duì)應(yīng)的PR2值 M_1 119 M_2 105 M_3 94 M_5 79 M_6 70 H_1 59 L_5 158 L_6 141 如表4.2所示:音樂(lè)的音拍,一個(gè)節(jié)拍為單位(C調(diào)) 表4.2 音樂(lè)的音拍 曲調(diào)值 DELAY 曲調(diào)值 DELAY 調(diào)4/4 125ms 調(diào)4/4 62ms 調(diào)3/4 187ms 調(diào)3/4 94ms 調(diào)2/4 250ms 調(diào)2/4 125ms 對(duì)于不同的曲調(diào)我們也可以用單片機(jī)的另外一個(gè)定時(shí)/計(jì)數(shù)器來(lái)完成。發(fā)音部分代碼在程序中實(shí)現(xiàn),靠單片機(jī)的一個(gè)管腳輸出,考慮到聲音可能不夠大所以我們加入了功放電路,利用LM386來(lái)對(duì)聲音信號(hào)進(jìn)行放大。音頻輸出信號(hào)由ADU OUT引出,信號(hào)可經(jīng)功放電路LM386輸出到揚(yáng)聲器或耳機(jī)。 三、課程設(shè)計(jì)應(yīng)完成的工作 1.音樂(lè)播放源程序。 #include p16f877a.inc #DEFINE youyi 0X2100 ;樂(lè)譜編號(hào) #define L_5 .158 #define L_6 .141 #define M_1 .119 #define M_2 .105 #define M_3 .94 #define M_5 .79 #define M_6 .70 #define H_1 .59 #define M_0 .0 ; tone[8]={158,141,119,105,94,79,70,59};聲調(diào)的高低,實(shí)際上是PWM的周期值 ;計(jì)算方法是CCP的時(shí)鐘1MHz除以預(yù)分頻比16,再除以要產(chǎn)生的頻率,最后再減去1。 PORTD_D EQU 20H ;顯示緩沖器COUNT COUNT1 EQU 21H COUNT2 EQU 22H COUNT3 EQU 23H COUNT4 EQU 24H SAVEW EQU 25H ;W保護(hù)寄存器 SAVES EQU 26H ;STATUS保護(hù)寄存器 COUNT5 EQU 27H ;節(jié)拍數(shù) H EQU 28H ;地址寄存器 HANG EQU 29H ;行寄存器 LIE EQU 30H ;列寄存器 TMP1 EQU 31H ;TMP1緩存寄存器 Byte EQU 32H ;緩存 Count6 EQU 33H ;節(jié)拍數(shù) Count7 EQU 34H ;節(jié)拍數(shù) DD_RAM_ADDR EQU 35H ; 第一行顯示地址寄存器 DD_RAM_UL EQU 36H ; 第二行顯示地址寄存器 COUNT EQU 37H Count EQU 38H ;計(jì)數(shù)寄存器 Count2 EQU 39H ;* 定義 LCD數(shù)據(jù)& 控制I/O口 #define LCD_DB7 PORTB,3 ;占用的I/O口定義 #define LCD_DB6 PORTB,2 ;LCD的DB6與RB2連接,其它類(lèi)推 #define LCD_DB5 PORTB,1 ; #define LCD_DB4 PORTB,0 ; #define LCD_EN PORTC,0 #define LCD_RS PORTC,1 #define LCD_DB7_DIR TRISB,3 ;對(duì)應(yīng)的方向寄存器定義 #define LCD_DB6_DIR TRISB,2 ; #define LCD_DB5_DIR TRISB,1 ; #define LCD_DB4_DIR TRISB,0 ; #define LCD_EN_DIR TRISC,0 ; #define LCD_RS_DIR TRISC,1 ; ;* LCD 模塊命令 #define DISP_ON 0x00C ; 開(kāi)顯示 #define DISP_ON_C 0x00E ; 開(kāi)顯示, 開(kāi)指針 #define DISP_ON_B 0x00F ; 開(kāi)顯示, 開(kāi)指針,開(kāi)閃爍 #define DISP_OFF 0x008 ; 關(guān)顯示 #define CLR_DISP 0x001 ; 清顯示的操作數(shù) #define ENTRY_INC 0x006 ; 操作數(shù) #define ENTRY_INC_S 0x007 ; 操作數(shù) #define ENTRY_DEC 0x004 ; 操作數(shù) #define ENTRY_DEC_S 0x005 ; 操作數(shù) ORG youyi ;友誼天長(zhǎng)地久 DE L_5,L_5,M_1,M_1,M_1,M_1,M_1,M_1,M_1,M_3,M_3,M_2,M_2,M_2,M_2 DE M_1,M_2,M_2,M_3,M_3,M_1,M_1,M_1,M_1,M_1,M_3,M_3,M_5,M_5,M_6 DE M_6,M_6,M_6,M_6,M_6,M_6,M_6,M_6,M_6,M_5,M_5,M_5,M_5,M_3,M_3 DE M_3,M_1,M_1,M_2,M_2,M_2,M_2,M_1,M_2,M_2,M_3,M_3,M_1,M_1,M_1 DE M_1,L_6,L_6,L_6,L_5,L_5,M_1,M_1,M_1,M_1,M_1,M_1,M_1,M_1,M_6 DE M_6,M_5,M_5,M_5,M_5,M_3,M_3,M_3,M_1,M_1,M_2,M_2,M_2,M_2,M_1 DE M_2,M_2,M_6,M_6,M_5,M_5,M_5,M_5,M_3,M_3,M_3,M_5,M_5,M_6,M_6 DE M_6,M_6,M_6,M_6,M_6,M_6,H_1,H_1,M_5,M_5,M_5,M_5,M_3,M_3,M_3 DE M_1,M_1,M_2,M_2,M_2,M_2,M_1,M_2,M_2,M_3,M_3,M_1,M_1,M_1,M_1 DE L_6,L_6,L_6,L_5,L_5,M_1,M_1,M_1,M_1,M_1,M_1,M_0,M_0,M_0,M_0 ORG 0x000 NOP ;空指令 GOTO MAIN ORG 0x004 ;中斷入口 BANKSEL SAVEW MOVWF SAVEW SWAPF STATUS,W CLRF STATUS MOVWF SAVES ;中斷保護(hù) GOTO CCPINT ;*TABLE TABLE1 ;取第一行的顯示碼TMR2 COUNT ADDWF PCL,1 ;地址偏移量加當(dāng)前PC值 RETLW I ;T RETLW n ;M RETLW n ;R RETLW o ;2 RETLW v ;空格 RETLW a ;空格 RETLW t ;C RETLW o ;O RETLW r ;U RETLW ;N RETLW ;T RETLW V ;N RETLW 1 ;T RETLW . ;N RETLW 5 ;T RETLW 00H ;* TABLE1 TABLE ;取第二行顯示TIME: ms ADDWF PCL,1 ;地址偏移量加當(dāng)前PC值 RETLW H ;T RETLW e ;I RETLW l ;M RETLW l ;E RETLW o ;: RETLW ;空格 RETLW P ;空格 RETLW I ;空格 RETLW C ;空格 RETLW ! ;空格 RETLW 00H ;* TABLE2 TABLE2 ADDWF PCL,1 RETLW 30H ;"0" RETLW 31H ;"1" RETLW 32H ;"2" RETLW 33H ;"3" RETLW 34H ;"4" RETLW 35H ;"5" RETLW 36H ;"6" RETLW 37H ;"7" RETLW 38H ;"8" RETLW 39H ;"9" ;*主程序開(kāi)始 MAIN CALL LCD_DISPAY BANKSEL TRISD ;選擇體1 CLRF TRISD ;PORTD為輸出端口 MOVLW 07H ; MOVWF OPTION_REG ;1:256 BANKSEL T1CON CLRF COUNT5 MOVLW 30H ;分頻器為1:8,關(guān)閉TMR1 MOVWF T1CON ; BCF PIR1,TMR1IF ;溢出標(biāo)志位清零 CLRF TMR1H CLRF TMR1L MOVLW 0xEE ;設(shè)定TMR1低位初值 ADDWF TMR1L ; MOVLW 0x85 ;設(shè)定TMR1高位初值 ADDWF TMR1H ; BSF T1CON,0 ;啟動(dòng)TMR1 BANKSEL TRISC ;跳到體1 BCF TRISC,2 ;CCP1為輸出狀態(tài) BANKSEL EEADR ;跳到體2 MOVLW youyi ;將地址存到W寄存器 MOVWF EEADR ;將地址送入EEPROM地址寄存器 BANKSEL EECON1 ;選定BANK3 BCF EECON1,EEPGD ;選擇EEPROM作為非易失性存儲(chǔ)器操作對(duì)象 BSF EECON1,RD ;啟動(dòng)一次讀EEPROM的操作 BANKSEL EEDATA ;跳到體2 MOVF EEDATA,W ;由于EEPROM的讀出操作花費(fèi)的時(shí)間很短,此時(shí)EEPROM BANKSEL PR2 ;跳到體1 MOVWF PR2 ;將W的值存到PR2 BANKSEL T2CON ;跳到體0 MOVLW 0x07 ;預(yù)分頻1:16,后預(yù)分頻1:1 MOVWF T2CON ;開(kāi)定時(shí)器2 MOVLW 0x0C ;將0x0C存到W寄存器 MOVWF CCP1CON ;使用8位PWM方式 BANKSEL PR2 ;跳到體1 MOVF PR2,0 ;將PR2值存到W寄存器 BANKSEL CCPR1L ;跳到體0 MOVWF CCPR1L ;將W存到CCPR1L MOVLW B11111100 ;屏蔽低兩位 ANDWF CCPR1L,1 RRF CCPR1L,1 ;CCPR1L右移一位 RRF CCPR1L,1 ;CCPR1L右移一位 RRF CCPR1L,1 ;CCPR1L右移一位 BANKSEL PIE1 ;跳到體1 BSF PIE1,TMR1IE ;啟動(dòng)TMR1中斷 BSF INTCON,PEIE ;開(kāi)啟外設(shè)中斷 BSF INTCON,GIE ;開(kāi)啟全局中斷 BANKSEL PORTD ;選擇體0 CLRF PORTD MOVLW 01H ;顯示緩沖器賦初值 MOVWF PORTD_D LOOP ;CALL DELAY_500ms ;延時(shí)500ms ;RLF PORTD_D ;顯示緩沖器循環(huán)左移 GOTO LOOP ;等待中斷 ;* CCPINT中斷子程序 CCPINT BTFSS PIR1,TMR1IF ;判斷是否是TMR1中斷 GOTO JMP4 ;否,跳出中斷 BCF PIR1,TMR1IF ;是,清中斷標(biāo)志位 MOVLW 30H ;分頻器為1:8,關(guān)閉TMR1 MOVWF T1CON ; CLRF TMR1H ;清TMR1H CLRF TMR1L ;清TMR1L MOVLW 0xEE ;設(shè)定TMR1低位初值 ADDWF TMR1L ; MOVLW 0x85 ;設(shè)定TMR1高位初值 ADDWF TMR1H ; BSF T1CON,0 ;啟動(dòng)TMR1 BANKSEL EEADR ;跳到體2 MOVLW youyi ;將地址存到W寄存器 MOVWF EEADR ;將地址送入EEPROM地址寄存器 BANKSEL COUNT5 ;跳到體0 MOVF COUNT5,0 ;將COUNT存到W寄存器 BANKSEL EEADR ;跳到體2 ADDWF EEADR,1 ;EEADR=EEADR+COUNT BANKSEL EECON1 ;選定BANK3 BCF EECON1,EEPGD ;選擇EEPROM作為非易失性存儲(chǔ)器操作對(duì)象 BSF EECON1,RD ;啟動(dòng)一次讀EEPROM的操作 BANKSEL EEDATA ;跳到體2 MOVF EEDATA,W ;由于EEPROM的讀出操作花費(fèi)的時(shí)間很短,此時(shí)EEPROM BANKSEL PR2 ;跳到體1 MOVWF PR2 ;將W存到PR2 BANKSEL CCPR1L ;跳到體0 MOVWF CCPR1L ;將W存到CCPR1L MOVLW B11111100 ;將11111100存到W寄存器 ANDWF CCPR1L,1 ;屏蔽低兩位 RRF CCPR1L,1 ;CCPR1L左移一位 RRF CCPR1L,1 ;CCPR1L左移一位 RRF CCPR1L,1 ;CCPR1L右移一位 MOVLW .149 ;將149存到W寄存器 SUBWF COUNT5,0 ;W=COUNT-149 BTFSS STATUS,C ;判斷是否有借位 GOTO JMP1 ;有,跳到JMP1 GOTO JMP2 ;無(wú),跳到JMP2 JMP1 INCF COUNT5,1 ;COUNT=COUINT+1 GOTO JMP ;跳到JMP JMP2 CLRF COUNT5 ;COUNT清零 JMP MOVLW B00000000 ;送.0到W寄存器 XORWF PORTD,0 ;判斷PORTD是否為0 BTFSS STATUS,Z GOTO JMP3 ;否,跳到JMP1 MOVF PORTD_D,0 ;是,將PORTD_D的值 MOVWF PORTD ;送到PORTD GOTO JMP4 JMP3 CLRF PORTD ;PORTD清零 BCF STATUS,C ;清楚其他操作對(duì)C的影響 RLF PORTD_D ;顯示緩沖器循環(huán)左移 BTFSC STATUS,C GOTO JMP5 GOTO JMP4 JMP5 MOVLW 01H ;顯示緩沖器賦初值 MOVWF PORTD_D JMP4 SWAPF SAVES,W MOVWF STATUS SWAPF SAVEW,F SWAPF SAVEW,W ;恢復(fù)中斷 RETFIE ;* 700ms延時(shí)子程序 DELAY_500ms MOVLW .5 MOVWF COUNT3 LOOP1 MOVLW D133 ;設(shè)置外部循環(huán)次數(shù) MOVWF COUNT1 ; LOOP2 MOVLW D249 ;設(shè)置內(nèi)部循環(huán)次數(shù) MOVWF COUNT2 ; LOOP3 DECFSZ COUNT2 ,1 ;內(nèi)部循環(huán)變量自減1,為0則跳轉(zhuǎn) GOTO LOOP3 ; DECFSZ COUNT1,1 ;外部循環(huán)變量自減1,為0則跳轉(zhuǎn) GOTO LOOP2 ; DECFSZ COUNT3,1 ;外部循環(huán)變量自減1,為0則跳轉(zhuǎn) GOTO LOOP1 ; RETURN ;返回主程序 ;* ADRESS地址轉(zhuǎn)換子程序 ADRESS BTFSS HANG,0 ;判斷行是否為1 GOTO J1 ;是,跳到J1 MOVF LIE,0 ;否,將列值送到W寄存器 ADDWF DD_RAM_UL,0 ;第二行首地址加上列值 GOTO J2 J1 MOVF LIE,0 ;將列值送到W寄存器 ADDWF DD_RAM_ADDR,0 ;第一行首地址加上列值 J2 MOVWF H ;將地址存到H寄存器 RETURN ;子程序返回 ;* SET_CURSOR設(shè)置光標(biāo)位置子程序 SET_CURSOR BANKSEL H MOVF H,0 ;設(shè)置光標(biāo)位置 CALL SendCmd MOVLW DISP_ON ; 開(kāi)顯示 CALL SendCmd RETURN ;子程序返回 ;* Delay - 延時(shí)子程序(773us) Delay ; call指令占用2個(gè)指令周期 CLRF Count ; 清 Count占用1個(gè)指令周期 Dloop DECFSZ Count,f ; 這兩行指令將延時(shí) GOTO Dloop ; (256 * 3) -1 個(gè)指令周期 RETURN ; return占用2個(gè)指令周期 END 四、實(shí)驗(yàn)總結(jié) 一開(kāi)始是電路設(shè)計(jì),因?yàn)樗枰哪K不多,所以電路也不是很復(fù)雜。但到蜂鳴器模塊設(shè)計(jì)的時(shí)候,不知道要接那個(gè)引腳,有接RC2的,有接RC1的。后來(lái)選擇了CCP1。而本身沒(méi)焊ICD2調(diào)試接口,所以找別的同學(xué)下載程序。最后驗(yàn)收。感覺(jué)這次實(shí)驗(yàn)也沒(méi)想象中難,主要是對(duì)電路不熟,有原理圖還好弄,要不然真不知道要接什么引腳。- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 單片機(jī) 音樂(lè) 播放 實(shí)驗(yàn) 報(bào)告
鏈接地址:http://www.3dchina-expo.com/p-9611501.html