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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于51單片機PWM輸出程序問題?

[復制鏈接]
跳轉到指定樓層
樓主
ID:687423 發(fā)表于 2020-2-19 09:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛學的PWM,看了一下參考的程序,有一些地方不是很明白,代碼如下。后面還有我自己改編后寫的代碼,但是不好使,請大家?guī)臀曳治鲆幌隆?br /> 問題:
      PWM的周期timer1是自己設定的還是單片機內部定的
      value代表的是占空比,當count==100的時候才加1,為什么value要等于1000而不是等于10(我認為應該是分成10份啊)
      關于判斷PWM是否為1為什么是用timer1和value的大小做對比。
參考代碼,沒有問題
#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ù)上面代碼自己改編了一下,只有這些變了,其他和上面程序一樣,但無法呈現(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;
  }


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:94031 發(fā)表于 2020-2-19 14:17 | 只看該作者
給你個參考程序,timer1只是給了定時中斷, PWM的周期是程序給定的,在參考程序里zhouqi計數(shù)值是周期,gaodianpin計數(shù)值是周期內的高電平值,具體看程序。 呼吸燈.rar (18.41 KB, 下載次數(shù): 10)
回復

使用道具 舉報

板凳
ID:687423 發(fā)表于 2020-2-19 19:05 | 只看該作者
xuyaqi 發(fā)表于 2020-2-19 14:17
給你個參考程序,timer1只是給了定時中斷, PWM的周期是程序給定的,在參考程序里zhouqi計數(shù)值是周期,gaod ...

我看了你發(fā)的程序,我在開發(fā)板上用了一下,但是發(fā)現(xiàn)這個程序的呼吸燈效果不是很明顯。
我還有幾個問題,可能是我沒有學好,希望你為我講解一下。
對于這個程序來說,我不知道你對P0的設定有什么用,我把他刪了還是和之前的效果一樣。
這個程序的周期是60000*1us嗎,我還是不明白為什么要等zhouqi>60000后才改變gaodianping的值,
而且開始是DIR為0,那gaodianping就在減,等到DIR為1時,高電平再加,那這么變化gaodianping的值不應該是-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--;}
}

回復

使用道具 舉報

地板
ID:687694 發(fā)表于 2020-2-19 19:36 | 只看該作者
#include<reg52.h>
#define uint unsigned int
#define led1 P1//P1口全接發(fā)光管,驗證程序請自行修改

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

void delay (uint yc)  //延遲函數(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) //調節(jié)最大占空比
                n=1;
                if(i==4)   //最小占空比
                n=0;
                led1=0x00;//此處自行修改
                delay(i);
                led1=0xff;//此處自行修改               
                delay(150-i);//半周期時間
                if(n==0)
                i++;
                if(n==1)
                i--;
                }
        }
呼吸燈,建議樓主仔細理解一下PWM的含義,簡單說PWM是固定時間長度的周期內,高低電平占時間比的變化量。
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91av在线免费看 | 天天影视综合 | 99r在线| a免费在线 | 一区二区三区视频在线观看 | 国产高清一区二区 | 91精品国产91久久久久久 | 国产激情视频 | 国产精品极品美女在线观看免费 | 一级黄a| 在线黄色网| 狠狠爱免费视频 | 日韩一区二区不卡 | 国产一区三区在线 | 久久乐国产精品 | 特一级黄色毛片 | 久久久久久久av | 欧美成人第一页 | 男女视频网站 | 色999视频 | 免费观看a级毛片在线播放 黄网站免费入口 | 91精品国产手机 | 成人午夜免费在线视频 | 亚洲+变态+欧美+另类+精品 | 日韩成人影院 | 最新日韩av | 亚洲国产成人精品久久 | 国产91成人| 久在线| 亚洲精品无 | 欧美一级淫片免费视频黄 | 四虎影院免费在线 | 国产一区中文字幕 | 国产精品久久一区二区三区 | 美女视频一区二区三区 | 色伊人| 亚洲精品99 | 亚洲 欧美 日韩 精品 | 日韩在线免费视频 | 国产xxxx岁13xxxxhd | zzzwww在线看片免费 |