PWM控制LED渐亮渐暗(基于51单片机)

2020-01-27 11:22发布

/*-------------------------------------------------------------------
假定led的闪烁频率为100HZ,而亮度变化的范围为0~99共100等分。
则每一等分所占用的时间为 1/(100*100)=100us即在改变led的亮灭状态时,
应该是在100us整数倍时刻时。用单片机的定时器产生100us的中断,
同时每10ms调整一次led的占空比。这样在10ms*100=1S的时间内led可以从暗逐渐变亮,
在下一个1S内可以从亮逐渐变暗,然后不断循环。
---------------------------------------------------------------------*/

#include <reg52.h>

#define led_on P1=0x00
#define led_off P1=0xff

#define pwm_max 99
#define pwm_min 0

unsigned char timenum;
signed char ledpwm,ledpwm_temp;
bit leddirction;

void main(void)
{
        TMOD=0x02;
        TL0=156;
        TH0=156;
        ET0=1;
        EA=1;
        TR0=1;
        while(1);
}

void timer0(void) interrupt 1
{
        if((++timenum)>=100)          //每20mS调整一下led的占空比
        {
                timenum=0;
                if(leddirction==0)        //如果是渐亮方向变化,则占空比递增
                {
                        ledpwm++;
                        if(ledpwm>pwm_max)
                        {
                                ledpwm=pwm_max;
                                leddirction=1;
                        }
                }

                if(leddirction==1)        //如果是渐暗方向变化,则占空比递减
                {
                        ledpwm--;
                        if(ledpwm<pwm_min)
                        {
                                ledpwm=pwm_min;
                                leddirction=0;
                        }
                }

                ledpwm_temp=ledpwm;         //获取LED的占空比
        }

        if(ledpwm_temp>0)         //占空比大于0,则点亮led,否则熄灭led
        {
                led_on;
                ledpwm_temp--;
        }
        else
        {
                led_off;
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
44条回答
tianheiGE
1楼-- · 2020-01-28 19:36
我也仿照写了个
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a=0,z=0,c=0,b=99;
void chushi()
{
        TMOD=0X01;//设置定时器0为定时工作
        TH0=(65536-200)/256;//装初值
        TL0=(65536-200)%256;
        ET0=1;//开定时器中断
        EA=1;//        开总中断
        TR0=1;//启动定时器
}
void flash(uchar a,uchar b)
{
        if(c==a)//灭的时间
                P1=0xff;
        if(c==b)//亮的时间
        {
                P1=0;
        }
}
void main()
{
        chushi();
        while(1)
        {
                flash(a,b);
                if(c==99)//每20MS调整一次占空比
                {
                        c=0;
                        if(z==0)//暗到亮
                        {
                                a++;
                                b--;
                                if(a==99&&b==0)
                                        z=1;
                        }
                        if(z==1)//亮到暗
                        {
                                a--;
                                b++;
                                if(a==0&&b==99)
                                        z=0;
                        }
                }
        }
}
void zhongduan1() interrupt 1
{
        TH0=(65536-200)/256;//重新装初值
        TL0=(65536-200)%256;
        c++;
}
yxf861284
2楼-- · 2020-01-28 21:18
怎么我点不亮啊,我用的是STC12C5A60S2
yao1
3楼-- · 2020-01-28 23:07
 精彩回答 2  元偷偷看……
LINER
4楼-- · 2020-01-29 02:01
回复【楼主位】hrb_winner  
-----------------------------------------------------------------------

您好楼主:

    能解释下pwmshi 是怎么与灯的亮度练习起来的(没看到相关语句)?
allenchou012
5楼-- · 2020-01-29 06:24
好、 pwm在电力电子也能用啊
yao1
6楼-- · 2020-01-29 07:53
回复【16楼】LINER
-----------------------------------------------------------------------
亮度变化的范围为0~99共100等分。
最亮的时候其灰度等级为99,为0的时候最暗,也就是熄灭了。
定义PWM的占空比上限为99, 下限定义为0
#define pwm_max 99  //最亮
#define pwm_min 0   //最暗 熄灭

控制PWM 就是控制亮度

一周热门 更多>