程序解释的挺清楚的了。
先要想明白呼吸灯原理是什么,怎么实现,再看程序。
呼吸灯开的时候,以非常快的速度开-关-开-关,并逐渐加大开的时间比率,减小关的时间比率。
呼吸灯关的时候,以非常快的速度开-关-开-关,并逐渐加大关的时间比率,减小开的时间比率。
先说呼吸灯,这个本质上是LED的亮度控制。
一般是用PWM方式控制LED亮度,PWM的输出按照一定的规律变化,就可以做出呼吸灯的效果。
再说30个LED的控制,如果要简单点做,30个LED可以串起来串一个电阻,接高点的电源电压,30个LED用同一个信号控制,当然,亮度也是同步变化的。如果要复杂,那就出30个信号分别控制30个LED串30个电阻,具体看你的追求的效果吧。
呼吸灯的程序,如果有硬件的PWM模块,是很简单的,按一定的规律让PWM的输出变化就可以。
像这样输出10%亮度,持续200ms,输出20%亮度,持续200ms,输出30%亮度,持续200ms。。。
如果没有硬件PWM模块,可以用软件来模拟,比如,输出10%亮度,持续200ms这两件事合在一起作,变成输出高电平10us,输出低电平90us,循环2000次。
给你个思路吧,用调制的方法,灯在高速闪烁人眼是看不出来的,你每个循环给闪烁的熄灭时间加1,灯就会慢慢变暗,在设置熄灭时间加到一定程度就开始减一,就会渐渐变亮了,如此循环就可以了
100hz,则周期是10ms,那呼吸灯每5ms就要把电平变换一次。
执行一条指令需要的时间是:(12/11.0592)us,那就可以算出来,大概执行4608条指令后。那就每执行4608条指令后就把呼吸灯的输出取反,得出来的就是100hz了。
用定时器也是一样,把它定在5ms中断一次即可。
#includereg52.h //包含头文件,一般情况不需要改动,//头文件包含特殊
/*-------------------------IO口定义----------------------------*/
sbit d0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号
void Delay(unsigned int t); //函数声明
/*------------------------------------------------主函数------------------------------------------------*/
void main (void)
{
unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
char y = 1;
while (y--) //主循环
{
d0=1;
Delay(20); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOWCYCLE;PWM_LOW++)
{//PWM_LOW表示低
//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
d0=0; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
d0=0;//熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
d0=0;
for(PWM_LOW=CYCLE-1;PWM_LOW0;PWM_LOW--)
{//与逐渐变亮相反的过程
d0=0;
Delay(PWM_LOW);
d0=1;
Delay(CYCLE-PWM_LOW);
}//主循环中添加其他需要一直工作的程序
}
}
/*----------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535---------------*/
void Delay(unsigned int t)
{
while(--t);
}
#includereg51.h
sbit LED0=P0^0;
sbit wei=P1^1;
sbit duan=P1^0;
sbit lcden=P1^7;
sbit dianzhen=P1^3;
sbit leden=P1^2;
void Delay(unsigned int t);
void main (void)
{
unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
lcden=0;
P0=0x00;
dianzhen=0;
P0=0xff;
wei=0;
duan=0;
while (1) //主循环
{
LED0=1;
Delay(150000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOWCYCLE;PWM_LOW++)
{
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}
for(PWM_LOW=CYCLE-1;PWM_LOW0;PWM_LOW--)
{
LED0=0;
Delay(PWM_LOW);
LED0=1;
Delay(CYCLE-PWM_LOW);
}
}
}
void Delay(unsigned int t)
{
while(t--);
}
51单片机呼吸灯时间比例的介绍就聊到这里吧,感谢您花时间阅读,谢谢。
本文标签:51单片机呼吸灯时间比例