写点什么

基于 51 单片机设计的呼吸灯

作者:DS小龙哥
  • 2024-07-15
    重庆
  • 本文字数:2563 字

    阅读完需:约 8 分钟

一、项目介绍

呼吸灯是一种常见的 LED 灯光效果,它可以模拟人类呼吸的变化,使灯光看起来更加柔和和自然。51 单片机是一种广泛使用的微控制器,具有体积小、功耗低、成本低等优点,非常适合用于控制 LED 呼吸灯。本项目的呼吸灯将使用 PWM(脉冲宽度调制)技术控制 LED 亮度,从而实现呼吸灯的效果。


在本项目中,将使用 51 单片机作为主控制器,通过编程实现呼吸灯的控制。将使用 C 语言编写代码,并使用 Keil C51 集成开发环境进行编译和调试。使用 Proteus 仿真软件进行电路设计和仿真,确保电路的正确性和稳定性。


二、设计原理

2.1 PWM 技术

PWM 是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种通过改变脉冲宽度来控制电路的技术。在数字电路中,PWM 是一种非常常见的技术,它可以用来控制电机、LED 灯等电子设备的亮度、速度等参数。


PWM 技术的基本原理是通过控制脉冲的宽度和周期来控制电路的输出。在一个 PWM 周期内,电路会以一定的频率(也就是 PWM 频率)产生一系列脉冲,每个脉冲的宽度和高电平时间占整个周期的比例是由控制器根据需要设定的。通过这种方式,可以实现对电路输出的精确控制。


在 LED 呼吸灯项目中,使用定时器模拟 PWM 技术可以实现呼吸灯效果。具体来说,就是通过定时器产生一定频率的脉冲信号,然后通过改变脉冲的占空比来控制 LED 灯的亮度。当脉冲的占空比逐渐增大时,LED 灯的亮度也会逐渐增强,直到达到最大亮度;当脉冲的占空比逐渐减小时,LED 灯的亮度也会逐渐减弱,直到最终熄灭。这样就可以实现类似于人类呼吸的渐变效果。

2.2 呼吸灯原理

呼吸灯是一种将 LED 灯光做成渐变效果的技术,可以让 LED 的亮度在一定时间内慢慢地增加和减小,使得 LED 的亮度变化更加自然和柔和,适合用于需要渐变效果的场景,如灯光调节、音响节拍等。


呼吸灯的原理是通过改变 LED 的 PWM 信号的占空比来控制 LED 的亮度。PWM(Pulse Width Modulation,脉宽调制)是一种调节模拟信号幅度的常用技术,它通过改变信号的脉冲宽度来实现对信号幅度的调节。在呼吸灯中,PWM 信号的频率较高,而占空比则会随着时间的推移而逐渐变化,从而实现 LED 亮度的渐变效果。


呼吸灯的实现通常需要使用一个定时器和一个 PWM 模块。定时器用来定时触发中断事件,在中断处理函数中改变 PWM 信号的占空比,从而控制 LED 的亮度。在定时器中断处理函数中,可以通过数学函数(如正弦、余弦等)或者简单的数值计算来得到不同的 PWM 占空比,实现不同的呼吸灯效果。

2.3 51 单片机

51 单片机是一种广泛使用的微控制器,具有体积小、功耗低、成本低等优点,非常适合用于控制 LED 呼吸灯。


STC89C52 是一种基于 MCS-51 内核的 8 位单片机,由中国的 STC 公司生产。具有高性价比、易于编程、广泛应用等特点,在工业控制、通信、家电控制等领域得到了广泛应用。


STC89C52 单片机的主要特点如下:


  1. 采用 MCS-51 内核,具有 8 位数据总线和 16 位地址总线,可以访问 64KB 的程序存储器和 64KB 的数据存储器。

  2. 内置 12MHz 的晶振,可以通过软件设置分频系数来获得不同的系统时钟频率。

  3. 具有多种外设接口,包括 UART、SPI、I2C、定时器、中断等,可以方便地实现各种应用。

  4. 支持 ISP(In-System Programming)编程方式,可以通过串口或并口进行在线编程,方便快捷。

  5. 具有低功耗模式,可以通过软件设置进入不同的睡眠模式,以节省系统能耗。


STC89C52 单片机可以使用 C 语言或汇编语言进行编程,编写的程序可以通过编译器生成 HEX 文件,然后通过编程器烧录到芯片中。由于 STC89C52 单片机的广泛应用和丰富的资料,因此学习和使用它相对来说比较容易。

三、代码实现

3.1 自动呼吸灯

因为 STC89C52 单片机没有 PWM 输出功能,只能使用延时函数实现,以下是基于 STC89C52 单片机实现呼吸灯效果的完整代码:


#include <reg52.h>
#define LED P1
void delay(unsigned int xms){ unsigned int i, j; for (i = xms; i > 0; i--) for (j = 110; j > 0; j--);}
void main(){ unsigned char i; while (1) { for (i = 0; i < 255; i++) { LED = i; delay(10); } for (i = 255; i > 0; i--) { LED = i; delay(10); } }}
复制代码


在这个代码中,使用了 STC89C52 单片机的 P1 口来控制 LED 灯的亮度。通过一个循环,让 LED 灯的亮度从 0 到 255 逐渐增加,再从 255 到 0 逐渐减小,这样就实现了呼吸灯的效果。


在代码中,使用了一个 delay 函数来控制循环的速度。这个函数可以让程序延时一定的时间,从而控制 LED 灯的亮度变化速度。在这个代码中,设置了每次延时 10 毫秒,可以根据需要调整这个值来改变呼吸灯的效果。

3.2 按键控制灯光亮度

以下是基于 STC89C52 单片机的 LED 灯亮度控制完整代码,其中使用了两个按键分别控制 LED 的亮度和灭度。


#include <reg52.h>
#define LED P1
sbit KEY_UP = P3 ^ 2;sbit KEY_DOWN = P3 ^ 3;
unsigned char pwm = 0;
void delay(unsigned int i) { while (i--);}
void key_scan() { if (KEY_UP == 0) { delay(1000); if (KEY_UP == 0) { pwm += 10; if (pwm >= 100) { pwm = 100; } } } if (KEY_DOWN == 0) { delay(1000); if (KEY_DOWN == 0) { pwm -= 10; if (pwm <= 0) { pwm = 0; } } }}
void main() { TMOD = 0x01; // 设置定时器0为模式1 TH0 = 0xFC; // 定时器初值,用于产生PWM信号的频率为50Hz TL0 = 0x67; TR0 = 1; // 启动定时器0 ET0 = 1; // 允许定时器0中断 EA = 1; // 开启总中断 while (1) { key_scan(); }}
void timer0() interrupt 1 { static unsigned char cnt = 0; if (cnt >= 100) { cnt = 0; } if (cnt < pwm) { LED = 0; } else { LED = 1; } cnt++;}
复制代码


以上代码中,使用了定时器 0 来产生 PWM 信号,控制 LED 的亮度。使用了两个按键来调整 LED 的亮度和灭度。其中,KEY_UP 按键用于增加 LED 的亮度,KEY_DOWN 按键用于减小 LED 的亮度。在每次定时器中断时,根据 pwm 的值来控制 LED 的亮度。当 cnt 小于 pwm 时,LED 为低电平,LED 亮度较高;当 cnt 大于等于 pwm 时,LED 为高电平,LED 亮度较低。

发布于: 刚刚阅读数: 3
用户头像

DS小龙哥

关注

微信公众号:DS小龙哥嵌入式技术资讯 2022-01-06 加入

所有项目文章对应的工程源码,都可以在我的微信公众号:《DS小龙哥嵌入式技术资讯》 里下载。

评论

发布
暂无评论
基于51单片机设计的呼吸灯_7月月更_DS小龙哥_InfoQ写作社区