呼吸灯

news/2024/12/23 6:30:40/

呼吸灯

呼吸灯,就是控制led灯的亮度从弱变强、从强变弱的循环往复,从而实现像呼吸一样的效果。改变电压即可改变led灯的亮度,但是用代码控制led灯两端电压显然是不现实的,我们可以用控制脉冲宽度的方式来控制led灯点亮的时间,从完全熄灭到完全点亮,再从完全熄灭到完全点亮,从而实现呼吸灯的效果。
在这里插入图片描述

如下图是led从完全熄灭到完全点亮的过程。中间变量cnt_1s[9:0]、cnt_1ms[9:0]、cnt_1us[5:0],以1s为周期来实现led亮度的渐变,第一个1s时间led灯点亮了1ms,第二个1s点亮了2ms…以此类推,到第一千个1s,led灯完全点亮。cnt_en是改变led从完全熄灭到完全点亮,再从完全熄灭到完全点亮状态的标志信号,它将在计数到达1000个1s周期时,进行翻转电平,实现亮度从弱变强(图一)到从强变弱(图二)(或从强变弱到从弱变强)的切换。
图1
图2
代码如下:

module breath_led
#(	parameter	CNT_1S_MAX = 10'd999	,	//1s = 1000msparameter	CNT_1mS_MAX = 10'd999	,	//1ms = 1000msparameter	CNT_1US_MAX = 6'd49			//50*20ns=1us
)
(input			sys_clk		,input			rst_n		,output	 reg	led_out
);reg		[9:0]	cnt_1s	;
reg		[9:0]	cnt_1ms	;
reg		[5:0]	cnt_1us	;
reg				cnt_en	;always@(posedge sys_clk or negedge rst_n)beginif(rst_n == 1'b0)cnt_1us <= 6'd0;	else if(cnt_1us == CNT_1US_MAX)cnt_1us <= 6'd0;elsecnt_1us <= cnt_1us + 6'd1;
endalways@(posedge sys_clk or negedge rst_n)beginif(rst_n == 1'b0)cnt_1ms <= 10'd0;else if((cnt_1ms==CNT_1mS_MAX) && (cnt_1us==CNT_1US_MAX))cnt_1ms <= 10'd0;else if(cnt_1us==CNT_1US_MAX)cnt_1ms <= cnt_1ms + 10'd1;elsecnt_1ms <= cnt_1ms;
endalways@(posedge sys_clk or negedge rst_n)beginif(rst_n == 1'b0)cnt_1s <= 10'd0;else if((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1mS_MAX) && (cnt_1us==CNT_1US_MAX))cnt_1s <= 10'd0;else if((cnt_1us == CNT_1US_MAX) && (cnt_1ms == CNT_1mS_MAX))cnt_1s <= cnt_1s + 10'd1;elsecnt_1s <= cnt_1s;
endalways@(posedge sys_clk or negedge rst_n)beginif(rst_n == 1'b0)cnt_en <= 1'd0;else if((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1mS_MAX) && (cnt_1us==CNT_1US_MAX))cnt_en <= ~cnt_en;elsecnt_en <= cnt_en;
endalways@(posedge sys_clk or negedge rst_n)beginif(rst_n == 1'b0)led_out <= 1'd0;else if( ((cnt_en == 1'd0) && (cnt_1ms <= cnt_1s) ) || ((cnt_en == 1'd1) && (cnt_1ms > cnt_1s) ) )led_out <= 1'd0;else led_out <= 1'd1;
endendmodule

仿真文件如下:

`timescale 1ns/1ns
module  breath_led_tb();reg		sys_clk		;
reg		rst_n		;wire	led_out		;parameter  CYCLE = 20;initial beginsys_clk = 1'b0;forever #(CYCLE/2) sys_clk = ~sys_clk;
endinitial beginrst_n <= 1'b0;#20rst_n <= 1'b1;
endbreath_led
#(	.CNT_1S_MAX (10'd9),	//1s = 1000ms.CNT_1mS_MAX(10'd9),	//1ms = 1000ms.CNT_1US_MAX(6'd4)		//50*20ns=1us
)
breath_led_inst
(.	sys_clk		(sys_clk),.	rst_n		(rst_n	),.	led_out     (led_out )
);
endmodule

仿真结果如图,可以看出低电平持续时间由少增多,再由多减少的过程。和所绘制波形图(二图首尾结合)一致。
在这里插入图片描述


http://www.ppmy.cn/news/701089.html

相关文章

Arduino(五)——呼吸灯

这节的主要内容为AO模拟输出&#xff0c;内容是比较简单的&#xff0c;我们只要注意一个函数 也就是 analogWrite(pin,value) - PWM ,数字IO口PWM输出函数&#xff0c;Arduino 数字IO口标注了PWM的IO口可使用该函数&#xff0c;pin 表示 3&#xff0c;5&#xff0c;6&#xff…

呼吸灯按钮的实现

前几天浏览网页是时候&#xff0c;发现一个特效&#xff0c;感觉很不错&#xff0c;博主仿照它的样子写了一下&#xff0c;下面直接见代码吧。 在页面中添加一个提交按钮 <body> <div class"submit_style"><input type"submit" class&quo…

CC2530按键控制呼吸灯

#include "iocc2530.h"#define LED1 P1_1 #define sw1 P0_1unsigned char h 0; unsigned char flag 0; unsigned char a1; //a 1渐亮&#xff0c;a2渐灭//初始化 void Init() {P1SEL & ~0x02; //11100000P1DIR | 0x02; //0…

按键呼吸灯(循环)

1.定义按键中断设置pin脚13为按键&#xff0c;设置f为标志位&#xff0c;按键一旦按下&#xff0c;f为1&#xff0c;进入呼吸灯算法 if(GPIO_Pin&GPIO_PIN_13 ) { if(f0) f1; else f0; } 2.呼吸灯就是将一个灯点亮延时一…

Spring面试题--Spring中的循环引用(循环依赖)

我们以上述代码为例分析一下死循环产生的过程 为什么A是半成品呢&#xff1f; 如果熟悉bean的生命周期&#xff0c;那么在实例化对象A的时候&#xff0c;首先去调用的是构造函数&#xff0c;像是依赖注入还有接口的实现重写什么的&#xff0c;还有后置处理器&#xff0c;初始化…

软件UI工程师的职责模板

软件UI工程师的职责模板1 职责&#xff1a; 1.负责产品的UI视觉设计(手机软件界面 网站界面 图标设计产品广告及 企业文化的创意设计等); 2.负责公司各种客户端软件客户端的UI界面及相关图标制作; 3.设定产品界面的整体视觉风格; 4.为开发工程师创建详细的界面说明文档&…

私有网段ABC网段

私有网段,有A,B,C三个地址段&#xff1a; A类私有网段 10.0.0.0/8 10.0.0.0-10.255.255.255 B类私有网段 172.16.0.0/12 172.16.0.0-172.31.255.255 C类私有网段 192.168.0.0/16 192.168.0.0-192.168.255.255 ———————————————— 版权声明&#xff1a;本文为CS…

网段和网络号的区别

网络号和网段是两个不同的概念。在 IP 地址中&#xff0c;网络号指的是这个 IP 地址所在的网络的标识符&#xff0c;而网段是由网络前缀加上主机地址共同组成的一段地址范围&#xff0c;用来划分一个网络中各个子网的边界。 一个 IP 地址通常会被分成网络号和主机地址两部分&am…