


摘 要:節(jié)拍器是一種專門用來打奏拍子的設(shè)備,它可以使練音者或練琴者正確掌握樂曲速度,對(duì)音樂練習(xí)達(dá)到事半功倍的效果。鑒于此,設(shè)計(jì)了一款電子式節(jié)拍器,以AT89C51為控制核心,通過C語言設(shè)計(jì)程序,充分利用單片機(jī)內(nèi)部中斷和定時(shí)系統(tǒng)控制外部電路,準(zhǔn)確產(chǎn)生拍子,且實(shí)現(xiàn)了節(jié)拍類型和節(jié)拍速度的實(shí)時(shí)調(diào)節(jié)、數(shù)碼管的清晰顯示。該節(jié)拍器音色優(yōu)美、精度較高,具有很好的視覺和聽覺效果。
關(guān)鍵詞:節(jié)拍器;單片機(jī);中斷;數(shù)碼管
中圖分類號(hào):TP202? ? 文獻(xiàn)標(biāo)志碼:A? ? 文章編號(hào):1671-0797(2024)03-0032-04
DOI:10.19514/j.cnki.cn32-1628/tm.2024.03.008
0? ? 引言
在音樂的教學(xué)和學(xué)習(xí)中,學(xué)習(xí)者的音準(zhǔn)感和節(jié)奏感非常重要,但是速度感同樣不可忽視,精準(zhǔn)地確定所需要表達(dá)的速度,在音樂學(xué)習(xí)和創(chuàng)作中逐步建立敏銳的速度感對(duì)于一個(gè)優(yōu)秀的音樂人尤為重要。節(jié)拍器就是在各種速度中發(fā)出穩(wěn)定節(jié)拍的裝置,它不僅可以提高音樂練習(xí)的效率,而且能提高練習(xí)者的注意力,使演奏更均勻平衡[1]。目前主流的節(jié)拍器有機(jī)械式和電子式兩種,機(jī)械式節(jié)拍器調(diào)節(jié)不便,不宜攜帶,精確度不高且價(jià)格昂貴,所以本次設(shè)計(jì)將要完成一個(gè)電子式節(jié)拍器[2]。它基于單片機(jī)系統(tǒng),不僅能發(fā)出聲音信號(hào),同時(shí)能在數(shù)碼管上顯示當(dāng)前的節(jié)拍類型和節(jié)拍速度,使用者可以通過鍵盤實(shí)時(shí)更改節(jié)拍類型、調(diào)整節(jié)拍速度。設(shè)計(jì)采用單片機(jī)的中斷程序?qū)崿F(xiàn)按鍵檢測(cè)、數(shù)碼管掃描和蜂鳴器發(fā)音等一系列功能。
1? ? 硬件設(shè)計(jì)
節(jié)拍用于控制各個(gè)音的快慢,即各個(gè)音產(chǎn)生及持續(xù)的時(shí)長(zhǎng),在單片機(jī)中可用延時(shí)程序或定時(shí)器來控制。節(jié)拍器發(fā)出的強(qiáng)弱拍聲音由兩個(gè)不同的頻率驅(qū)動(dòng),每個(gè)拍子的時(shí)長(zhǎng)由另一個(gè)定時(shí)器控制。設(shè)計(jì)基于AT89C51芯片完成,運(yùn)行的單片機(jī)最小系統(tǒng)中,用P0口作為數(shù)碼管的接口,用P1.6端口作為蜂鳴器電路信號(hào)輸出口,用P2口高四位作為按鍵的接口;T0中斷用于定期掃描按鍵輸入模塊、數(shù)碼管顯示模塊和節(jié)拍延時(shí)模塊,T1中斷用于反轉(zhuǎn)蜂鳴器發(fā)出不同頻率的音。
本系統(tǒng)分為兩個(gè)部分,一部分是節(jié)拍類型切換,另一部分是節(jié)拍速度調(diào)整。對(duì)于節(jié)拍的處理,使用單片機(jī)C語言來編寫,用定時(shí)器T1來控制脈沖頻率發(fā)音,用定時(shí)器T0來控制每個(gè)節(jié)拍的時(shí)長(zhǎng)[3],電路共5個(gè)按鍵。具體功能如下:
按鍵A和按鍵B用于切換節(jié)拍類型,使節(jié)拍類型在1~6幾個(gè)檔位間循環(huán),分別實(shí)現(xiàn)1/4拍、2/4拍、3/4拍、4/4拍、3/8拍、6/8拍這些常用拍子。復(fù)位電路按鍵用于停止節(jié)拍器發(fā)音,且復(fù)位后節(jié)拍類型顯示0。按鍵C和按鍵D用于調(diào)整節(jié)拍速度,初始節(jié)拍速度設(shè)置為90拍/min。按下按鍵,數(shù)碼管實(shí)時(shí)顯示節(jié)拍器當(dāng)前的參數(shù)值。節(jié)拍速度在40~200拍/min循環(huán)。根據(jù)節(jié)拍速度可以求出每個(gè)節(jié)拍的時(shí)長(zhǎng),即一個(gè)音符該唱多長(zhǎng)時(shí)間。設(shè)計(jì)中以四分音符為一拍,則八分音符的時(shí)長(zhǎng)為四分音符的一半,時(shí)長(zhǎng)越短,節(jié)奏越輕快[4]。
由于本次設(shè)計(jì)的電子節(jié)拍器要實(shí)現(xiàn)按鍵輸入、數(shù)碼管顯示、蜂鳴器發(fā)音等功能,利用Proteus仿真設(shè)計(jì)的硬件電路如圖1所示,實(shí)現(xiàn)過程為:以AT89C51作為控制核心,通過按鍵輸入來改變節(jié)拍類型和節(jié)拍速度,74HC245芯片在數(shù)碼管LED小燈和單片機(jī)I/O口間起電流緩沖作用,防止電流產(chǎn)生瓶頸效應(yīng),保證通道足夠暢通[5]。74HC245具有雙向緩沖作用,無任何邏輯功能,1引腳DIR是方向引腳,當(dāng)1引腳輸入為高電平時(shí),使B等于A的狀態(tài)。74HC138芯片開啟數(shù)碼管段選功能,顯示當(dāng)前節(jié)拍類型和節(jié)拍速度[6]。段的選擇(指該段的亮滅)是通過單片機(jī)的P0口控制,經(jīng)過74HC245驅(qū)動(dòng),再將T0中斷以1 ms為定時(shí),實(shí)現(xiàn)4個(gè)數(shù)碼管的動(dòng)態(tài)顯示。電路設(shè)計(jì)中,4個(gè)數(shù)碼管都是共陽極,第一個(gè)數(shù)碼管用于顯示節(jié)拍類型,后三個(gè)數(shù)碼管用于顯示節(jié)拍速度。由于本次節(jié)拍器的設(shè)計(jì)中用到的按鍵較少,所以按鍵部分選用獨(dú)立式按鍵。4條輸入線分別連接到單片機(jī)的P2.4~2.7端口上。發(fā)聲部分的蜂鳴器電路采用無源蜂鳴器設(shè)計(jì),BUZZ引腳連接至單片機(jī)P1.6端口,由于蜂鳴器電流依然相對(duì)較大,所以用三極管來驅(qū)動(dòng),并加連一個(gè)100 Ω的電阻來限流,此外還增加一個(gè)D4續(xù)流二極管,從而很好地避免電感電流的反向沖擊,接續(xù)關(guān)斷電流。程序控制單片機(jī)I/O口反轉(zhuǎn),使蜂鳴器發(fā)出有節(jié)奏的聲音[7]。電子節(jié)拍器復(fù)位電路為含手動(dòng)開關(guān)復(fù)位的復(fù)位電路,連接到單片機(jī)的9引腳RST(Reset)復(fù)位引腳上。復(fù)位按鍵可作為節(jié)拍器的停止發(fā)音開關(guān)。
2? ? 軟件設(shè)計(jì)
本設(shè)計(jì)軟件部分全部用C語言編寫,軟件程序由主程序、數(shù)碼管顯示子程序、按鍵輸入子程序和音頻輸出子程序幾個(gè)模塊組成。主程序用來開啟74HC138使能和啟動(dòng)定時(shí)器T0、T1,T0中斷負(fù)責(zé)按鍵檢測(cè),刷新數(shù)碼管顯示和控制每個(gè)拍子的時(shí)長(zhǎng),T1中斷控制單片機(jī)I/O口反轉(zhuǎn),使蜂鳴器發(fā)音。現(xiàn)就各個(gè)程序模塊的執(zhí)行流程分別進(jìn)行敘述。
2.1? ? 主程序流程
圖2為系統(tǒng)主程序流程圖。當(dāng)給節(jié)拍器上電后,數(shù)碼管顯示節(jié)拍類型為0,此時(shí)無節(jié)拍,節(jié)拍器不發(fā)音。當(dāng)按下A、B鍵后,切換節(jié)拍類型,節(jié)拍器開始打拍;按下C、D鍵開始動(dòng)態(tài)調(diào)整節(jié)拍速度;按下復(fù)位鍵,節(jié)拍器回到上電時(shí)狀態(tài)。
2.2? ? 音頻輸出子程序
節(jié)拍器開始打奏節(jié)拍時(shí),發(fā)出的強(qiáng)弱拍聲音實(shí)質(zhì)為兩個(gè)不同的脈沖頻率產(chǎn)生,由單片機(jī)內(nèi)部的T1中斷控制,通過反轉(zhuǎn)與蜂鳴器電路連接的單片機(jī)I/O口來實(shí)現(xiàn),過程如圖3所示。
2.3? ? 數(shù)碼管顯示和按鍵檢測(cè)子程序
節(jié)拍器的數(shù)碼管顯示和按鍵檢測(cè)執(zhí)行過程都是用T0中斷實(shí)現(xiàn),每1 ms刷新一次數(shù)碼管顯示且檢測(cè)一次按鍵狀態(tài)值并保存,連續(xù)檢測(cè)四次,如果四次檢測(cè)到的按鍵狀態(tài)值相同,說明按鍵已經(jīng)穩(wěn)定地按下或彈起,相應(yīng)地要改變按鍵值,即實(shí)現(xiàn)了按鍵消抖功能。同時(shí)備份當(dāng)前按鍵狀態(tài)(按下或彈起),方便下次檢測(cè)比較用。
3? ? 系統(tǒng)調(diào)試
在上電前確保電路中不存在短路和斷路的情況,這是整個(gè)調(diào)試過程的第一步,也是最重要的一步。萬用表是這一步驟的主要工具,用萬用表的兩個(gè)探頭檢測(cè)電路中是否存在短路和斷路等情況,特別要注意焊點(diǎn)是否虛焊、焊點(diǎn)之間有無短接以及焊點(diǎn)的美觀,確保電路沒有開路、短路問題。
實(shí)物電路沒問題后,接下來從電子節(jié)拍器的顯示、按鍵和聲音等方面進(jìn)行調(diào)試:
(1)顯示觀察:起初將程序燒錄單片機(jī)運(yùn)行時(shí),發(fā)現(xiàn)數(shù)碼管在顯示時(shí)有些不應(yīng)亮的段似乎微微在發(fā)亮,但持續(xù)的時(shí)間很短,只是一閃而過。這是數(shù)碼管消影問題,解決方法是在數(shù)碼管刷新之前關(guān)閉所有的段,改變好位選后再打開即可。即在數(shù)碼管掃描程序switch(i)代碼之前,加入P0=0xFF,這樣數(shù)碼管所有的段都關(guān)閉了,當(dāng)把位選“ADDR”全部賦值之后,再給P0賦對(duì)應(yīng)的值即可,數(shù)碼管“鬼影”問題就順利解決。程序如下:
static unsigned char i = 0;? //動(dòng)態(tài)掃描的索引
P0 = 0xFF;? ?//顯示消影
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i=0; P0=LedBuff[3]; break;
default: break;
}
(2)聲音調(diào)試:在設(shè)計(jì)電子節(jié)拍器時(shí),暫不確定強(qiáng)拍和弱拍該用什么頻率較為合適,通過在程序中反復(fù)修改頻率,燒錄單片機(jī)進(jìn)行測(cè)試,最終決定用1 400 Hz和1 000 Hz兩個(gè)頻率來表示強(qiáng)弱拍,起始拍和其余拍聲音區(qū)別明顯,短促有力更耐聽,在鋼琴?gòu)椬喹h(huán)境中清晰可聞。
(3)按鍵測(cè)試:初期程序中沒加入按鍵消抖代碼,經(jīng)常按一下按鍵,數(shù)字卻不止加1,而是加2或者更多,于是考慮按鍵消抖問題。最后通過單片機(jī)T0中斷的1 ms定時(shí)來解決,每1 ms中斷就記錄一次按鍵狀態(tài),記錄四次,如果四次按鍵狀態(tài)一樣,說明按鍵已穩(wěn)定按下或彈起。將程序燒錄單片機(jī)測(cè)試,即使快速按下按鍵,數(shù)字也能準(zhǔn)確地加1,實(shí)現(xiàn)了按鍵消抖功能[8]。程序如下:
unsigned char i;
static unsigned char keybuf[4] = {? //按鍵掃描緩沖區(qū)
0xFF, 0xFF, 0xFF, 0xFF? ?};
//將一行的4個(gè)按鍵值移入緩沖區(qū)
keybuf[0] = (keybuf[0] << 1) | KEY_IN_1;
keybuf[1] = (keybuf[1] << 1) | KEY_IN_2;
keybuf[2] = (keybuf[2] << 1) | KEY_IN_3;
keybuf[3] = (keybuf[3] << 1) | KEY_IN_4;
//消抖后更新按鍵狀態(tài)
for (i=0; i<4; i++)? //4個(gè)按鍵,所以循環(huán)4次
{
if ((keybuf[i] & 0x0F) == 0x00)
{? ?//連續(xù)4次掃描值為0,即4 ms內(nèi)都是按下狀態(tài)時(shí),可認(rèn)為按鍵已穩(wěn)定地按下
KeySta[i] = 0;
}
else if ((keybuf[i] & 0x0F) == 0x0F)
{? ?//連續(xù)4次掃描值為1,即4 ms內(nèi)都是彈起狀態(tài)時(shí),可認(rèn)為按鍵已穩(wěn)定地彈起
KeySta[i] = 1;
}
}
(4)節(jié)拍器精度測(cè)試:使用秒表測(cè)量節(jié)拍器400拍所用時(shí)間。節(jié)拍速度分別為90、120、160拍/min的時(shí)候,用時(shí)分別為267.7、200.7、151.3 s,誤差分別為0.22%、0.35%、0.86%,節(jié)拍器精度較高。
4? ? 結(jié)束語
最終將程序燒錄硬件電路,經(jīng)測(cè)試,節(jié)拍器能打奏響亮而有規(guī)律的節(jié)奏,并可任意切換不同類型節(jié)拍,節(jié)拍速度也可實(shí)時(shí)調(diào)整。數(shù)碼管能清晰地顯示當(dāng)前節(jié)拍類型和節(jié)拍速度,無論是音樂初學(xué)者還是專業(yè)音樂人,都能輕松上手,調(diào)節(jié)一個(gè)適合自己的速度,練習(xí)起來效果顯著。該節(jié)拍器基于單片機(jī)設(shè)計(jì),成本較低,可靠性高,使用方便,控制功能強(qiáng),容易產(chǎn)品化,若將產(chǎn)品外形工藝化,市場(chǎng)空間廣闊。
[參考文獻(xiàn)]
[1] 吳迪.跳動(dòng)的音符——淺析鋼琴教學(xué)中節(jié)拍器的重要性[J].北方音樂,2018,38(24):130-131.
[2] 劉惠明.鋼琴學(xué)習(xí)過程中節(jié)拍器的功能及應(yīng)用[J].音樂時(shí)空,2014(24):188-189.
[3] 宋雪松.手把手教你學(xué)51單片機(jī) C語言版[M].北京:清華大學(xué)出版社,2014.
[4] 楊夢(mèng)雅,黃堂森,邵金俠,等.基于單片機(jī)演奏音階設(shè)計(jì)[J].信息技術(shù)與信息化,2021(4):143-145.
[5] 吳靜進(jìn),何尚平,萬彬.MCS-51單片機(jī)原理與應(yīng)用[M].重慶:重慶大學(xué)出版社,2019.
[6] 黃有全,李桂平.多功能節(jié)拍器的研制[J].電子技術(shù),2004(11):56-58.
[7] 孫可旭.基于Atmega16的LED電子節(jié)拍器的設(shè)計(jì)[J].電聲技術(shù),2009,33(增刊1):35-37.
[8] 張紅軍.C語言下的抗干擾消抖按鍵程序設(shè)計(jì)研究[J].數(shù)碼世界,2018(1):349-350.
收稿日期:2023-10-10
作者簡(jiǎn)介:楊輝(1992—),男,云南云龍人,碩士研究生,助理講師,研究方向:電子信息技術(shù)。