这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 看看我用单片机pwm实现的LED呼吸灯的程序

共5条 1/1 1 跳转至

看看我用单片机pwm实现的LED呼吸灯的程序

工程师
2020-12-07 21:31:44     打赏

大家好!

看看我用单片机pwm实现的LED呼吸灯的程序,有什么需要改进的吗?

源码如下:

       yc=1000;
        led=0;
                while(1){
                  led=0;
                        a=yc-300;
                        if(a<0){a=0;}
                        Delay_us(a);
                        led=1;
                        b=1000-yc;
                        if(b<0){b=0;}
                        Delay_us(b);
                        yc=yc-1;
                        if(yc==0){led=1;break;}
                }
                while(1){
                  led=0;
                        a=yc-300;
                        if(a<0){a=0;}
                        Delay_us(a);
                        led=1;
                        b=1000-yc;
                        if(b<0){b=0;}
                        Delay_us(b);
                        yc=yc+1;
                        if(yc==1000){led=0;break;}
                }
               

不停的渐亮,渐暗,但是发现2个问题,
1.在渐亮的时候,最后会突然很亮.
2.渐变过程中,闪烁比较明显..





关键词: 呼吸灯     LED     渐变    

工程师
2020-12-07 21:46:52     打赏
2楼

楼主,你这程序烂的很,不用定时器可以这样:


while(1){
               led=0;
               Delay_us(a);
               led=1;
               Delay_us(1000-a);
                if(a++>1000)
                {a=0;break;}

             }
while(1){
               led=0;
               Delay_us(1000-a);
               led=1;
               Delay_us(a);
                if(a++>1000)
                {a=0;break;}

             }



工程师
2020-12-07 21:51:48     打赏
3楼

LED 是压敏器件。。在达到阈值电压时会有自稳压特性,导致电流变化变小,所以均匀输出pwm并不会得到均匀光亮度增加。还有多理解pwm的意思,程序写的不太好。再优化一下吧。


工程师
2020-12-07 21:57:34     打赏
4楼

也参考我以前写的呼吸灯~

  1. #include<reg52.h>

  2. typedef unsigned char uchar;

  3. typedef unsigned int uint;

  4. sbit led=P1^0;

  5. uint count=0,time0=0,time1=0,DIR=0;


  6. void main( )

  7. {       

  8.         while (1)

  9.         {

  10.                 time0++;

  11.                 count++;

  12.                 if(count>=80)

  13.                 {

  14.                         count=0;

  15.                         if(DIR==0)

  16.                         time1++;

  17.                         else

  18.                         time1--;               

  19.                 }

  20.                 if(time1>=500)

  21.                         DIR=1;

  22.                 if(time1==0)

  23.                         DIR=0;

  24.                 if(time0>=500)

  25.                         time0=0;

  26.                 if(time0<=time1)

  27.                         led=0;

  28.                 else

  29.                         led=1;

  30.         }

  31. }




工程师
2020-12-07 23:00:02     打赏
5楼

代码写的非常不错的


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]