久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21531|回復: 8
打印 上一主題 下一主題
收起左側

51單片機的方波的輸出頻率和占空比

[復制鏈接]
跳轉到指定樓層
樓主
ID:65022 發表于 2014-8-13 12:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如何改變51單片機輸出方波的頻率和占空比
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2014-8-13 13:57 來自觸屏版 | 只看該作者
昨天在24小時必答區還討論了這個問題,樓主你進這個去看一下
回復

使用道具 舉報

板凳
ID:63752 發表于 2014-8-13 22:40 來自觸屏版 | 只看該作者
一起研究吧!我也要這信息!
回復

使用道具 舉報

地板
ID:65549 發表于 2014-8-28 16:35 | 只看該作者
我在網上找到得找個,試試還可以,剛剛學,還有好多地方不懂。
  //程序功能簡介:本程序產生15HZ~~~50KHZ的方波,并且實現頻率和脈寬的獨立調制,即可
//    在改變頻率的同時不改變脈寬,再改變脈寬的同時不改變頻率;同時設置
//    兩個調節步長------在KEY鍵按下時,粗調,沒有按下時,細調;
//程序思路: 本程序用到兩個定時器------定時器0和定時器1,其中定時器0工作在定時方式下,
//    決定方波的頻率;定時器1,同樣工作在定時方式下,用于設定脈寬;
//制作人:  陳卓;
//制作人單位: 武漢理工大學 信息工程學院 電信0504班;
//制作時間: 2007年12月26日;
//------------------------------------------------------------------------------------
#include "reg52.h"
#include "math.h"

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

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

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

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

//-----------------------------------------------------------------------------------
//函數名稱:calculate_W();
//入口參數:無;
//出口參數:無;
//函數功能:脈寬計算函數,脈寬變化時,計算出定時器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;
  }
//-----------------------------------------------------------------------------------
//函數名稱:key_scan();
//入口參數:無;
//出口參數:無;
//函數功能:按鍵掃描函數;
//------------------------------------------------------------------------------------
    void key_scan()
  {
   delay(4);
   if(!KEY_F_UP)     //頻率上調鍵按下;
    {
     FLAG_F=1;    //置標志位;
     if(!KEY)
      FREQ+=10;
     else
      FREQ++;
     if(FREQ>50000)
      FREQ=1;
     }
   else if(!KEY_F_DOWN)   //頻率下調鍵按下;
    {
     FLAG_F=1;    //置標志位;
     if(!KEY)
      FREQ-=10;
     else
      FREQ--;
     if(FREQ<1)
      FREQ=50000;
     }
    else if(!KEY_W_UP)    //脈寬上調鍵按下;
    {
     FLAG_W=1;    //置標志位;
     if(!KEY)
      PERCENT+=5;
     else
      PERCENT++;
     if(PERCENT>49)
      PERCENT=1;
     }
    else if(!KEY_W_DOWN)   //脈寬下調鍵按下;
    {
     FLAG_W=1;    //置標志位;
     if(!KEY)
      PERCENT-=5;
     else
      PERCENT--;
     if(PERCENT<1)
      PERCENT=49;
     }
     else ;
     }

//-----------------------------------------------------------------------------------
//函數名稱timer0();
//入口參數:無;
//出口參數:無;
//函數功能:定時器0中斷函數;
//------------------------------------------------------------------------------------
  void timer0() interrupt 1
    {
    TH0=TIMER0_H;
    TL0=TIMER0_L;
    TR1=1;      //開定時器1;
    OUTPUT=1;
    }
//-----------------------------------------------------------------------------------
//函數名稱timer1();
//入口參數:無;
//出口參數:無;
//函數功能:定時器1中斷函數;
//制作人: 陳卓;
//制作人單位:武漢理工大學 信息工程學院 電信0504班;
//制作時間:2007年12月26日;
//------------------------------------------------------------------------------------
  void timer1() interrupt 3
    {
    TH1=TIMER1_H;
    TL1=TIMER1_L;
    TR1=0;      //關定時器1,一定要這一步,因為定時器1的定時短于定時器0;
    OUTPUT=0;
    }
//-----------------------------------------------------------------------------------
//函數名稱init();
//入口參數:無;
//出口參數:無;
//函數功能:定時器初始化函數;
//------------------------------------------------------------------------------------
   void init()
     {
    TMOD=0x11;    //定時器0和定時器1都工作在方式1,16位計數器;
    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;
   
    }
//-----------------------------------------------------------------------------------
//函數名稱main();
//入口參數:無;
//出口參數:無;
//函數功能:主函數入口;
//------------------------------------------------------------------------------------
main()
      {
    init();
    while(1)
     {
      key_scan();
      if(FLAG_F)     //改變頻率時要注意要進行脈寬的重新設置;
       {
        calculate_F();
        calculate_W();
        FLAG_F=0;
        }
       if(FLAG_W)     // 脈寬改變,頻率不改變;
       {
        calculate_W();
        FLAG_W=0;
        }
        }
}

評分

參與人數 1威望 +25 黑幣 +30 收起 理由
admin + 25 + 30 幫助他人解決問題的 積分獎勵!!!

查看全部評分

回復

使用道具 舉報

5#
ID:63752 發表于 2014-8-29 12:57 | 只看該作者
很好呢,學習學習了。有沒有PCA模塊來改變占空比的例子啊?這個是用定時器中斷。只是能單一輸出PWM。如果我要輸出三路呢,覺得就很麻煩了。最好有PCA模塊的那程序,學習學習~~~
回復

使用道具 舉報

6#
ID:26218 發表于 2014-9-3 22:02 | 只看該作者
建議你看看LED調光(PWM)的程序,細細鉆研會有幫助
回復

使用道具 舉報

7#
ID:308632 發表于 2018-4-23 21:18 | 只看該作者
可以用AD
回復

使用道具 舉報

8#
ID:372402 發表于 2018-8-31 11:34 | 只看該作者
臺老怪 發表于 2014-8-28 16:35
**** 作者被禁止或刪除 內容自動屏蔽 ****

很好的東西,電路圖有嗎老鐵?可否發一下?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线日韩中文字幕 | 日韩一区二区三区精品 | 欧美日韩三区 | 欧美乱人伦视频 | 一区二区三区欧美 | 超碰免费在线观看 | 日韩欧美亚洲一区 | 午夜99| 激情五月综合 | 日韩精品专区在线影院重磅 | 亚洲欧美一区二区三区在线 | 天堂一区二区三区 | 日韩中文字幕区 | av电影一区二区 | 欧美日韩国产一区二区三区 | 国产美女精品视频 | 国产在线一区二区三区 | 一区二区三区视频在线 | 成年人精品视频 | 国产成人精品免费 | 国产免费一区二区三区 | 中文字幕在线二区 | 久久999| 天天综合91 | 欧美涩涩网 | 一级片网站视频 | 福利社午夜影院 | 成人精品 | 亚洲成人av | 蜜桃视频一区二区三区 | 久久综合伊人 | 9久久婷婷国产综合精品性色 | 韩国欧洲一级毛片 | 亚洲国产电影 | 亚洲精品久久久久中文字幕欢迎你 | 亚欧精品 | 精品www | 欧美二区三区 | 伊人婷婷 | 久久久久国产一区二区三区四区 | 人人澡人人射 |