PWM波产生的方法及原理

2019-07-16 05:14发布

如休利用51单片机的来产生PWM波,用以控制led的亮度变化,在网上看过一些程序,有些地方不大明白,程序是这样的:
#include<reg52.h>
unsigned char cycle,pwm;
sbit led=P1^0;
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
bit flag;
TMOD=1;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IE=0x82;
TR0=1;
cycle=10;
while(!flag)
  {
   delay(200000);
   pwm++;
   if(pwm==10)
    flag=1;
  }
while(flag)
  {
   delay(200000);
   pwm--;
   if(pwm==0)
    flag=0;
  }
}
void tim()interrupt 1
{
unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
count++;
if(count==pwm)////此处是什么意思呢?
  {
   led=1;
  }
  
if(count==10)
  {
   count=0;
   if(pwm!=0)///此处又是什么意思呢?
    led=0;
  }
}

感觉这个程序不是太好,因为烧到单片机观察到led虽然有亮度的变化,不过在由暗变的过程中有一个突然的跳跃,就是亮度一下子就上来了,请教高手指点迷津


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
单片机z123
2019-07-17 14:54
if(count==pwm)////此处是什么意思呢?这个循环中低电平时长从1累加到count(周期),下面一个也是。
突然的跳跃是因为时间调的不准,试试我改的吧。
#include<reg52.h>
unsigned char count,i;
sbit led=P1^0;
void delay(unsigned int i)
{
while(--i);
}
void main()
{
bit flag;
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IE=0x82;
TR0=1;
count=100;
while(!flag)
{
delay(200000);
i++;
if(i==100)
flag=1;
}
while(flag)
{
delay(200000);
i--;
if(i==0)
flag=0;
}
}
void tim()interrupt 1
{
unsigned char count;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
count++;
if(count==i)////此处是什么意思呢?
{
led=1;
}

if(count==100)
{
count=0;
if(i!=0)///此处又是什么意思呢?
led=0;
}
}

一周热门 更多>