吝歡歡,任新成,王玉清
延安大學(xué)物理與電子信息學(xué)院,陜西延安716000
“音調(diào)”是物理8年級(jí)上冊(cè)《聲音的特性》一節(jié)中的重要概念。我們都知道,聲音的高低叫做音調(diào),在日常生活中,我們可以通過(guò)聽(tīng)覺(jué)的不同感受來(lái)辨別音調(diào)的高低。但是,由于對(duì)發(fā)聲體的振動(dòng)頻率我們無(wú)法直觀感知,更難以獲得準(zhǔn)確的數(shù)據(jù)。所以,“音調(diào)高低與振動(dòng)頻率的關(guān)系”就成為本節(jié)的教學(xué)難點(diǎn)。因此,如何讓學(xué)生更好地感受音調(diào)的高低、明確振動(dòng)頻率的大小,并進(jìn)一步得到兩者的相互關(guān)系就成為教學(xué)的關(guān)鍵所在[1]。
利用AT89C51單片機(jī)的定時(shí)器中斷功能,通過(guò)改變蜂鳴器的發(fā)聲頻率來(lái)控制音調(diào)高低,模擬簡(jiǎn)易電子琴的工作過(guò)程。能夠使學(xué)生更加直觀地感受物理現(xiàn)象,精確驗(yàn)證音調(diào)高低與發(fā)聲體振動(dòng)頻率的關(guān)系,總結(jié)物理規(guī)律。而且單片機(jī)操作系統(tǒng)成本低廉 (一般在二三十元不等),性價(jià)比高,為學(xué)習(xí)和應(yīng)用提供了便利條件。
AT89C51單片機(jī)是美國(guó)ATMEL公司生產(chǎn)的低電壓、高性能CMOS8位單片機(jī),內(nèi)含4KB可反復(fù)擦寫的只讀程序存儲(chǔ)器(ROM)和128KB隨機(jī)數(shù)據(jù)存儲(chǔ)器(RAM)。內(nèi)置通用8位中央處理器(CPU)和Flash存儲(chǔ)單元,并且兼容MCS-51指令系統(tǒng)。
圖1 AT89C51單片機(jī)控制蜂鳴器電路圖
AT89C51單片機(jī)控制發(fā)聲系統(tǒng)[2]如圖1所示,它是由單片機(jī)、時(shí)鐘電路、復(fù)位電路、按鍵電路和蜂鳴器電路組成。其中,時(shí)鐘電路由一個(gè)12 MHz的晶振和兩個(gè)33 pF的電容組成,它們決定了單片機(jī)的工作時(shí)間精度為1 μs。該系統(tǒng)采用按鍵手動(dòng)復(fù)位方式,即在單片機(jī)運(yùn)行期間,用手動(dòng)按鍵的方式使單片機(jī)初始化。系統(tǒng)利用P1口的P1.0-P1.7引腳設(shè)置了8個(gè)獨(dú)立按鍵,當(dāng)有鍵按下時(shí),P1口相應(yīng)的引腳置為低電平,單片機(jī)接收脈沖信號(hào)。在實(shí)驗(yàn)中,我們用其中P1.0-P1.6這7個(gè)引腳分別來(lái)控制C調(diào)中音的7個(gè)音調(diào)。蜂鳴器電路主要由蜂鳴器、PNP型三極管和一個(gè)電阻組成,低電平有效,即當(dāng)向電路輸入高電平(P3.0引腳置1)時(shí),蜂鳴器中無(wú)電流通過(guò),電路不發(fā)聲;當(dāng)向其輸入低電平(P3.0引腳置0)時(shí),蜂鳴器中有電流通過(guò),產(chǎn)生蜂鳴。我們可以通過(guò)控制高、低電平的持續(xù)時(shí)間來(lái)形成不同頻率的脈沖電壓,驅(qū)動(dòng)蜂鳴器發(fā)聲,從而實(shí)現(xiàn)對(duì)音調(diào)高低的控制。
當(dāng)單片機(jī)[3]內(nèi)部定時(shí)器/計(jì)數(shù)器T0工作在計(jì)數(shù)器模式1時(shí),寄存器TH0和TL0是以全部16位參與工作,計(jì)數(shù)長(zhǎng)度為216=65 536。我們就可以通過(guò)改變計(jì)數(shù)初值TH0、TL0來(lái)產(chǎn)生不同的頻率。 例如,C 調(diào)中音 1(do)的音頻 f=523 Hz,周期s=1912 μs,定時(shí)器的定時(shí)時(shí)間為μs=956 μs,即每經(jīng)過(guò) 956 μs,使輸出口改變一次脈沖電壓。定時(shí)器的計(jì)數(shù)值=956,則裝入T0計(jì)數(shù)器初值65 536-956=64 580,即啟動(dòng)T0工作后,每計(jì)數(shù)956次時(shí)將產(chǎn)生溢出中斷,進(jìn)入中斷服務(wù)后將P3.0(RXD)引腳輸出電平取反就可得到中音do的音符頻率,如圖2所示。
圖2 音符脈沖波形圖
同理,C調(diào)中音各音符的頻率與計(jì)數(shù)初值如表1所示。
表1 C調(diào)中音各音符的頻率與計(jì)數(shù)初值對(duì)照表
我們使用Keil C51軟件的C語(yǔ)言編寫程序來(lái)實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康摹?/p>
首先,啟動(dòng)Keil C51軟件進(jìn)入編輯界面,單擊“Project”菜單,在彈出的下拉子菜單中選擇“New Project”選項(xiàng)建立新工程,選擇文件保存路徑,輸入工程文件名后點(diǎn)擊保存,在彈出的對(duì)話框中選擇相應(yīng)的單片機(jī)型號(hào),即Atmel公司的AT89C51型單片機(jī),點(diǎn)擊確定按鈕。然后,在編輯界面“File”菜單的下拉子菜單中單擊“New”選項(xiàng)新建文件。 再單擊“File”菜單下的“Save As”選項(xiàng)保存該文件,在彈出的對(duì)話框中“文件名”欄內(nèi)輸入文件名及對(duì)應(yīng)的擴(kuò)展名,如“test.c”。單擊“保存”按鈕后回到編輯界面,單擊“Target 1”前面的“+”號(hào),在“Source Group 1”上單擊右鍵后再單擊“Add Files to Group‘Source Group 1’”。 最后,在彈出的對(duì)話框中選中文件test.c,單擊 “Add”按鈕,如圖3所示。
圖3 Keil C51編輯界面
在KeilC51的編輯界面輸入如下C語(yǔ)言源程序:
#include<reg51.h> //包含51單片機(jī)寄存器定義的頭文件
sbit key1=P1^0; //將key1位定義為P1.0引腳
sbit key2=P1^1; //將key2位定義為P1.1引腳
sbit key3=P1^2; //將key3位定義為P1.2引腳
sbit key4=P1^3; //將key4位定義為P1.3引腳
sbit key5=P1^4; //將key5位定義為P1.4引腳
sbit key6=P1^5; //將key6位定義為P1.5引腳
sbit key7=P1^6; //將key7位定義為P1.6引腳
sbit sound=P3^0; //將sound位定義為P3.0
unsigned int C; //定義全局變量,儲(chǔ)存定時(shí)器的定時(shí)常數(shù)
unsigned long n; //定義無(wú)符號(hào)數(shù)n
//以下是C調(diào)中音的音頻宏定義
#define do 64580 //將“do”宏定義為中音“1”的初值64580
#define re 64687 //將“re”宏定義為中音“2”的初值64687
#define mi 64780 //將“mi”宏定義為中音“3”的初值64780
#define fa 64822 //將“fa”宏定義為中音“4”的初值64822
#define sol 64900 //將“sol”宏定義為中音“5”的初值64900
#define la 64969 //將“l(fā)a”宏定義為中音“6”的初值64969
#define si 65031 //將“si”宏定義為中音“7”的初值65031
timer0()interrupt 1 //函數(shù)功能:產(chǎn)生中斷,改變脈沖電壓
{TH0=C/256; //對(duì)16位計(jì)數(shù)器高8位TH0賦值
TL0=C%256; //對(duì)16位計(jì)數(shù)器低8位TL0賦值
sound=~sound;} //取反形成脈沖電壓,輸出音頻
void main(void) //函數(shù)功能:主函數(shù)
{TMOD=0x01; //使用定時(shí)器0的工作模式1
ET0=1; //定時(shí)器T0中斷允許
EA=1; //開總中斷
while(1) //無(wú)限循環(huán),按鍵掃描
{if(key1==0) //檢測(cè)key1鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key1) //如果key1鍵按下,循環(huán)指令
{C=do; //將中音do的初值賦給C
TR0=1;}} //開定時(shí)器T0
if(key2==0) //檢測(cè)key2鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key2) //如果key2鍵按下,循環(huán)指令
{C=re; //將中音re的初值賦給C
TR0=1;}} //開定時(shí)器T0
if(key3==0) //檢測(cè)key3鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key3) //如果key3鍵按下,循環(huán)指令
{C=mi; //將中音mi的初值賦給C
TR0=1;}} //開定時(shí)器T0
if(key4==0) //檢測(cè)key4鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key4) //如果key4鍵按下,循環(huán)指令
{C=fa; //將中音fa的初值賦給C
TR0=1;}} //開定時(shí)器T0
if(key5==0) //檢測(cè)key5鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key5) //如果key5鍵按下,循環(huán)指令
{C=sol; //將中音sol的初值賦給C
TR0=1;}} //開定時(shí)器T0
if(key6==0) //檢測(cè)key6鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key6) //如果key6鍵按下,循環(huán)指令
{C=la; //將中音la的初值賦給C
TR0=1;}} //開定時(shí)器T0
if(key7==0) //檢測(cè)key7鍵按下
{for(n=0;n<5000;n++); //延時(shí) 5ms,按鍵消抖,防止誤操作
while(!key7) //如果key7鍵按下,循環(huán)指令
{C=si; //將中音si的初值賦給C
TR0=1;}} //開定時(shí)器T0
TR0=0; //關(guān)定時(shí)器
sound=1;}} //關(guān)蜂鳴器
程序輸入完畢后,單擊“Project”菜單下的“Built Target”選項(xiàng),確認(rèn)編譯無(wú)誤,如圖4所示。
圖4 Keil C51程序編譯界面
依次單擊 “Debug”菜單下的“Start/Stop Debug Session”和“Go”選項(xiàng)調(diào)試運(yùn)行,然后再依次單擊 “Stop Running” 和 “Start/Stop Debug Session”選項(xiàng)停止運(yùn)行。選擇“Project”菜單下的“Options for Target ‘Target 1’”選項(xiàng) ,在彈出的對(duì)話框中將“Target”選項(xiàng)卡的Xtal(MHz)一欄輸入 12,選擇“Output”選 項(xiàng) 卡中的“Create HEX File”選項(xiàng),點(diǎn)擊確定按鈕,使程序編譯后產(chǎn)生HEX代碼,最后用燒錄軟件(STC-ISP)將程序下載至AT89C51單片機(jī)中即可,如圖5所示。
圖5 程序下載界面
利用AT89C51單片機(jī)的基本操作功能,可以用實(shí)驗(yàn)的方法精確驗(yàn)證音調(diào)高低與發(fā)聲體振動(dòng)頻率的關(guān)系,使學(xué)生更加清晰、直觀地感受物理現(xiàn)象,自主總結(jié)物理規(guī)律,同時(shí)寓教于樂(lè),通過(guò)模擬電子琴的工作流程,激發(fā)了學(xué)生強(qiáng)烈的好奇心和求知欲望,而且了解了有關(guān)編程方面的知識(shí)和方法,訓(xùn)練了學(xué)生的邏輯思維。