单片机PWM调节LED灯亮度

发布者:SereneGardener最新更新时间:2015-10-29 来源: eefocus关键字:单片机  PWM调节  LED灯亮度 手机看文章 扫描二维码
随时随地手机看文章
刚搞完飞思卡尔智能车,昨天我一起做车的搭档跑来跟我说魏老师(我们系的前主任,不知道他们怎么认识的....)叫他帮忙做个可通过无线遥控调节LED灯亮度的设计方案,问我有没有兴趣做做,主要是魏老师也是受他以前的老同学(合工大的....)所托,他自己估计没怎么搞过这个,开始自己不敢接,很担心自己不会做,自己几斤几两自己还不清楚,呵呵,后来实在央求不过,算了,做就做吧,还以为是什么大项目...了解了才知道,我能需要做的很简单,只要通过无线按键控制增减调节灯得亮度,甚至只要通过按键实现一定范围变化的模拟变化量输出就OK了,回来上网搜索了一些资料,昨晚花了一晚上的时间写了一个很简单的通过单片机PWM调节LED灯亮度的代码,估计我想通过调节灯得亮度一般都是通过PWN来调节的,(网上一般都是这样的设计)

上午又写了个,主要是感觉昨晚的那个不怎么好,而且控制的不够精准,两个程序都贴出来吧,主要大家一起学学!这两个程序都是经过我亲自调试过!下载到自己使用只需要修改相关的控制引脚就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   //模拟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++) ;
     }
}

关键字:单片机  PWM调节  LED灯亮度 引用地址:单片机PWM调节LED灯亮度

上一篇:单片机内的Flash与EEPROM作用及区别
下一篇:直流电动机的调速 用单片机产生PWM控制

推荐阅读最新更新时间:2024-03-16 14:37

单片机智能温控风扇原理图PCB文件与源程序
主芯片为89c51,外设有电机,温度传感器,红外热释电,lcd1602,主要功能是可根据室温自动调整电机转速,并且识别人体,有人打开,无人断电,室内温度,以及上下限可按键调整,并在1602上显示。 压缩包里有原理图,pcb板,以及库。还有代码和文档。 Altium Designer画的原理图和PCB图如下: 单片机源程序如下: #include reg52.h //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #incl
[单片机]
<font color='red'>单片机</font>智能温控风扇原理图PCB文件与源程序
“叮咚”门铃电路设计
“叮咚”门铃 1. 实验任务 当按下开关SP1,AT89S51单片机产生“叮咚”声从P1.0端口输出到LM386,经过放大之后送入喇叭。 2. 电路原理图 图4.19.1 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2. 在“音频放大模块”区域中的SPK OUT端口上接上一个8欧或者是16欧的喇叭; (3. 把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上; 4. 程序设计方法 (1. 我们用单片机实定时/计数器T0来产生700HZ和500HZ的频率,根据定时/计数器T0,我们取定时250us,因此,700
[单片机]
“叮咚”门铃电路设计
51单片机-最终按键程序
1.代码及解析 我们先贴出代码,下面再进行解析原理 u8 KEY_Scan(u8 mode,u16 TIMES) { static u8 key_up=1; //按键松开标志 static u16 times; if(mode)key_up=1; //如果mode等于1,支持连按 if(key_up&&(KEY4==0||KEY8==0||KEY12==0||KEY16==0))//只要在key_up等于1时,其中一个按键被按下就可以进入执行代码 { times++; //记录进入低电平的时间 if(times =TIMES)//抖动的时间已经过去 {
[单片机]
涡街流量计的二次仪表设计
1 引言   随着现代工业自动化水平的不断提高,在很多情况下需要集中监测多个流量点,如在石油注水开采过程中,为了保持开采效果、保护地下环境及随后分析注水数据,需要对注水量进行监测,在油田系统中逐渐使用智能仪表来计量油井的出油量。计量仪表精确度的高低直接影响企业的经济效益。目前,我国的流量计起步晚,起点低,还比较落后。使用单片机开发的流量计作为二次仪表是非常适用的,对油田自动化有很大的促进。 2 系统原理    就整体结构而言,流量计主要由涡街流量传感器、前置放大器、计数显示单元组成。涡街流量传感器主要由漩涡发生体、漩涡频率检测器和壳体构成,其作用是产生稳定和强烈的漩涡,并检出产生漩涡的频率和输出与漩涡频率成正比的电信号。漩涡发生
[测试测量]
基于S3C44B0X芯片和SPCE061A单片机实现移动机器人的设计
1、引言 移动机器人利用导航技术,获得机器人的目前所处的位置,结合技术对周围外界环境(障碍物等)作实时探测,并根据环境提供的信息规划一条可行路径完成达到目标点的任务。移动机器人技术涉及到传感器技术,导航技术,技术,人工智能等多个领域,因而对移动机器人的控制部分提出很高的要求,特别是视觉传感器的出现,要求控制系统不仅存储量大,而且处理速度快等。以往基于和控制的移动机器人就不能很好的满足实时性快速性的特点。 随着处理器的出现和发展以及嵌入式系统的发展,移动机器人的实时性快速性要求便能得到很好满足,现在该技术已经在多种领域得到有效的应用。本文是以SAMSUNG公司一款基于ARM7TD核的低功耗高性能的32位处理器芯片S3C44
[机器人]
单片机串行通讯引见
通讯依照根本类型可以分为并行通讯和串行通讯。并行通讯时数据的各个位同时传送,可以完成字节为单元通讯,然则通讯线多占用资本多,本钱高。比方我们前边用到的 P0 = 0xFE;一次给 P0 的 8 个 IO 口辨别赋值,同时停止旌旗灯号输入,相似于有 8 个车道同时可以过来 8 辆车一样,这种方式就是并行的,我们习气上还称 P0、P1、P2 和 P3 为 51 单片机的 4 组并行总线。 而串行通讯,就好像一条车道,一次只能一辆车过来,假如一个 0xFE 如许一个字节的数据要传输过来的话,假设低位在前高位在后的话,那发送方法就是 0-1-1-1-1-1-1-1-1,一位一位的发送出去的,要发送 8 次才干发送完一个字节。 STC
[单片机]
<font color='red'>单片机</font>串行通讯引见
基于森国科MCU SPIN的落地扇和循环扇应用方案
本期内容重点介绍,针对三相低压风扇电机驱动,森国科SGK32G031芯片可提供的一款高性价比解决方案,加速实现低功耗、轻量化、节能化的落地扇&循环扇应用。 森国科MCU SPIN(SGK32G031)芯片 高性能 高可靠性 芯片采用32-bit Arm Cortex-M0内核,主频60MHZ,内置USART ,集成业内领先的高采样率的高速12bit ADC ,集成2个高速 模拟 比较器 ,2个OPA 运算放大器 , 硬件 除法器; 芯片针对电机应用进行了多项设计优化,具备了高精准高可靠 时钟 系统、可支持移相的 TI MER、以及-40℃~105℃增强 工业 级工作温度范围等多项高可靠性优势。 小尺寸、多应用 芯片采用Q
[嵌入式]
基于森国科<font color='red'>MCU</font> SPIN的落地扇和循环扇应用方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved