欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機的方波的輸出頻率和占空比 [打印本頁]

作者: 張自達    時間: 2014-8-13 12:34
標(biāo)題: 51單片機的方波的輸出頻率和占空比
如何改變51單片機輸出方波的頻率和占空比

作者: admin    時間: 2014-8-13 13:57
昨天在24小時必答區(qū)還討論了這個問題,樓主你進這個去看一下
作者: XUSHENG    時間: 2014-8-13 22:40
一起研究吧!我也要這信息!
作者: 臺老怪    時間: 2014-8-28 16:35
我在網(wǎng)上找到得找個,試試還可以,剛剛學(xué),還有好多地方不懂。
  //程序功能簡介:本程序產(chǎn)生15HZ~~~50KHZ的方波,并且實現(xiàn)頻率和脈寬的獨立調(diào)制,即可
//    在改變頻率的同時不改變脈寬,再改變脈寬的同時不改變頻率;同時設(shè)置
//    兩個調(diào)節(jié)步長------在KEY鍵按下時,粗調(diào),沒有按下時,細(xì)調(diào);
//程序思路: 本程序用到兩個定時器------定時器0和定時器1,其中定時器0工作在定時方式下,
//    決定方波的頻率;定時器1,同樣工作在定時方式下,用于設(shè)定脈寬;
//制作人:  陳卓;
//制作人單位: 武漢理工大學(xué) 信息工程學(xué)院 電信0504班;
//制作時間: 2007年12月26日;
//------------------------------------------------------------------------------------
#include "reg52.h"
#include "math.h"

#define  uchar unsigned char
#define  uint unsigned int
#define  ALL  65536     //定時器工作方式1時,最大基數(shù)長度 65536;
#define  F_osc 12000000    //晶振頻率12M;

//------------------------------------------------------------------------------------
// 各端口定義;
//------------------------------------------------------------------------------------
sbit KEY_F_UP=P0^2;      //頻率上調(diào)按鈕;
sbit KEY_F_DOWN=P0^3;     //頻率下調(diào)按鈕;
sbit KEY_W_UP=P0^4;      //脈寬上調(diào)按鈕;
sbit KEY_W_DOWN=P0^5;     //脈寬下調(diào)按鈕;
sbit KEY=P0^6;       //粗細(xì)調(diào)節(jié)按鈕-----按下為粗調(diào),否則為細(xì)調(diào);
sbit OUTPUT=P1^0;      //波形輸出;

//------------------------------------------------------------------------------------
//全局變量聲明;
//------------------------------------------------------------------------------------
uchar TIMER0_H,TIMER0_L,TIMER1_H,TIMER1_L; //定時器0和定時器1的初值設(shè)置;
uchar PERCENT=50;        //初始占空比;
uchar FLAG_F=0,FLAG_W=0;      //頻率調(diào)節(jié)標(biāo)志和脈寬調(diào)制標(biāo)志;
uint FREQ=50000;        //初始頻率;
float temp;         //臨時全局變量,用于數(shù)據(jù)傳遞;
//-----------------------------------------------------------------------------------
//函數(shù)聲明;
//-----------------------------------------------------------------------------------
void delay(uchar t);       //延時函數(shù),用于按鍵去抖;
void init();         //初始化函數(shù),用于定時器的初始化;
void calculate_F();       //頻率計算函數(shù),當(dāng)頻率變化,計算出定時器0初值;
void calculate_W();       //脈寬計算函數(shù),脈寬變化時,計算出定時器1初值;
void key_scan();        //按鍵掃描函數(shù);
void timer0();        //定時器0中斷函數(shù);
void timer1();        //定時器1中斷函數(shù);

//-----------------------------------------------------------------------------------
//函數(shù)名稱:delay();
//入口參數(shù):uchar t;
//出口參數(shù):無;
//函數(shù)功能:延時;
//------------------------------------------------------------------------------------
void delay(uchar t)
  {
   uchar i,j;
   while(t--)
    {
     for(i=0;i<100;i++)
     for(j=0;j<100;j++)
     ;
     }
    }
//-----------------------------------------------------------------------------------
//函數(shù)名稱:calculate_F();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:頻率計算函數(shù),當(dāng)頻率變化,計算出定時器0初值;
//------------------------------------------------------------------------------------
void calculate_F()
  {
   
   temp=ALL-F_osc/12.0/FREQ;
   TIMER0_H=(uint)temp/256;
   TIMER0_L=(uint)temp%256;
   }

//-----------------------------------------------------------------------------------
//函數(shù)名稱:calculate_W();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:脈寬計算函數(shù),脈寬變化時,計算出定時器1初值;
//------------------------------------------------------------------------------------  
void calculate_W()
  {
   float TEMP;
   TEMP=(1-PERCENT/100.0)*ALL+temp*PERCENT/100.0;
   TIMER1_H=(uint)TEMP/256;
   TIMER1_L=(uint)TEMP%256;
  }
//-----------------------------------------------------------------------------------
//函數(shù)名稱:key_scan();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:按鍵掃描函數(shù);
//------------------------------------------------------------------------------------
    void key_scan()
  {
   delay(4);
   if(!KEY_F_UP)     //頻率上調(diào)鍵按下;
    {
     FLAG_F=1;    //置標(biāo)志位;
     if(!KEY)
      FREQ+=10;
     else
      FREQ++;
     if(FREQ>50000)
      FREQ=1;
     }
   else if(!KEY_F_DOWN)   //頻率下調(diào)鍵按下;
    {
     FLAG_F=1;    //置標(biāo)志位;
     if(!KEY)
      FREQ-=10;
     else
      FREQ--;
     if(FREQ<1)
      FREQ=50000;
     }
    else if(!KEY_W_UP)    //脈寬上調(diào)鍵按下;
    {
     FLAG_W=1;    //置標(biāo)志位;
     if(!KEY)
      PERCENT+=5;
     else
      PERCENT++;
     if(PERCENT>49)
      PERCENT=1;
     }
    else if(!KEY_W_DOWN)   //脈寬下調(diào)鍵按下;
    {
     FLAG_W=1;    //置標(biāo)志位;
     if(!KEY)
      PERCENT-=5;
     else
      PERCENT--;
     if(PERCENT<1)
      PERCENT=49;
     }
     else ;
     }

//-----------------------------------------------------------------------------------
//函數(shù)名稱timer0();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:定時器0中斷函數(shù);
//------------------------------------------------------------------------------------
  void timer0() interrupt 1
    {
    TH0=TIMER0_H;
    TL0=TIMER0_L;
    TR1=1;      //開定時器1;
    OUTPUT=1;
    }
//-----------------------------------------------------------------------------------
//函數(shù)名稱timer1();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:定時器1中斷函數(shù);
//制作人: 陳卓;
//制作人單位:武漢理工大學(xué) 信息工程學(xué)院 電信0504班;
//制作時間:2007年12月26日;
//------------------------------------------------------------------------------------
  void timer1() interrupt 3
    {
    TH1=TIMER1_H;
    TL1=TIMER1_L;
    TR1=0;      //關(guān)定時器1,一定要這一步,因為定時器1的定時短于定時器0;
    OUTPUT=0;
    }
//-----------------------------------------------------------------------------------
//函數(shù)名稱init();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:定時器初始化函數(shù);
//------------------------------------------------------------------------------------
   void init()
     {
    TMOD=0x11;    //定時器0和定時器1都工作在方式1,16位計數(shù)器;
    calculate_F();   //初始為1KHZ,占空比為50%;
    calculate_W();
    TH0=TIMER0_H;
    TL0=TIMER0_L;
    TH1=TIMER1_H;
    TL1=TIMER1_L;
    ET0=1;
    ET1=1;
    EA=1;
    TR0=1;
    TR1=1;
   
    }
//-----------------------------------------------------------------------------------
//函數(shù)名稱main();
//入口參數(shù):無;
//出口參數(shù):無;
//函數(shù)功能:主函數(shù)入口;
//------------------------------------------------------------------------------------
main()
      {
    init();
    while(1)
     {
      key_scan();
      if(FLAG_F)     //改變頻率時要注意要進行脈寬的重新設(shè)置;
       {
        calculate_F();
        calculate_W();
        FLAG_F=0;
        }
       if(FLAG_W)     // 脈寬改變,頻率不改變;
       {
        calculate_W();
        FLAG_W=0;
        }
        }
}
作者: XUSHENG    時間: 2014-8-29 12:57
很好呢,學(xué)習(xí)學(xué)習(xí)了。有沒有PCA模塊來改變占空比的例子?這個是用定時器中斷。只是能單一輸出PWM。如果我要輸出三路呢,覺得就很麻煩了。最好有PCA模塊的那程序,學(xué)習(xí)學(xué)習(xí)~~~
作者: clfpc    時間: 2014-9-3 22:02
建議你看看LED調(diào)光(PWM)的程序,細(xì)細(xì)鉆研會有幫助
作者: 沐伊雪    時間: 2018-4-23 21:18
可以用AD
作者: 關(guān)外秀才    時間: 2018-8-31 11:34
臺老怪 發(fā)表于 2014-8-28 16:35
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

很好的東西,電路圖有嗎老鐵?可否發(fā)一下?




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1