欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 可編程樂(lè)曲演奏器的設(shè)計(jì)論文 含單片機(jī)程序 [打印本頁(yè)]

作者: 51黑電子迷    時(shí)間: 2017-8-13 01:06
標(biāo)題: 可編程樂(lè)曲演奏器的設(shè)計(jì)論文 含單片機(jī)程序
可編程樂(lè)曲演奏器的設(shè)計(jì)
本設(shè)計(jì)是一個(gè)基于AT89C51系列單片機(jī)的樂(lè)曲演奏器,通過(guò)硬件電路制作以及軟件編譯,設(shè)計(jì)制作出一個(gè)可編程的樂(lè)曲演奏器。該演奏器主要由最小單片機(jī)系統(tǒng)、鍵盤控制、數(shù)碼管、發(fā)光二極管以及蜂鳴器組成。使用三個(gè)按鍵控制演奏器,兩個(gè)用來(lái)切換樂(lè)曲,另一個(gè)控制開始、暫停,本演奏器共有七首樂(lè)曲。播放歌曲時(shí),蜂鳴器發(fā)出某個(gè)音調(diào),與之對(duì)應(yīng)的發(fā)光二極管亮起。本設(shè)計(jì)利用KEIL編程軟件對(duì)演奏源程序進(jìn)行編程并調(diào)試,配合PROTEUS仿真軟件對(duì)硬件進(jìn)行仿真調(diào)試,實(shí)現(xiàn)了樂(lè)曲演奏的功能,節(jié)約了設(shè)計(jì)時(shí)間。

目錄

1設(shè)計(jì)任務(wù)
1.1 設(shè)計(jì)目的和意義
1.2 設(shè)計(jì)任務(wù)要求
2系統(tǒng)硬件電路的設(shè)計(jì)
2.1 總體設(shè)計(jì)方案
2.1.1 總體設(shè)計(jì)原理
2.1.2 總體設(shè)計(jì)框圖
2.2 具體電路設(shè)計(jì)              2
2.2.1 最小單片機(jī)系統(tǒng)              2
2.2.2 發(fā)光二極管電路              4
2.2.3 數(shù)碼管電路
2.2.4 蜂鳴器電路              5
2.2.5 鍵盤控制電路              5
2.3 整體硬件電路              6
2.4 系統(tǒng)所用元器件              7
3軟件設(shè)計(jì)              7
3.1 音調(diào)、節(jié)拍以及編碼的確定方法              7
3.1.1 音調(diào)的確定              7
3.1.2 節(jié)拍的確定              9
3.1.3 編碼的確定              10
3.2 軟件設(shè)計(jì)思路              11
3.3 主函數(shù)的設(shè)計(jì)              11
3.4 定時(shí)器初始函數(shù)的設(shè)計(jì)              12
3.5 延時(shí)函數(shù)的設(shè)計(jì)              12
3.6 樂(lè)曲演奏函數(shù)的設(shè)計(jì)              13
3.7 定時(shí)器0中斷函數(shù)的設(shè)計(jì)              14
4系統(tǒng)仿真與調(diào)試              15
4.1系統(tǒng)軟件程序的調(diào)試              15
4.2系統(tǒng)硬件電路的仿真與調(diào)試              16
5總結(jié)              17
5.1本系統(tǒng)的優(yōu)缺點(diǎn)              17
5.2心得體會(huì)
6參考文獻(xiàn)              18
附錄              19

1 設(shè)計(jì)任務(wù)1.1  設(shè)計(jì)目的和意義
本次課程設(shè)計(jì)是應(yīng)用單片機(jī)原理設(shè)計(jì)可編程樂(lè)曲演奏器的硬件電路,并利用C語(yǔ)言進(jìn)行程序設(shè)計(jì)。課程設(shè)計(jì)的目的就是配合本課程的教學(xué)和平時(shí)實(shí)驗(yàn),以達(dá)到鞏固消化課程的內(nèi)容的目的,進(jìn)一步加強(qiáng)綜合應(yīng)用能力及單片機(jī)應(yīng)用系統(tǒng)開發(fā)和設(shè)計(jì)能力的訓(xùn)練,啟發(fā)創(chuàng)新思維,使之具有獨(dú)立單片機(jī)產(chǎn)品和科研的基本技能,是培養(yǎng)綜合運(yùn)用所學(xué)知識(shí)的過(guò)程,是知識(shí)轉(zhuǎn)化為能力和能力轉(zhuǎn)化為工程素質(zhì)的重要階段。
1.2 設(shè)計(jì)任務(wù)要求
可編程樂(lè)曲演奏器的設(shè)計(jì),具體內(nèi)容如下:
2 系統(tǒng)硬件電路的設(shè)計(jì)2.1 總體設(shè)計(jì)方案2.1.1 總體設(shè)計(jì)原理
通過(guò)單片機(jī)的定時(shí)器產(chǎn)生一定長(zhǎng)度的方波,驅(qū)動(dòng)蜂鳴器發(fā)聲。產(chǎn)生音頻脈沖,只需算出某一音頻的周期(1/音頻),然后取半周期的時(shí)間定時(shí)。利用定時(shí)器計(jì)時(shí)這個(gè)半周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O口反相,就可在I/O腳上得到此頻率的脈沖。如中音D0,頻率為523HZ,其周期T=1/523=1912微秒,因此只要令計(jì)數(shù)器定時(shí)1912/2=956,在每計(jì)數(shù)956次時(shí)將I/O口反相,就可得到中音D0(523HZ)。
當(dāng)鍵盤有鍵按下時(shí),判斷鍵值,啟動(dòng)計(jì)數(shù)器T0,產(chǎn)生一定頻率的脈沖,由P1口輸出驅(qū)動(dòng)蜂鳴器,放出樂(lè)曲。通過(guò)單片機(jī)P0口控制數(shù)碼管,實(shí)現(xiàn)歌曲序號(hào)的顯示;功能鍵盤采用按鍵開關(guān),通過(guò)單片機(jī)P3口控制,實(shí)現(xiàn)歌曲播放順序的調(diào)換和暫停播放功能;彩燈是由普通發(fā)光二極管代替,通過(guò)單片機(jī)P2口控制,實(shí)現(xiàn)閃爍效果。
通過(guò)按下功能鍵實(shí)現(xiàn)上一首和下一首及開始/暫停播放,同時(shí)有數(shù)碼管顯示當(dāng)前播放歌曲的序號(hào),蜂鳴器播放出音樂(lè),伴有彩燈閃爍。
2.1.2 總體設(shè)計(jì)框圖
單片機(jī)電源供電后,晶振電路產(chǎn)生單片機(jī)所需時(shí)鐘信號(hào),通過(guò)功能鍵產(chǎn)生外部中斷,控制演奏器的上一首和下一首曲目,再由I/O接口輸出控制蜂鳴器發(fā)聲,LED顯示,彩燈閃爍。另外,復(fù)位電路在于營(yíng)造一個(gè)程序運(yùn)行的初始狀態(tài),在程序出錯(cuò)時(shí),重新啟動(dòng)單片機(jī)工作?傮w設(shè)計(jì)框圖如圖1所示。

圖1 總體設(shè)計(jì)框圖

編程設(shè)置好定時(shí)時(shí)間,通過(guò)編程器寫入AT89C51單片機(jī)系統(tǒng)。由AT89C51單片機(jī)的定時(shí)器每秒鐘通過(guò)P0.0-P0.7口控制LED數(shù)碼顯示,復(fù)位信號(hào)由按鈕輸入,每按下一次,系統(tǒng)恢復(fù)原設(shè)定狀態(tài)。電源,晶振部分,復(fù)位電路,單片機(jī),LED,功能鍵,蜂鳴器部分后面均有詳細(xì)介紹。

2.2  具體電路設(shè)計(jì)

2.2.1 最小單片機(jī)系統(tǒng)
     圖2  AT89C51系列單片機(jī)

單片機(jī)最小系統(tǒng)以AT89C51為核心,外加時(shí)鐘和復(fù)位電路,如圖2所示。電路結(jié)構(gòu)簡(jiǎn)單,抗干擾能力強(qiáng),成本相對(duì)較低,非常符合本設(shè)計(jì)的所有要求.AT89C51單片機(jī)系列是在MCS-51系列的基礎(chǔ)上發(fā)展起來(lái)的,是當(dāng)前8位單片機(jī)的典型代表,采用CHMOS工藝,即互補(bǔ)金屬氧化物的HMOS工藝, CHMOS是CMOS和HMOS的結(jié)合,具有HMOS高速度和高密度的特點(diǎn),還具有CMOS低功耗的特點(diǎn).
單片機(jī)需要一個(gè)時(shí)間基準(zhǔn)來(lái)為各種操作提供秩序,此電路叫時(shí)鐘電路,采用不同的接線方式可以獲得不同時(shí)鐘電路,有內(nèi)部時(shí)鐘電路和外部時(shí)鐘電路,外部時(shí)鐘電路會(huì)使電路復(fù)雜,故采用的是內(nèi)部時(shí)鐘電路。時(shí)鐘電路在單片機(jī)的外部通過(guò)XTAL1,XTAL2這兩個(gè)引腳跨接晶體振蕩器和微調(diào)電容,構(gòu)成穩(wěn)定的自激振蕩器.本系統(tǒng)采用的為1MHz的晶振,一個(gè)機(jī)器周期為12us,C1,C2為22pF。
復(fù)位電路的基本功能是:系統(tǒng)上電時(shí)提供復(fù)位信號(hào),直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號(hào)。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時(shí)才撤銷復(fù)位信號(hào),以防電源開關(guān)或電源插頭分-合過(guò)程中引起的抖動(dòng)而影響復(fù)位。
復(fù)位電路分為上電自動(dòng)復(fù)位和按鍵手動(dòng)復(fù)位RST引腳是復(fù)位信號(hào)的輸入端,復(fù)位信號(hào)是高電平有效.這次采用的是手動(dòng)復(fù)位。復(fù)位通過(guò)電容C2和電阻R1來(lái)實(shí)現(xiàn),按鍵手動(dòng)復(fù)位是圖中復(fù)位鍵來(lái)實(shí)現(xiàn)的。


2.2.2 發(fā)光二極管電路
播放歌曲時(shí),單片機(jī)通過(guò)定時(shí)器產(chǎn)生一定長(zhǎng)度方波,驅(qū)動(dòng)蜂鳴器發(fā)出某個(gè)音調(diào),產(chǎn)生音頻脈沖,使與之對(duì)應(yīng)的發(fā)光二極管亮起。電路如圖3所示。

圖3 發(fā)光二極管電路圖


2.2.3 數(shù)碼管電路
播放樂(lè)曲時(shí),數(shù)碼管電路顯示當(dāng)前播放樂(lè)曲序號(hào)。
樂(lè)曲序號(hào)顯示部分用數(shù)碼管來(lái)顯示,LED顯示器件是通過(guò)發(fā)光二極管顯示字段的器件。在單片機(jī)控制系統(tǒng)中常用的是由7段LED數(shù)碼管,它的顯示塊中有8個(gè)發(fā)光二極管,7個(gè)發(fā)光二極管組成字符“8”,1個(gè)發(fā)光二極管構(gòu)成小數(shù)點(diǎn),因此有人稱7段LED數(shù)碼管為8段顯示器。LED數(shù)碼管的電路圖如圖4所示。
圖4  LED數(shù)碼管電路圖
2.2.4 蜂鳴器電路
一般所指的蜂鳴器是以壓電陶瓷為主要元件的。壓電陶瓷是一類有將壓力與電流相互轉(zhuǎn)換能力的特殊陶瓷。這種能力緣于其特殊的晶體結(jié)構(gòu)。當(dāng)壓電陶瓷在一定方向上受到一個(gè)壓力使其晶體結(jié)構(gòu)發(fā)生形變時(shí),它就會(huì)在內(nèi)部產(chǎn)生一個(gè)電流,并且電流的變化與壓力的變化密切相關(guān)。反之亦然。所以利用這一特性,在壓電陶瓷上通過(guò)一定頻率的電流,就會(huì)引起壓電陶瓷微小形變,這一形變帶動(dòng)空氣發(fā)生振動(dòng),如果頻率適當(dāng),就可以被人耳所聽見,也就是產(chǎn)生了蜂鳴聲。
蜂鳴器的作用:蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。
蜂鳴器的分類:蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
蜂鳴器的電路圖形符號(hào):蜂鳴器在電路中用字母“H”或“HA”(舊標(biāo)準(zhǔn)用“FM”、“LB”、“JD”等)表示。
蜂鳴器電路如圖5所示。


圖5 蜂鳴器電路圖

2.2.5 鍵盤控制電路

通過(guò)按下功能鍵實(shí)現(xiàn)上一首和下一首及開始/暫停播放。電路如圖6所示。

鍵盤是由一組按壓式或觸摸式開關(guān)構(gòu)成的陣列,是一種常用的輸入設(shè)備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。

非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴(yán)格的對(duì)應(yīng)關(guān)系,而要由所用的程序來(lái)決定。非編碼鍵盤的硬件接口簡(jiǎn)單,但是要占用較多的CPU時(shí)間,通常采用可編程鍵盤管理芯片來(lái)克服這個(gè)缺點(diǎn)。本設(shè)計(jì)使用兩種按鍵,一種是按鍵式非編碼鍵盤和輕觸式非編碼開關(guān)。

圖6 鍵盤控制電路圖


2.3  整體硬件電路

整體硬件電路如圖7所示。

圖7 整體硬件電路圖


2.4  系統(tǒng)所用元器件

表1  本系統(tǒng)所用的元器件

元器件名稱
數(shù)量
AT89C51
1
按鈕 BUTTON
4
數(shù)碼管 7SEG-MPX1-CA
1
SOUNDER
1
CAP
2
CAP-ELEC
1
CRYSTAL
1
NPN
1
電阻RES
2
電源

導(dǎo)線
若干


3軟件設(shè)計(jì)3.1 音調(diào)、節(jié)拍以及編碼的確定方法  
一般說(shuō)來(lái),單片機(jī)演奏音樂(lè)基本都是單音頻率,它不包含相應(yīng)幅度的諧波頻率,也就是說(shuō)不能像電子琴那樣能奏出多種音色的聲音。因此單片機(jī)奏樂(lè)只需弄清楚兩個(gè)概念即可,也就是“音調(diào)”和節(jié)拍表示一個(gè)音符唱多長(zhǎng)的時(shí)間。

3.1.1 音調(diào)的確定

不同音高的樂(lè)音是用C、D、E、F、G、A、B來(lái)表示,這7個(gè)字母就是音樂(lè)的音名,它們一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成簡(jiǎn)譜的1、2、3、4、5、6、7,相當(dāng)于漢字“多來(lái)米發(fā)梭拉西”的讀音,這是唱曲時(shí)樂(lè)音的發(fā)音,所以叫“音調(diào)”,即Tone。把C、D、E、F、G、A、B這一組音的距離分成12個(gè)等份,每一個(gè)等份叫一個(gè)“半音”。兩個(gè)音之間的距離有兩個(gè)“半音”,就叫“全音”。在鋼琴等鍵盤樂(lè)器上,C–D、D–E、F–G、G–A、A–B兩音之間隔著一個(gè)黑鍵,他們之間的距離就是全音;E–F、B–C兩音之間沒(méi)有黑鍵相隔,它們之間的距離就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它們的左上角加上﹟號(hào)或者b號(hào)的叫變化音。﹟叫升記號(hào),表示把音在原來(lái)的基礎(chǔ)上升高半音,b叫降記音,表示在原來(lái)的基礎(chǔ)上降低半音。例如高音DO的頻率(1046Hz)剛好是中音DO的頻率(523Hz)的一倍,中音DO的頻率(523Hz)剛好是低音DO頻率(266 Hz)的一倍;同樣的,高音RE的頻率(1175Hz)剛好是中音RE的頻率(587Hz)的一倍,中音RE的頻率(587Hz)剛好是低音RE頻率(294 Hz)的一倍。
要產(chǎn)生音頻脈沖,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時(shí)間。利用定時(shí)器計(jì)時(shí)這半個(gè)周期時(shí)間,每當(dāng)計(jì)時(shí)到后就將輸出脈沖的I/O反相,然后重復(fù)計(jì)時(shí)此半周期時(shí)間再對(duì)I/O反相,就可在I/O腳上得到此頻率的脈沖。
利用AT89C51的內(nèi)部定時(shí)器使其工作在計(jì)數(shù)器模式MODE1下,改變計(jì)數(shù)值TH0及TL0以產(chǎn)生不同頻率的方法。
此外結(jié)束符和休止符可以分別用代碼00H和FFH來(lái)表示,若查表結(jié)果為00H,則表示曲子終了;若查表結(jié)果為FFH,則產(chǎn)生相應(yīng)的停頓效果。
例如頻率為523Hz,其周期T=1/523=1912us,因此只要令計(jì)數(shù)器計(jì)時(shí)956us/1us=956,在每次技術(shù)956次時(shí)將I/O反相,就可得到中音DO(523Hz)。
計(jì)數(shù)脈沖值與頻率的關(guān)系公式如下:
N=Fi 2 Fr
N:計(jì)算值;                            Fi:內(nèi)部計(jì)時(shí)一次為1us,故其頻率為1MHz;
其計(jì)數(shù)值的求法如下:
T=65536-N=65536-Fi2Fr
例如:設(shè)K=65536,F(xiàn)=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的計(jì)算值
T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
低音DO的T=65536-500000/523=64580
低音DO的T=65536-500000/1047=65059
C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表如表2所示。

表2  C調(diào)各音符頻率與計(jì)數(shù)值T的對(duì)照表
低音
頻率
T
參數(shù)
中音
頻率
T
參數(shù)
高音
頻率
T
參數(shù)
Do
262
1908
229
Do
523
956
115
Do
1046
57
57
Do﹟
277
1805
217
Do﹟
554
903
108
Do﹟
1109
54
54
Re
294
1701
204
Re
587
852
102
Re
1175
51
51
Re﹟
311
1608
193
Re﹟
622
804
97
Re﹟
1245
48
48
Mi
330
1515
182
Mi
659
759
91
Mi
1318
45
45
Fa
349
1433
172
Fa
698
716
86
Fa
1397
43
43
Fa﹟
370
1351
162
Fa﹟
740
676
81
Fa﹟
1480
41
41
So
392
1276
153
So
784
638
77
So
1568
38
38
So﹟
415
1205
145
So﹟
831
602
72
So﹟
1661
36
36
La
440
1136
136
La
880
568
68
La
1760
34
34
La﹟
464
1078
129
La﹟
932
536
64
La﹟
1865
32
32
Si
494
1012
121
Si
988
506
61
Si
1976
30
30


3.1.2 節(jié)拍的確定

若要構(gòu)成音樂(lè),光有音調(diào)是不夠的,還需要節(jié)拍,讓音樂(lè)具有旋律(固定的律動(dòng)),而且可以調(diào)節(jié)各個(gè)音的快滿度!肮(jié)拍”,即Beat,簡(jiǎn)單說(shuō)就是打拍子,就像我們聽音樂(lè)不自主的隨之拍手或跺腳。若1拍實(shí)0.5s,則1/4 拍為0.125s。至于1拍多少s,并沒(méi)有嚴(yán)格規(guī)定,就像人的心跳一樣,大部分人的心跳是每分鐘72下,有些人快一點(diǎn),有些人慢一點(diǎn),只要聽的悅耳就好。音持續(xù)時(shí)間的長(zhǎng)短即時(shí)值,一般用拍數(shù)表示。休止符表示暫停發(fā)音。
一首音樂(lè)是由許多不同的音符組成的,而每個(gè)音符對(duì)應(yīng)著不同頻率,這樣就可以利用不同的頻率的組合,加以與拍數(shù)對(duì)應(yīng)的延時(shí),構(gòu)成音樂(lè)。了解音樂(lè)的一些基礎(chǔ)知識(shí),我們可知產(chǎn)生不同頻率的音頻脈沖即能產(chǎn)生音樂(lè)。對(duì)于單片機(jī)來(lái)說(shuō),產(chǎn)生不同頻率的脈沖是非常方便的,利用單片機(jī)的定時(shí)/計(jì)數(shù)器來(lái)產(chǎn)生這樣的方波頻率信號(hào)。因此,需要弄清楚音樂(lè)中的音符和對(duì)應(yīng)的頻率,以及單片機(jī)定時(shí)計(jì)數(shù)的關(guān)系。

表3 節(jié)拍與節(jié)拍碼對(duì)照
節(jié)拍碼
節(jié)拍數(shù)
節(jié)拍碼
節(jié)拍數(shù)
1
1/4拍
1
1/8拍
2
2/4拍
2
1/4拍
3
3/4拍
3
3/8拍
4
1拍
4
2/1拍
5
1又1/4拍
5
5/8拍
6
1又1/2拍
6
3/4拍
8
2拍
8
1拍
A
2又1/2拍
A
1又1/4拍
C
3拍
C
1又1/2拍
F
3又3/4拍




每個(gè)音符使用1個(gè)字節(jié),字節(jié)的高4位代表音符的高低,低4位代表音符的節(jié)拍,表3為節(jié)拍碼的對(duì)照。如果1拍為0.4秒,1/4拍實(shí)0.1秒,只要設(shè)定延遲時(shí)間就可求得節(jié)拍的時(shí)間。假設(shè)1/4拍為1DELAY,則1拍應(yīng)為4DELAY,以此類推。所以只要求得1/4拍的DELAY時(shí)間,其余的節(jié)拍就是它的倍數(shù),如表4為1/4和1/8節(jié)拍的時(shí)間設(shè)定。

表4 1/4和1/8節(jié)拍的時(shí)間設(shè)定
曲調(diào)值
DELAY
曲調(diào)值
DELAY
調(diào)4/4
125毫秒
調(diào)4/4
62毫秒
調(diào)3/4
187毫秒
調(diào)3/4
94毫秒
調(diào)2/4
250毫秒
調(diào)2/4
125毫秒


3.1.3 編碼的確定
do re mi fa so la si分別編碼為1~7,重音do編為8,重音re編為9,停頓編為0。播放長(zhǎng)度以十六分音符為單位(在本程序中為165ms),一拍即四分音符等于4個(gè)十六分音符,編為4,其它的播放時(shí)間以此類推。音調(diào)作為編碼的高4位,而播放時(shí)間作為低4位,如此音調(diào)和節(jié)拍就構(gòu)成了一個(gè)編碼。以0xff作為曲譜的結(jié)束標(biāo)志。
舉例1:音調(diào)do,發(fā)音長(zhǎng)度為兩拍,即二分音符,將其編碼為0x18。
舉例2:音調(diào)re,發(fā)音長(zhǎng)度為半拍,即八分音符,將其編碼為0x22
歌曲播放的設(shè)計(jì)。先將歌曲的簡(jiǎn)譜進(jìn)行編碼,儲(chǔ)存在一個(gè)數(shù)據(jù)類型為unsigned char 的數(shù)組中。程序從數(shù)組中取出一個(gè)數(shù),然后分離出高4位得到音調(diào),接著找出相應(yīng)的值賦給定時(shí)器0,使之定時(shí)操作蜂鳴器,得出相應(yīng)的音調(diào);接著分離出該數(shù)的低4位,得到延時(shí)時(shí)間,接著調(diào)用軟件延時(shí)。

表5 簡(jiǎn)譜對(duì)應(yīng)的簡(jiǎn)譜碼、T值、節(jié)拍數(shù)
簡(jiǎn)譜
發(fā)音
簡(jiǎn)譜碼
T值
節(jié)拍碼
節(jié)拍數(shù)
5
低音SO
1
64260
1
1/4拍
6
低音LA
2
64400
2
2/4拍
7
低音TI
3
64524
3
3/4拍
1
中音DO
4
64580
4
1拍
2
中音RE
5
64684
5
1又1/4拍
3
中音MI
6
64777
6
1又1/2拍
4
中音FA
7
64820
8
2拍
5
中音SO
8
64898
A
2又1/2拍
6
中音LA
9
64968
C
3拍
7
中音TI
A
65030
F
3又3/4拍
1
高音DO
B
65058


2
高音RE
C
65110


3
高音MI
D
65157


4
高音FA
E
65178


5
高音SO
F
65217




3.2 軟件設(shè)計(jì)思路
定時(shí)器初始化后,加載延時(shí)函數(shù)、樂(lè)曲演奏函數(shù)、定時(shí)器中斷函數(shù),按鍵控制主函數(shù)演奏樂(lè)曲。樂(lè)曲演奏函數(shù)控制七首樂(lè)曲演奏,并顯示當(dāng)前曲目序號(hào);按鍵控制切換選擇樂(lè)曲并控制開始、暫停,發(fā)光二極管閃爍。
3.3 主函數(shù)的設(shè)計(jì)
主函數(shù)流程圖如圖8所示。
圖8 主函數(shù)流程圖

主函數(shù)程序:
void main()
{
while(key3==1);
led1=0;
led2=1;
InitTimer();
while(1)
{
  Musics_Play();
  if(key1==0)
  {
   delay1ms(10);
   while(key1==0);
   music_value++;
   if(music_value>7) music_value=1;
  }
  if(key2==0)
  {
   delay1ms(10);
   while(key2==0);
   music_value--;
   if(music_value==0) music_value=7;
  }                              
}
}
3.4定時(shí)器初始函數(shù)的設(shè)計(jì)
void InitTimer(void)
{
  TMOD=0x01;   //定時(shí)器0置于方式一,X=65536-N=

  IT0=1;

  ET0=1;

  EA=1;        //打開總中斷

}
3.5延時(shí)函數(shù)的設(shè)計(jì)
void delay150ms(void)  /*延時(shí)1/4拍時(shí)間即150ms*/
{
  unsigned char a,b,c;

    for(c=3;c>0;c--)
        for(b=80;b>0;b--)
                               {
                                if(P3!=0xff) {break;}            
            for(a=214;a>0;a--);
                                          }

}

3.6樂(lè)曲演奏函數(shù)的設(shè)計(jì)
樂(lè)曲演奏函數(shù)流程圖如圖9所示。

圖9 樂(lè)曲演奏流程圖



void Musics_Play()
{
unsigned int j=0,i=0,k=0;
//------------------------音樂(lè)選擇
switch(music_value)            
{
  case 1 :song=song1;
   led3=1;
   P0=tab[1];
   delay(50);
   break;
     .
     .
     .
//---------------------------節(jié)拍音調(diào)讀取

while(*(song+j)!=0xFF&&cycle_flag)
{
  beat=*(song+j)&0x0F;        //取出節(jié)拍
  sound=*(song+j)>>4;       //取出音
  TH0=tones[2*sound];
  TL0=tones[2*sound+1];
  TR0=1;
  if ((tones[2*sound]==0xFF)&&(tones[2*sound+1]==0xFF)) TR0=0;
  for(i=beat;i>0;i--){delay150ms();}
  TR0=0;
  if(sound>=8) sound=7;
  led1=!led1;
  led2=!led2;
  j++;
  k++;
  if(k==7) k=0;
}
}
3.7定時(shí)器0中斷函數(shù)的設(shè)計(jì)
void Timer0Interrupt(void) interrupt 1
{

  TH0=tones[2*sound];

  TL0=tones[2*sound+1];

  speaker = !speaker;

}


4系統(tǒng)仿真與調(diào)試
4.1 系統(tǒng)軟件程序的調(diào)試

圖10 軟件程序運(yùn)行調(diào)試圖


如圖10所示,0 Error(s),0 Warning(s)。運(yùn)行結(jié)果無(wú)錯(cuò),正常運(yùn)行。
4.2 系統(tǒng)硬件電路的仿真與調(diào)試

圖11 系統(tǒng)硬件電路調(diào)試圖

如圖11所示,最小單片機(jī)系統(tǒng)運(yùn)行正常;驅(qū)動(dòng)蜂鳴器運(yùn)行正常;數(shù)碼管顯示正常;發(fā)光二極管正常閃爍;按鍵控制正常。

圖12 產(chǎn)生方波調(diào)試圖

如圖12所示,單片機(jī)正常產(chǎn)生不同頻率的方波。

5總結(jié)
5.1 本系統(tǒng)的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):本系統(tǒng)實(shí)現(xiàn)了:
用定時(shí)器T0方式1來(lái)產(chǎn)生不同頻率的方波、由P1.0輸出驅(qū)動(dòng)喇叭,演奏最少兩段樂(lè)曲、有按鍵切換選擇樂(lè)曲、開始/暫停、有發(fā)光二極管伴隨音頻脈沖閃爍、數(shù)碼管顯示當(dāng)前演奏曲目序號(hào)等功能。
缺點(diǎn):
不能顯示樂(lè)曲名稱,功能較少。

5.2 心得體會(huì)

單片機(jī)的設(shè)計(jì)至今為止已經(jīng)進(jìn)入了令人鼓舞的階段,在進(jìn)行了兩周時(shí)間的摸索與實(shí)驗(yàn),使我不僅僅是掌握單片機(jī)入門軟件與硬件的常用設(shè)計(jì)與功能,同時(shí)也了解對(duì)于一項(xiàng)設(shè)計(jì)研究的制作過(guò)程所需要的詳細(xì)步驟和具體的實(shí)現(xiàn)方法的。
當(dāng)然在這次寶貴的課程設(shè)計(jì)活動(dòng)中,經(jīng)驗(yàn)才是對(duì)于我們最大的收獲,而且還增強(qiáng)了自身對(duì)未知問(wèn)題以及對(duì)知識(shí)的深化認(rèn)識(shí)的能力,用受益匪淺這個(gè)詞語(yǔ)來(lái)概括這次難忘的活動(dòng)我覺(jué)得再合適不過(guò)了。但是,光是完成了作品還是不可以自我滿足的,在從一開始的時(shí)候就懷著將作品制作得更加人性化,更加令人滿意,更加地使功能完美又方便地被應(yīng)用領(lǐng)域這個(gè)最終目的下,隨著對(duì)單片機(jī)這門學(xué)科的認(rèn)識(shí)加深,到達(dá)了拓展的程度,我想這個(gè)目的將在不遠(yuǎn)的時(shí)期內(nèi)被實(shí)現(xiàn)。
總之,這次設(shè)計(jì)從軟件編寫、調(diào)試到軟硬件聯(lián)機(jī)調(diào)試,我傾注了大量的時(shí)間和心血。真是曾經(jīng)為程序的編寫而冥思查找過(guò),曾經(jīng)為無(wú)法找出錯(cuò)誤而郁悶苦惱過(guò),也曾經(jīng)為某一功能不能實(shí)現(xiàn)而猶豫彷徨過(guò),但最終我成功了。
我不僅品味到了結(jié)果的喜悅,更明白了過(guò)程的彌足珍貴。

6參考文獻(xiàn)
[1] 李建忠.單片機(jī)原理及應(yīng)用[M],西安電子科技大學(xué)出版社,2008.2.
[2] 黃智偉.全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽系統(tǒng)設(shè)計(jì)[M],北京:北京航空航天大學(xué)出版社,2006.6.
[3] 黃智偉.凌陽(yáng)單片機(jī)課程設(shè)計(jì)指導(dǎo)[M],北京:北京航空航天大學(xué)出版社,2006.11.
[4] 李廣弟,朱月秀,王秀山.單片機(jī)基礎(chǔ)[M],北京:北京航空航天大學(xué)出版社,2001.7.
[5] 趙曙光,郭萬(wàn)有,楊頌華.可編程邏輯器件原理開發(fā)與應(yīng)用[M],西安:西安電子科技大學(xué), 2000.
[6] 候伯亨.VHDL硬件描述語(yǔ)言與數(shù)字邏輯電路設(shè)計(jì)[M], 西安:西安電子科技大學(xué)出版社, 1999.
[7] 康華光. 模擬電子技術(shù)基礎(chǔ)(第四版)[M], 武漢:華中理工大學(xué)出版社,1999.
[8] 譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)(第二版)[M],北京:清華大學(xué)出版社,1991.
[9] 陳小忠,黃寧. 單片機(jī)接口技術(shù)實(shí)用子程序[M],北京:北京人民郵電出版社, 2005.
[10] 歐偉明,周春臨,瞿遂春.電子信息系統(tǒng)設(shè)計(jì)[M],西安電子科技大學(xué)出版社,2005.9.
[11] 賈立新,王涌.電子系統(tǒng)設(shè)計(jì)與實(shí)踐[M],北京:清華大學(xué)出版社,2007.
[12] 羅亞非.凌陽(yáng)16位單片機(jī)應(yīng)用基礎(chǔ)[M],北京:北京航空航天大學(xué)出版社,2003.
[13] 雷思孝.凌陽(yáng)單片機(jī)原理及實(shí)用技術(shù)[M],西安電子科技大學(xué),2004.

附錄1
單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #define  uchar unsigned char
  3. #define  uint  unsigned int            
  4.             
  5. uchar sound,//音

  6.       beat,//節(jié)拍
  7.                
  8.       music_value=1;//音樂(lè)值(播放第幾首音樂(lè))

  9. uchar code * data song;            

  10. sbit speaker=P1^0;///蜂鳴器
  11. sbit key1=P3^0;
  12. sbit key2=P3^1;            
  13. sbit key3=P3^4;
  14. sbit key4=P3^5;
  15. sbit led1=P2^0;
  16. sbit led2=P2^1;            
  17. sbit led3=P2^2;            
  18. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19.                                             

  20. bit  cycle_flag=1;//循環(huán)標(biāo)志位 1允許循環(huán)
  21. //                                                                        休止符              低6       低7       中1       中2       中3       中4       中5                 中6       中7       高1       低3       低5       低4       高3
  22. uchar code tones[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xFD,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85};

  23. uchar code song1[37]={0xC4,0x12,0x32,0x44,0x42,0x52,                                                        //<<祈禱>>
  24.                              0x52,0x44,0x32,0x32,0x12,0x14,
  25.                              0x12,0x12,0x32,0x42,0x54,0x44,
  26.                              0x4F,
  27.                              0xC4,0x12,0x32,0x44,0x42,0x72,
  28.                              0x58,0x42,0x32,0x34,
  29.                              0x14,0x12,0x32,0x34,0x32,0x12,
  30.                              0x1F,
  31.                                                                                                   0xFF};
  32. uchar code song2[46]={0x12,0x52,0x52,0x52,0x56,0x42,                                                        //<<蘭花草>>
  33.                              0x32,0x42,0x32,0x22,0x18,
  34.                                                                                                   0x82,0x82,0x82,0x82,0x86,0x72,
  35.                                                                                                   0xB2,0x72,0x72,0x62,0x58,
  36.                                                                                                   0x52,0x82,0x82,0x72,0x56,0x42,
  37.                                                                                                   0x32,0x42,0x32,0x22,0x16,0xB2,
  38.                                                                                                   0xB2,0x32,0x32,0x22,0x16,0x52,
  39.                                                                                                   0x42,0x32,0x22,0xC2,0x88,
  40.                                                                                                   0xFF};
  41. uchar code song3[131]={0x52,0x42,                                                                                                                              //<<兩只蝴蝶>>                                                                                                               
  42.                              0x58,0x02,0x42,0x52,0x42,
  43.                              0x38,0x04,0x12,0x32,
  44.                              0x44,0x42,0x52,0x42,0x32,0x12,0x12,
  45.                              0xC8,0x04,0x52,0x42,
  46.                              0x58,0x02,0x42,0x52,0x42,
  47.                              0x38,0x04,0x12,0x32,
  48.                              0x44,0x42,0x52,0x42,0x32,0x12,0x32,
  49.                              0x48,0x04,0x52,0x42,
  50.                              0x58,0x02,0x42,0x52,0x42,
  51.                              0x38,0x04,0x12,0x32,
  52.                              0x44,0x42,0x52,0x42,0x32,0x12,0x11,0x31,
  53.                              0xC8,0x04,0x52,0x72,
  54.                              0x78,0x02,0x72,0x82,0x72,
  55.                              0x58,0x04,0x42,0x42,
  56.                              0x44,0x42,0x52,0x42,0x32,0x12,0x12,
  57.                              0x32,0x32,0x3C,
  58.                              0x09,0x72,0x72,0x82,
  59.                              0xA2,0x92,0x92,0x82,0x52,0x42,0x42,0x42,
  60.                              0x58,0x02,0x52,0x52,0x72,
  61.                              0x84,0x84,0x02,0x12,0x52,0x42,
  62.                              0x48,0x04,0x52,0x72,
  63.                              0x72,0x52,0x74,0x02,0xA4,0x92,
  64.                              0x82,0x92,0x54,0x02,0x82,0x82,0x92,
  65.                              0x82,0x72,0x52,0x42,0x02,0xC4,0x12,
  66.                              0x3C,
  67.                                                                                                   0xFF};
  68. uchar code song4[37]={0xC4,0x12,0x32,0x44,0x42,0x52,                                                        //<<祈禱>>
  69.                              0x52,0x44,0x32,0x32,0x12,0x14,
  70.                              0x12,0x12,0x32,0x42,0x54,0x44,
  71.                              0x4F,
  72.                              0xC4,0x12,0x32,0x44,0x42,0x72,
  73.                              0x58,0x42,0x32,0x34,
  74.                              0x14,0x12,0x32,0x34,0x32,0x12,
  75.                              0x1F,
  76.                                                                                                   0xFF};
  77. uchar code song5[144]={0x52,0x62,                                                                                                                              //<<陽(yáng)光總在風(fēng)雨后>>
  78.                              0x74,0x74,0x74,0x34,
  79.                              0x42,0x34,0x52,0x56,0x42,
  80.                              0x34,0x34,0x14,0x32,0x12,
  81.                              0x12,0xC2,0xC4,0x04,0x52,0x62,
  82.                              0x74,0x74,0x74,0x34,
  83.                              0x42,0x34,0x52,0x56,0x42,
  84.                              0x34,0x32,0x12,0x12,0x34,0x42,
  85.                              0x4C,0x52,0x42,
  86.                              0x34,0x32,0x42,0x32,0x12,0x12,0xC2,
  87.                              0xC2,0x54,0x52,0x54,0x52,0x52,
  88.                              0x42,0x32,0x32,0x12,0x32,0x42,0x32,0x52,
  89.                              0x5C,0x52,0x42,
  90.                              0x34,0x32,0x42,0x32,0x12,0x12,0xC2,
  91.                              0xC2,0x54,0x52,0x54,0x02,0x52,
  92.                              0x52,0x42,0x32,0x12,0x32,0x84,0x72,
  93.                              0x7F,
  94.                              0x0F,
  95.                              0x74,0x72,0x52,0x54,0x74,
  96.                              0x82,0x52,0x52,0x72,0x78,
  97.                              0x34,0x32,0x32,0x42,0x54,0x72,
  98.                              0x7F,
  99.                              0x86,0x82,0x72,0x52,0x54,
  100.                              0x72,0x84,0x32,0x36,0x52,
  101.                              0x42,0x52,0x42,0x32,0x34,0x12,0x32,
  102.                              0x32,0x42,0x4C,
  103.                              0x86,0x82,0x72,0x52,0x54,
  104.                              0x72,0x84,0x52,0x56,0x52,
  105.                              0x42,0x52,0x72,0x82,0x52,0x34,0x12,
  106.                              0x12,0x32,0x3C,
  107.                              0xFF};                                                                        
  108. uchar code song6[77]={0xC2,0xC2,0x34,0x42,0x42,                                                                                    //<<一生有你>>
  109.                              0x52,0x41,0x51,0x5C,
  110.                              0x04,0xC2,0xC2,0x34,0x42,0x42,
  111.                              0x52,0x31,0x41,0x4C,
  112.                              0x04,0xC2,0xC2,0x34,0x42,0x42,
  113.                              0x52,0x41,0x51,0x58,0x32,0x52,
  114.                              0x4C,0x42,0x32,
  115.                              0x34,0x32,0x42,0x48,
  116.                              0x04,0xC2,0xC2,0x34,0x42,0x42,
  117.                              0x72,0x41,0x51,0x5C,
  118.                              0x04,0xC2,0xC2,0x32,0x32,0x42,0x42,
  119.                              0x52,0x42,0x4C,
  120.                              0x04,0xC2,0xC2,0x34,0x42,0x42,
  121.                              0x52,0x41,0x51,0x58,0x32,0x52,
  122.                              0x4C,0x42,0x32,
  123.                              0x32,0x42,0x4C,
  124.                                                                                                   0xFF};
  125. uchar code song7[]={0XC2,0XB2,                                                                                                                              //<<喜歡你>>            
  126.                                                                                                   0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
  127.                                                                                                   0XC6,0X12,0XC4,0X12,0XC2,
  128.                                                                                                   0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
  129.                                                                                                   0X4C,0X42,0X32,
  130.                                                                                                   0X74,0X82,0X74,0X82,0X72,
  131.                                                                                                   0X52,0X41,0X38,0X32,0X42,
  132.                                                                                                   0X16,0XC2,0X72,0X52,0X42,0X42,
  133.                                                                                                   0X3C,0XC2,0XB2,
  134.                                                                                                   0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
  135.                                                                                                   0XC6,0X12,0XC4,0X12,0XC2,
  136.                                                                                                   0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
  137.                                                                                                   0X4C,0X42,0X32,
  138.                                                                                                   0X76,0X82,0X74,0X82,0X72,
  139.                                                                                                   0X53,0X41,0X38,0X32,0X42,
  140.                                                                                                   0X16,0XC2,0X72,0X52,0X41,0X51,0X12,
  141.                                                                                                   0XCC,0XC2,0XB2,
  142.                                                                                                   0X16,0XC2,0X72,0X52,0X42,0X42,
  143.                                                                                                   0X3C,0X32,0X32,
  144.                                                                                                   0X26,0X22,0X24,0X42,0X32,
  145.                                                                                                   0x22,0x12,0x18,0x02,0x52,
  146.                                                                                                   0X46,0X12,0X44,0X72,0X82,
  147.                                                                                                   0X5C,0X52,0X52,
  148.                                                                                                   0X46,0X42,0X74,0X42,0X32,
  149.                                                                                                   0X36,0X42,0X58,
  150.                                                                                                   0X82,0X72,0X62,0X52,0X46,0X32,
  151.                                                                                                   0X3C,0X12,0XB2,
  152.                                                                                                   0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
  153.                                                                                                   0XC6,0X12,0XC4,0X12,0XC2,
  154.                                                                                                   0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
  155.                                                                                                   0X48,0X02,0X42,0X52,0X62,
  156.                                                                                                   0X76,0X82,0X74,0X82,0X72,
  157.                                                                                                   0X56,0X41,0X38,0X32,0X22,
  158.                                                                                                   0X16,0XC2,0X72,0X52,0X42,0X42,
  159.                                                                                                   0X3C,0X04,0X04,0X04,0X04,
  160.                                                                                                   0xFF};
  161.                                                                                                                                                                                                                                  


  162. void delay150ms(void)  /*延時(shí)1/4拍時(shí)間即150ms*/
  163. {
  164.   unsigned char a,b,c;

  165.     for(c=3;c>0;c--)
  166.         for(b=80;b>0;b--)
  167.                                {
  168.                                 if(P3!=0xff) {break;}            
  169.             for(a=214;a>0;a--);
  170.                                           }

  171. }

  172. /**************************************

  173. *名稱: InitTimer(void)

  174. *功能:定時(shí)器初始化函數(shù)

  175. ***************************************/
  176. void InitTimer(void)
  177. {
  178.   TMOD=0x01;   //定時(shí)器0置于方式一

  179.   IT0=1;

  180.   ET0=1;

  181.   EA=1;        //打開總中斷

  182. }            
  183. /**************************************

  184. *名稱:Music_Play()

  185. *功能:樂(lè)曲演奏函數(shù)

  186. ***************************************/
  187. void delay(uint i)
  188. {
  189. uchar j;
  190. for(i;i>0;i--)
  191. for(j=115;j>0;j--);
  192. }

  193. void Musics_Play()
  194. {
  195. unsigned int j=0,i=0,k=0;
  196. //------------------------音樂(lè)選擇
  197. switch(music_value)            
  198. {
  199.   case 1 :song=song1;
  200.    led3=1;
  201.    P0=tab[1];
  202.    delay(50);
  203.    break;
  204.   case 2 :song=song2;
  205.   led3=1;
  206.    P0=tab[2];
  207.    delay(50);
  208.    break;
  209.   case 3 :song=song3;
  210.    led3=1;
  211.    P0=tab[3];
  212.    delay(50);
  213.    break;
  214.   case 4 :song=song4;
  215.    led3=1;
  216.    P0=tab[4];
  217.    delay(50);
  218.    break;
  219.   case 5 :song=song5;
  220.    led3=1;
  221.    P0=tab[5];
  222.    delay(50);
  223.    break;
  224.   case 6 :song=song6;
  225.    led3=1;
  226.    P0=tab[6];
  227.    delay(50);
  228.    break;
  229.   case 7 :song=song7;
  230.    led3=1;
  231.    P0=tab[7];
  232.    delay(50);
  233.    break;
  234. }
  235. //---------------------------節(jié)拍音調(diào)讀取

  236. while(*(song+j)!=0xFF&&cycle_flag)
  237. {
  238.   beat=*(song+j)&0x0F;        //取出節(jié)拍
  239.   sound=*(song+j)>>4;       //取出音
  240.   TH0=tones[2*sound];
  241.   TL0=tones[2*sound+1];
  242.   TR0=1;
  243.   if ((tones[2*sound]==0xFF)&&(tones[2*sound+1]==0xFF)) TR0=0;
  244.   for(i=beat;i>0;i--){delay150ms();}
  245.   TR0=0;
  246.   if(sound>=8) sound=7;
  247.   led1=!led1;
  248.   led2=!led2;
  249.   j++;
  250.   k++;
  251.   if(k==7) k=0;
  252. }
  253. }
  254. void delay1ms(int t) //1ms延時(shí)函數(shù)
  255. {
  256.   int i,j;
  257.   for (i=0;i<t;i++)
  258.    for(j=0;j<120;j++);
  259. }
  260. void main()
  261. {
  262. while(key3==1);
  263. led1=0;
  264. led2=1;
  265. InitTimer();
  266. while(1)
  267. {
  268. ……………………

  269. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
http://www.raoushi.com/bbs/dpj-89386-1.html



作者: 0801170104    時(shí)間: 2019-4-23 11:40
非常棒。
作者: 文化    時(shí)間: 2019-12-8 10:55
感謝,十分厲害了。 多謝幫助




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1