找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1505|回复: 4
打印 上一主题 下一主题
收起左侧

关于51单片机PWM输出程序问题?

[复制链接]
跳转到指定楼层
楼主
ID:687423 发表于 2020-2-19 09:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学的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;
  }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:687423 发表于 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--;}
}

回复

使用道具 举报

地板
ID:687694 发表于 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是固定时间长度的周期内,高低电平占时间比的变化量。
回复

使用道具 举报

5#
ID:94031 发表于 2020-2-19 21:17 | 只看该作者
我这个程序只是仿真了一下没在开发板上试,因此要想效果好得在理解的基础上修改程序。
P0那部分那是我为了调试仿真临时加的,删了并不影响PWM运行。
是不是1us我没有测,这和定时器设置有关,总之周期是60000个定时周期。
if(gaodianpin>60000){gaodianpin=60000;}//怕意外加的限制,具体高电平数在中断里根据DIR ++,--。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表