0 普通MCU如何LED渐亮渐灭 - 第2页 - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印

普通MCU如何LED渐亮渐灭

[复制链接]
楼主: OUCHANGHUA
手机看帖
扫描二维码
随时随地手机跟帖
21
sherwin| | 2010-7-28 15:54 | 只看该作者 回帖奖励 |倒序浏览
最简单的方案就是PWM。如果是普通LED的话,LED正极接VCC,负极串个限流电阻然后接IO。其他什么都可以不要。大功率要加驱动电路,但不至于用上电子电位器。
如果是自己想玩电子电位器,当然没有问题。如果做产品,楼 ...
cubasa 发表于 2010-7-28 10:34


呵呵,这位兄弟,换做你是老板,你敢把做产品卖钱的项目交给一个连PWM概念都还没搞清楚的初哥去开发么?嘿嘿!  :P

我估计,楼主是在学习单片机编程,刚入门的,估计还是学生呢。对于这样的初哥,了解程序的整体框架比了解具体的实施细节、技巧更重要,所以我建议他选用电子电位器先做,重点是了解整体的程序框架。
在此基础上,再去细的了解PWM技术,那只不过是一个子程序模块而已,写好之后直接调用就是了,呵呵。

学习知识,是要循序渐进的,呵呵。

使用特权

评论回复
22
宇容创行| | 2010-7-28 15:57 | 只看该作者
要是楼主采用了沙文的方案,估计要被老板追杀

使用特权

评论回复
23
OUCHANGHUA|  楼主 | 2010-7-29 10:17 | 只看该作者
多谢那么多位前辈指点,,,,小弟正在学习中,,

使用特权

评论回复
24
OUCHANGHUA|  楼主 | 2010-7-29 10:30 | 只看该作者
多谢你,,你猜得很对, 21# sherwin

使用特权

评论回复
25
zhoukok| | 2010-7-29 10:35 | 只看该作者
我一般都是用定时器做的 只要有一个定时器,一个IO口 就完全足够了 管他什么芯片啊

使用特权

评论回复
26
OUCHANGHUA|  楼主 | 2010-7-29 10:41 | 只看该作者
是吖,,可对于我初哥来说有一定的难度吖,,就如21楼说的程序框架不了解吖,

使用特权

评论回复
27
zhoukok| | 2010-7-29 10:54 | 只看该作者
那没事,以后多下点功夫啊,我以前也是那么过来的,应聘的时候一个调光程序想半天,不过写过之后就容易了,可以做一个容易移植的子程序,以后用起来直接复制就好了

使用特权

评论回复
28
OUCHANGHUA|  楼主 | 2010-7-29 11:20 | 只看该作者
各位前辈大侠,小弟没有经过什么培训,,单片机是自学的有几个月了,,进步得好慢,,开始我是用51的学习板,学C语言,,现在要用汇编写,不会组积了,,请大侠们能帮忙说下渐亮渐灭程序的框架,,多谢了

使用特权

评论回复
29
zhoukok| | 2010-7-29 11:33 | 只看该作者
你可以用定时器顶一个基本的时间,然后,你定一个PWM的周期,然后你定义一个高电平时间,再定义个变量,中断一次加一次,当他的值等于你定义的高电平值时,输出低电平,然后当计数等于周期长度时,输出高电平
你就可以通过调整高电平时间来调PWM了

使用特权

评论回复
30
rainbajie| | 2010-7-29 11:35 | 只看该作者
顶,不错

使用特权

评论回复
31
华邦掌门人| | 2010-7-29 12:23 | 只看该作者
W79E2051 这个小芯片不错,带1路10位PWM

使用特权

评论回复
32
zhoukok| | 2010-7-29 14:00 | 只看该作者
WINBOND没有用过 改天弄2个玩玩 不知道编译器好用不

使用特权

评论回复
33
疯子8972| | 2010-7-29 14:58 | 只看该作者
用单片机控制一个马达   马达上装个遮光片。。。。

使用特权

评论回复
34
雁舞白沙| | 2010-7-29 17:11 | 只看该作者
#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x2.h>

#define LedOneOut          P6DIR |=  BIT2
#define LedOneHig          P6OUT |=  BIT2            
#define LedOneLow          P6OUT &=~ BIT2

#define LedTwoOut          P6DIR |=  BIT5
#define LedTwoHig          P6OUT |=  BIT5            
#define LedTwoLow          P6OUT &= ~ BIT5

#define LedThrOut          P6DIR |=  BIT6
#define LedThrHig          P6OUT |=  BIT6            
#define LedThrLow          P6OUT &=~ BIT6
void LedSet(bool LedSt,unsigned char LedData)
{
    if(LedSt)
    {
        if(LedData&0x01){LedOneHig;}else{LedOneLow;}
        if(LedData&0x02){LedTwoHig;}else{LedTwoLow;}
        if(LedData&0x04){LedThrHig;}else{LedThrLow;}
    }
    else
    {
        if(LedData&0x01){LedOneLow;}else{LedOneHig;}
        if(LedData&0x02){LedTwoLow;}else{LedTwoHig;}
        if(LedData&0x04){LedThrLow;}else{LedThrHig;}
    }
}
void LedCircumgyrate(void)                   // led1 on
{
    unsigned int i;
    for(i=10;i<200;i+=5)
    {
        LedOneLow;
        Delay(i);
        LedOneHig;
        Delay(200-i);
    }
    LedOneLow;
}
void LedFlicker(void)                   // led1 on
{
    unsigned int i;
    for(i=10;i<200;i+=5)
    {
        LedOneLow;
        Delay(i);
        LedOneHig;
        Delay(200-i);
    }
    LedOneLow;
}
void LedOn(void)                   // led1 on
{
    LedSet(1,LedOnDate);
    Delay(50000);
}
void LedOff(void)                   // led1 on
{
    LedSet(0,LedOnDate);
    Delay(50000);
}
void LedPwmOn(void)                   // led1 on
{
    unsigned int k;
    for(k=0;k<800;k++)
    {
        LedSet(1,LedOnDate);
        Delay(k);
        LedSet(1,LedOffDate);
        Delay(800-k);
    }
    LedSet(1,LedOnDate);
}
void LedPwmOff(void)                  // led1 off
{
    unsigned int k;
    for(k=0;k<800;k++)
    {
        LedSet(1,LedOffDate);
        Delay(k);
        LedSet(1,LedOnDate);
        Delay(800-k);
    }
    LedSet(1,LedOffDate);
}

void LedPwm(void)
{
    unsigned char i,k;
    for(i=0;i<8;i++)
    {
        LedOnDate=i;
        LedOffDate=~i;
        LedPwmOn();
        LedPwmOff();
    }
    for(i=1;i<9;i++)
    {
        for(k=0;k<8;k++)
        {
            LedOnDate=i;
            LedOn();
            LedOff();
        }
    }
    for(i=0;i<8;i++)
    {
        LedOnDate=i;
        LedOffDate=~i;
        LedPwmOn();
        LedPwmOff();
    }
    for(i=1;i<9;i++)
    {
        for(k=0;k<8;k++)
        {
            LedOnDate=i;
            LedOn();
            LedOff();
        }
    }
}

使用特权

评论回复
35
雁舞白沙| | 2010-7-29 17:12 | 只看该作者
#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x2.h>

//----- *** --- 主程序 --- *** -----//
int main(void)
{                      
    _DINT();
    InitSys();
    _EINT();
    for(;;)
    {
        LedPwm();
    }
}

使用特权

评论回复
36
雁舞白沙| | 2010-7-29 17:13 | 只看该作者
自己吓琢磨的,就是一个七彩混合灯!

使用特权

评论回复
37
程序匠人| | 2010-7-29 17:52 | 只看该作者
到匠人的百宝箱里去搜索“LED”。有几个例程。


参考:

EDN_51助学板交差作业 之一——渐明渐暗动态流水灯效果(C源程序)

使用特权

评论回复
38
OUCHANGHUA|  楼主 | 2010-8-11 09:42 | 只看该作者
多谢大家光临,路过的大侠留下你指导好吗,,

使用特权

评论回复
39
tcc8073| | 2010-8-11 23:26 | 只看该作者
把PWM的原理看明白了,在利用软件延时模拟就可以了啊

使用特权

评论回复
40
mage心寒| | 2010-8-12 08:55 | 只看该作者
PWM调光用定时器写效果比较好,个人觉得。我用延迟写的效果不是太理想,可能是我不懂的原因,定时器写的程序我有,LZ要的话M我下。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则