標題: 都是定時器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