當前位置:編程學習大全網 - 源碼下載 - C調低音5-高音5的頻率是多少,如何轉換成51系列單片機的頻率?

C調低音5-高音5的頻率是多少,如何轉換成51系列單片機的頻率?

壹 實現方法: (1)音頻控制 要讓蜂鳴器發生,只要給蜂鳴器送該音調頻率的電平信號就可以,單片機IO口只能輸出高電平1,低電平0兩個狀態,因此向蜂鳴器送電平信號實際就是音頻的方波。單片機晶振11.0592MHZ,機器周期為12*(1/11.0592)us=1.085us,例如中音“1”頻率為523hz,周期就是1/523s,即1.91s,因此向單片機送周期為1.91s的方波就能發出523HZ的音調,該方波半個周期為1.91/2=0.955s,利用中斷定時器,讓單片機每0.955s取反壹次就可以得到523hz的音調,機器周期總數為955us/1.085us=880,定時常數為880.當發生頻率為f時的時候,定時常數C=(1000000/2f)us/1.085us=46083/f.當t0工作方式0時,最大計數8192,定時初值計算如下:TH0=(8192-C)/32;TL0=(8192-C)%32;下面給妳個例子:(用定時T0的方式0控制播放:好人壹生平安)希望對妳有幫助 #include<reg51.h> //包含51單片機寄存器定義的頭文件

sbit sound=P3^7; //將sound位定義為P3.7

unsigned int C; //儲存定時器的定時常數

//以下是C調低音的音頻宏定義

#define l_dao 262 //將“l_dao”宏定義為低音“1”的頻率262Hz

#define l_re 286 //將“l_re”宏定義為低音“2”的頻率286Hz

#define l_mi 311 //將“l_mi”宏定義為低音“3”的頻率311Hz

#define l_fa 349 //將“l_fa”宏定義為低音“4”的頻率349Hz

#define l_sao 392 //將“l_sao”宏定義為低音“5”的頻率392Hz

#define l_la 440 //將“l_a”宏定義為低音“6”的頻率440Hz

#define l_xi 494 //將“l_xi”宏定義為低音“7”的頻率494Hz

//以下是C調中音的音頻宏定義

#define dao 523 //將“dao”宏定義為中音“1”的頻率523Hz

#define re 587 //將“re”宏定義為中音“2”的頻率587Hz

#define mi 659 //將“mi”宏定義為中音“3”的頻率659Hz

#define fa 698 //將“fa”宏定義為中音“4”的頻率698Hz

#define sao 784 //將“sao”宏定義為中音“5”的頻率784Hz

#define la 880 //將“la”宏定義為中音“6”的頻率880Hz

#define xi 987 //將“xi”宏定義為中音“7”的頻率523H

//以下是C調高音的音頻宏定義

#define h_dao 1046 //將“h_dao”宏定義為高音“1”的頻率1046Hz

#define h_re 1174 //將“h_re”宏定義為高音“2”的頻率1174Hz

#define h_mi 1318 //將“h_mi”宏定義為高音“3”的頻率1318Hz

#define h_fa 1396 //將“h_fa”宏定義為高音“4”的頻率1396Hz

#define h_sao 1567 //將“h_sao”宏定義為高音“5”的頻率1567Hz

#define h_la 1760 //將“h_la”宏定義為高音“6”的頻率1760Hz

#define h_xi 1975 //將“h_xi”宏定義為高音“7”的頻率1975Hz

/*******************************************

函數功能:1個延時單位,延時200ms

******************************************/

void delay()

{

unsigned char i,j;

for(i=0;i<250;i++)

for(j=0;j<250;j++)

;

}

/*******************************************

函數功能:主函數

******************************************/

void main(void)

{

unsigned char i,j;

//以下是《渴望》片頭曲的壹段簡譜

unsigned int code f[]={re,mi,re,dao,l_la,dao,l_la, //每行對應壹小節音符<br> l_sao,l_mi,l_sao,l_la,dao,<br> l_la,dao,sao,la,mi,sao,<br> re, <br> mi,re,mi,sao,mi,<br> l_sao,l_mi,l_sao,l_la,dao,<br> l_la,l_la,dao,l_la,l_sao,l_re,l_mi,<br> l_sao,<br> re,re,sao,la,sao,<br> fa,mi,sao,mi,<br> la,sao,mi,re,mi,l_la,dao,<br> re,<br> mi,re,mi,sao,mi,<br> l_sao,l_mi,l_sao,l_la,dao,<br> l_la,dao,re,l_la,dao,re,mi,<br> re,<br> l_la,dao,re,l_la,dao,re,mi,<br> re,<br> 0xff}; //以0xff作為音符的結束標誌

//以下是簡譜中每個音符的節拍

//"4"對應4個延時單位,"2"對應2個延時單位,"1"對應1個延時單位

unsigned char code JP[ ]={ 4,1,1,4,1,1,2,

2,2,2,2,8,

4,2,3,1,2,2,

10,

4,2,2,4,4,

2,2,2,2,4,

2,2,2,2,2,2,2,

10,

4,4,4,2,2,

4,2,4,4,

4,2,2,2,2,2,2,

10,

4,2,2,4,4,

2,2,2,2,6,

4,2,2,4,1,1,4,

10,

4,2,2,4,1,1,4,

10

};

EA=1; //開總中斷

ET0=1; //定時器T0中斷允許

TMOD=0x00; // 使用定時器T0的模式1(13位計數器)

while(1) //無限循環

{

i=0; //從第1個音符f[0]開始播放

while(f[i]!=0xff) //只要沒有讀到結束標誌就繼續播放

{

C=460830/f[i];

TH0=(8192-C)/32; //可證明這是13位計數器TH0高8位的賦初值方法

TL0=(8192-C)%32; //可證明這是13位計數器TL0低5位的賦初值方法

TR0=1; //啟動定時器T0

for(j=0;j<JP[i];j++) //控制節拍數

delay(); //延時1個節拍單位

TR0=0; //關閉定時器T0

i++; //播放下壹個音符

}

}

}

/***********************************************************

函數功能:定時器T0的中斷服務子程序,使P3.7引腳輸出音頻的方波

************************************************************/

void Time0(void ) interrupt 1 using 1

{

sound=!sound; //將P3.7引腳輸出電平取反,形成方波

TH0=(8192-C)/32; //可證明這是13位計數器TH0高8位的賦初值方法

TL0=(8192-C)%32; //可證明這是13位計數器TL0低5位的賦初值方法

}

  • 上一篇:什麽叫股票中的DDE軟件?什麽又叫DDX選股?如何用?
  • 下一篇:如何在通達信的副圖裏添加大盤指數
  • copyright 2024編程學習大全網