1 課程設計總體目標
1.1 功能目標(1)利用JD51開發板上的按鍵S1~S4進行音調選擇,即按下不同的開關產生不同的音調,依次按動S1~S4 及組合按鍵,蜂鳴器發出1234567i八個音調;并在數碼管上顯示。 (2)編寫2支歌曲,并可進行選擇播放。 (3)拓展題:播放音樂前亮燈10秒,并可以通過按下按鍵來中斷播放。 1.2 總體結構
圖1-1 總體結構 1.3 工作原理音節由不同頻率的方波產生,音節與頻率的關系通過查表可得。要產生音頻方波,只要算出某一音頻的周期(1/頻率),然后將此周期除以2,即為半周期的時間。利用計時器計時此半周期時間,每當計時到后就將輸出方波的 I/0 反相,然后重復計時此半周期時間再對I/O 反相,就可在 I/O 腳得到此頻率的方波。在 ZKS-03 實驗儀上,產生方波的 I/O 腳選用P1.7,通過跳線選擇器 JP1 將單片機的 P1.7 與蜂鳴器的驅動電路相連。這樣 P1.7 輸出不同頻率的方波,蜂鳴器便會發出不同的聲音。另外, 音樂的節拍是由延時實現的,如果 1 拍為0.4 秒, 1/4 拍是 0.1 秒。只要設定延時時間,就可求得節拍的時間。延時作為基本延時時間,節拍值只能是它的整數倍,每個音節相應的定時器初值 X 可按下法計算: (式1-1) 即 (式1-2) 其中,f是音調頻率。當晶振f_osc=11.0592MHz時,音節“1”相應的定時器初值為x,則可得x=63777D=F921H其他的可同樣求得。 另外,音樂的節拍是由延時實現的,如果1拍為0.4秒,1/4拍是0.1秒。只要設定延時時間,就可求得節拍的時間。延時作為基本延時時間,節拍值只能是它的整數倍。 表1-1 音調頻率對照表
2 硬件設計運用到相關硬件為:51單片機、數碼管、蜂鳴器等。 2.1數碼管LED數碼管實際上是由七個發光管組成8字形構成的,加上小數點就是8個,如圖2-1所示,這些段分別由字母a,b,c,d,e,f,g,dp來表示,DP表示小數點。當數碼管特定的段加上電壓后,這些特定的段就會發亮,這樣就可以看到不同的字樣。發光二極管的陰極連接到一起連接到低電平的稱為共陰極數碼管,如圖2-2所示,發光二極管的陽極連接到一起連接到電源正極的稱為共陽極數碼管,如圖2-3所示。
圖2-1 數碼管 圖2-2 共陰極數碼管 圖2-4 共陽極數碼管 各段碼位的對應關系,如表2-1所示: 表2.1 碼位對應關系 LED顯示斷碼如表2-1所示: 表2-2 LED顯示段碼 2.2蜂鳴器
圖2-4 蜂鳴器電路圖 這里的三極管主要是做驅動用的。因為單片機的IO口驅動能力不夠讓蜂鳴器發出聲音,所以我們通過三極管放大驅動電流,從而可以讓蜂鳴器發出聲音,你要是輸出高電平,三極管導通,集電極電流通過蜂鳴器讓蜂鳴器發出聲音,當輸出低電平時,三極管截止,沒有電流流過蜂鳴器,所以就不會發出聲音。 2.3定時/計數器單片機內有兩個16位定時/計數器(增量式計數) 1.工作方式(方式0、方式1、方式2、方式3) (1)方式0(13位定時/計數)
圖2-5 工作方式0 (2)方式1(16位定時/計數)
圖2-6 工作方式1 (3)方式2(8位自動重裝時間常數定時/計數)
圖2-7 工作方式2 (4)方式3(僅適用于定時/計數器0) TL0 用于8位定時/計數,TH0 只用于8位定時。
圖2-8 工作方式3 2.控制寄存器 (1)定時/計數器方式控制寄存器:TMOD ├──── T1 ────┼──── T0 ────┤ ├──┬──┬──┬──┼──┬──┬──┬─—┤ │GATE│C/T │ M1 │ M0 │GATE│C/T │ M1 │ M0 │ └──┴──┴──┴──┴──┴──┴──┴──┘ GATE:門控位。1:打開,0:關閉 C/T:工作狀態選擇。1:計數狀態,0:定時狀態 M1,M0:工作方式選擇 00 方式0 01 方式1 10 方式2 11 方式3 (2)定時/計數器控制寄存器:TCON ┌──┬──┬──┬──┬──┬──┬──┬──┐ │TF1 │TR1 │TF0 │TR0 │IE1 │IT1 │IE0 │IT0 │ └──┴──┴──┴──┴──┴──┴──┴──┘ TF1,TF0:定時/計數器中斷請求標志,1:有請求;0:無請求 TR1,TR0:定時/計數器運行控制位,1:打開;0:關斷 IE1,IE0:外部中斷INT1,INT0 中斷請求標志,1:有請求;0:無請求 IT1,IT0:外部中斷INT1,INT0 觸發方式,1:下降沿觸發;0:低電平觸發
3.中斷系統 五個中斷源: INT0:外部中斷0 INT1:外部中斷1 T0:定時/計數器0中斷 T1:定時/計數器1中斷 TI/RI:串行I/O中斷 中斷允許寄存器:IE(1:允許;0:不允許) ┌──┬──┬──┬──┬──┬──┬──┬──┐ │EA │× │× │ES │ET1 │EX1 │ET0 │EX0 │ └──┴──┴──┴──┴──┴──┴──┴──┘ EA: 全局中斷允許位 ES: 串行口中斷允許位 ET1:T1 中斷允許位 EX1:INT1 中斷允許位 ET0:T0 中斷允許位 EX0:INT0 中斷允許位
3 軟件設計3.1流程圖根據要實現的功能,流程圖如下: 功能選擇
音樂
開始
系統初始化
判斷按鍵
判斷按鍵
電子琴
液晶顯示
播放音調
播放音樂
3.2軟件組成鍵盤掃描、中斷計時、數碼顯示、音樂播放、主程序 ①鍵盤掃描 鍵盤鍵值讀取程序包括鍵盤掃描、消除抖動、鍵譯碼等內容。按鍵的識別主要有兩種方法:行反轉法和行掃描法。因為鍵盤為機械開關,容易引入抖動。為了消除抖動干擾,在程序中要加入消除抖動的部分。 ②中斷計時 中斷部分,中斷定時器1主要負責輸出不同頻率的方波,產生聲音,中斷定時器1主要是計時按鍵時間及按鍵間隔時間的功能,在播放音樂的時候,還擔任著播放音樂的節拍的任務。 ③音樂播放 音樂播放部分主要是實現播放程序里面的音樂的功能。 ④主程序 主程序主要是隨時發出按鍵的聲音功能,并且通過不同P口的掃描,判斷是否是播放按鍵聲音還是播放音樂,還是繼續發出按鍵聲音。 3.3詳細思路1.題目一:利用JD51開發板上的按鍵S1~S4進行音調選擇,即按下不同的開關產生不同的音調,依次按動S1~S4 及組合按鍵,蜂鳴器發出1234567i八個音調;并在數碼管上顯示。 方案:我們計劃設計以C語言為主體的程序代碼,用按鍵控制音符的輸出,4個按鍵單個按下時會輸出4個音符,另外4個按鍵進行兩兩組合表示另外4個音符,效果就像電子琴的按鍵一樣。由于平時不能發聲,只有按鍵后才發聲,我們用定時器的啟動TR0作為聲音輸出開關。在發現按鍵后,送入對應頻率值,打開定時器,就發出了聲音,延時一陣再關閉定時器,聲音就停止了。整體C代碼應該分為以下模塊: (1)變量的定義。在這個模塊里,我們要定義喇叭的輸出腳,四個按鍵等。 (2)頻率對照模塊。在這個模塊中,按照頻率對照表定義一個矩陣,按照工作原理,每個頻率值用兩個八位二進制數來表示。這兩個八位二進制數分為低八位和高八位,并可合并看做四位十六進制數。四位十六進制數可以表示0~65535范圍內的數。對于12MHz的晶振,每一個電平保持時間為【65535-(四位十六進制數表示的十進制數)】微秒,用t來表示。因此該音調的一個周期為T=2*t,音調的頻率f=1/T。在本項目中,由于要使用1234567i八個音調,因此建立的矩陣大小應為2*8,矩陣內的每個元素為一個八位二進制數,分別表示八個不同的頻率。 (3)定時中斷模塊。產生定時中斷以及音樂輸出。4.主函數模塊。在這個模塊中,我們將使用while循環以及if判斷等函數,對每個按鍵是否按下進行判定以及數碼管的顯示。 2.題目二:編寫2支歌曲,并可進行選擇播放。 方案:我們計劃用三個按鍵來控制播放音樂。K1、K2每個鍵播放一首音樂,K4鍵停止音樂的播放。 程序分為以下幾個模塊。 (1)變量定義模塊。在這個模塊中,我們定義一些必要的引腳以及按鍵。 (2)頻率對照模塊。不同于任務一的頻率對照模塊,在這里我們要定義盡可能全的音調的頻率。我們使用36*2的矩陣定義36個由低到高不同的頻率,用于之后播放音樂。 (3)定時中斷模塊。調入預定時值,產生對應頻率的音調。 (4)音樂符號串解釋模塊。使用此模塊的原因在于,在之后的模塊中我們會用123等數字、“’”、“.”、“_”、“|”等單引號、英文句號、下劃線、分隔線等,來對一首歌進行編寫。在這個模塊中,我們使用switch函數,將以上不同符號分成多個case分別進行處理。 (5)奏樂模塊。該模塊是自定義的函數,入口是要演奏的音樂符號串,對音樂符號進行逐一解釋,按照音長進行延時或中斷,進而完成一首完整的曲子。在這個模塊中,同時也要使用一個if函數進行判定,當在演奏過程中,使用者按下了K4按鍵,則退出音樂的演奏。 (6)音樂符號編寫模塊。在這個模塊中,由兩個自定義函數構成。每個自定義函數表示一首曲子。函數內容為該曲子對應的數字曲譜。 (7)主函數模塊。在這個模塊中進行對以上所有模塊的統籌調用。
|