找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3791|回复: 21
收起左侧

单片机控制LED灯怎样从暗到亮?

  [复制链接]
ID:826754 发表于 2021-9-3 08:10 | 显示全部楼层 |阅读模式
各位大佬,如题怎样编写LED灯可以从暗到亮的起动。用P3.7来控制PMOS管。
回复

使用道具 举报

ID:10947 发表于 2021-9-3 11:06 | 显示全部楼层
输出占空比可调的PWM脉冲
回复

使用道具 举报

ID:514901 发表于 2021-9-3 11:57 | 显示全部楼层
pwm调压
回复

使用道具 举报

ID:668693 发表于 2021-9-3 14:41 | 显示全部楼层
好家伙  我程序都给你发出来
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号

void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                                                                               
        unsigned int CYCLE=600,PWM_LOW=0;        //定义周期并赋值
        while (1)                                                                         //主循环
                        {
                                 LED0=1;
                                 Delay(60000);                                //特意加延时,可以看到熄灭的过程
                                 for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低
                                        {
                                 //电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
                                                        LED0=0;        //点亮LED  
                                                        Delay(PWM_LOW);//延时长度,600次循环中从1加至599
                                                        LED0=1;        //熄灭LED
                                                        Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
                                        }
                                        LED0=0;
                                        for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
                                        { //与逐渐变亮相反的过程
                                                LED0=0;
                                                Delay(PWM_LOW);
                                                LED0=1;
                                                Delay(CYCLE-PWM_LOW);
                                        }                                                 
                        }
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
回复

使用道具 举报

ID:136485 发表于 2021-9-3 16:01 | 显示全部楼层
在简单一点网上有专门调光的IC卖,用555都可以搭个调光电路
回复

使用道具 举报

ID:149799 发表于 2021-9-3 18:30 | 显示全部楼层
林神经 发表于 2021-9-3 14:41
好家伙  我程序都给你发出来
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定 ...

谢谢,你是最快的,最直接的帮忙,
回复

使用道具 举报

ID:420836 发表于 2021-9-4 08:14 | 显示全部楼层
使用PWM控制应该很容易,在这个论坛上寻找一些示例项目。
回复

使用道具 举报

ID:267932 发表于 2021-9-4 11:27 | 显示全部楼层
PWM 控制占空比,或者定时器,模拟PWM改变占空比。
回复

使用道具 举报

ID:417092 发表于 2021-9-5 19:45 | 显示全部楼层
100Hz   PWM占空比5%----90%每200ms增加5%
回复

使用道具 举报

ID:57657 发表于 2021-9-5 20:15 | 显示全部楼层
例如亮度30%频率100Hz,10毫秒内3毫秒点亮,7毫秒熄灭,频率高就会产生视觉暂留,这就叫PWM调光的原理,懂?
回复

使用道具 举报

ID:956872 发表于 2021-9-5 21:32 | 显示全部楼层
最简单的调亮度的
void timer1() interrupt 12
{       zq++;       //周期
      if(zq == 250)
              zq = P1 = 0;
      if(zkb == zq)      //调zkb就能调亮暗   
     P1 = 0xff;   
回复

使用道具 举报

ID:890186 发表于 2021-9-6 06:50 来自手机 | 显示全部楼层
用定时器模拟pwm,调占空比,占空比越大越亮
回复

使用道具 举报

ID:950946 发表于 2021-9-6 11:07 | 显示全部楼层
利用PWM调占空比,用定时器控制从0%一直到100%。你就能看到led的亮度变化
回复

使用道具 举报

ID:826754 发表于 2021-9-6 12:02 | 显示全部楼层
F:\单片机文件\锐志流光灯\锐志转向流光灯
回复

使用道具 举报

ID:826754 发表于 2021-9-7 17:08 | 显示全部楼层
  1. /***使用STC8F1K08S2-SOP16为主控转向流光灯
  2. 1、上电扫描蓝光从两边向中间流光一次——蓝光从L6流向L1一次——黄光从L1流向L1一次——蓝光呼吸灯两次后灭。
  3. 2、双闪时,左右同时接到信号,左右跟随信号同时流光。
  4. 3、接收到左或右转向信号时相应方向流光一次常亮,中断灭。
  5. 4、断开左或右转向信号时,延时2秒日行灯LED11 100%亮度。
  6. *****/

  7. #include <STC8.H>  
  8. typedef unsigned char u8;
  9. typedef unsigned int u16;
  10. /********端口引脚定义*****/  
  11. sbit KEYL=P5^4;    //设置左方向触发信号

  12. sbit LED1=P3^2;    //左方向流光灯设定
  13. sbit LED2=P3^3;
  14. sbit LED3=P3^4;
  15. sbit LED4=P3^5;
  16. sbit LED5=P3^6;
  17. sbit LED6=P3^7;   

  18. sbit YU=P1^3;
  19. sbit BU=P1^2;

  20. bit signl=0;       //触发状态标志
  21. //bit signk=0;
  22. u16 count3=0,num;

  23. /******函数声明*******/

  24. void Delay(unsigned int t); //延时函数
  25. void keyScan();                           //触发子程序函数
  26. void Led_YU();             //呼吸灯函数

  27. /*********定时器0初始化函数***********/
  28. void Timer0Init()                //5毫秒@11.0592MHz
  29. {
  30.         AUXR |= 0x80;                //定时器时钟1T模式
  31.         TMOD &= 0xF0;                //设置自动重装模式
  32.         TL0 = 0x00;                        //设置定时初值
  33.         TH0 = 0x28;                        //设置定时初值
  34.         TF0 = 0;                                //清除TF0标志
  35.         TR0 = 1;                                //定时器0开始计时
  36.         EA  = 1;                                //开总中断
  37.         ET0 = 1;                                //开T0中断
  38. }
  39. /********左流光函数*********/
  40. void Led_L()
  41. {
  42. YU=1;
  43.         if(num>50)              {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;}
  44.         else if(num<=50&&num>40){LED1=1;LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;}
  45.         else if(num<=40&&num>30){LED1=1;LED2=1;LED3=1;LED4=0;LED5=0;LED6=0;}
  46.         else if(num<=30&&num>20){LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;}
  47.         else if(num<=20&&num>10){LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=0;}
  48.         else if(num>0&&num==10) {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;}
  49. }
  50. /*******右流光函数******/
  51. /**void Led_R()
  52. {
  53.         if(num>50)              {LED6=1;LED7=0;LED8=0;LED9=0;LEDA=0;}
  54.         else if(num<=50&&num>40){LED6=1;LED7=1;LED8=0;LED9=0;LEDA=0;}
  55.         else if(num<=40&&num>30){LED6=1;LED7=1;LED8=1;LED9=0;LEDA=0;}
  56.         else if(num<=30&&num>20){LED6=1;LED7=1;LED8=1;LED9=1;LEDA=0;}
  57.         else if(num<=20&&num>10){LED6=1;LED7=1;LED8=1;LED9=1;LEDA=1;}
  58.        // else if(num>0&&num==10)    {LED6=0;LED7=0;LED8=0;LED9=0;LEDA=0;}
  59. }
  60. /*****扫描流光函数*****/
  61. void Led_BU()
  62. {               

  63.                 if(num>590)                                        {BU=1;P3=0X84;       }
  64.                 else if(num<=590&&num>570)        {BU=1;P3=0X48;       }
  65.                 else if(num<=570&&num>550)        {BU=1;P3=0X30;       }

  66.                 else if(num<=550&&num>530)        {BU=1;P3=0X30;       }
  67.                 else if(num<=530&&num>510)        {BU=1;P3=0X48;       }
  68.                 else if(num<=510&&num>490)        {BU=1;P3=0X84;       }

  69.                 else if(num<=490&&num>480)        {BU=1;P3=0X80;       }
  70.                 else if(num<=480&&num>470)        {BU=1;P3=0X40;       }
  71.                 else if(num<=470&&num>460)        {BU=1;P3=0X60;       }
  72.                 else if(num<=460&&num>450)        {BU=1;P3=0X10;       }
  73.                 else if(num<=450&&num>440)        {BU=1;P3=0X08;       }
  74.                 else if(num<=440&&num>430)        {BU=1;P3=0X04;       }                     
  75.                 else if(num<=430&&num>420)        {BU=1;P3=0X84;       }
  76.                 else if(num<=420&&num>410)        {BU=1;P3=0X44;       }
  77.                 else if(num<=410&&num>400)        {BU=1;P3=0X24;       }
  78.                 else if(num<=400&&num>390)        {BU=1;P3=0X14;       }
  79.                 else if(num<=390&&num>380)        {BU=1;P3=0X0C;       }
  80.                 else if(num<=380&&num>370)        {BU=1;P3=0X8C;       }
  81.                 else if(num<=370&&num>360)        {BU=1;P3=0X4C;       }
  82.                 else if(num<=360&&num>350)        {BU=1;P3=0X2C;       }
  83.                 else if(num<=350&&num>340)        {BU=1;P3=0X1C;       }
  84.                 else if(num<=340&&num>330)        {BU=1;P3=0X9C;       }
  85.                 else if(num<=330&&num>320)        {BU=1;P3=0X5C;       }
  86.                 else if(num<=320&&num>310)        {BU=1;P3=0X3C;       }
  87.                 else if(num<=310&&num>300)        {BU=1;P3=0XBC;       }
  88.                 else if(num<=300&&num>290)        {BU=1;P3=0X7C;       }
  89.                 else if(num<=290&&num>280)        {BU=1;P3=0XFC;       }
  90.                 else if(num<=280&&num>270)        {BU=0;P3=0X00;       }
  91.    
  92.                 else if(num<=270&&num>260)        {YU=1;P3=0X04;       }
  93.                 else if(num<=260&&num>250)        {YU=1;P3=0X08;       }
  94.                 else if(num<=250&&num>240)        {YU=1;P3=0X10;       }
  95.                 else if(num<=240&&num>230)        {YU=1;P3=0X20;       }
  96.                 else if(num<=230&&num>220)        {YU=1;P3=0X40;       }
  97.                 else if(num<=220&&num>210)        {YU=1;P3=0X80;       }                     
  98.                 else if(num<=210&&num>200)        {YU=1;P3=0X84;       }
  99.                 else if(num<=200&&num>190)        {YU=1;P3=0X88;       }
  100.                 else if(num<=190&&num>180)        {YU=1;P3=0X90;       }
  101.                 else if(num<=180&&num>170)        {YU=1;P3=0XA0;       }
  102.                 else if(num<=170&&num>160)        {YU=1;P3=0XC0;       }
  103.                 else if(num<=160&&num>150)        {YU=1;P3=0XC4;       }
  104.                 else if(num<=150&&num>140)        {YU=1;P3=0XC8;       }
  105.                 else if(num<=140&&num>130)        {YU=1;P3=0XD0;       }
  106.                 else if(num<=130&&num>120)        {YU=1;P3=0XE0;       }
  107.                 else if(num<=120&&num>110)        {YU=1;P3=0XE4;       }
  108.                 else if(num<=110&&num>100)        {YU=1;P3=0XE8;       }
  109.                 else if(num<=100&&num>90)        {YU=1;P3=0XF0;       }
  110.                 else if(num<=90&&num>80)        {YU=1;P3=0XF4;       }
  111.                 else if(num<=80&&num>70)        {YU=1;P3=0XF8;       }
  112.                 else if(num<=70&&num>60)        {YU=1;P3=0XFC;       }

  113.                 else if(num<=60&&num>50)        {YU=1;P3=0X7C;       }               
  114.                 else if(num<=50&&num>40)        {YU=1;P3=0X3C;       }
  115.                 else if(num<=40&&num>30)        {YU=1;P3=0X1C;       }
  116.                 else if(num<=30&&num>20)        {YU=1;P3=0X0C;       }
  117.                 else if(num<=20&&num>10)        {YU=1;P3=0X04;       }
  118.                 else if(num<=10&&num>0)            {YU=0;P3=0X00;       }
  119.                        
  120. }
  121. /******主函数区******/  
  122. void main()
  123. {
  124.         u8 i;
  125.         P3M0=0xFC;//设P3.1~3口为推挽输出,P3.0为准双向口。      
  126.         P3M1=0x00;
  127.         P1M0=0xFF;//设P1口为推挽输出,
  128.         P1M1=0x00;         
  129.         P5M0=0x00;//设P5.4、P5.5为准双向口.        
  130.         P5M1=0xCF;
  131.         P3=0X03;
  132.         P1=0X00;
  133.                 P5=0X30;  //不可设为底电平   
  134.         Timer0Init();
  135.                 if(KEYL==0)
  136.           {
  137.            
  138.                    keyScan(); //把触发部分的代码打包成函数放在这里执行

  139.           }
  140.         else
  141.          {      
  142.         for(i=0;i<1;i++)//上电扫描流光1次
  143.                 {
  144.               num=590;//1.秒
  145.             // if(num==460)
  146.                           while(num)
  147.                {
  148.                                
  149.                  Led_BU();
  150.                                
  151.                                        
  152.                      
  153.                }
  154.                             Led_YU();
  155.                                 Led_YU();
  156.                 //        if(num==0)
  157.                 //         {LED11=1;}
  158.                 }  
  159.          }       
  160.                   
  161.     while(1)         
  162.         {      
  163.                 if(KEYL==0)
  164.                  {                         
  165.                         keyScan();
  166.                  }
  167.         }         
  168. }
  169. /*********定时器0中断服务函数*************/
  170. void timer0() interrupt 1      
  171. {
  172.         /* static unsigned char i=0;
  173.         if(i<3)PWM=1;//占空比75%
  174.         else PWM=0;
  175.         i++;
  176.         i%=4;             */
  177.     //    PWM=~PWM;//PWM周期10ms,占空比50%
  178.                                   
  179.                 if(num>0)
  180.                
  181.                 num--;          
  182.         //if(num==0)
  183.                 if(KEYL!=0)
  184.         {
  185.                         YU=0;
  186.                 LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;
  187.                                
  188.                                 signl=0;
  189.                
  190.              //   signk=0;
  191.                         if(++count3>=150)//3秒延时
  192.               {
  193.                  count3=150; //保持
  194.                  BU=1;
  195.                                   P3=0XFC;              //日行灯亮
  196.                }  
  197.         }
  198. }

  199. /********触发子程序函数*********/

  200. void keyScan()
  201. {
  202.                             
  203.              if(KEYL==0  && signl==0  )//左转流光
  204.                 {
  205.                                                 count3=0;        //计数3清0
  206.                         signl=1;
  207.                         num=60;
  208.                         while(num)
  209.                         {
  210.                          BU=0;   
  211.                          Led_L();

  212.                         }
  213.                        
  214.                 }
  215.      
  216. }         


  217. /*------------------------------------------------
  218. 延时函数,含有输入参数 unsigned int t,无返回值
  219. unsigned int 是定义无符号整形变量,其值的范围是
  220. 0~65535
  221. ------------------------------------------------*/
  222. void Delay(unsigned int t)
  223. {
  224. while(--t);
  225. }


  226. /*****扫描呼吸灯函数*****/
  227. void Led_YU()
  228. {
  229.                                                                               
  230.         unsigned int CYCLE=1500,PWM_LOW=0;        //定义周期并赋值
  231.          
  232.                                                                                     
  233.                         {
  234.                                  BU=0;
  235.                                  Delay(60000);                                //特意加延时,可以看到熄灭的过程
  236.                                  for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)//PWM_LOW表示低电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
  237.                                         {                                P3=0XFC;
  238.                                                                 BU=1;        //点亮LED  
  239.                                                         Delay(PWM_LOW);//延时长度,600次循环中从1加至599
  240.                                                         BU=0;        //熄灭LED
  241.                                                         Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
  242.                                         }
  243.                                      //   BU=1;
  244.                                      //  for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  245.                                      //   {                       //与逐渐变亮相反的过程
  246.                                      //          BU=1;
  247.                                      //          Delay(PWM_LOW);
  248.                                      //          BU=0;
  249.                                      //          Delay(CYCLE-PWM_LOW);
  250.                                      //  }                                                
  251.                         }
  252. }
复制代码


以上是按大神的修改后的程序,但还有一个地方不理想,就是上电流光扫描还没有完成时,
                        if(++count3>=150)//3秒延时
              {
                 count3=150; //保持
                 BU=1;
                                  P3=0XFC;              //日行灯亮
               }  
        }
}
这一部份就亮了,我想要的效果是扫描完成后才亮。转向中断后1秒也要亮。
各位大神帮看看需要怎样修改一下。
回复

使用道具 举报

ID:99987 发表于 2021-9-7 21:04 | 显示全部楼层
用pwm方式实现
回复

使用道具 举报

ID:280000 发表于 2021-9-8 08:56 | 显示全部楼层
单片机定时器输出不同大小的PWM即可实现
回复

使用道具 举报

ID:859245 发表于 2021-9-8 18:28 | 显示全部楼层
呼吸灯用PWM调占空比呀,STM32和51都是这样做的
回复

使用道具 举报

ID:280000 发表于 2021-9-15 09:01 | 显示全部楼层
单片机定时器输出不同大小的PWM即可
回复

使用道具 举报

ID:966227 发表于 2021-9-15 12:02 | 显示全部楼层
就是找准控制IO开关频率,这个开关频率里面又要去按照一定时间去调整占空比从0-100%。找到一个最佳的显示效果
回复

使用道具 举报

ID:161164 发表于 2021-9-15 14:42 | 显示全部楼层
川蜀浪子 发表于 2021-9-7 17:08
以上是按大神的修改后的程序,但还有一个地方不理想,就是上电流光扫描还没有完成时,
                        if(++count3 ...

加一个标置位Init_Done
在上电流光的后面置1
在中断里
if(Init_Done)
{
行195~209
}
回复

使用道具 举报

ID:966294 发表于 2021-9-15 16:23 | 显示全部楼层
用TIM来制造PWM波,然后调节PWM的占空比就可能实现它的亮暗变化
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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