吝歡歡,任新成,王玉清
延安大學物理與電子信息學院,陜西延安716000
“音調”是物理8年級上冊《聲音的特性》一節中的重要概念。我們都知道,聲音的高低叫做音調,在日常生活中,我們可以通過聽覺的不同感受來辨別音調的高低。但是,由于對發聲體的振動頻率我們無法直觀感知,更難以獲得準確的數據。所以,“音調高低與振動頻率的關系”就成為本節的教學難點。因此,如何讓學生更好地感受音調的高低、明確振動頻率的大小,并進一步得到兩者的相互關系就成為教學的關鍵所在[1]。
利用AT89C51單片機的定時器中斷功能,通過改變蜂鳴器的發聲頻率來控制音調高低,模擬簡易電子琴的工作過程。能夠使學生更加直觀地感受物理現象,精確驗證音調高低與發聲體振動頻率的關系,總結物理規律。而且單片機操作系統成本低廉 (一般在二三十元不等),性價比高,為學習和應用提供了便利條件。
AT89C51單片機是美國ATMEL公司生產的低電壓、高性能CMOS8位單片機,內含4KB可反復擦寫的只讀程序存儲器(ROM)和128KB隨機數據存儲器(RAM)。內置通用8位中央處理器(CPU)和Flash存儲單元,并且兼容MCS-51指令系統。

圖1 AT89C51單片機控制蜂鳴器電路圖
AT89C51單片機控制發聲系統[2]如圖1所示,它是由單片機、時鐘電路、復位電路、按鍵電路和蜂鳴器電路組成。其中,時鐘電路由一個12 MHz的晶振和兩個33 pF的電容組成,它們決定了單片機的工作時間精度為1 μs。該系統采用按鍵手動復位方式,即在單片機運行期間,用手動按鍵的方式使單片機初始化。系統利用P1口的P1.0-P1.7引腳設置了8個獨立按鍵,當有鍵按下時,P1口相應的引腳置為低電平,單片機接收脈沖信號。在實驗中,我們用其中P1.0-P1.6這7個引腳分別來控制C調中音的7個音調。蜂鳴器電路主要由蜂鳴器、PNP型三極管和一個電阻組成,低電平有效,即當向電路輸入高電平(P3.0引腳置1)時,蜂鳴器中無電流通過,電路不發聲;當向其輸入低電平(P3.0引腳置0)時,蜂鳴器中有電流通過,產生蜂鳴。我們可以通過控制高、低電平的持續時間來形成不同頻率的脈沖電壓,驅動蜂鳴器發聲,從而實現對音調高低的控制。
當單片機[3]內部定時器/計數器T0工作在計數器模式1時,寄存器TH0和TL0是以全部16位參與工作,計數長度為216=65 536。我們就可以通過改變計數初值TH0、TL0來產生不同的頻率。 例如,C 調中音 1(do)的音頻 f=523 Hz,周期s=1912 μs,定時器的定時時間為μs=956 μs,即每經過 956 μs,使輸出口改變一次脈沖電壓。定時器的計數值=956,則裝入T0計數器初值65 536-956=64 580,即啟動T0工作后,每計數956次時將產生溢出中斷,進入中斷服務后將P3.0(RXD)引腳輸出電平取反就可得到中音do的音符頻率,如圖2所示。

圖2 音符脈沖波形圖
同理,C調中音各音符的頻率與計數初值如表1所示。

表1 C調中音各音符的頻率與計數初值對照表
我們使用Keil C51軟件的C語言編寫程序來實現實驗目的。
首先,啟動Keil C51軟件進入編輯界面,單擊“Project”菜單,在彈出的下拉子菜單中選擇“New Project”選項建立新工程,選擇文件保存路徑,輸入工程文件名后點擊保存,在彈出的對話框中選擇相應的單片機型號,即Atmel公司的AT89C51型單片機,點擊確定按鈕。然后,在編輯界面“File”菜單的下拉子菜單中單擊“New”選項新建文件。 再單擊“File”菜單下的“Save As”選項保存該文件,在彈出的對話框中“文件名”欄內輸入文件名及對應的擴展名,如“test.c”。單擊“保存”按鈕后回到編輯界面,單擊“Target 1”前面的“+”號,在“Source Group 1”上單擊右鍵后再單擊“Add Files to Group‘Source Group 1’”。 最后,在彈出的對話框中選中文件test.c,單擊 “Add”按鈕,如圖3所示。

圖3 Keil C51編輯界面
在KeilC51的編輯界面輸入如下C語言源程序:
#include<reg51.h> //包含51單片機寄存器定義的頭文件
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; //定義全局變量,儲存定時器的定時常數
unsigned long n; //定義無符號數n
//以下是C調中音的音頻宏定義
#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 //將“la”宏定義為中音“6”的初值64969
#define si 65031 //將“si”宏定義為中音“7”的初值65031
timer0()interrupt 1 //函數功能:產生中斷,改變脈沖電壓
{TH0=C/256; //對16位計數器高8位TH0賦值
TL0=C%256; //對16位計數器低8位TL0賦值
sound=~sound;} //取反形成脈沖電壓,輸出音頻
void main(void) //函數功能:主函數
{TMOD=0x01; //使用定時器0的工作模式1
ET0=1; //定時器T0中斷允許
EA=1; //開總中斷
while(1) //無限循環,按鍵掃描
{if(key1==0) //檢測key1鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key1) //如果key1鍵按下,循環指令
{C=do; //將中音do的初值賦給C
TR0=1;}} //開定時器T0
if(key2==0) //檢測key2鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key2) //如果key2鍵按下,循環指令
{C=re; //將中音re的初值賦給C
TR0=1;}} //開定時器T0
if(key3==0) //檢測key3鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key3) //如果key3鍵按下,循環指令
{C=mi; //將中音mi的初值賦給C
TR0=1;}} //開定時器T0
if(key4==0) //檢測key4鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key4) //如果key4鍵按下,循環指令
{C=fa; //將中音fa的初值賦給C
TR0=1;}} //開定時器T0
if(key5==0) //檢測key5鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key5) //如果key5鍵按下,循環指令
{C=sol; //將中音sol的初值賦給C
TR0=1;}} //開定時器T0
if(key6==0) //檢測key6鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key6) //如果key6鍵按下,循環指令
{C=la; //將中音la的初值賦給C
TR0=1;}} //開定時器T0
if(key7==0) //檢測key7鍵按下
{for(n=0;n<5000;n++); //延時 5ms,按鍵消抖,防止誤操作
while(!key7) //如果key7鍵按下,循環指令
{C=si; //將中音si的初值賦給C
TR0=1;}} //開定時器T0
TR0=0; //關定時器
sound=1;}} //關蜂鳴器
程序輸入完畢后,單擊“Project”菜單下的“Built Target”選項,確認編譯無誤,如圖4所示。

圖4 Keil C51程序編譯界面
依次單擊 “Debug”菜單下的“Start/Stop Debug Session”和“Go”選項調試運行,然后再依次單擊 “Stop Running” 和 “Start/Stop Debug Session”選項停止運行。選擇“Project”菜單下的“Options for Target ‘Target 1’”選項 ,在彈出的對話框中將“Target”選項卡的Xtal(MHz)一欄輸入 12,選擇“Output”選 項 卡中的“Create HEX File”選項,點擊確定按鈕,使程序編譯后產生HEX代碼,最后用燒錄軟件(STC-ISP)將程序下載至AT89C51單片機中即可,如圖5所示。

圖5 程序下載界面
利用AT89C51單片機的基本操作功能,可以用實驗的方法精確驗證音調高低與發聲體振動頻率的關系,使學生更加清晰、直觀地感受物理現象,自主總結物理規律,同時寓教于樂,通過模擬電子琴的工作流程,激發了學生強烈的好奇心和求知欲望,而且了解了有關編程方面的知識和方法,訓練了學生的邏輯思維。