版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、精選優(yōu)質文檔-傾情為你奉上基于單片機多功能數(shù)字音樂盒單片機原理及應用課程設計任務書一、目的意義單片機原理及應用是高校工程專業(yè)的一門專業(yè)基礎課,該門課程具有很強的實踐性。通過課程的學習,使學生掌握基本概念、基本理論和基本技能,為今后從事相應的生產(chǎn)設計和科研工作打下一定的基礎。因此,除課程的理論教學和實驗教學外,課程設計也是一個必要和重要的實踐教學環(huán)節(jié)。通過課程設計,進一步培養(yǎng)學生理論聯(lián)系實際的能力,學會正確地分析工程實際問題,善于查閱參考文獻,準確地選擇相應的數(shù)據(jù)、參數(shù),具備全面地解決實際問題的素質,同時課程設計也為今后的畢業(yè)設計打下基礎。二、設計時間、地點、班級時間:第16、17周(二周)地點
2、: 三教 433 、426 班級: 09電氣 99人 三、設計內(nèi)容(二十)基于單片機的多功能數(shù)字音樂盒的設計1、功能描述用AT89S52單片機的I/O口產(chǎn)生一定頻率的方波,驅動蜂鳴器,發(fā)出不同的音調,從而演奏樂曲。共有4樂曲,每首樂曲都由相應的按鍵控制,并且有開關鍵、暫停鍵、上一曲以及下一曲控制鍵。2、設計已知參數(shù)樂曲3、設計要求:按鍵輸入電路的設計復位電路的設計;時鐘電路的設計顯示電路及驅動電路的設計;掃描模式的選擇設計系統(tǒng)主程序及子程序的設計;元件及元件參數(shù)的選擇前言:本設計是以AT89C51芯片的電路為基礎,外部加上放音設備,以此來實現(xiàn)音樂演奏控制器的硬件電路,通過軟件程序來控制單片機內(nèi)
3、部的定時器使其演奏出優(yōu)美動聽的音樂。用戶可以按照自己的喜好選擇音樂并將其轉化成機器碼存入單片機的存儲器中。對于不同型號的單片機只需要相應的改變一下地址即可。該軟、硬件系統(tǒng)具有很好的通用性,很高的實際使用價值,為廣大的單片機和音樂愛好者提供了很好的借鑒。1、 設計原理及相關說明設計原理:通過按鍵給單片機的P2口輸入低電平,進而利用程序來判斷是否執(zhí)行某一播放功能。而利用單片機的定時器0中斷來控制播放樂曲。2.1芯片AT89C51的介紹AT89C51是一種帶4K字節(jié)閃存可編程可擦除只讀存儲器(FPEROM)的低電壓,高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節(jié)閃存可編
4、程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。外形及引腳排列如圖2.1所示圖3.2 AT89C51引腳排列圖2.2 時鐘振蕩電路、復位電路利用12MHZ的晶振做外部時鐘;AT89C51中有一個用于構成內(nèi)部振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是該
5、放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體(陶瓷)諧振器一起構成自然振蕩器。外接石英晶體及電容C1、C2接在放大器的反饋回路中構成并聯(lián)振蕩電路。對外接電容C1,C2雖然沒有什么嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩(wěn)定性、起振的難易程序及溫度穩(wěn)定性。如果使用石英晶體,我們推薦電容使用30PF10PF(而如果使用陶瓷振蕩器建議選擇40PF10PF)。用2.3控制電路:鍵盤接口電路如圖,本次設計中,按鍵有7個.鍵分別接于7根I/O線(P2口),各按鍵在實物連接上相互獨立,彼此的工作狀態(tài)互不影響,STC單片機自帶上拉電阻因此無需外接上拉電阻,用查詢法完
6、成按鍵功能。2.4蜂鳴器電路:利用PNP管(9012)放大驅動。基極接10K歐姆的電阻,發(fā)射極接蜂鳴器,集電極接電源。3系統(tǒng)軟件設計程序設計流程圖如圖7所示設計流程圖依據(jù)所寫源程序所繪制,所用代號均為源程序中所使用,源程序可參照源程序清單。仿真調試及操作說明調試步驟調試分為硬件調試和軟件調試。硬件調試主要是檢查硬件電路是否有短路、斷路和虛焊等,首先接上電源,電源的指示燈亮了之后,檢測一下單片機的電源腳有沒有電源輸入,如果有這說明焊接無誤,然后可以用萬用表檢查各個元器件的管腳之間的焊接,檢查過程中需要細心和耐心。硬件調試無誤后,進行軟件調試。軟件調試可以針對子程序調試,測試其是否正常工作。5.2
7、 性能分析將程序燒入單片機后,在proteus軟件中進行仿真。通過仿真和實物測試發(fā)現(xiàn),按下按鍵時,存在一定的延時,不能立刻反應,按下按鍵時,必須有足夠的時間。附錄:總圖方針;實物圖:程序文件:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit BEEP = P14; /蜂鳴器sbit k0=P20;sbit k1=P21;sbit k2=P22;sbit k3=P23;sbit k4=P24;sbit k5=P25;sbit k6=P26;uint code Tone_Delay_Ta
8、ble = 64021,64103,64260,64400,64524,64580,64684,64777, 64820,64898,64968,65030,65058,65110,65157,65178 ;uchar code Song1_Tone=1, 1, 5, 5, 6, 6, 5,4, 4, 3 ,3, 2, 2, 1,5, 5, 4, 4, 3, 3, 2, 5, 5, 4, 4, 3, 3, 2,1,1, 5, 5, 6, 6 ,5,4 ,4, 3, 3, 2, 2, 1,0xff;uchar code Song1_Time=2,2,2,2,2,3,4,2,2,2,2,2,2,4
9、,2,2,2,2,2,2,4,2,2,2,2,2,2,5,2,2,2,2,2,2,5,2,2,2,2,2,2,5,0xff;uchar code Song2_Tone=1,2,3,1,1,2,3,1,3,4,5,3,4,5, 5,6,5,4,3,1, 5,6,5,4,3,1 ,1,5,1,0xff;uchar code Song2_Time=2,2,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0xff; uchar code Song3_Tone = 1,3,3,3,3,5,4,2,5,3,7,6,5,5,7,4,4,3,
10、6,7,2,1,0xFF; uchar code Song3_Time = 2,1,1,2,1,1,1,2,1,1,3,2,1,1,2,4,1,1,2,1,1,1,0xFF; uchar code Song4_Tone = 8,9,2,3,7,6,2,3,10,11,1,2,3,1,2,3,3,4,5,6,5,3,5,6,5,3,5,3,2,1,1,2,3,0xFF; uchar code Song4_Time = 3,6,7,2,4,5,8,1,2,2,5,5,1,9,1,1,1,1,6,1,1,2,4,1,1,2,1,1,1,1,1,2,2,1,0xFF;uchar Song_Index
11、= 0, Tone_Index = 0; /音樂片段索引,音符索引uchar *Song_Tone_Pointer, *Song_Time_Pointer; /音符指針,延時指針uchar i = 0; uchar j=0,k=0,m=0; /從當前數(shù)組中取音符的位置 void DelayMS(uint ms) /延時 uchar t; while(ms-) for (t = 0; t < 120; t+); void play0() /按鍵產(chǎn)生的INT0 ET0=1; TR0 = 0;k0=1; Song_Index = ( Song_Index + 1) % 4; /切換到下一音樂
12、switch (Song_Index) case 0: Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1: Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2: Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song
13、_Time_Pointer = Song4_Time; break; /從下一段音樂的第0個音符開始 i = 0; while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Poin
14、ter Tone_Index * 240); TR0 = 0; i+; return; void play1() ET0=1; TR0 = 0;k1=1; Song_Index = ( Song_Index + 3) % 4; /切換到上一段音樂 switch (Song_Index) case 0: Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1: Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break
15、; case 2: Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; i = 0; /從上一段音樂的第0個音符開始 while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Ton
16、e_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play2() m=!m; TR0 = 0;k2=1;if(m=0) j=1; TR0=0;ET0=0; if(m=1) ET0=1; k=1;if(j=1) /播放被暫停的音樂 switch (Song_Index) case 0: Song_Tone
17、_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1: Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2: Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; /從
18、本一段音樂的第i個音符開始 while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 Song_Index = ( Song_Index + 1) % 4; /播放下一首音樂 switch (Song_Index) case 0: Song_Tone_Pointer =
19、 Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1: Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2: Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break;continue; TR0
20、 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; if (j=0)j=1; Song_Tone_Pointer = Song1_Tone; /開始播放音樂 Song_Time_Pointer = Song1_Time; i = 0; while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri; if ( Tone_Ind
21、ex = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 Song_Index = ( Song_Index + 1) % 4; /播放下一段音樂 switch (Song_Index) case 0: Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1: Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2: Song_Tone_Pointer
22、= Song3_Tone; Song_Time_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; continue; TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play3() ET0=1; TR0 = 0; k3=1;/切換到第一段音樂 Song_Tone_Pointer = Song1_Tone; Song_Ti
23、me_Pointer = Song1_Time; Song_Index=0; /從第一段音樂的第0個音符開始 i = 0; while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_
24、Pointer Tone_Index * 240); TR0 = 0; i+; return; void play4() ET0=1; TR0 = 0;k4=1;Song_Tone_Pointer = Song2_Tone;/切換到第二段音樂 Song_Time_Pointer = Song2_Time; Song_Index=1 ; i=0; /從第二段音樂的第0個音符開始 while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index =
25、Song_Tone_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play5() ET0=1; TR0 = 0;k5=1;Song_Tone_Pointer = Song3_Tone; /切換到第三段音樂 Song_Time_Pointer = Song3_Time; Song_Index=2; /從第
26、三段音樂的第0個音符開始 i = 0; while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結束后停頓一段時間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play6() ET0=1; TR0 = 0;k6=1; Song_Tone_Pointer = Song4_Tone;/切換到第四段音樂Song_Time_Pointer = Song4_Time;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單位管理制度呈現(xiàn)大全【員工管理】十篇
- 《物業(yè)管理服務業(yè)》課件
- 三年級數(shù)學數(shù)學廣角課件
- 2024年農(nóng)業(yè)綜合開發(fā)和扶貧開發(fā)工作總結
- 2024年公司勞動社??粕习肽甑墓ぷ骺偨Y
- 空調機運輸協(xié)議三篇
- 農(nóng)業(yè)產(chǎn)品銷售主管工作總結
- 通信科技前臺工作總結
- 家政服務前臺工作總結
- 機電裝備話務員工作總結
- 年產(chǎn)30萬噸高鈦渣生產(chǎn)線技改擴建項目環(huán)評報告公示
- 07221美術設計與創(chuàng)意
- 2023年拓展加盟經(jīng)理年終總結及下一年計劃
- 網(wǎng)絡安全技術及應用 第5版 習題及答案 賈鐵軍 習題集 第1章
- 有限空間作業(yè)審批表
- 認罪認罰悔罪書(4篇)
- 煙花采購協(xié)議書
- 高考作文模擬寫作:“善言”與“敢言”+導寫及范文
- 《建筑施工承插型盤扣式鋼管支架安全技術規(guī)程》 JGJ231-2010
- 視頻監(jiān)控維護合同
- 國開大學2023年01月22588《管理線性規(guī)劃入門》期末考試參考答案
評論
0/150
提交評論