单片机:实现LED亮度等级控制(附带源码)

单片机实现LED亮度等级控制

LED亮度控制是单片机应用中的一种常见功能,通常通过调节LED的电流来实现不同的亮度等级。在嵌入式开发中,**PWM(脉宽调制)**信号常用于实现对LED亮度的控制。通过改变PWM信号的占空比(duty cycle),可以调节LED的平均电压,从而调节LED的亮度。

本项目将介绍如何使用**单片机(如AT89C51)**实现LED亮度的等级控制。通过按键控制LED的亮度,并使用PWM信号调节LED的亮度等级。

1. 项目需求分析

目标:
  1. 使用单片机通过PWM信号控制LED的亮度。
  2. 通过按键输入来切换不同的亮度等级。
  3. LED亮度可以分为多个等级,例如:低、中、高亮度。
功能需求:
  1. PWM调光:通过改变PWM信号的占空比,调节LED的亮度。
  2. 按键控制:通过按键(例如:上升或下降按钮)来切换亮度等级。
  3. LED亮度显示:根据设定的亮度等级,通过LED的亮度变化来反映等级的变化。

2. 硬件设计

2.1 单片机选择

选择AT89C51单片机作为控制核心,它具有丰富的I/O口,可以方便地连接PWM输出引脚、按键以及LED。

2.2 硬件连接
  1. LED连接

  2. LED与单片机的一个GPIO引脚连接(如P1.0)。为了实现亮度调节,可以将LED和电流限流电阻连接到一个PWM输出引脚。
  3. 按键输入

  4. 使用两个按键,一个用于增大亮度等级(如K1),另一个用于减小亮度等级(如K2)。这些按键连接到单片机的输入引脚(如P3.0和P3.1)。
  5. 电源

  6. 为单片机提供5V电源,为LED提供足够的电压和电流。
2.3 电路设计
  1. LED电路:LED和限流电阻连接到PWM输出引脚,通过PWM信号控制LED的亮度。
  2. 按键电路:两个按键连接到P3.0和P3.1,并通过外部上拉电阻或内置上拉电阻配置。

3. 软件设计

3.1 PWM调光原理

PWM信号的占空比(duty cycle)决定了LED的亮度。占空比越大,LED的亮度越高。我们通过调节定时器的重载值来产生不同占空比的PWM信号。

  • 占空比计算:占空比是控制信号的高电平时间与总周期的比例。
  • PWM周期 = 1 / PWM频率
  • 占空比 = 高电平时间 / PWM周期
  • 通过改变占空比,单片机可以输出不同的亮度等级。

    3.2 按键控制

    使用两个按键来控制亮度等级:

  • 按键1:增加亮度(增加PWM的占空比)。
  • 按键2:减小亮度(减小PWM的占空比)。
  • 3.3 程序设计
    1. PWM初始化:通过定时器产生固定频率的PWM信号。
    2. 亮度等级调整:根据按键的输入调整PWM的占空比,进而控制LED的亮度。
    3. 按键去抖动:使用简单的延时或软去抖动处理按键输入,避免误触发。
    3.4 代码实现
    #include <reg51.h>  // 包含51单片机的寄存器定义文件
    
    // 定义按键连接引脚
    #define KEY_UP    P3_0  // 增加亮度的按键
    #define KEY_DOWN  P3_1  // 减少亮度的按键
    
    // 定义PWM信号输出引脚
    #define PWM_PIN   P1_0  // PWM输出控制LED亮度
    
    // 定义亮度等级
    #define MAX_BRIGHTNESS  100  // 最大亮度等级
    #define MIN_BRIGHTNESS  0    // 最小亮度等级
    #define STEP_BRIGHTNESS 10   // 亮度步长
    
    unsigned char brightness = 50;  // 默认亮度等级为50
    
    // 延时函数,用于PWM周期控制
    void delay(unsigned int ms) {
        unsigned int i, j;
        for (i = 0; i < ms; i++) {
            for (j = 0; j < 120; j++);
        }
    }
    
    // PWM信号生成函数
    void PWM_Init() {
        // 设置PWM的周期,假设定时器周期较长
        TMOD &= 0xF0;  // 清空定时器模式
        TMOD |= 0x02;  // 设置定时器1为模式2(8位自动重装载)
    
        // 设置PWM周期
        TH1 = 256 - (255);  // 定时器溢出值
        TL1 = 256 - (255);  // 定时器初值
        TR1 = 1;  // 启动定时器1
    }
    
    // PWM中断服务程序
    void PWM_ISR() interrupt 3 {
        static unsigned int pwm_counter = 0;
        
        if (++pwm_counter >= brightness) {  // 如果计数器达到亮度等级,则关灯
            PWM_PIN = 0;  // 关闭LED
        } else {
            PWM_PIN = 1;  // 打开LED
        }
        
        if (pwm_counter >= 100) pwm_counter = 0;  // 重新计数
    }
    
    // 按键去抖动函数
    unsigned char Key_Scan() {
        unsigned char key = 0;
        if (KEY_UP == 0) {  // 如果按下增加亮度键
            delay(10);  // 去抖动延时
            if (KEY_UP == 0) {
                if (brightness < MAX_BRIGHTNESS) brightness += STEP_BRIGHTNESS;
            }
        } else if (KEY_DOWN == 0) {  // 如果按下减少亮度键
            delay(10);  // 去抖动延时
            if (KEY_DOWN == 0) {
                if (brightness > MIN_BRIGHTNESS) brightness -= STEP_BRIGHTNESS;
            }
        }
        return key;
    }
    
    // 主程序
    void main() {
        // 初始化PWM
        PWM_Init();
        
        // 开启定时器1中断
        ET1 = 1;
        EA = 1;  // 全局中断使能
        
        while (1) {
            Key_Scan();  // 扫描按键
        }
    }
    

    4. 代码解释

    1. PWM_Init()

    2. 该函数初始化定时器1为模式2(8位自动重装载模式),定时器的溢出周期用于控制PWM信号的周期。
    3. 每次定时器溢出时,会触发PWM信号的生成,从而调节LED的亮度。
    4. PWM_ISR()

    5. 定时器1的中断服务程序。每当定时器溢出时,这个函数被调用。pwm_counter用于跟踪PWM信号的高电平时间,当计数值小于brightness时,输出PWM高电平,点亮LED;当计数值大于brightness时,输出低电平,熄灭LED。
    6. brightness值的范围决定了LED的亮度,brightness值越大,LED越亮。
    7. Key_Scan()

    8. 该函数用于扫描按键输入并处理去抖动。当按下增加亮度按键时,brightness增加,减小亮度时,brightness减小。按键去抖动通过延时实现,防止误触发。
    9. 主程序

    10. 主程序中初始化PWM输出、启动定时器1中断、扫描按键并控制亮度。

    5. Proteus仿真

    5.1 电路设计
    1. 在Proteus中创建一个新项目,选择AT89C51单片机
    2. 添加一个LED和一个限流电阻,连接到P1.0引脚,用于控制LED的亮度。
    3. 添加两个按键,连接到P3.0和P3.1,用于控制亮度等级。
    4. 为单片机提供5V电源,设置定时器及PWM输出。
    5.2 仿真步骤
    1. 将代码上传到Proteus仿真环境中。
    2. 运行仿真,按下按键来调节LED的亮度,观察LED亮度的变化。

    6. 总结

    本项目实现了基于PWM控制的LED亮度调节功能。通过按键控制,可以在不同亮度等级之间切换,PWM信号的占空比决定了LED的亮度。这个项目展示了PWM技术在嵌入式系统中的应用,并可以扩展到更复杂的调光应用,如调节不同类型的LED灯光亮度。

    作者:Katie。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机:实现LED亮度等级控制(附带源码)

    发表回复