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

发布者:BlissfulDreams最新更新时间:2024-03-19 来源: elecfans关键字:51单片机  呼吸灯  Keil  C51集成开发环境 手机看文章 扫描二维码
随时随地手机看文章

一、项目介绍

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


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

image-20230606214353670

二、设计原理

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亮度较低。


关键字:51单片机  呼吸灯  Keil  C51集成开发环境 引用地址:基于51单片机设计的呼吸灯

上一篇:关于51单片机寄存器功能汇总表
下一篇:51单片机编程环境搭建方法

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

51单片机:P3.3口输入/P 1口输出实验
51单片机:P3.3口输入/P 1口输出实验 一、实验内容 1 P3.3口做输入口,外接一脉冲,每输入一个脉冲, P1口按十六进制除2(乘2)。 2. P1口做输出口,P1口接的8个发光二极管L1—L8按十六进制除2(乘2)方式点亮。 二、仿真图 三、代码实现 C语言实现: #include reg52.h #include intrins.h sbit KEY=P3^3; void delay10ms(void); void main() { char num=0xfe; KEY=1; while(1) { if(KEY==0) { dela
[单片机]
<font color='red'>51单片机</font>:P3.3口输入/P 1口输出实验
51单片机 主循环和中断共享全局变量的冲突
现象:工作中遇到一个大坑,STC11F32的运行灯闪的不均匀,大多数是500ms低电平和500ms高电平,但偶尔会有40ms左右的高、低电平出现,对,就这么简单的一个程序,奇哉怪哉! //定义全局变量:ms计数器 unsigned int cnt_ms; //定义全局变量:ms计数器备份 unsigned int cnt_ms_bk; //定义LED对应的IO口 sbit LED = P3 ^ 3; //主循环读访问 int main(void) { ...... if ((cnt_ms - cnt_ms_bk) 500) { led = ~led; cnt_ms_bk = cnt_ms; } ......
[单片机]
51单片机+K9F2080U0A制作MP3电路图与源程序
1单片机作MP3 步骤很详细奥 PLAY键播放音乐 FUNC用于在乐取选择、音量控制、音效控制间切换 PREVIOUS,选取时下一首,音量控制时为减小音量,音效控制时为下一音效 PREVIOUS,选取时上一首,音量控制时为增大音量,音效控制时为上一音效 电路原理图如下: 单片机源程序如下: /*C************************************************************************** * NAME: main.c *--------------------------------------------------------------------------
[单片机]
<font color='red'>51单片机</font>+K9F2080U0A制作MP3电路图与源程序
GD32F303标准库开发:Keil5新建GD32标准库工程
新建GD32工程 步骤1:创建工程模板文件 新建一个文件夹,命名为:GD32 在文件夹GD32里面新建四个文件夹 (1)CMSIS: 存放内核驱动程序和启动引导文件 (2)FWLIB:存放库函数文件 (3)Project:存放工程文件 (4)User: 存放用户程序(主函数) 具体效果图如下: 步骤2:导入GD32固件库 GD32标准固件库下载链接 1. 打开GD32F30x固件库文件 其中需要用到的两个文件:Firmware 和 Template。 2. 导入文件到 CMSIS 文件 (1)导入内核驱动程序 GD32F30x_Firmware_Library_V2.1.3FirmwareCMSIS 中的 4 个
[单片机]
GD32F303标准库开发:<font color='red'>Keil</font>5新建GD32标准库工程
基于2051单片机串行数据采集传输模块的设计
在微机测控系统中,经常要用到A/D转换。常用的方法是扩展一块或多块A/D采集卡。当模拟量较少或是温度、压力等缓变信号场合,采用总线型A/D卡并不是最合适、最经济的方案。这里介绍一种以GNS97C2051单片机为核心,采用TLC2543 12位串行A/D转换器构成的采样模块,该模块的采样数据由单片机串口经电平转换后送到上位机(IBM PC兼容机)的串口COM1或COM2,形成一种串行数据采集串行数据传输的方式。经实践调试证实:该模块功耗低、采样精度高、可靠性好、接口简便,有一定实用价值。 1 主要器件介绍 1.1 TLC2543串行A/D转换器 模块采用TI公司的TLC2543 12位串行A/D转换器,使用开关电容逐次逼近技术完
[单片机]
基于20<font color='red'>51单片机</font>串行数据采集传输模块的设计
通过51单片机定时器/计数器实现精确延时
  MCS-51单片机内部共有两个16位可编程定时器,计数器,即TO、Tl。既有定时功能,又有计数的功能。每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成(i=0、1)。TMOD是TO和Tl的工作方式控制寄存器,TCON是TO和Tl的运行状态控制寄存器。在实际应用时,应首先根据需要对这些寄存器进行初始化,即设置TO和Tl的工作方式并对TO和Tl定时器装入初始值以得到精确的定时时间。TO和Tl的工作方式及运行状态是由TMOD和TCON两个特殊功能寄存器控制的,而TMOD和TCON是由用户所编的程序控制的。      定时器的核心是一个加l计数器,加l计数器的脉冲有两个来源:一个是系统时钟振荡器,另一个是外部脉冲,计数器对脉
[单片机]
通过<font color='red'>51单片机</font>定时器/计数器实现精确延时
基于51单片机+DHT11温湿度+LCD1602显示
DHT11温湿度相关介绍 DHT11产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快 响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的 湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内 部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集 成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使 其成为各类应用甚至最为
[单片机]
基于<font color='red'>51单片机</font>+DHT11温湿度+LCD1602显示
51单片机精确延时程序
51单片机精确延时程序(晶振12MHz,一个机器周期1us.) 几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时, 在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序程序:.(晶振12MHz,一个机器周期1us.) void delay500ms(void) { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 计算分析: 程序共有三层循环 一层循环n:R5*2 = 81*2 = 162us DJNZ 2us 二层循环m:R6*(n+3)
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved