找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2929|回复: 12
打印 上一主题 下一主题
收起左侧

求助,给这个调光程序加一个开关控制LED的亮灭

[复制链接]
跳转到指定楼层
楼主
ID:140489 发表于 2016-10-22 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助,给这个调光程序加一个开关控制LED的亮灭。现在的情况是可以调光,开关键按下LED灭,松开又亮了;key3那段程序在单独一个工程里面是可以实现按一下灭,再按一下亮的;放到这个调光程序里面就就只有点动的效果,不能自锁,请高手解惑,谢谢



使用PWM方式调整LED的亮灭周期,达到亮度变化。

/*********************************************************************************************/

#include <REG51.h> //51头文件
/*********************************************************************************************/
//《B_无级亮度变化》
#define DY_PORT                P1 //设置LED连接的I/O组
#define DY_PWM                180 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX                179 //设置最大亮度(值域:小于明亮总级数)
#define DY_MIN                1 //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
sbit DY_KEY1 = P3 ^ 0; //亮度加
sbit DY_KEY2 = P3 ^ 1; //亮度减

sbit key3 = P3^2;  //开关键
unsigned int temp;

void delay (unsigned int a){ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
        unsigned char i;
        while( --a != 0){
                for(i = 0; i < 12; i++);
        }                                     
}
/*********************************************************************************************/
void display (unsigned int a)
{                                         //显示程序(50ms的PWM宽度)
        DY_PORT = 0x00; //LED小灯亮
        delay (a);                 //延时a的长度
        DY_PORT = 0xff; //LED小灯灭
        delay (DY_PWM-a);//延时总PWM长度减a
}
/*********************************************************************************************/
void main (void)
{                                                 //主程序
        unsigned int k=5;
        while (1)
        {
                display(k); //
                if(DY_KEY1 == 0)
                {                                         //如果按键按下则继续
                        delay(20);                 //延时20mS
                        if(DY_KEY1 == 0)
                        {                                 //如果按键按下则继续
                                k++;
                                if(k>DY_MAX)
                                {
                                        k = DY_MAX;
                                }
                                //while(DY_KEY1 == 0); //等待按键松开
                        }
                }
               
               
                if(DY_KEY2 == 0)
                {                                 //如果按键按下则继续
                        delay(20);         //延时20mS
                        if(DY_KEY2 == 0)
                        {                                 //如果按键按下则继续
                                k--;
                                if(k<DY_MIN)
                                {
                                        k = DY_MIN;
                                }
                                //while(DY_KEY2 == 0); //等待按键松开
                        }
                }

                if(key3==0)
                {
                  delay(20);
                        if(key3==0)
                        {
                           temp=~temp;
                           P1=temp;
                           while(!key3);
                        }
        }
          }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123732 发表于 2016-10-23 10:39 | 只看该作者
temp初始状态=0;你按下key3时temp=~temp; P1=temp;(也就是P1=0xff;)小灯的确灭了,但是你松开按键后程序会反复执行display();这段程序,也就是执行DY_PORT = 0x00;(即P1=0X00;也就是说P1口又被重新赋值了) //LED小灯又亮
回复

使用道具 举报

板凳
ID:144022 发表于 2016-10-23 10:57 | 只看该作者
好乱的代码。。。
回复

使用道具 举报

地板
ID:140489 发表于 2016-10-23 14:23 | 只看该作者
刘海龙 发表于 2016-10-23 10:39
temp初始状态=0;你按下key3时temp=~temp; P1=temp;(也就是P1=0xff;)小灯的确灭了,但是你松开按键后程 ...

怎样才能做到key3按一下灭,再按一下亮呢?
回复

使用道具 举报

5#
ID:123732 发表于 2016-10-23 14:41 | 只看该作者
lids 发表于 2016-10-23 14:23
怎样才能做到key3按一下灭,再按一下亮呢?

1.定义一个标志位,例如bit m;
2.开关键按键按下时把标志位改变例如 if(!key3){m=~m;}
3.主循环处加上判断标志位的程序例如if(m==0){display(k);}else{P1=0XFF;}
回复

使用道具 举报

6#
ID:144054 发表于 2016-10-23 14:51 | 只看该作者
#define TRUE  1 #define FAULSE   0  uchar key=0; uchar scan;  /**********************delay*********************************/  void delay(void) {  int l;  char m;  for (l=0;l<400;l++)  for (m=0;m<5;m++);  }  /****************check if any key pressed*********************/  bit CheckState(void) {         bit state=0;                 P3=0x0F;                   //scan key                                                 if(P3!=0x0F)         {         delay();         state=TRUE;}    //check if any key pressed         else state=FAULSE;         return(state);         }  /****************** ckeck whitch key pressed*****************/  uchar GetKeys(void) {         uchar column,line;          scan=0xFE;          while((scan&0x10)!=0)           {                 P3=scan;                                  if((P3&0xF0)!=0xF0)                  //line 1 have key pressed                   {                    column=~(P3|0x0F);                  line=~(scan|0xF0);                  key=column+line;                                    return(key);                                           }                 else scan=(scan<<1)|0x01;               }         return(0);         }        
回复

使用道具 举报

7#
ID:140489 发表于 2016-10-23 15:22 | 只看该作者
刘海龙 发表于 2016-10-23 14:41
1.定义一个标志位,例如bit m;
2.开关键按键按下时把标志位改变例如 if(!key3){m=~m;}
3.主循环处加 ...

按刘师傅的方法搞定了,谢谢

#include <REG51.h> //51头文件
/*********************************************************************************************/
//《B_无级亮度变化》
#define DY_PORT                P1 //设置LED连接的I/O组
#define DY_PWM                180 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX                179 //设置最大亮度(值域:小于明亮总级数)
#define DY_MIN                1 //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
sbit KEY1 = P3 ^ 0; //亮度加
sbit KEY2 = P3 ^ 1; //亮度减
sbit KEY3 = P3^2;        //开关键

bit flag;

void delay (unsigned int a)
{ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
        unsigned char i;
        while( --a != 0)
        {
                for(i = 0; i < 12; i++);
        }                                     
}


void display (unsigned int a)
{                                         //显示程序(50ms的PWM宽度)
        DY_PORT = 0x00; //LED小灯亮
        delay (a);                 //延时a的长度
        DY_PORT = 0xff; //LED小灯灭
        delay (DY_PWM-a);//延时总PWM长度减a
}


void main (void)
{                                                 //主程序
        unsigned int k=5;

       
        while (1)
        {
                if(flag==0)
                {
                   display(k);
                }

                 else
                 {
                         DY_PORT=0xff;
                 }
               

                if(KEY1 == 0)
                {                                         //如果按键按下则继续
                        delay(20);                 //延时20mS
                        if(KEY1 == 0)
                        {                                 //如果按键按下则继续
                                k++;
                                if(k>DY_MAX)
                                {
                                        k = DY_MAX;
                                }
                       
                        }
                }
               
       

               
                if(KEY2 == 0)
                {                                 //如果按键按下则继续
                        delay(20);         //延时20mS
                        if(KEY2 == 0)
                        {                                 //如果按键按下则继续
                                k--;
                                if(k<DY_MIN)
                                {
                                        k = DY_MIN;
                                }
                               
                        }
                }
          
          
          
          
                if(KEY3==0)
                {
                  delay(20);
                        if(KEY3==0)
                        {
                        flag=~flag;
                        while(!KEY3);
            }
                 }
          }
}
回复

使用道具 举报

8#
ID:140489 发表于 2016-10-23 15:25 | 只看该作者
刘海龙 发表于 2016-10-23 14:41
1.定义一个标志位,例如bit m;
2.开关键按键按下时把标志位改变例如 if(!key3){m=~m;}
3.主循环处加 ...

按刘师傅的方法搞定了,谢谢

#include <REG51.h> //51头文件
/*********************************************************************************************/
//《B_无级亮度变化》
#define DY_PORT                P1 //设置LED连接的I/O组
#define DY_PWM                180 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX                179 //设置最大亮度(值域:小于明亮总级数)
#define DY_MIN                1 //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
sbit KEY1 = P3 ^ 0; //亮度加
sbit KEY2 = P3 ^ 1; //亮度减
sbit KEY3 = P3^2;        //开关键

bit flag;

void delay (unsigned int a)
{ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
        unsigned char i;
        while( --a != 0)
        {
                for(i = 0; i < 12; i++);
        }                                     
}


void display (unsigned int a)
{                                         //显示程序(50ms的PWM宽度)
        DY_PORT = 0x00; //LED小灯亮
        delay (a);                 //延时a的长度
        DY_PORT = 0xff; //LED小灯灭
        delay (DY_PWM-a);//延时总PWM长度减a
}


void main (void)
{                                                 //主程序
        unsigned int k=5;

       
        while (1)
        {
                if(flag==0)
                {
                   display(k);
                }

                 else
                 {
                         DY_PORT=0xff;
                 }
               

                if(KEY1 == 0)
                {                                         //如果按键按下则继续
                        delay(20);                 //延时20mS
                        if(KEY1 == 0)
                        {                                 //如果按键按下则继续
                                k++;
                                if(k>DY_MAX)
                                {
                                        k = DY_MAX;
                                }
                       
                        }
                }
               
       

               
                if(KEY2 == 0)
                {                                 //如果按键按下则继续
                        delay(20);         //延时20mS
                        if(KEY2 == 0)
                        {                                 //如果按键按下则继续
                                k--;
                                if(k<DY_MIN)
                                {
                                        k = DY_MIN;
                                }
                               
                        }
                }
          
          
          
          
                if(KEY3==0)
                {
                  delay(20);
                        if(KEY3==0)
                        {
                        flag=~flag;
                        while(!KEY3);
            }
                 }
          }
}
回复

使用道具 举报

9#
ID:140489 发表于 2016-10-23 15:32 | 只看该作者
按刘师傅的方法搞定了,谢谢

#include <REG51.h> //51头文件
/*********************************************************************************************/
//《B_无级亮度变化》
#define DY_PORT                P1 //设置LED连接的I/O组
#define DY_PWM                180 //设置明亮的总级数(级数过大会出现闪烁)(值域:0~65535)
#define DY_MAX                179 //设置最大亮度(值域:小于明亮总级数)
#define DY_MIN                1 //设置最小亮度(值域:明亮大于等于1,小于最大亮度)
sbit KEY1 = P3 ^ 0; //亮度加
sbit KEY2 = P3 ^ 1; //亮度减
sbit KEY3 = P3^2;        //开关键

bit flag;

void delay (unsigned int a)
{ // 0.1ms延时程序(12MHz 10倍于51单片机速度时)
        unsigned char i;
        while( --a != 0)
        {
                for(i = 0; i < 12; i++);
        }                                     
}


void display (unsigned int a)
{                                         //显示程序(50ms的PWM宽度)
        DY_PORT = 0x00; //LED小灯亮
        delay (a);                 //延时a的长度
        DY_PORT = 0xff; //LED小灯灭
        delay (DY_PWM-a);//延时总PWM长度减a
}


void main (void)
{                                                 //主程序
        unsigned int k=5;

       
        while (1)
        {
                if(flag==0)
                {
                   display(k);
                }

                 else
                 {
                         DY_PORT=0xff;
                 }
               

                if(KEY1 == 0)
                {                                         //如果按键按下则继续
                        delay(20);                 //延时20mS
                        if(KEY1 == 0)
                        {                                 //如果按键按下则继续
                                k++;
                                if(k>DY_MAX)
                                {
                                        k = DY_MAX;
                                }
                       
                        }
                }
               
       

               
                if(KEY2 == 0)
                {                                 //如果按键按下则继续
                        delay(20);         //延时20mS
                        if(KEY2 == 0)
                        {                                 //如果按键按下则继续
                                k--;
                                if(k<DY_MIN)
                                {
                                        k = DY_MIN;
                                }
                               
                        }
                }
          
          
          
          
                if(KEY3==0)
                {
                  delay(20);
                        if(KEY3==0)
                        {
                        flag=~flag;
                        while(!KEY3);
            }
                 }
          }
}
回复

使用道具 举报

10#
ID:123732 发表于 2016-10-23 18:47 | 只看该作者
lids 发表于 2016-10-23 15:22
按刘师傅的方法搞定了,谢谢

#include  //51头文件

我也是入门级的爱好者,师傅称不上,共同学习共同进步。
回复

使用道具 举报

11#
ID:1130333 发表于 2024-8-10 21:56 | 只看该作者
lids 发表于 2016-10-23 15:32
按刘师傅的方法搞定了,谢谢

#include  //51头文件

您好,看了您的这个led调光.强炸了.
可以请教您几个问题吗?
无极调光,,您的是按住 key ,led++  此间松开再按,还是led++
如果我想这样:" led的亮度假设为 0-100,,按住key 加到20,,我松开key,再次按下,即为led--,,再松开再按又是led++"
这样就不用每次调光都需要到最高或者最低了.
回复

使用道具 举报

12#
ID:140489 发表于 2024-8-15 14:52 | 只看该作者
vb2002 发表于 2024-8-10 21:56
您好,看了您的这个led调光.强炸了.
可以请教您几个问题吗?
无极调光,,您的是按住 key ,led++  此间松 ...

这是初学单片机时写的这程序,写着玩的。现在不是这种写法了,这样的功能一个按键就可以实现
回复

使用道具 举报

13#
ID:1130555 发表于 2024-8-15 15:14 | 只看该作者
先找个点,在扩展。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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