呼吸灯

呼吸灯

呼吸灯,就是控制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 = 1000ms
	parameter	CNT_1mS_MAX = 10'd999	,	//1ms = 1000ms
	parameter	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)begin
	if(rst_n == 1'b0)
		cnt_1us <= 6'd0;	
	else if(cnt_1us == CNT_1US_MAX)
		cnt_1us <= 6'd0;
	else
		cnt_1us <= cnt_1us + 6'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(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;
	else
		cnt_1ms <= cnt_1ms;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(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;
	else
		cnt_1s <= cnt_1s;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(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;
	else
		cnt_en <= cnt_en;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(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;
end

endmodule

仿真文件如下:

`timescale 1ns/1ns
module  breath_led_tb();

reg		sys_clk		;
reg		rst_n		;

wire	led_out		;

parameter  CYCLE = 20;

initial begin
	sys_clk = 1'b0;
	forever #(CYCLE/2) sys_clk = ~sys_clk;
end

initial begin
	rst_n <= 1'b0;
	#20
	rst_n <= 1'b1;
end

breath_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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
关于呼吸灯C语言编程Options 1,0,0 // Target 'Target 1' Device (AT89C51) Vendor (Atmel) Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000)) FlashUt () StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code")) FlashDR () DevID (2976) Rgf (REGX51.H) Mem () C () A () RL () OH () DBC_IFX () DBC_CMS () DBC_AMS () DBC_LMS () UseEnv=0 EnvBin () EnvInc () EnvLib () EnvReg (Atmel\) OrgReg (Atmel\) TgStat=16 OutDir (.\) OutName (a9) GenApp=1 GenLib=0 GenHex=1 Debug=1 Browse=1 LstDir (.\) HexSel=0 MG32K=0 TGMORE=0 RunUsr 0 0 RunUsr 1 0 BrunUsr 0 0 BrunUsr 1 0 SVCSID MODEL5=0 RTOS5=0 ROMSZ5=2 DHOLD5=0 XHOLD5=0 T51FL=80 XT51FL=0 CBANKS5=0 XBANKS5=0 RCB51 { 0,0,0,0,0,0,0,1,0 } RXB51 { 0,0,0,0,0,0,0,0,0 } OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IRO51 { 1,0,0,0,0,0,16,0,0 } IRA51 { 0,0,0,0,0,128,0,0,0 } XRA51 { 0,0,0,0,0,0,0,0,0 } XRA512 { 0,0,0,0,0,0,0,0,0 } IROM512 { 0,0,0,0,0,0,0,0,0 } C51FL=21630224 C51VA=0 C51MSC () C51DEF () C51UDF () INCC5 () AX51FL=4 AX51MSC () AX51SET () AX51RST () INCA5 () PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IncBld=1 AlwaysBuild=0 GenAsm=0 AsmAsm=0 PublicsOnly=0 StopCode=3 CustArgs () LibMods () BankNo=65535 LX51FL=292 LX51OVL () LX51MSC () LX51DWN () LX51LFI () LX51ASN () LX51RES () LX51CCL () LX51UCL () LX51CSC () LX51UCS () LX51COB () LX51XDB () LX51PDB () LX51BIB () LX51DAB () LX51IDB () LX51PRC () LX51STK () LX51COS () LX51XDS () LX51BIS () LX51DAS () LX51IDS () OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51) OPTDBG 48125,-1,()()()()()()()()()() ()()()() FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 } FLASH2 () FLASH3 () FLASH4 () EndOpt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值