❶ 單片機的輸出聲音頻率為什麼這么算
首先,0.7ms翻轉P3.0一次,P3.0輸出的波形由1變0或由0變1,而一個震盪周期包含一個高電平和一個低電平,因此你看到需要將0.7ms乘以2才是一個周期波形的時長,0.7ms*2=1.4ms
1.4ms換算成秒: 1.4ms/1000=0.0014s
0.0014s換算成頻率: 1/0.0014s=714.2857Hz
❷ 單片機的輸出聲音頻率是多少
揚聲器或蜂鳴器是靠正、負電平驅動生成震盪,因此,正、負電平相同時長能生成最大聲音
500Hz=500次震盪每秒,即震盪頻率=1/500Hz=0.002秒=0.002s
如果我們需要生成500Hz的聲音,應該讓揚聲器接收到這樣的波形:0.001s的高電平和0.001s的低電平
因此我們設定定時器每0.001s中斷一次,在中斷時翻轉P3.0的狀態,得到的波形就是我們想要的波形啦。
❸ C51單片機中用P1.0輸出1KHz和500Hz的音頻信號驅動揚聲器
開兩個計時器,計時器0用作定時中斷,計數器1用作普通計數器用,用計數器1產生兩個不同的頻率。
定時器0中斷用以判別100ms和200ms的時間隙,由於定時器中斷需要在兩個中斷間隔時間間跳變,幫需要加一個標志位FLAG,當FLAG=0時讓定時器0延時100MS中斷,當FLAG=1時定時器0延時200MS中斷。
假設p1.1外接按鈕,對輸出1khz和500hz進行切換。
#include
sbit wave = p1^0;
sbit k = p1^1;
#define fosc 12000000ul //晶振頻率,可以自行修改
#define fint 1000 //定時器中斷頻率
bit switchflag;
void delayms(unsigned int x)
{
unsigned char t;
while(x--)
for(t=0;t<120;t++);
}
void main()
{
tmod&=0xf0;
tmod|=0x01;
th0=(65536-fosc/fint/12)/256;
tl0=(65536-fosc/fint/12)%256;
ie|=0x82;
tr0=1;
while(1)
{
if(!k)
{
delayms(10);
if(!k)
switchflag=!switchflag;
}
}
}
void t0_int() interrupt 1
{
static bit i;
th0=(65536-fosc/fint/12)/256;
tl0=(65536-fosc/fint/12)%256;
i=!i;
if(switchflag) {wave=!wave;}
else {wave=(i)?!wave:wave;}
}
(3)單片機音頻輸出擴展閱讀:
單片機也被稱為單片微控器,屬於一種集成式電路晶元。在單片機中主要包含CPU、只讀存儲器ROM和隨機存儲器RAM等,多樣化數據採集與控制系統能夠讓單片機完成各項復雜的運算,無論是對運算符號進行控制,還是對系統下達運算指令都能通過單片機完成。
由此可見,單片機憑借著強大的數據處理技術和計算功能可以在智能電子設備中充分應用。簡單地說,單片機就是一塊晶元,這塊晶元組成了一個系統,通過集成電路技術的應用,將數據運算與處理能力集成到晶元中,實現對數據的高速化處理。
❹ 怎樣用stc89c52單片機控制蜂鳴器發出音樂的c語言程序
#include
#include
//本例採用89C52,晶振為11.0592MHZ
//關於如何編制音樂代碼,其實十分簡單,各位可以看以下代碼.
//頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍;
//所以拿出譜子,試探編吧!
sbitBeep=P1^5;
unsignedcharn=0;//n為節拍常數變數
unsignedcharcodemusic_tab[]={
0x18,0x30,0x1C,0x10,//格式為:頻率常數,節拍常數,頻率常數,節拍常數,
0x20,0x40,0x1C,0x10,
0x18,0x10,0x20,0x10,
0x1C,0x10,0x18,0x40,
0x1C,0x20,0x20,0x20,
0x1C,0x20,0x18,0x20,
0x20,0x80,0xFF,0x20,
0x30,0x1C,0x10,0x18,
0x20,0x15,0x20,0x1C,
0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,
0x20,0x30,0x80,0xFF,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x20,0x1C,0x10,
0x18,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x80,
0x20,0x30,0x1C,0x10,
0x20,0x10,0x1C,0x10,
0x20,0x20,0x26,0x20,
0x2B,0x20,0x30,0x20,
0x2B,0x40,0x20,0x15,
0x1F,0x05,0x20,0x10,
0x1C,0x10,0x20,0x20,
0x26,0x20,0x2B,0x20,
0x30,0x20,0x2B,0x40,
0x20,0x30,0x1C,0x10,
0x18,0x20,0x15,0x20,
0x1C,0x20,0x20,0x20,
0x26,0x40,0x20,0x20,
0x2B,0x20,0x26,0x20,
0x20,0x20,0x30,0x30,
0x20,0x30,0x1C,0x10,
0x18,0x40,0x1C,0x20,
0x20,0x20,0x26,0x40,
0x13,0x60,0x18,0x20,
0x15,0x40,0x13,0x40,
0x18,0x80,0x00
};
voidint0()interrupt1//採用中斷0控制節拍
{TH0=0xd8;
TL0=0xef;
n--;
}
voiddelay(unsignedcharm)//控制頻率延時
{
unsignedi=3*m;
while(--i);
}
voiddelayms(unsignedchara)//豪秒延時子程序
{
while(--a);//採用while(--a)不要採用while(a--);各位可編譯一下看看匯編結果就知道了!
}
voidmain()
{unsignedcharp,m;//m為頻率常數變數
unsignedchari=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a:p=music_tab[i];
if(p==0x00){i=0,delayms(1000);gotoplay;}//如果碰到結束符,延時1秒,回到開始再來一遍
elseif(p==0xff){i=i+1;delayms(100),TR0=0;gotoa;}//若碰到休止符,延時100ms,繼續取下一音符
else{m=music_tab[i++],n=music_tab[i++];}//取頻率常數和節拍常數
TR0=1;//開定時器1
while(n!=0)Beep=~Beep,delay(m);//等待節拍完成,通過P1口輸出音頻(可多聲道哦!)
TR0=0;//關定時器1
}
}
你參考這個吧
❺ 51單片機聲音輸出
看你要輸出什麼樣的音頻。
1、如果只是很簡單的像某些有聲賀卡那樣的話,接一個無源喇叭,自己控制I/O輸出一個方波,通過控制方波的頻率來調節音調,然後將不同的頻率組合起來,連續播放就是一首簡單的歌曲。
2、如果要輸出MP3,那就需要一塊音頻解碼晶元,比如VS1003。單片機將存儲在外部存儲器里(比如U盤)的歌曲信息通過介面晶元傳給音頻解碼晶元,解碼之後就能輸出歌曲了。
第二種情況相對比較復雜,涉及到如何高效讀取存儲的歌曲信息和高效傳輸這些信息。