标题: 关于51单片机PWM输出程序问题? [打印本页]

作者: 。。jj    时间: 2020-2-19 09:20
标题: 关于51单片机PWM输出程序问题?
刚学的PWM,看了一下参考的程序,有一些地方不是很明白,代码如下。后面还有我自己改编后写的代码,但是不好使,请大家帮我分析一下。
问题:
      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++;
}
我自己根据上面代码自己改编了一下,只有这些变了,其他和上面程序一样,但无法呈现呼吸状态,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;
  }



作者: xuyaqi    时间: 2020-2-19 14:17
给你个参考程序,timer1只是给了定时中断, PWM的周期是程序给定的,在参考程序里zhouqi计数值是周期,gaodianpin计数值是周期内的高电平值,具体看程序。 呼吸灯.rar (18.41 KB, 下载次数: 10)
作者: 。。jj    时间: 2020-2-19 19:05
xuyaqi 发表于 2020-2-19 14:17
给你个参考程序,timer1只是给了定时中断, PWM的周期是程序给定的,在参考程序里zhouqi计数值是周期,gaod ...

我看了你发的程序,我在开发板上用了一下,但是发现这个程序的呼吸灯效果不是很明显。
我还有几个问题,可能是我没有学好,希望你为我讲解一下。
对于这个程序来说,我不知道你对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--;}
}


作者: lovexulu    时间: 2020-2-19 19:36
#include<reg52.h>
#define uint unsigned int
#define led1 P1//P1口全接发光管,验证程序请自行修改

/**********占空比太小会熄灭,故一开始有3.3%,最大占空比也看不出变化了,故最大为80%**********/

void delay (uint yc)  //延迟函数,定时器中断更好,这里就偷懒了
        {
        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) //调节最大占空比
                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是固定时间长度的周期内,高低电平占时间比的变化量。
作者: xuyaqi    时间: 2020-2-19 21:17
我这个程序只是仿真了一下没在开发板上试,因此要想效果好得在理解的基础上修改程序。
P0那部分那是我为了调试仿真临时加的,删了并不影响PWM运行。
是不是1us我没有测,这和定时器设置有关,总之周期是60000个定时周期。
if(gaodianpin>60000){gaodianpin=60000;}//怕意外加的限制,具体高电平数在中断里根据DIR ++,--。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1