找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1807|回復(fù): 4
收起左側(cè)

關(guān)于51單片機(jī)PWM輸出程序問(wèn)題?

[復(fù)制鏈接]
ID:687423 發(fā)表于 2020-2-19 09:20 | 顯示全部樓層 |閱讀模式
剛學(xué)的PWM,看了一下參考的程序,有一些地方不是很明白,代碼如下。后面還有我自己改編后寫(xiě)的代碼,但是不好使,請(qǐng)大家?guī)臀曳治鲆幌隆?br /> 問(wèn)題:
      PWM的周期timer1是自己設(shè)定的還是單片機(jī)內(nèi)部定的
      value代表的是占空比,當(dāng)count==100的時(shí)候才加1,為什么value要等于1000而不是等于10(我認(rèn)為應(yīng)該是分成10份。
      關(guān)于判斷PWM是否為1為什么是用timer1和value的大小做對(duì)比。
參考代碼,沒(méi)有問(wèn)題
#include "reg52.h"   
typedef unsigned int u16;   
typedef unsigned char u8;

sbit PWM=P2^2;
bit DIR;

u16 count,value,timer1;

void Timer1Init()
{
TMOD|=0X10
TH1 = 0xFF;
TL1 = 0xff;   
ET1=1
EA=1;
TR1=1;
}

void main()
{
Timer1Init();
while(1)
{
  if(count>100)      
  {  
   count=0;
   if(DIR==1)      
   {
     value++;
   }   
   if(DIR==0)
   {
     value--;
   }
   
  }
  if(value==1000)
  {
    DIR=0;
  }
  if(value==0)
  {
    DIR=1;
  }
   
  if(timer1>1000)
  {
   timer1=0;
  }
  if(timer1 <value)
  {
   PWM=1;
  }
  else
  {
   PWM=0;
  }  
}  
}

void Time1(void) interrupt 3   
{
TH1 = 0xFF;
TL1 = 0xff;   //1us
timer1++;
    count++;
}
我自己根據(jù)上面代碼自己改編了一下,只有這些變了,其他和上面程序一樣,但無(wú)法呈現(xiàn)呼吸狀態(tài),led一直在閃爍。
if(value==10)
  {
    DIR=0;
  }
  if(value==0)
  {
    DIR=1;
  }
  for(i=0;i<=value;i++)
  {
   PWM=1;
  }
  for(i=value+1;i<=10;i++)
  {
   PWM=0;
  }


回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2020-2-19 14:17 | 顯示全部樓層
給你個(gè)參考程序,timer1只是給了定時(shí)中斷, PWM的周期是程序給定的,在參考程序里zhouqi計(jì)數(shù)值是周期,gaodianpin計(jì)數(shù)值是周期內(nèi)的高電平值,具體看程序。 呼吸燈.rar (18.41 KB, 下載次數(shù): 10)
回復(fù)

使用道具 舉報(bào)

ID:687423 發(fā)表于 2020-2-19 19:05 | 顯示全部樓層
xuyaqi 發(fā)表于 2020-2-19 14:17
給你個(gè)參考程序,timer1只是給了定時(shí)中斷, PWM的周期是程序給定的,在參考程序里zhouqi計(jì)數(shù)值是周期,gaod ...

我看了你發(fā)的程序,我在開(kāi)發(fā)板上用了一下,但是發(fā)現(xiàn)這個(gè)程序的呼吸燈效果不是很明顯。
我還有幾個(gè)問(wèn)題,可能是我沒(méi)有學(xué)好,希望你為我講解一下。
對(duì)于這個(gè)程序來(lái)說(shuō),我不知道你對(duì)P0的設(shè)定有什么用,我把他刪了還是和之前的效果一樣。
這個(gè)程序的周期是60000*1us嗎,我還是不明白為什么要等zhouqi>60000后才改變gaodianping的值,
而且開(kāi)始是DIR為0,那gaodianping就在減,等到DIR為1時(shí),高電平再加,那這么變化gaodianping的值不應(yīng)該是-60000~0嗎,怎么能大于60000呢。
#include "reg52.h"   
typedef unsigned int u16;   
typedef unsigned char u8;

sbit PWM=P2^2;
bit DIR;

u16 zhouqi;
u16 gaodianpin;

void Timer1Init()
{
        TMOD|=0X10;
        TH1 = 0xFF;
        TL1 = 0xff;   
        ET1=1;
        EA=1;
        TR1=1;
}

void main()
{
        Timer1Init();
        while(1)
        {
            if(zhouqi>60000)
                {
                        zhouqi=0;
                        DIR=!DIR;
                }
            if(gaodianpin>60000)
                {
                        gaodianpin=60000;
                }
                if(gaodianpin<10000)       
                {
                        gaodianpin=10000;
                }
            if((gaodianpin>10000)&&(gaodianpin<60000))
                {
                        PWM=1;
                }
                else
                {       
                        PWM=0;
                }
        }  
}

void Time1(void) interrupt 3   
{
        TH1 = 0xFF;
        TL1 = 0xff;   //1us
        zhouqi++;
        if(DIR==1){gaodianpin++;}
        else{gaodianpin--;}
}

回復(fù)

使用道具 舉報(bào)

ID:687694 發(fā)表于 2020-2-19 19:36 | 顯示全部樓層
#include<reg52.h>
#define uint unsigned int
#define led1 P1//P1口全接發(fā)光管,驗(yàn)證程序請(qǐng)自行修改

/**********占空比太小會(huì)熄滅,故一開(kāi)始有3.3%,最大占空比也看不出變化了,故最大為80%**********/

void delay (uint yc)  //延遲函數(shù),定時(shí)器中斷更好,這里就偷懶了
        {
        uint i,j;
        for (i=yc;i>0;i--)
            for (j=10;j>0;j--);
        }
void main()
         {
         uint i=5,n=0; //此處初始化i不得小于最小占空比
        while(1)
                {
                if(i==120) //調(diào)節(jié)最大占空比
                n=1;
                if(i==4)   //最小占空比
                n=0;
                led1=0x00;//此處自行修改
                delay(i);
                led1=0xff;//此處自行修改               
                delay(150-i);//半周期時(shí)間
                if(n==0)
                i++;
                if(n==1)
                i--;
                }
        }
呼吸燈,建議樓主仔細(xì)理解一下PWM的含義,簡(jiǎn)單說(shuō)PWM是固定時(shí)間長(zhǎng)度的周期內(nèi),高低電平占時(shí)間比的變化量。
回復(fù)

使用道具 舉報(bào)

ID:94031 發(fā)表于 2020-2-19 21:17 | 顯示全部樓層
我這個(gè)程序只是仿真了一下沒(méi)在開(kāi)發(fā)板上試,因此要想效果好得在理解的基礎(chǔ)上修改程序。
P0那部分那是我為了調(diào)試仿真臨時(shí)加的,刪了并不影響PWM運(yùn)行。
是不是1us我沒(méi)有測(cè),這和定時(shí)器設(shè)置有關(guān),總之周期是60000個(gè)定時(shí)周期。
if(gaodianpin>60000){gaodianpin=60000;}//怕意外加的限制,具體高電平數(shù)在中斷里根據(jù)DIR ++,--。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表