單片機音樂播放實驗報告.doc
《單片機音樂播放實驗報告.doc》由會員分享,可在線閱讀,更多相關《單片機音樂播放實驗報告.doc(11頁珍藏版)》請在裝配圖網上搜索。
課 程 設 計 課程名稱 微機原理與單片機技術實踐 題目名稱 單片機制作與音樂播放 學生學院 自動化學院 專業(yè)班級 電子(2) 學 號 學生姓名 指導教師 張學習 2013 年 5 月 24 日 單片機制作與音樂播放 一、課程設計的內容 1.用面包板焊一塊PIC單片機最小系統(tǒng),包括晶振,復位電路,按鈕,LED燈。 2.自主添加新模塊。 3.寫程序驅動單片機工作。 二、課程設計的要求與數據 1.焊板所需原理圖: LED燈 蜂鳴器 復位 晶振 AD轉換 按鈕 2.音樂播放所需資料。 摘要:16F877A單片機原理和控制理論來設計音樂盒的硬件電路,并利用16單片機語言進行程序設計。通過控制單片機內部的定時器來產生不同頻率的方波,驅動喇叭發(fā)出不同音調的音樂,再利用延遲來控制發(fā)音時間的長短。該程序通過把樂譜轉化成相應的定時常數來驅動發(fā)音設備演奏出悅耳動聽的音樂。這種控制電路結構簡單,可靠性高,應用性強;軟件程序適應范圍廣,對于不同的音樂只需要改變相應的定時常數即可。 音樂產生的方法: 一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可?,F在以單片機12MHZ晶振為例,例出高中低音符與單片機計數T0相關的計數值如下表4.1所示: 表4.1 高中低音符與單片機計數T0相關的計數值 音符 對應的PR2值 音符 對應的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所示:音樂的音拍,一個節(jié)拍為單位(C調) 表4.2 音樂的音拍 曲調值 DELAY 曲調值 DELAY 調4/4 125ms 調4/4 62ms 調3/4 187ms 調3/4 94ms 調2/4 250ms 調2/4 125ms 對于不同的曲調我們也可以用單片機的另外一個定時/計數器來完成。發(fā)音部分代碼在程序中實現,靠單片機的一個管腳輸出,考慮到聲音可能不夠大所以我們加入了功放電路,利用LM386來對聲音信號進行放大。音頻輸出信號由ADU OUT引出,信號可經功放電路LM386輸出到揚聲器或耳機。 三、課程設計應完成的工作 1.音樂播放源程序。 #include p16f877a.inc #DEFINE youyi 0X2100 ;樂譜編號 #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};聲調的高低,實際上是PWM的周期值 ;計算方法是CCP的時鐘1MHz除以預分頻比16,再除以要產生的頻率,最后再減去1。 PORTD_D EQU 20H ;顯示緩沖器COUNT COUNT1 EQU 21H COUNT2 EQU 22H COUNT3 EQU 23H COUNT4 EQU 24H SAVEW EQU 25H ;W保護寄存器 SAVES EQU 26H ;STATUS保護寄存器 COUNT5 EQU 27H ;節(jié)拍數 H EQU 28H ;地址寄存器 HANG EQU 29H ;行寄存器 LIE EQU 30H ;列寄存器 TMP1 EQU 31H ;TMP1緩存寄存器 Byte EQU 32H ;緩存 Count6 EQU 33H ;節(jié)拍數 Count7 EQU 34H ;節(jié)拍數 DD_RAM_ADDR EQU 35H ; 第一行顯示地址寄存器 DD_RAM_UL EQU 36H ; 第二行顯示地址寄存器 COUNT EQU 37H Count EQU 38H ;計數寄存器 Count2 EQU 39H ;* 定義 LCD數據& 控制I/O口 #define LCD_DB7 PORTB,3 ;占用的I/O口定義 #define LCD_DB6 PORTB,2 ;LCD的DB6與RB2連接,其它類推 #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 ;對應的方向寄存器定義 #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 ; 開顯示 #define DISP_ON_C 0x00E ; 開顯示, 開指針 #define DISP_ON_B 0x00F ; 開顯示, 開指針,開閃爍 #define DISP_OFF 0x008 ; 關顯示 #define CLR_DISP 0x001 ; 清顯示的操作數 #define ENTRY_INC 0x006 ; 操作數 #define ENTRY_INC_S 0x007 ; 操作數 #define ENTRY_DEC 0x004 ; 操作數 #define ENTRY_DEC_S 0x005 ; 操作數 ORG youyi ;友誼天長地久 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 ;中斷保護 GOTO CCPINT ;*TABLE TABLE1 ;取第一行的顯示碼TMR2 COUNT ADDWF PCL,1 ;地址偏移量加當前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 ;地址偏移量加當前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" ;*主程序開始 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,關閉TMR1 MOVWF T1CON ; BCF PIR1,TMR1IF ;溢出標志位清零 CLRF TMR1H CLRF TMR1L MOVLW 0xEE ;設定TMR1低位初值 ADDWF TMR1L ; MOVLW 0x85 ;設定TMR1高位初值 ADDWF TMR1H ; BSF T1CON,0 ;啟動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作為非易失性存儲器操作對象 BSF EECON1,RD ;啟動一次讀EEPROM的操作 BANKSEL EEDATA ;跳到體2 MOVF EEDATA,W ;由于EEPROM的讀出操作花費的時間很短,此時EEPROM BANKSEL PR2 ;跳到體1 MOVWF PR2 ;將W的值存到PR2 BANKSEL T2CON ;跳到體0 MOVLW 0x07 ;預分頻1:16,后預分頻1:1 MOVWF T2CON ;開定時器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 ;啟動TMR1中斷 BSF INTCON,PEIE ;開啟外設中斷 BSF INTCON,GIE ;開啟全局中斷 BANKSEL PORTD ;選擇體0 CLRF PORTD MOVLW 01H ;顯示緩沖器賦初值 MOVWF PORTD_D LOOP ;CALL DELAY_500ms ;延時500ms ;RLF PORTD_D ;顯示緩沖器循環(huán)左移 GOTO LOOP ;等待中斷 ;* CCPINT中斷子程序 CCPINT BTFSS PIR1,TMR1IF ;判斷是否是TMR1中斷 GOTO JMP4 ;否,跳出中斷 BCF PIR1,TMR1IF ;是,清中斷標志位 MOVLW 30H ;分頻器為1:8,關閉TMR1 MOVWF T1CON ; CLRF TMR1H ;清TMR1H CLRF TMR1L ;清TMR1L MOVLW 0xEE ;設定TMR1低位初值 ADDWF TMR1L ; MOVLW 0x85 ;設定TMR1高位初值 ADDWF TMR1H ; BSF T1CON,0 ;啟動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作為非易失性存儲器操作對象 BSF EECON1,RD ;啟動一次讀EEPROM的操作 BANKSEL EEDATA ;跳到體2 MOVF EEDATA,W ;由于EEPROM的讀出操作花費的時間很短,此時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 ;無,跳到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 ;清楚其他操作對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 ;恢復中斷 RETFIE ;* 700ms延時子程序 DELAY_500ms MOVLW .5 MOVWF COUNT3 LOOP1 MOVLW D133 ;設置外部循環(huán)次數 MOVWF COUNT1 ; LOOP2 MOVLW D249 ;設置內部循環(huán)次數 MOVWF COUNT2 ; LOOP3 DECFSZ COUNT2 ,1 ;內部循環(huán)變量自減1,為0則跳轉 GOTO LOOP3 ; DECFSZ COUNT1,1 ;外部循環(huán)變量自減1,為0則跳轉 GOTO LOOP2 ; DECFSZ COUNT3,1 ;外部循環(huán)變量自減1,為0則跳轉 GOTO LOOP1 ; RETURN ;返回主程序 ;* ADRESS地址轉換子程序 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設置光標位置子程序 SET_CURSOR BANKSEL H MOVF H,0 ;設置光標位置 CALL SendCmd MOVLW DISP_ON ; 開顯示 CALL SendCmd RETURN ;子程序返回 ;* Delay - 延時子程序(773us) Delay ; call指令占用2個指令周期 CLRF Count ; 清 Count占用1個指令周期 Dloop DECFSZ Count,f ; 這兩行指令將延時 GOTO Dloop ; (256 * 3) -1 個指令周期 RETURN ; return占用2個指令周期 END 四、實驗總結 一開始是電路設計,因為所需要的模塊不多,所以電路也不是很復雜。但到蜂鳴器模塊設計的時候,不知道要接那個引腳,有接RC2的,有接RC1的。后來選擇了CCP1。而本身沒焊ICD2調試接口,所以找別的同學下載程序。最后驗收。感覺這次實驗也沒想象中難,主要是對電路不熟,有原理圖還好弄,要不然真不知道要接什么引腳。- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 單片機 音樂 播放 實驗 報告
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://www.3dchina-expo.com/p-9611501.html