單片機(jī)課程設(shè)計報告簡易音樂播放器
《單片機(jī)課程設(shè)計報告簡易音樂播放器》由會員分享,可在線閱讀,更多相關(guān)《單片機(jī)課程設(shè)計報告簡易音樂播放器(35頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、. . 第一章 前言 伴隨著科技的開展和時代的進(jìn)步,人們對生活質(zhì)量的要求也越來越高,由以前簡單的追求溫飽和物質(zhì)財富轉(zhuǎn)向更高層面的精神追求!而這一切催生了智能儀器的開展,音樂那么是人們娛樂生活的重要組成局部,目前市場上出現(xiàn)了許許多多的音樂播放器,而人們對播放器的功能需求也越來越廣泛,本文將設(shè)計一個基于單片機(jī)的音樂播放器,通過對其全面的介紹與分析,讓大家了解音樂播放器的原理! 第二章: 簡易音樂播放器的功能和原理說明 音樂播放器,可以通過單片機(jī)板子上的數(shù)字按鍵對音樂播放的曲目進(jìn)展控制,并且通過LED燈將播放的音樂加以區(qū)分,在播放音樂的同時點(diǎn)亮LED
2、燈,讓人知道現(xiàn)在正在播放的音樂曲目,從而實(shí)現(xiàn)簡單的音樂播放功能! 表1 需求分析 名稱 簡易音樂播放器 目的 實(shí)現(xiàn)簡單的特定音樂播放功能 輸入 單片機(jī)板子上的數(shù)字按鍵 輸出 揚(yáng)聲器,LED燈 功能 (1) 接收按鍵開關(guān)的信號,并將信號送入單片機(jī) (2) 處理得到的結(jié)果通過LED信號燈進(jìn)展顯示,并通過揚(yáng)聲器播放音樂 (3) 可以播放4首程序中寫好的音樂 性能 基于單片機(jī)的揚(yáng)聲器和程序的軟件設(shè)計 功能說明:這次設(shè)計是依據(jù)單片機(jī)技術(shù)原理,通過硬件電路設(shè)計以及軟件的編譯而設(shè)計的一個簡單的音樂播放器,可以通過按鍵選擇播放四首歌曲〔歌曲自選,只要將想要播放的歌曲的樂譜寫入
3、程序中即可〕同時點(diǎn)亮相應(yīng)的LED燈,并用它來指示當(dāng)前播放的歌曲序列,只能實(shí)現(xiàn)簡單的音樂播放功能。 原理說明:這個音樂播放器主要有晶振電路,復(fù)位電路,LED電路,按鍵電路以及揚(yáng)聲器組成。它利用單片機(jī)產(chǎn)生樂曲音符,再把樂曲音符翻譯成計算機(jī)音樂語言,接著用單片機(jī)進(jìn)展信息處理,再通過蜂鳴器或喇叭放出音樂。音樂的產(chǎn)生主要是通過單片機(jī)的I/O口輸出上下不同的脈沖信號來控制揚(yáng)聲器發(fā)音。通常利用單片機(jī)的部定時器0,工作在方式1下,再改變計數(shù)初值TH0和TL0來產(chǎn)生不同頻率。當(dāng)控制歌曲按鍵按下時,按照預(yù)先存放在單片機(jī)中的程序,就會自動判斷鍵值,然后啟動計數(shù)器,按照程序產(chǎn)生一定頻率的脈沖,接著通過uln2003
4、芯片驅(qū)動揚(yáng)聲器,播放出樂曲。該硬件電路中用P3.0,P3.1,P3.2,P3.3控制四個按鍵,"0〞,"1〞,"2〞,"3〞分別控制四首音樂。P1.0,P1.1,P1.2,P1.3控制四個LED燈,它們分別對應(yīng)四個按鍵,用來顯示正在播放的歌曲,并用P2.3 來控制揚(yáng)聲器,電路為12MHz晶振頻率工作,起振電路中C1 和C2為22pf。 第三章:系統(tǒng)硬件電路設(shè)計 1:硬件體系構(gòu)造設(shè)計 該簡易音樂播放器主要有單片機(jī)核心芯片89C52,LED發(fā)光二極管,揚(yáng)聲器,晶振電路,按鍵電路,復(fù)位電路組成,通過芯片引腳輸出定時器產(chǎn)生的各種固定頻率的方波信號,然后在經(jīng)由揚(yáng)聲器產(chǎn)生各種頻率的聲音。另
5、外,該方案使用的是單片機(jī)板子的部振蕩電路,89C52芯片的X1,X2引腳外接石英晶體。它的系統(tǒng)組成如下列圖。 晶體振蕩電路 89C52芯片 復(fù)位電路 按鍵電路 揚(yáng)聲器 LED顯示 (1) 晶振電路局部晶振的作用是給電路提供工作信號脈沖的,其實(shí)就是單片機(jī)的工作速度。本次設(shè)計選用12M晶振,那么單片機(jī)的工作速度就是每秒12M。與此同時,也要注意單片機(jī)的工作頻率圍。 (2) 復(fù)位電路局部 當(dāng)系統(tǒng)出現(xiàn)問題時可以重置系統(tǒng),解決一些問題 (3) LED顯示局部顯示系統(tǒng)在各種不同條件下的狀態(tài) (4) 89C52芯片整個設(shè)計的核心,接收和處理信號及程序 (5) 按鍵電路
6、局部作為系統(tǒng)的輸入 (6) 揚(yáng)聲器局部用于發(fā)出不同頻率的音調(diào)形成歌曲 2 硬件電路設(shè)計 硬件電路分為單片機(jī)芯片最小系統(tǒng)〔包括時鐘電路,復(fù)位電路〕,揚(yáng)聲器電路,按鍵電路和LED電路等 (1) 單片機(jī)89C52芯片最小系統(tǒng)設(shè)計 AT89C52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效
7、的解決方案。AT89S52具有以標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16 位定時器/計數(shù)器,一個6向量2級中斷構(gòu)造,全雙工串行口, 片晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停頓工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM容被保存,振蕩器被凍結(jié), 單片機(jī)一切工作停頓,直到下一個中斷或硬件復(fù)位為止。它的引腳圖如圖2所示 圖2 主要性能參數(shù): l 與MCS-51單片機(jī)產(chǎn)品兼容 l 8K字節(jié)在系統(tǒng)可編程Flash存儲器
8、 l 1000次擦寫周期 l 全靜態(tài)操作:0Hz~33Hz l 三級加密程序存儲器 l 32個可編程I/O口線 l 三個16位定時器/計數(shù)器 l 八個中斷源 l 全雙工UART串行通道 l 低功耗空閑和掉電模式 l 掉電后中斷可喚醒 l 看門狗定時器 l 雙數(shù)據(jù)指針 l 掉電標(biāo)識符 引腳介紹:VCC : 電源 GND: 地 P0 口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅(qū)動8個TTL邏 輯電平。對P0端口寫"1〞時,引腳用作高阻抗輸入。 當(dāng)訪問外部程序和數(shù)據(jù)存儲器時,P0口也被作為低8位地址/數(shù)據(jù)復(fù)用。在這種模式下, P0具有部上拉電阻
9、。 在flash編程時,P0口也用來接收指令字節(jié);在程序校驗(yàn)時,輸出指令字節(jié)。程序校驗(yàn) 時,需要外部上拉電阻。 P1 口:P1 口是一個具有部上拉電阻的8 位雙向I/O 口,p1 輸出緩沖器能驅(qū)動4 個 TTL 邏輯電平。對P1 端口寫"1〞時,部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于部電阻的原因,將輸出電流〔IIL〕。 此外,P1.0和P1.2分別作定時器/計數(shù)器2的外部計數(shù)輸入〔P1.0/T2〕和時器/計數(shù)器2 的觸發(fā)輸入〔P1.1/T2EX〕,具體如下表所示。 在flash編程和校驗(yàn)時,P1口接收低8位地址字節(jié)。 P2 口:P
10、2 口是一個具有部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅(qū)動4 個 TTL 邏輯電平。對P2 端口寫"1〞時,部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于部電阻的原因,將輸出電流〔IIL〕。 在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器〔例如執(zhí)行MOVX DPTR〕 時,P2 口送出高八位地址。在這種應(yīng)用中,P2 口使用很強(qiáng)的部上拉發(fā)送1。在使用 8位地址〔如MOVX RI〕訪問外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的容。 在flash編程和校驗(yàn)時,P2口也接收高8位地址字節(jié)和一些控制信號。 P3 口:P3 口是一個具有
11、部上拉電阻的8 位雙向I/O 口,p2 輸出緩沖器能驅(qū)動4 個 TTL 邏輯電平。對P3 端口寫"1〞時,部上拉電阻把端口拉高,此時可以作為輸入 口使用。作為輸入使用時,被外部拉低的引腳由于部電阻的原因,將輸出電流 P3口亦作為AT89S52特殊功能〔第二功能〕使用,如下表所示。 在flash編程和校驗(yàn)時,P3口也接收一些控制信號。 RST: 復(fù)位輸入。晶振工作時,RST腳持續(xù)2 個機(jī)器周期高電平將使單片機(jī)復(fù)位??撮T 狗計時完成后,RST 腳輸出96 個晶振周期的高電平。特殊存放器AUXR(地址8EH)上 的DISRTO位可以使此功能無效。DISRTO默認(rèn)狀態(tài)下,復(fù)位高電平有效。
12、 ALE/PROG:地址鎖存控制信號〔ALE〕是訪問外部程序存儲器時,鎖存低8 位地址 的輸出脈沖。在flash編程時,此引腳〔PROG〕也用作編程輸入脈沖。 在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或 時鐘使用。然而,特別強(qiáng)調(diào),在每次訪問外部數(shù)據(jù)存儲器時,ALE脈沖將會跳過。 如果需要,通過將地址為8EH的SFR的第0位置"1〞,ALE操作將無效。這一位置"1〞, ALE 僅在執(zhí)行MOVX 或MOVC指令時有效。否那么,ALE 將被微弱拉高。這個ALE 使能標(biāo)志位〔地址為8EH的SFR的第0位〕的設(shè)置對微控制器處于外部執(zhí)行模式下無效。 PSE
13、N:外部程序存儲器選通信號〔PSEN〕是外部程序存儲器選通信號。 當(dāng)AT89S52從外部程序存儲器執(zhí)行外部代碼時,PSEN在每個機(jī)器周期被激活兩次,而 在訪問外部數(shù)據(jù)存儲器時,PSEN將不被激活。 EA/VPP:訪問外部程序存儲器控制信號。為使能從0000H 到FFFFH的外部程序存儲器 讀取指令,EA必須接GND。 為了執(zhí)行部程序指令,EA應(yīng)該接VCC。 在flash編程期間,EA也接收12伏VPP電壓。 XTAL1:振蕩器反相放大器和部時鐘發(fā)生電路的輸入端。 XTAL2:振蕩器反相放大器的輸出端。 該最小系統(tǒng)包括時鐘電路,復(fù)位電路。在部時鐘電路中,必須在X1和X2引腳兩端
14、跨接石英晶體振蕩器和兩個微調(diào)電容從而形成振蕩電路,按照單片機(jī)的板子C1和C2取的是22pf,而晶振的頻率取值在1.2MHz和12MHz之間。復(fù)位電路就和電腦的重啟局部差不多,當(dāng)電腦使用中出現(xiàn)死機(jī),按下重啟按鈕電腦部的程序從頭執(zhí)行,其中,電容大小為10uf,電阻大小為10K。 它在設(shè)計中電路圖如圖3 圖3 (2) LED電路設(shè)計 四個LED燈〔發(fā)光二極管〕分別由P1.0~P1.3控制,播放第一首歌時D0點(diǎn)亮,第二、三首歌時D1、D2點(diǎn)亮,第四首歌時D3亮,電阻的阻值由單片機(jī)板子上的電阻值決定。它的電路原理圖如圖4 圖4 (3)揚(yáng)聲器電路設(shè)計 由于本設(shè)計基于單片機(jī)板子,所以揚(yáng)聲器電路
15、取自板子的設(shè)計,將信號通過一個名為uln2003的芯片進(jìn)展放大,并推動揚(yáng)聲器發(fā)出聲音也即音樂。高耐壓、大電流復(fù)合晶體管ULN2003 是高耐壓、大電流復(fù)合晶體管陣列,由七個硅NPN 復(fù)合晶體管組成。它是大電流驅(qū)動陣列,多用于單片機(jī)、智能儀表、PLC,數(shù)字量輸出卡等控制電路中。可直接驅(qū)動繼電器等負(fù)載。在5V的工作電壓下它能與TTL和CMOS電路 直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來處理的數(shù)據(jù)。還具有電流增益高、工作電壓高、溫度圍寬、帶負(fù)載能力強(qiáng)等特點(diǎn),適應(yīng)于各類要求高速大功率驅(qū)動的系統(tǒng)。完全可以用來驅(qū)動揚(yáng)聲器發(fā)聲!它的引腳圖如圖5所示。下附引腳介紹 圖5 引腳介紹:引腳1:CPU脈
16、沖輸入端,端口對應(yīng)一個信號輸出端。 引腳2:CPU脈沖輸入端。 引腳3:CPU脈沖輸入端。 引腳4:CPU脈沖輸入端。 引腳5:CPU脈沖輸入端。 引腳6:CPU脈沖輸入端。 引腳7:CPU脈沖輸入端。 引腳8:接地。 引腳9:該腳是部7個續(xù)流二極管負(fù)極的公共端,各二極管的正極分別接各達(dá)林頓管的集電極。用于感性負(fù)載時,該腳接負(fù)載電源正極,實(shí)現(xiàn)續(xù)流作用。如果該腳接地,實(shí)際上就是達(dá)林頓管的集電極對地接通。 引腳10:脈沖信號輸出端,對應(yīng)7腳信號輸入端。 參考電路接法 引腳11:脈沖信號輸出端,對應(yīng)6腳信號輸入端。 引腳12:脈沖信號輸出端,對應(yīng)5腳信號輸入端。 引腳13:
17、脈沖信號輸出端,對應(yīng)4腳信號輸入端。 引腳14:脈沖信號輸出端,對應(yīng)3腳信號輸入端。 引腳15:脈沖信號輸出端,對應(yīng)2腳信號輸入端。 引腳16:脈沖信號輸出端,對應(yīng)1腳信號輸入端。 揚(yáng)聲器電路在設(shè)計中的電路圖如圖6所示: 圖6 〔4〕按鍵電路設(shè)計 單片機(jī)應(yīng)用系統(tǒng)中的人機(jī)對話通道是用戶為了對應(yīng)用系統(tǒng)進(jìn)展干預(yù)以及了解應(yīng)用系統(tǒng)運(yùn)行狀態(tài)所設(shè)置的通道,主要有鍵盤,顯示器等通道接口,為了控制系統(tǒng)的工作狀態(tài)以及向系統(tǒng)中輸入數(shù)據(jù),應(yīng)用系統(tǒng)設(shè)置鍵盤,借助鍵盤向系統(tǒng)輸入程序,置數(shù),送操作命令,控制程序的執(zhí)行等。本設(shè)計采用4個按鈕來實(shí)現(xiàn)選擇歌曲的播放,電路的連接選用單片機(jī)板子上的電路。"0〞、"
18、1〞"2〞、"3〞分別由單片機(jī)引腳P3.0,P3.1,P3.2,P3.3控制,它的設(shè)計電路圖如圖7所示。 圖7 第四章: 軟件系統(tǒng)設(shè)計 1:主程序 在本設(shè)計中,主程序是整個軟件模塊的核心,它實(shí)現(xiàn)對程序的初始化以及各個函數(shù)的調(diào)用。 void main() { uchar key; P2=0; P0=0X00; while(1) { key=keyscan(); //調(diào)用鍵盤掃描掃描函數(shù), switch(key) { case 0xee:P0=EL[0]; P1=0xfe; //LED燈D0點(diǎn)
19、亮 yy1(); //播放第一首音樂 break; case 0xde:P0=EL[1]; P1=0xfd;//LED燈D1點(diǎn)亮 yy2();//播放第二首音樂 break; case 0xbe:P0=EL[2]; P1=0xfb; //LED燈D2點(diǎn)亮 yy3(); //播放第三首音樂 break; case 0x7e:P0=EL[3]; P1=0xf7;//LED燈D3點(diǎn)亮
20、 yy4();//播放第四首音樂 break; } } } 系統(tǒng)構(gòu)造框圖 開場 系統(tǒng)初始化 有鍵按下 否 是 "2〞鍵 "1〞鍵 "3〞鍵 "0〞鍵 否 否 否 是 是 是 是 播放第四首歌,點(diǎn)亮D3 播放第三首歌,
21、點(diǎn)亮D2 播放第二首歌,點(diǎn)亮D1 播放第一首歌,點(diǎn)亮D0 播放 播放 播放 播放 完畢 完畢 完畢 完畢 2:鍵盤掃描程序 在主程序中,需要調(diào)用鍵盤掃描程序,該程序可以對鍵盤的鍵值進(jìn)展掃描,確保我們再輸入鍵值后,系統(tǒng)單片機(jī)能夠接收并作出相應(yīng)的處理。 uchar keyscan(void) //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法 { uchar cord_h,cord_l;//行列值中間變量 P3=
22、0x0f; //行線輸出全為0 cord_h=P3&0x0f; //讀入列線值 if(cord_h!=0x0f) //先檢測有無按鍵按下 { delay(100); //去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f; //讀入列線值 P3=cord_h|0xf0; //輸出當(dāng)前列線值 cord_l=P3&0xf0; //讀入行線值 return(cord_h+cord_l);//鍵盤最后組合碼值 } }return(0xff);
23、 //返回該值 } 構(gòu)造框圖: 開場 有鍵按下 延遲100ms 是 逐行逐列掃描并確定按鍵的鍵值 調(diào)用按鍵相應(yīng)的子程序 3:音樂播放函數(shù) 該音樂播放函數(shù)包含了音樂播放的規(guī)律,能夠確保音樂按照樂譜播放。 void yy1(void) { unsigned char k,i; TMOD=1; //置CT0定時工作方式1 EA=1; ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷 while(1) { i=0;
24、 while(i<100){ //音樂數(shù)組長度 ,唱完從頭再來 k=sszymmh[i]+7*sszymmh[i+1]-1; timer0h=FREQH[k]; timer0l=FREQL[k]; time=sszymmh[i+2]; i=i+3; song(); } } } void yy2(void) { unsigned char k,i; TMOD=1; //置CT0定時工作方式1 EA=1; ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷 w
25、hile(1) { i=0; while(i<150){ //音樂數(shù)組長度 ,唱完從頭再來 k=mldsh[i]+7*mldsh[i+1]-1; timer0h=FREQH[k]; timer0l=FREQL[k]; time=mldsh[i+2]; i=i+3; song(); } } } void yy3(void)
26、 { unsigned char k,i; TMOD=1; //置CT0定時工作方式1 EA=1; ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷 while(1) { i=0; while(i<150){ //音樂數(shù)組長度 ,唱完從頭再來 k=lzlh[i]+7*lzlh[i+1]-1; timer0h=FREQH[k]; timer0l=FREQL[k]; time=lzlh[i+2];
27、 i=i+3; song(); } } } void yy4(void) { unsigned char k,i; TMOD=1; //置CT0定時工作方式1 EA=1; ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷 while(1) { i=0; while(i<150){ //音樂數(shù)組長度 ,唱完從頭再來 k=srg[i]+7*srg
28、[i+1]-1; timer0h=FREQH[k]; timer0l=FREQL[k]; time=srg[i+2]; i=i+3; song(); } } } 4:音樂處理函數(shù) 該函數(shù)能夠?qū)σ魳愤M(jìn)展簡單的處理。 void song() { TH0=timer0h; TL0=timer0l; TR0=1; delay2(time); } 5:定時器中斷函數(shù) 該函數(shù)可以控制音樂播放后停頓。 void t0
29、int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
6:延時程序
void delay1(uint i) //延時函數(shù)
{
while(i--);
}
void delay2(unsigned char t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1 30、 ;
}
}
TR0=0;
}
7:樂譜及音階頻率函數(shù)
該函數(shù)是歌曲和音階頻率的C語言代碼
1> 第一首歌:世上只有媽媽好
code uchar sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1 31、,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
}
2> 第二首歌 美麗的神話
code uchar mldsh[]={ 32、 6,1,2, 3,2,2, 7,1,3, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4, 6,1,2, 6,2,2,
5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,2, 6,1,2, 6,2,2, 5,2,1,
6,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,4, 1,2,4, 6,1,2, 3,2,2, 2,2,3,
7,1,1, 6,1 33、,8, 6,1,2, 3,2,2, 7,2,3, 7,1,1, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4,
6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,6, 6,1,2,
6,2,2, 5,2,1, 2,2,1, 3,2,1, 4,2,1, 3,2,2, 2,2,2, 1,2,4, 6,2,2, 2,2,2,
1,2,3, 7,1,1, 6,1,6, 6,1,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 1 34、,2,1, 7,2,2, 5,1,2,
6,1,1, 1,2,1, 2,2,1, 3,2,1
}
3> 第三首歌 兩只老虎
code uchar lzlh[]={ 1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,
6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,
35、 6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4,
1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,
6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,
36、 6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4
};
4>第四首歌 生日歌
code uchar srg[]={ 5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
37、5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,1, 6,1,1,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4
};
5> 音階頻率表
// 音階頻率表 高八位
code uchar FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xF 38、B,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音階頻率表 低八位
code uchar FREQL[]={
39、 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
40、 };
六: 系統(tǒng)調(diào)試及總結(jié)
硬件電路和軟件程序設(shè)計完成后,在單片機(jī)上連接好硬件電路,然后將由軟件產(chǎn)生的程序Hex文件拷入單片機(jī)的AT89C51芯片,然后在按鍵面板上選擇按鍵,看能否播放程序中的音樂,同時注意觀察相應(yīng)的LED燈能否點(diǎn)亮,實(shí)驗(yàn)結(jié)果證明設(shè)計成功。本設(shè)計沒有考慮到音樂的暫停播放功能,因此選擇按鍵后必須等待音樂全部播放完畢,然后斷開電源再接通電源重新選擇播放的曲目。
在程序調(diào)試的過程中,由于編程中出現(xiàn)的一些錯誤,導(dǎo)致軟件的Hex文件一直不能生成,但是經(jīng)過仔細(xì)檢查,最終成功寫好程序。除此之外,在使用PROTEL軟件畫硬件電路時,也由于硬件電路元件的特殊性,遇到了許多困難,無奈多 41、方查詢資料,終于解決問題。另外在編寫樂譜程序也頗為不易,上網(wǎng)查閱了很多資料才根本將一首簡單的音樂C程序代碼編寫出來。
總之,雖然調(diào)試過程遇到很多問題,但經(jīng)過集體努力,最終調(diào)試成功。根本實(shí)現(xiàn)設(shè)計預(yù)定的功能,可以用按鍵控制四首音樂的播放,并在播放的同時點(diǎn)亮了相應(yīng)的LED燈。設(shè)計成功。
附錄一
系統(tǒng)硬件電路圖:
附錄二
系統(tǒng)軟件總程序:
*include 42、d char
*define uint unsigned int
uchar timer0h,timer0l,time;
code uchar sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
6,1,1, 5,2,1, 3,2, 43、1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
};
//世上只有媽媽好
code uchar mldsh[]= 44、{ 6,1,2, 3,2,2, 7,1,3, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4, 6,1,2, 6,2,2,
5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,2, 6,1,2, 6,2,2, 5,2,1,
6,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,4, 1,2,4, 6,1,2, 3,2,2, 2,2,3,
45、 7,1,1, 6,1,8, 6,1,2, 3,2,2, 7,2,3, 7,1,1, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4,
6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,6, 6,1,2,
6,2,2, 5,2,1, 2,2,1, 3,2,1, 4,2,1, 3,2,2, 2,2,2, 1,2,4, 6,2,2, 2,2,2,
1,2,3, 7,1,1, 6,1,6, 6,1,1, 7,1,1, 1,2,1, 2,2, 46、1, 3,2,1, 1,2,1, 7,2,2, 5,1,2,
6,1,1, 1,2,1, 2,2,1, 3,2,1
};
//美麗的神話
code uchar lzlh[]={ 1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,
47、 6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,
6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4,
1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,
48、 6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,
6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4
};
//兩只老虎
code uchar srg[]={ 5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
49、 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,1, 6,1,1,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4
};
//生日歌
// 音階頻率表 高八位
code uchar FREQH[]={
0xF2,0xF 50、3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
51、 // 音階頻率表 低八位
code uchar FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
52、 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
uchar const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
/*******************************************************/
/* 53、 函數(shù)聲明 */
/*******************************************************/
uchar keyscan(void); //鍵盤掃描
void delay1(uint i); //演示程序
void delay2(unsigned char t);
void yy1(void) ; //定義音樂函數(shù)1
void yy2(void) ; //定義音樂函數(shù)2
void yy3(void) ; //定義音樂函數(shù)3
void 54、 yy4(void); //定義音樂函數(shù)4
/****************************************************/
/* 主函數(shù) */
/****************************************************/
void main()
{
uchar key;
P2=0;
P0=0X00;
while(1)
{
key=keyscan(); //調(diào)用鍵盤掃描,
switch(k 55、ey)
{
case 0xee:P0=EL[0];
P1=0xfe; //票
yy1();
break;
case 0xde:P0=EL[1];
P1=0xfd;
yy2();
break;
case 0xbe:P0=EL[2];
P1=0xfb;
yy3();
break;
case 0x7e:P0=EL[3];
P1=0xf7;
56、 yy4();
break;
}
}
}
/***********************************************************/
/* 鍵盤掃描程序 */
/************************************************************/
uchar keyscan(void) //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
{
uchar cord_ 57、h,cord_l;//行列值中間變量
P3=0x0f; //行線輸出全為0
cord_h=P3&0x0f; //讀入列線值
if(cord_h!=0x0f) //先檢測有無按鍵按下
{
delay1(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //讀入列線值
P3=cord_h|0xf0; //輸出當(dāng)前列線值
cord_l=P3&0xf0; //讀入行線值
return(cord_h+cord_l);//鍵盤最后組合碼 58、值
}
}return(0xff); //返回該值
}
/***********************************************************/
/* 延時程序 */
/************************************************************/
void delay1(uint i) //延時函數(shù)
{
while(i--);
}
void delay2(unsigned char 59、 t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1 60、**********************************************************/
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
/*************************************************************/
/***********************************************************/
/* 61、 音樂處理函數(shù) */
/************************************************************/
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay2(time);
}
/*************************************************************/
/* 音樂播放函數(shù) 62、 */
/************************************************************/
void yy1(void)
{
unsigned char k,i;
TMOD=1; //置CT0定時工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷
while(1)
{
i=0;
while( 63、i<100){ //音樂數(shù)組長度 ,唱完從頭再來
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
void yy2(void)
{
unsigned char k,i;
TMOD=1; //置CT0定時工作方式1
EA=1;
ET0 64、=1;//IE=0x82 //CPU開中斷,CT0開中斷
while(1)
{
i=0;
while(i<150){ //音樂數(shù)組長度 ,唱完從頭再來
k=mldsh[i]+7*mldsh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=mldsh[i+2];
i=i+3;
song();
}
}
}
65、 void yy3(void)
{
unsigned char k,i;
TMOD=1; //置CT0定時工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷
while(1)
{
i=0;
while(i<150){ //音樂數(shù)組長度 ,唱完從頭再來
k=lzlh[i]+7*lzlh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k] 66、;
time=lzlh[i+2];
i=i+3;
song();
}
}
}
void yy4(void)
{
unsigned char k,i;
TMOD=1; //置CT0定時工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU開中斷,CT0開中斷
while(1)
{
i=0;
while(i<150){ //音樂數(shù)組長度 ,唱完從頭再來
k=srg[i]+7*srg[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=srg[i+2];
i=i+3;
song();
}
}
}
參考文獻(xiàn):
單片機(jī)原理與接口技術(shù)〔第3版〕朝青 編著
- 溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案