12下一页

[问答] 51单片机花样流水灯求解

[复制链接]

技术员

发表于 2018-1-10 11:28:01   444 查看 22 回复 显示全部楼层 倒序浏览
分享
P0,P1口直接驱动16路LED,定时时间到灭一路(定时器0假设5S,从P1.7开始到P0.0结束)而且灭的这路效果为渐灭。有一个按键有俩功能,选择整体亮度(高、中、低亮度),控制定时时间(假设5S、10S、30S)。只用51单片机直接做,求大牛指点迷津。
奖励10积分

人中狼 2018-1-10

做一个计数变量,用来确定该灭哪一路,然后比较重复的做法就是在
void jmie0 ()
{
        switch(计数变量)        case 0:
        for (pwm=time;pwm>0;pwm--)
                {
                        P00=1;
                        delay(pwm);
                        P00=0;
                        delay(time-pwm);
                }

         break;
        .....
        case 6:
        for (pwm=time;pwm>0;pwm--)
                {
                        P05=1;
                        delay(pwm);
                        P05=0;
                        delay(time-pwm);
                }
         break;
         .....
}

中间根据不同的计数变量值更改引脚

标签:51单片机

高级工程师

发表于 2018-1-10 11:28:02  
做一个计数变量,用来确定该灭哪一路,然后比较重复的做法就是在
void jmie0 ()
{
        switch(计数变量)        case 0:
        for (pwm=time;pwm>0;pwm--)
                {
                        P00=1;
                        delay(pwm);
                        P00=0;
                        delay(time-pwm);
                }

         break;
        .....
        case 6:
        for (pwm=time;pwm>0;pwm--)
                {
                        P05=1;
                        delay(pwm);
                        P05=0;
                        delay(time-pwm);
                }
         break;
         .....
}

中间根据不同的计数变量值更改引脚
回复

点赞 举报

技术员

发表于 2018-1-10 11:36:46  
渐灭的意思是一个一个灭还是每个慢慢变暗?况且你要控制亮度的话要能要用到PWM输出,普通51上没有这个,而且普通51直接驱动LED,设计成灌电流要有点勉强啊,至少还需要一个达林顿管。
回复

点赞 举报

技术员

发表于 2018-1-10 11:46:06    楼主|
fight281 发表于 2018-1-10 11:36
渐灭的意思是一个一个灭还是每个慢慢变暗?况且你要控制亮度的话要能要用到PWM输出,普通51上没有这个,而且普通51直接驱动LED,设计成灌电流要有点勉强啊,至少还需要一个达林顿管。

慢慢变暗,现在用for循环做出了慢慢变暗的效果,用的STC11F08XE,而且后边加的有2803
回复

点赞 举报

技术员

发表于 2018-1-10 12:15:09  
wjz01002 发表于 2018-1-10 11:46
慢慢变暗,现在用for循环做出了慢慢变暗的效果,用的STC11F08XE,而且后边加的有2803

这个片子有3路定时器 你用2路模拟PWM,随便用1路做定时效果。按键短按控制亮度,长按调定时时间。
回复

点赞 举报

技术员

发表于 2018-1-10 12:30:44    楼主|
fight281 发表于 2018-1-10 12:15
这个片子有3路定时器 你用2路模拟PWM,随便用1路做定时效果。按键短按控制亮度,长按调定时时间。

一步步来,P0P1口到时间灭一路且效果是渐灭,这个该怎么写下。渐灭我用的for循环,但只能赋值一个口。定时时间到灭是做了个表格,放在一起怎么写下
回复

点赞 举报

高级工程师

发表于 2018-1-10 12:34:03  
用一个定时器做模拟的PWM,在这个定时器里控制该哪一路LED动作,按键用一个引脚就可以了,最好有两个LED用来指示当前处于哪一种功能设定,通过记录按键按下的次数来判断选择哪个功能。整体亮度看是指什么了,如果是16路LED的亮度的话,那也是由模拟PWM来控制,这样就需要区别控制渐灭LED和常亮LED了。
回复

点赞 举报

技术员

发表于 2018-1-10 12:52:56    楼主|
本帖最后由 wjz01002 于 2018-1-10 12:54 编辑
人中狼 发表于 2018-1-10 12:34
用一个定时器做模拟的PWM,在这个定时器里控制该哪一路LED动作,按键用一个引脚就可以了,最好有两个LED用来指示当前处于哪一种功能设定,通过记录按键按下的次数来判断选择哪个功能。整体亮度看是指什么了,如果是16路LED的亮度的话,那也是由模拟PWM来控制,这样就需要区别控制渐灭LED和常亮LED了。 ...

不太明白,void jmie0 ()
{
        for (pwm=time;pwm>0;pwm--)
                {
                        P05=1;
                        delay(pwm);
                        P05=0;
                        delay(time-pwm);
                }
}这是我某路渐灭程序


if (p==20)
                {
                        p=0;
                        sec++;
                        if (sec==2)//30秒定时到
                        {        
                                sec=0;
                                table++;
                                if (table>0&&table<9)
                                {
                                        P1=0xff;
                                        P0=play[table];
                                }
                                if (table>=9&&table<=16)
                                {
                                        P0=0X00;
                                        P1=play[table];               
                                }                                
                                if (table==16)
                                {
                                        table=0;
                                }
                        }                        
                }这是IO口到时灭一路。怎么个弄法啊
回复

点赞 举报

技术员

发表于 2018-1-10 13:13:56  
人中狼 发表于 2018-1-10 13:09
做一个计数变量,用来确定该灭哪一路,然后比较重复的做法就是在
void jmie0 ()
{

是的。这样可以的。 看我的帖子,我有新问题请教。
回复

点赞 举报

高级工程师

发表于 2018-1-10 13:40:05  
fight281 发表于 2018-1-10 13:13
是的。这样可以的。 看我的帖子,我有新问题请教。

是哪个帖子呢。。
回复

点赞 举报

技术员

发表于 2018-1-10 14:03:43    楼主|
人中狼 发表于 2018-1-10 13:09
做一个计数变量,用来确定该灭哪一路,然后比较重复的做法就是在
void jmie0 ()
{

谢谢大牛。还有一步就是按键可控制整体(16路)亮度共三档(高中低)现在共有3种时间5S、10S、30S每种时间有高中低三种亮度,也就是共9个模式。
void init()
{
    TMOD=0x01;             //
    TH0=(65536-50000)/256; //
    TL0=(65536-50000)%256;

        ET0=1;                 //
    TR0=1;                 //
       
}

void time0() interrupt 1   //
{       
        TH0=(65536-50000)/256;//50ms
    TL0=(65536-50000)%256;
        p++;
} 这个是定时的基准时间50MS

void bight()
{
        for (pwm=time;pwm>0;pwm--)
                {
                        P0=P1=0XFF;
                        delay(6);
                        P0=P1=0X00;
                        delay(4);
                }
               
}
void light()
{
        for (pwm=time;pwm>0;pwm--)
                {
                        P0=P1=0XFF;
                        delay(1);
                        P0=P1=0X00;
                        delay(9);
                }
}这个使用for循环写了俩亮度,中和低

我用同样的方法switch  一个变量来计按键次数来进入相应的时间控制程序,但整体亮度就没反应,这个该怎么组下呢?
回复

点赞 举报

高级工程师

发表于 2018-1-10 14:17:03  
要看你整合后的程序是怎么样的,整体亮度的调节应该和时间控制部分都在一个switch里
回复

点赞 举报

技术员

发表于 2018-1-10 14:26:59    楼主|
人中狼 发表于 2018-1-10 14:17
要看你整合后的程序是怎么样的,整体亮度的调节应该和时间控制部分都在一个switch里

void keyscan()
{
        if (k1==0)
                Delayms(20);
                if (k1==0)
                {        while (!k1);               
                        cs++;
                        if (cs==4)
                                cs=1;
                                        }       
                switch (cs)
                {
                        case 1:
                                //hight();//高亮状态,进入定时并显示
                                       
                                led_3 ();
                                break;                               
                        case 2:
                                //bight();//中亮
                                led_3 ();
                                break;
                        case 3:
                                //light();//低亮
                                led_3 ();
                                break;
                       
                        case 4:hight();break;        //静止状态                               
                        case 5:bight();break;                               
                        case 6:light();break;
                               
                        case 7:        //定时10s
                                led_2();
                                break;
                        case 8:
                                led_2();
                                break;
                        case 9:
                                led_2();
                                break;
                        case 10:                //定时30S
                                led_1();
                                break;
                        case 11:
                                led_1();
                                break;
                        case 12:
                                led_1();
                                break;
       
        }
}

最终main里只有  keyscan()扫描程序。按键后进入switch 亮度和定时显示,只能进一个。。。
回复

点赞 举报

技术员

发表于 2018-1-10 14:40:53    楼主|
人中狼 发表于 2018-1-10 14:17
要看你整合后的程序是怎么样的,整体亮度的调节应该和时间控制部分都在一个switch里

void keyscan()
{
        if (k1==0)
                Delayms(20);
                if (k1==0)
                {        while (!k1);               
                        cs++;
                        if (cs==4)
                                cs=1;
                                        }       
                switch (cs)
                {
                        case 1:
                                //hight();//高亮状态,进入定时并显示状态
                                led_3 ();
                                break;                               
                        case 2:
                                //bight();//中亮
                                led_3 ();
                                break;
                        case 3:
                                //light();//低亮
                                led_3 ();
                                break;
                       
                        case 4:hight();break;        //¾²Ö¹×´Ì¬                               
                        case 5:bight();break;                               
                        case 6:light();break;
                               
                        case 7:        //
                                led_2();
                                break;
                        case 8:
                                led_2();
                                break;
                        case 9:
                                led_2();
                                break;
                        case 10:                //¶¨Ê±30Ãë
                                led_1();
                                break;
                        case 11:
                                led_1();
                                break;
                        case 12:
                                led_1();
                                break;
       
        }
}
这是最终while(1)循环的按键检测程序,,亮度程序和定时显示程序只能进一个,。。。额..
回复

点赞 举报

技术员

发表于 2018-1-10 14:41:31    楼主|
人中狼 发表于 2018-1-10 14:17
要看你整合后的程序是怎么样的,整体亮度的调节应该和时间控制部分都在一个switch里

void keyscan()
{
        if (k1==0)
                Delayms(20);
                if (k1==0)
                {        while (!k1);               
                        cs++;
                        if (cs==4)
                                cs=1;
                                        }       
                switch (cs)
                {
                        case 1:
                                //hight();//高亮状态,进入定时并显示状态
                                led_3 ();
                                break;                               
                        case 2:
                                //bight();//中亮
                                led_3 ();
                                break;
                        case 3:
                                //light();//低亮
                                led_3 ();
                                break;
                       
                        case 4:hight();break;        //¾²Ö¹×´Ì¬                               
                        case 5:bight();break;                               
                        case 6:light();break;
                               
                        case 7:        //
                                led_2();
                                break;
                        case 8:
                                led_2();
                                break;
                        case 9:
                                led_2();
                                break;
                        case 10:                //¶¨Ê±30Ãë
                                led_1();
                                break;
                        case 11:
                                led_1();
                                break;
                        case 12:
                                led_1();
                                break;
       
        }
}
这是最终while(1)循环的按键检测程序,,亮度程序和定时显示程序只能进一个,。。。额..
回复

点赞 举报

技术员

发表于 2018-1-10 14:55:46    楼主|
人中狼 发表于 2018-1-10 14:17
要看你整合后的程序是怎么样的,整体亮度的调节应该和时间控制部分都在一个switch里

void keyscan()
{
        if (k1==0)
                Delayms(20);
                if (k1==0)
                {        while (!k1);               
                        cs++;
                        if (cs==4)
                                cs=1;
                                        }       
                switch (cs)
                {
                        case 1:
                                //hight();//亮度最亮,进入计时并显示
                                       
                                led_3 ();
                                break;                               
                        case 2:
                                //bight();//中亮
                                led_3 ();
                                break;
                        case 3:
                                //light();//低亮
                                led_3 ();
                                break;
                       
                        case 4:hight();break;        //¾²Ö¹×´Ì¬                               
                        case 5:bight();break;                               
                        case 6:light();break;
                               
                        case 7:        //¶¨Ê±°ëСʱ
                                led_2();
                                break;
                        case 8:
                                led_2();
                                break;
                        case 9:
                                led_2();
                                break;
                        case 10:                //¶¨Ê±30Ãë
                                led_1();
                                break;
                        case 11:
                                led_1();
                                break;
                        case 12:
                                led_1();
                                break;
       
        }
}

亮度调节和时间控制在switch里但是只能进一个程序,,,哪个在前进哪个
回复

点赞 举报

高级工程师

发表于 2018-1-10 15:10:11  
   if (cs==4)
                                cs=1;
这里限定了cs只能到4,可以改成   if (cs==12)试试看
回复

点赞 举报

技术员

发表于 2018-1-10 15:29:11    楼主|
人中狼 发表于 2018-1-10 15:10
if (cs==4)
                                cs=1;
这里限定了cs只能到4,可以改成   if (cs==12)试试看

4只是用于前边测试用,只要一组成了,其他的肯定就好了嘛,就case=1之后,要么进调亮程序,要么进计时程序。。不能一起么这个?
回复

点赞 举报

高级工程师

发表于 2018-1-10 15:41:57  
没明白,switch一次只能进一个case,在switch里最好再加一个default: break;
另外
if (k1==0)   {
                Delayms(20);
                if (k1==0)
这里差一对大括号,switch也在这个括号内,也就是只有当按键有效时,才会执行switch
回复

点赞 举报

技术员

发表于 2018-1-10 16:38:42  
回复

点赞 举报

12下一页
高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /7 下一条

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

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区