1. bread电子发烧友论坛/
  2. 嵌入式论坛/
    1. 电子论坛综合区
    2. 嵌入式论坛
    3. 电源技术论坛
    4. 硬件设计论坛
    5. 测试测量论坛
    6. 检测技术与质量
    7. EDA设计论坛
    8. 综合技术与应用
    9. 开源硬件
    10. IC设计论坛
    11. 消费电子论坛
    12. 无线通信论坛
    13. 个人版区
    14. 厂商专区
    15. 论坛服务区
    16. 高校联盟
    17. 供求信息发布
  3. 单片机/MCU论坛
    1. ARM技术论坛
    2. Android论坛
    3. Linux论坛
    4. MSP430技术论坛
    5. FPGA|CPLD|ASIC论坛
    6. STM32/STM8技术论坛
    7. NXP MCU 技术论坛
    8. PIC单片机论坛
    9. DSP论坛
    10. 瑞萨单片机论坛
    11. 嵌入式系统论坛
  4. / 51单片机花样流水灯求解
    关闭提示
12下一页

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

[复制链接]
技术员
发表于 2018-1-10 11:28:01   784 查看 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下一页
高级模式
您需要登录后才可以回帖 登录 | 注册
关闭

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

快速回复 返回顶部 返回列表
  1. time最新主题
  2. recommend推荐主题
  3. hot热门主题
  4. post 我的帖子
-

推荐专区

技术干货集中营

专家问答

方案交易

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

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

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论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区

鸿运国际手机版