打印
[应用方案]

单片机PWM调节LED灯亮度

[复制链接]
4182|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jessicakjdsl|  楼主 | 2016-5-10 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过无线遥控调节LED灯亮度的设计方案,我能需要做的很简单,只要通过无线按键控制增减调节灯得亮度,甚至只要通过按键实现一定范围变化的模拟变化量输出就OK了,回来上网搜索了一些资料,昨晚花了一晚上的时间写了一个很简单的通过单片机PWM调节LED灯亮度的代码,估计我想通过调节灯得亮度一般都是通过PWM来调节的,(网上一般都是这样的设计)
上午又写了个,主要是感觉昨晚的那个不怎么好,而且控制的不够精准,两个程序都贴出来吧,主要大家一起学习!这两个程序都是经过我亲自调试过!下载到自己使用只需要修改相关的控制引脚就OK了.......
昨晚的程序如下:
// PWM 控制 LED 灯渐亮渐灭程序
// 晶振为12M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。
#include < reg51.h >
sbit K1 =P3^0 ;                    //增加键
sbit K2 =P3^1 ;
sbit P10=P1^0 ;                  //减少键
sbit BEEP =P3^7 ;                //蜂鸣器
unsigned char PWM=0x7f;   //赋初值
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
void main()
{
/////////////////////////////初始化/////////////////////////
    K1=1;
    K2=1;
    TMOD=0x21;
    TH0=0xfc;             //1ms延时常数
    TL0=0x18;            //频率调节
    TH1=PWM;            //脉宽调节
    TL1=0;
     EA=1;
     ET0=1;
     ET1=1;
     TR0=1;
/////////////////////////////主循环//////////////////////////  
   while(1)
  {
     if(K1==0)//递增按键考虑消抖..
  {
   delayms(20);
    if(K1==0)
   {   
   if(PWM==255)
    {
     PWM=255;
     Beep();
    }
   else PWM++;
   }
  }
      if(K2==0)//递减按键
  {
   delayms(20);
    if(K2==0)
   {
   if(PWM==0)
    {
     PWM=0;
     Beep();
    }
   else PWM-- ;
   }
  }
}
}

// 定时器0中断服务程序.

void timer0() interrupt 1
{
    TH0=0xfc ;
    TL0=0x18 ;
    TH1=PWM ;//定时器自动重装值由PWM提供
    TR1=1 ;
    P10=0 ;      //启动输出
}

// 定时器1中断服务程序

void timer1() interrupt 3
{
TR1=0;
    P10=1 ;    //结束输出
}

//蜂鸣器子程序
void Beep()   
{
      unsigned char i ;
      for (i=0 ;i<100 ;i++)
        {
          delay(200) ;
          BEEP=!BEEP ;                //Beep取反
        }
     BEEP=1 ;                            //关闭蜂鸣器
     delayms(200);
}

// 延时子程序

void delay(unsigned char t)
{
    while(t--)   ;
}

// 延时子程序

void delayms(unsigned char ms)
{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}
上午的程序,也是从网上下修改修改的,通过示波器可以很明显的观察到PWM占空比的变化
#include <reg51.H>  //模拟PWM输出控制灯的10个亮度级
unsigned int scale;
sbit K1 =P3^0 ;                    //增加键
sbit K2 =P3^1 ;
sbit P11=P1^2 ;
sbit P10=P1^0 ;                  //减少键
sbit BEEP =P3^7 ;                //蜂鸣器
unsigned char PWM=20;   //赋初值  //占空比控制变量
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
void main(void)  // 主程序
{
    TMOD=0x02;  //定时器0,工作模式2(0000,0010),8位定时模式
    TH0=0x06;  //写入预置初值6到定时器0,使250微秒溢出一次(12MHz)
    TL0=0x06;  //写入预置值
    TR0=1;   //启动定时器
    ET0=1;   //允许定时器0中断
    EA=1;   //允许总中断
    while (1)  //无限循环,实际应用中,这里是做主要工作
    {

     if(K1==0)//递增按键
  {
   delayms(100);
    if(K1==0)
   {   
   if(scale==40)
    {
     //PWM=255;
     Beep();
    }
   else scale++; ;
   }
  }
      if(K2==0)//递减按键
  {
   delayms(100);
    if(K2==0)
   {
   if(scale==0)
    {
     //PWM=0;
     Beep();
    }
   else scale-- ;
   }
  }
    }
}
void timer0(void) interrupt 1 //定时器0中断服务程序
{
    static unsigned int n ; //n用来保存当前时间在一秒中的比例位置
    n++;   //每250微秒增加1
    if(n==40)  //1秒的时钟周期
    {
        n=0;  //使n=0,开始新的PWM周期
        P10=0; //使LED灯亮
    }
    if(scale==n)  //按照当前占空比切换输出为高电平
        P10=1; //使LED灯灭
}
//程序中从tt=0开始到scale为低电平,从scale开始到n=10为高电平,
//由于scale是变量,所以改变scale就可以改变占空比。
/////////////////////////下面的程序同上面一样///////////////////////////////////

//蜂鸣器子程序
void Beep()   
{
      unsigned char i ;
      for (i=0 ;i<100 ;i++)
        {
          delay(200) ;
          BEEP=!BEEP ;                //Beep取反
        }
     BEEP=1 ;                            //关闭蜂鸣器
     delayms(200);
}

// 延时子程序

void delay(unsigned char t)
{
    while(t--)   ;
}

// 延时子程序

void delayms(unsigned char ms)
{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}


沙发
598330983| | 2016-5-11 10:59 | 只看该作者
无线采用的什么功能?蓝牙吗,通常如果没有无线电遥控器,就最好用蓝牙,这样方便手机控制。

使用特权

评论回复
板凳
捉虫天师| | 2016-5-11 15:07 | 只看该作者
还有一种调光方式就是控制不同数量的LED点亮。

使用特权

评论回复
地板
zhuomuniao110| | 2016-5-11 22:05 | 只看该作者
我之前用ZigBee做过类似的,也就是通过无线传。

使用特权

评论回复
5
fang355| | 2016-6-15 15:09 | 只看该作者
感谢分享  已经下载过, 很好的。 在此追问楼主, 这里PWM值, 直接使用按键加10% 20% 30% 40% 。。。 100% 全亮, 反之到 10%最暗。 不用T0  T1定时功能(因为定时器功能已经由其他的派用),  就是单纯的安件控制   单片机可否也能起到你的效果!?

使用特权

评论回复
6
Jessicakjdsl|  楼主 | 2016-6-16 22:26 | 只看该作者
这么做出来的功能不就是呼吸灯吗

使用特权

评论回复
7
gejigeji521| | 2016-7-27 22:55 | 只看该作者
如果用51,只能使用IO来模拟这个功能。

使用特权

评论回复
8
chundidi| | 2016-11-29 11:49 | 只看该作者
请问有仿真图么?先看了你的博客,又来了这里看见你

使用特权

评论回复
9
bingkaiok| | 2016-11-30 00:23 | 只看该作者
感谢楼主分享

使用特权

评论回复
10
598330983| | 2016-12-3 14:40 | 只看该作者
用的频率是多少的?

使用特权

评论回复
11
zhuomuniao110| | 2016-12-4 15:15 | 只看该作者
电机调速也一般使用PWM操作。

使用特权

评论回复
12
goty2000| | 2017-3-12 09:37 | 只看该作者
感谢楼主分享,刚刚自己搭电路试了一下,在按住开关连续调光灯途中,会偶然遇到LED闪烁一下的情况。

使用特权

评论回复
13
zhuotuzi| | 2017-3-12 23:17 | 只看该作者
IO配合定时器模拟这个PWM。

使用特权

评论回复
14
heisexingqisi| | 2017-3-12 23:54 | 只看该作者
没有直接用PWM弄的方便,配置好就行了。

使用特权

评论回复
15
稳稳の幸福| | 2017-3-17 20:33 | 只看该作者
定时器做这个,考验人对这个PWM的理解深度。

使用特权

评论回复
16
zhuotuzi| | 2017-3-18 18:47 | 只看该作者
楼主可以试试新唐的M051,上面带PWM硬件。

使用特权

评论回复
17
huangcunxiake| | 2017-3-18 22:42 | 只看该作者
可以通过IO控制流水方向,实现那个很炫彩的效果。

使用特权

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

本版积分规则

17

主题

116

帖子

1

粉丝