標題: 都是定時器0惹得禍? [打印本頁]
作者: liuyang 時間: 2011-8-10 23:18
標題: 都是定時器0惹得禍?
問題:要用單片機產(chǎn)生一個10K頻率的信號,外接接有功放的揚聲器,要達到聲音有最好的效果,
方案一:
/****************************************
定時器2
三種模式:捕獲,自動重載,波特率發(fā)生器
NOW 作用:可編程時鐘輸出 ===>
公式:信號頻率=振蕩器頻率/4*[65536-(RCAP2H,RCAP2L)]
效果:非常刺耳尖銳的聲音,明顯達到預期效果
*****************************************/
#define DD 300
sbit BEEP = P1^0;
void Sound_Init(void) //0.000016
{
T2MOD = 0x02;
RCAP2H = TH2=(65536-DD)/256;
RCAP2L = TL2=(65536-DD)%256;
EA = 1; //開總中斷
TR2 = 1; //開定時器2
}
void main()
{
Sound_Init();
While(1);
}
方案二:
/*********************************************
普通定時器0的方法
效果:聲音間隔、低沉地發(fā)出,很明顯十分失敗
**********************************************/
sbit beep=P0^7;
void initail()
{
TMOD=0x01;
TH0=(65536-65486)/256; //裝入初值,使每隔50us溢出一次
TL0=(65536-65486)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0()interrupt 1
{
TH0=(65536-65486)/256;
TL0=(65536-65486)%256;
beep=~beep;
}
void main()
{
initail();
while(1);
}
方案三:
/*************************************
延時法
效果:較為連續(xù)清晰的聲音,達到一點效果
*************************************/
void delay_50() //50us
{
int x;
for(x=0;x<50;x++)
_nop_();
}
void main()
{
while(1)
{
beep=~beep;
delay_50(); //50us
}
}
IN A WORD ,毫無疑問,采用定時器2輸出時鐘信號是效果最好的
但我覺得疑惑的是:
采用定時器0效果竟然比普通延時效果差很多……。。。。
采用定時器0應該輸出的是10K信號,不過很明顯,出來效果是比10K低得多,揚聲器幾乎發(fā)出斷續(xù)的低吟聲。
希望有高人來賜教,幫小弟解決這個在你們眼中很弱的問題~~~~~~~~
作者: zlseek 時間: 2011-8-11 10:43
不會有差別吧~~~~~~~~
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |