搜索
bottom↓
回复: 26

51单片机如何做渐明渐暗流水灯

[复制链接]

出0入0汤圆

发表于 2010-9-20 13:09:04 | 显示全部楼层 |阅读模式
RT,就是那种亮度渐变效果的流水灯,有什么算法或者设计思路吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入18汤圆

发表于 2010-9-20 14:45:44 | 显示全部楼层
脉冲 宽度 调制

出0入0汤圆

发表于 2010-9-20 22:56:57 | 显示全部楼层
到bbs。mydigit。cn  找呼吸灯

出0入0汤圆

发表于 2010-10-7 15:45:17 | 显示全部楼层
#include "reg52.h"
#include "MacroAndConst.h"
#define LED P0            //定义LED接口
#define LED_ON()      LED = 0x00 ;  //所有LED亮
#define LED_OFF()    LED = 0xff ;  //所有LED熄灭

#define  LED_PWM_LIMIT_MAX    99
#define  LED_PWM_LIMIT_MIN      0

static uint8 s_u8TimeCounter = 0 ; //中断计数
static uint8 s_u8LedDirection = 0 ; //LED方向控制 0 :渐亮 1 :渐灭
static int8  s_s8LedPWMCounter  = 0 ; //LED占空比
void Timer0Init(void)
{
    TMOD &= 0xf0 ;
    TMOD |= 0x01 ;     //定时器0工作方式1
    TH0  =     0xff ;     //定时器初始值(200us中断一次)
    TL0  =  0x47 ;
    TR0  = 1 ;
    ET0  = 1 ;
}

void Time0Isr(void) interrupt 1
{     
    static int8 s_s8PWMCounter = 0  ;
    TH0  =     0xff ;           //定时器重新赋初值
    TL0  =  0x47 ;

    if(++s_u8TimeCounter >= 100) //每20MS调整一下LED的占空比
    {
        s_u8TimeCounter = 0 ;
        //如果是渐亮方向变化,则占空比递增
         if((s_s8LedPWMCounter <= LED_PWM_LIMIT_MAX) &&(0 == s_u8LedDirection))
        {
            s_s8LedPWMCounter++  ;
            if(s_s8LedPWMCounter > LED_PWM_LIMIT_MAX)
            {
                s_u8LedDirection = 1 ;
                s_s8LedPWMCounter =  LED_PWM_LIMIT_MAX ;               
            }            
        }
        //如果是渐暗方向变化,则占空比递渐
                if((s_s8LedPWMCounter >= LED_PWM_LIMIT_MIN) &&(1 == s_u8LedDirection))
                                                                                                
        {
            s_s8LedPWMCounter-- ;
            if(s_s8LedPWMCounter < LED_PWM_LIMIT_MIN)
            {
                s_u8LedDirection = 0 ;
                s_s8LedPWMCounter =  LED_PWM_LIMIT_MIN ;               
            }   
        }
        s_s8PWMCounter = s_s8LedPWMCounter ;  //获取LED的占空比
    }

    if(s_s8PWMCounter > 0) //占空比大于0,则点亮LED,否则熄灭LED
    {
        LED_ON() ;
        s_s8PWMCounter-- ;
    }
    else
    {
        LED_OFF();   
    }

}

出0入0汤圆

发表于 2010-10-7 21:54:37 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-12-2 16:41:14 | 显示全部楼层
是用的PWM吧

出0入0汤圆

发表于 2010-12-4 09:46:34 | 显示全部楼层
mark.

出0入0汤圆

发表于 2010-12-4 10:26:50 | 显示全部楼层
mark.

出0入0汤圆

发表于 2010-12-5 18:45:16 | 显示全部楼层
设两个定时器,定时器1定时周期基本上设定在10ms左右,另一个定时器根据渐变方式逐渐增加和减小定时时间。当定时器1开通时将LED点亮,(在10ms内)定时器2在T1的时间范围内,延长或缩短T2的定时关闭LED时间的长短即可得到LED渐亮或渐暗的效果。这样可做出7彩渐变等很好的效果。

出0入0汤圆

发表于 2010-12-5 23:38:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-1 23:22:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-2 19:40:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-2 22:31:31 | 显示全部楼层
单个呼吸灯就是PCA配置为输出比较模式。

呼吸流水灯就是将PCA的比较输出端接在数据分配器的DI端,然后8个Q端分别接8个LED,然后A2 A1 A0接MCU的IO做地址,每个地址对应一个变化的PWM占空比,同时每个地址对应占空比错开一定的相位,每次地址轮换后PWM发生一次变化,这样就是呼吸的流水灯了。

出0入0汤圆

发表于 2011-1-3 13:38:52 | 显示全部楼层
查表方式,使用定时器,改变定时器初值即可。

出0入0汤圆

发表于 2011-1-4 00:44:49 | 显示全部楼层
回复【8楼】sun_jinde
-----------------------------------------------------------------------

说的挺明白的。我看懂了。

出0入0汤圆

发表于 2011-1-4 08:11:29 | 显示全部楼层
顶一下

出50入0汤圆

发表于 2011-1-4 10:18:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-4 10:22:10 | 显示全部楼层
调节的本质就是PWM。MARK!

出0入0汤圆

发表于 2011-1-19 16:17:33 | 显示全部楼层
PWM

出0入0汤圆

发表于 2011-1-20 01:27:17 | 显示全部楼层
正在学这个呢

出0入0汤圆

发表于 2011-10-18 17:18:30 | 显示全部楼层
你懂的

出0入0汤圆

发表于 2011-10-18 21:24:08 | 显示全部楼层
回复【3楼】q492240  
-----------------------------------------------------------------------

用PWM同延时都可以

出0入0汤圆

发表于 2011-10-20 14:26:20 | 显示全部楼层
/*
学习内容:灵活控制io口输出。
程序效果:下载此程序后会看到8个led渐渐亮起来然后渐渐暗,此效果利用人眼视觉惰性,制造不同的亮度。
任何光色都可以用红、绿、蓝三种光混合出来,所以控制红绿蓝三种led的亮度就制作出无数种颜色。
很多led装饰产品都是由这个简单的程序变化出来的。
*/

#include<reg51.h>

sbit led_k=P1^4;//单片机引脚定义,控制8个LED的开关三极管。请看电路原理图
sbit a1=P1^0;//单片机引脚定义,此引脚控制共阴数码的一个共阴极。请看电路原理图
sbit a2=P1^1;//单片机引脚定义,此引脚控制共阴数码的一个共阴极。请看电路原理图
sbit a3=P1^2;//单片机引脚定义,此引脚控制共阴数码的一个共阴极。请看电路原理图
sbit a4=P1^3;//单片机引脚定义,此引脚控制共阴数码的一个共阴极。请看电路原理图
void delay10us(unsigned int i);/*延时函数*/

main()
{
    unsigned int i=0;
    led_k=1;/*打开6个led的总开关*/
    a1=a2=a3=a4=0;/*关闭数码管,否则数码管会拉低P0口电平,导致流水灯不亮*/
   //P0=0X01;
    delay10us(10);
    while(1)
    {
        for(i=0;i<500;i++)//渐亮
        {
           P0=255;//         LED亮
           delay10us(i);// led亮时间
           P0=0;             //led灭
           delay10us(500-i); //led灭时间
        }
       for(i=0;i<500;i++)//渐灭。原理与上面的渐亮相同
       {
           P0=0;                  
           delay10us(i);       
           P0=255;          
           delay10us(500-i);         
       }
  
    }

}

void delay10us(unsigned int i)
{
  unsigned int j;
  for(;i>0;i--);
   // for(j=1;j>0;j--);
}


出0入0汤圆

发表于 2013-4-10 19:59:13 | 显示全部楼层
很不错的资源,学习了

出0入10汤圆

发表于 2013-4-10 20:12:13 | 显示全部楼层
还可以这样啊,厉害,我以为只能DAC呢,Mark!

出0入0汤圆

发表于 2013-4-10 22:32:06 | 显示全部楼层
winkle 发表于 2011-1-3 13:38
查表方式,使用定时器,改变定时器初值即可。

赞同,想补充的就是,把间距做的越小,呼吸效果越好

出0入0汤圆

发表于 2013-4-10 22:48:54 | 显示全部楼层
还是顶一个吧!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 09:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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