單片機(jī)控制的數(shù)字音樂盒設(shè)計(jì)_第1頁(yè)
單片機(jī)控制的數(shù)字音樂盒設(shè)計(jì)_第2頁(yè)
單片機(jī)控制的數(shù)字音樂盒設(shè)計(jì)_第3頁(yè)
單片機(jī)控制的數(shù)字音樂盒設(shè)計(jì)_第4頁(yè)
單片機(jī)控制的數(shù)字音樂盒設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、山東建筑大學(xué)信息與電氣工程學(xué)院學(xué)院課程設(shè)計(jì)說明書目 錄目 錄I摘 要I1設(shè)計(jì)目的及要求12總體設(shè)計(jì)內(nèi)容12.1 原理簡(jiǎn)介12.2 方案設(shè)計(jì)思想12.3 相關(guān)芯片說明22.3.1芯片AT89C5122.3.2 芯片LCD1286432.4 電路各模塊說明32.4.1 時(shí)鐘振蕩電路、復(fù)位電路32.4.2 蜂鳴電路42.4.3 鍵盤電路42.4.4 顯示電路52.5 系統(tǒng)的設(shè)計(jì)62.6 軟件設(shè)計(jì)62.7 仿真、安裝和調(diào)試8總結(jié)與致謝9參考文獻(xiàn)10附錄11附錄一:音樂程序11附錄二:基于單片機(jī)的數(shù)字音樂盒總電路圖19摘 要本設(shè)計(jì)是基于單片機(jī)的數(shù)字音樂盒設(shè)計(jì),由單片機(jī)AT89C51芯片和LCD顯示器為核

2、心,輔以必要的電路,構(gòu)成的一個(gè)單片機(jī)電子數(shù)字音樂盒。要求利用I/O口產(chǎn)生一定頻率的方波,驅(qū)動(dòng)蜂鳴器,發(fā)出不同的音調(diào)并采用LCD顯示信息,從而演奏樂曲(最少三首樂曲,每首不少于30秒),開機(jī)時(shí)有英文歡迎提示字符,播放時(shí)顯示歌曲序號(hào)(或名稱),可通過功能鍵選擇樂曲,暫停,播放。本設(shè)計(jì)采用4*4鍵盤,用Protel來畫系統(tǒng)硬件圖,采用匯編語(yǔ)言進(jìn)行編程,編程后利用KEIL C51來進(jìn)行編譯,再生成的HEX文件裝入芯片中,采用proteus軟件來仿真,檢驗(yàn)功能得以正常實(shí)現(xiàn)。該音樂盒的設(shè)計(jì)可以通過按鍵選擇不同的曲目,播放和暫停,并通過LCD顯示歌曲號(hào)及播放時(shí)間。關(guān)鍵詞:音樂盒;AT89C51;LCD顯示器

3、 Protel軟件;4*4鍵盤 I 1設(shè)計(jì)目的及要求設(shè)計(jì)目的:運(yùn)用單片機(jī)設(shè)計(jì)數(shù)字音樂盒設(shè)計(jì)要求:1、利用I/O口產(chǎn)生一定頻率的方波,驅(qū)動(dòng)蜂鳴器,發(fā)出不同的音調(diào),從而演奏樂曲(最少儲(chǔ)存三首樂曲,每首不少于30秒)2、采用LCD顯示信息3、開機(jī)時(shí)有英文歡迎提示字符,播放時(shí)顯示歌曲序號(hào)(或名稱)4、可通過功能鍵選擇樂曲,暫停,播放 5、顯示樂曲播放時(shí)間或剩余時(shí)間2總體設(shè)計(jì)內(nèi)容 2.1 原理簡(jiǎn)介當(dāng)鍵盤有鍵按下時(shí),判斷鍵值,啟動(dòng)計(jì)數(shù)器T0,產(chǎn)生一定頻率的脈沖,驅(qū)動(dòng)蜂鳴器,放出樂曲。同時(shí)啟動(dòng)定時(shí)器T1,顯示樂曲播放的時(shí)間,并驅(qū)動(dòng)LCD,顯示歌曲號(hào)。2.2 方案設(shè)計(jì)思想用AT89S52單片機(jī)的I/O口產(chǎn)生一

4、定頻率的方波,驅(qū)動(dòng)蜂鳴器,發(fā)出不同的音調(diào),從而演奏樂曲。共有4樂曲,每首樂曲都由相應(yīng)的按鍵控制,并且有開關(guān)鍵、暫停鍵、上一曲以及下一曲控制鍵。其組成框圖如2.2所示圖2.22.3 相關(guān)芯片說明2.3.1芯片AT89C51AT89C51是一種帶4K字節(jié)閃存可編程可擦除只讀存儲(chǔ)器(FPEROM)的低電壓,高性能CMOS 8位微處理器,俗稱單片機(jī)。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲(chǔ)器組合在

5、單個(gè)芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡(jiǎn)版本。AT89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。外形及引腳排列如圖2.3所示 圖2.32.3.2 芯片LCD12864帶中文字庫(kù)的128X64是一種具有4位/8位并行、2線或3線串行多種接口方式,內(nèi)部含有國(guó)標(biāo)一級(jí)、二級(jí)簡(jiǎn)體中文字庫(kù)的點(diǎn)陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192個(gè)16*16點(diǎn)漢字,和128個(gè)16*8點(diǎn)ASCII字符集.利用該模塊靈活的接口方式和簡(jiǎn)單、方便的操作指令,可構(gòu)成全中文人機(jī)交互圖形界面??梢燥@示8×4行16

6、5;16點(diǎn)陣的漢字.也可完成圖形顯示2.4 電路各模塊說明2.4.1 時(shí)鐘振蕩電路、復(fù)位電路時(shí)鐘電路在單片機(jī)系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個(gè)單片機(jī)應(yīng)用系統(tǒng)中,時(shí)鐘是保障系統(tǒng)正常工作的基準(zhǔn)振蕩定時(shí)信號(hào),主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機(jī)系統(tǒng)工作的快慢。為達(dá)到振蕩周期是12MHZ的要求,這里要采用12MHZ的晶振,另外有兩個(gè)22P的獨(dú)石電容,兩晶振引腳分別連到XTAL1和XTAL2振蕩脈沖輸入引腳。其電路圖如2.4.1所示圖2.4.12.4.2 蜂鳴電路利用PNP管(9012)放大驅(qū)動(dòng)。基極接10K歐姆的電阻,發(fā)射極接蜂鳴器,集電極接電源。其電路圖如圖2

7、.4.2所示圖2.4.22.4.3 鍵盤電路 鍵盤在單片機(jī)應(yīng)用系統(tǒng)中能實(shí)現(xiàn)向單片機(jī)輸入數(shù)據(jù),傳送命 圖3令等功能,是人工干預(yù)單片機(jī)的主要手段。鍵盤模塊采用4*4按鍵模式(S1-S16),接在單片機(jī)的P0口上。當(dāng)用手按下一個(gè)鍵時(shí),往往按鍵在閉合位置和斷開位置之間跳幾下才穩(wěn)定到閉合狀態(tài)的情況;在釋放一個(gè)鍵時(shí),也回會(huì)出現(xiàn)類似的情況。這就是抖動(dòng)。抖動(dòng)的持續(xù)時(shí)間隨鍵盤材料和操作員而異,不過通常總是不大于10ms。很容易想到,抖動(dòng)問題不解決就會(huì)引起對(duì)閉合鍵的識(shí)別。用軟件方法可以很容易地解決抖動(dòng)問題,這就是通過延遲10ms來等待抖動(dòng)消失,這之后,在讀入鍵盤碼。其電路如圖2.4.3所示圖2.4.32.4.4

8、顯示電路顯示電路采用LCD模塊,LCD顯示模塊采用LCD12864。LCD顯示模塊電路圖和驅(qū)動(dòng)模塊電路如圖2.4.4所示。圖2.4.42.5 系統(tǒng)的設(shè)計(jì)其系統(tǒng)總電路圖見附錄一2.6 軟件設(shè)計(jì)主模塊是系統(tǒng)軟件的主框架。結(jié)構(gòu)化程序設(shè)計(jì)一般有“自上而下”和“自下而上”兩種方式,“自上而下”法的核心就是主框架的構(gòu)建。它的合理與否關(guān)系到程序最終的功能的多少和性能的好壞。本程序可以實(shí)現(xiàn)課程設(shè)計(jì)的基本要求,并可以通過按鍵播放多首歌曲,主程序流程圖和顯示子程序的流程圖如圖2.6所示。數(shù)字音樂盒主程序流程圖顯示子程序流程圖2.7 仿真、安裝和調(diào)試仿真部分采用Keil軟件,進(jìn)行編程和仿真,修改編程錯(cuò)誤以及連接錯(cuò)誤

9、。總結(jié)與致謝學(xué)了一學(xué)期的單片機(jī),對(duì)單片機(jī)的硬件設(shè)計(jì),軟件設(shè)計(jì)掌握的深度不夠,但通過此次課程設(shè)計(jì),卻改變了很多,首先對(duì)于硬件電路的工作原理有了進(jìn)一步的學(xué)習(xí),同樣就有了進(jìn)一步的認(rèn)識(shí);其次軟件方面,在程序的設(shè)計(jì),程序的調(diào)試方面都學(xué)到了很多東西,這是第一次編寫單片機(jī)的大程序,很有成就感。在此次單片機(jī)的課程設(shè)計(jì)中,我不但對(duì)單片機(jī)的基礎(chǔ)知識(shí)掌握的更牢固,而且對(duì)其硬件和軟件方面有了更深一層的認(rèn)識(shí)。在做數(shù)字音樂盒的課程設(shè)計(jì)時(shí),我掌握了AT89C51單片機(jī)的內(nèi)部振蕩方式及振蕩頻率和單片機(jī)的復(fù)位電路形式。此次設(shè)計(jì)的軟件編程采用的是我們所學(xué)的匯編語(yǔ)言,通過對(duì)數(shù)字音樂盒的編程,我更熟悉了鍵盤掃描和動(dòng)態(tài)顯示的編程以及定

10、時(shí)計(jì)數(shù)器和中斷的編程。鞏固了對(duì)AT89C51的內(nèi)部結(jié)構(gòu)和接口擴(kuò)展的知識(shí)。本次設(shè)計(jì)中,我用到了protel99畫圖軟件,keil C51編程軟件。以前雖然對(duì)protel99有一定的認(rèn)識(shí),能運(yùn)用其畫圖,不缺不熟練,這次設(shè)計(jì)是我對(duì)其的熟練程度提高了不少。參考文獻(xiàn)1 許珉.單片機(jī)原理及應(yīng)用M.北京:中國(guó)電力出版社,2007.08 2 John Markus.電子電路大全M.北京:計(jì)量出版社,19953 閻石.數(shù)字電子技術(shù)基礎(chǔ)M.北京:高等教育出版社,1998.12,第4版4 鄧元慶.數(shù)字電路與邏輯設(shè)計(jì)M.北京:電子工業(yè)出版社,2001 5 高鋒,單片微型計(jì)算機(jī)原理與接口技術(shù).科學(xué)出版社,2003年.

11、6 三恒星科技.MCS-51單片機(jī)原理與應(yīng)用實(shí)例M. 北京:電子工業(yè)出版社,2008.017 王為青,程國(guó)鋼.單片機(jī)Keil Cx51應(yīng)用開發(fā)技術(shù)M. 北京:人民郵電出版社,2007.02 8 李傳軍,單片機(jī)原理及應(yīng)用(第一版).河南科學(xué)技術(shù)出版社,2006年.9 楊志忠.數(shù)字電子技術(shù).高等教育出版社(第二版)M.2003年.10 張友德.單片微型機(jī)原理應(yīng)用與實(shí)驗(yàn).上海復(fù)旦大學(xué)出版社,2000附錄附錄一:音樂程序#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit BEEP = P14;

12、 /蜂鳴器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_Table = 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

13、, 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,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,

14、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,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; uc

15、har 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 = 0, Tone_Index = 0; /音樂片段索引,音符索引uchar *Song_Tone_Pointer, *Song_Time_Pointer; /音符指針,延時(shí)指針uchar i = 0; uchar j=0,k=0,m=0; /從當(dāng)前數(shù)組中取音符的位置 void DelayMS(uint ms) /延時(shí) uchar t; while(ms-) for (t

16、= 0; t < 120; t+); void play0() /按鍵產(chǎn)生的INT0 ET0=1; TR0 = 0;k0=1; 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: So

17、ng_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; /從下一段音樂的第0個(gè)音符開始 i = 0; while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri;

18、if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結(jié)束后停頓一段時(shí)間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer 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

19、_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; i = 0; /從上一段音樂的第0個(gè)音符開始 while

20、(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); /每段音樂播放結(jié)束后停頓一段時(shí)間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play2() m=!m; T

21、R0 = 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_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_Ti

22、me_Pointer = Song3_Time; break;case 3: Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; /從本一段音樂的第i個(gè)音符開始 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

23、); /每段音樂播放結(jié)束后停頓一段時(shí)間 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 = Song3_Tone; Song_Time_Pointer

24、 = 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+; if (j=0)j=1; Song_Tone_Pointer = Song1_Tone; /開始播放音樂 Song_Time_Pointer = Song1_Time; i = 0; while (k0=1&&k1=1&&

25、amp;k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointeri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結(jié)束后停頓一段時(shí)間 Song_Index = ( Song_Index + 1) % 4; /播放下一段音樂 switch (Song_Index) case 0: Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time;

26、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 = 1; DelayMS( Song_Time_Pointer Tone_Index

27、* 240); TR0 = 0; i+; return; void play3() ET0=1; TR0 = 0; k3=1;/切換到第一段音樂 Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; Song_Index=0; /從第一段音樂的第0個(gè)音符開始 i = 0; while (k0=1&&k1=1&&k2=1&&k3=1&&k4=1&&k5=1&&k6=1) Tone_Index = Song_Tone_Pointe

28、ri; if ( Tone_Index = 0xFF ) i = 0; DelayMS(2000); /每段音樂播放結(jié)束后停頓一段時(shí)間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_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個(gè)音符開

29、始 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); /每段音樂播放結(jié)束后停頓一段時(shí)間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play5()

30、 ET0=1; TR0 = 0;k5=1;Song_Tone_Pointer = Song3_Tone; /切換到第三段音樂 Song_Time_Pointer = Song3_Time; Song_Index=2; /從第三段音樂的第0個(gè)音符開始 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); /每段音樂播放結(jié)束后停頓一段時(shí)間 continue; /繼續(xù)播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論