用定时器做个呼吸灯,实现亮度由亮到暗逐渐变化过程
在单片机中定时器的工作还是挺大的,可以利用定时器功能精准对外设延时,可以利用这一点做个万年历,精确度还是比较乐观的,我之前也做过,如果大家喜欢的话,我非常愿意分享制作方法,今天分享一个特别有意思的制作——呼吸灯。
呼吸灯制作图
呼吸灯制作起来挺有意思的,原理很简单,只要在短时间内,比如在0.05s内,让LED灯亮0.01s,灭0.04s,由于时间较短LED灯还没来得及灭掉,又再次亮起,效果就是比正常亮时要暗,如果亮的时间占不亮的时间越长,根据能量守恒可知LED会越亮,我们在短时间内不断调整这个占空比,让LED灯由不亮逐渐变为全亮,再由全亮变为部分亮,这就形成了呼吸灯。
呼吸灯效果
由于呼吸灯需要在短时内进行亮灭,时间一般都是毫秒级的,所以对我们人来说是不可能达到这种速度的,所以我们只能用单片机来实现,我们所用的就是单片机定时器功能,由于定时器计时较准,再加上定时器运行不占用CPU,大大提高了运行效率,在控制方面我们选用算法为PWM算法,其原理就是我所说的上一段,PWM结合定时器,可以把呼吸灯功能完美实现。
在硬件方面我们选用51单片机再加上LED,LED接在P1口,主要在程序上,我们通过写程序,打开单片机定时器功能,利用定时器产生一个PWM,从P1口输出,这就完成了呼吸灯的制作。
所选单片机及成果图片
这次我们使用的单片机功能来实现的这个功能,其实我们也可以不用单片机来做,可以选用自带定时功能的NE555定时器来制作,这对没学过单片机的来说是个福音,其实原理是一样的。
在电子领域会有很多有趣的小制作,结合单片机就会更多了,但是单片机必须得有编程基础,由于程序较长,我们也不可能每次把程序展示给大家,只能给予一个原理说明,以及一个方向指导,对感兴趣的同学引导一个道路,我也希望你们会越走越远。
零基础单片机学习笔记:LED呼吸灯程序详解
今天学习到了通过延时函数和for循环来做一个简单的PWM输出,来控制LED进行渐变。下面是我自已对这处程序的理解
#include <REGX52.H> // 调用REGX52.H这个文件,简单理解就是把这个文件内的东西放到自已的程序里。
void Delay(unsigned int t); // 定义一个延时函数Delay, unsigned int t是定义一个0-65535的变量
{
while(--t);// 通过循环while 从65535自减到0就会跳出程序,通过自减来实现延时。
}
void main()//主程序入口。 不管多复杂的程序 主程序只有一个
{
unsigned int T=500,Toff=0;//两个0-65535的变量,赋初值 T=500 Toff=0;
while (1)//进入循环,下面的程序会一直循环执行。
{
for(Toff=1;Toff<T;Toff++)//for循环,先初始化Toff=1,然判断Toff<T是否成立,如果成立则执行下面大括内的程序,再进行Toff++,因为T=500, Toff=1 , 当Toff自加499次时Toff=T。Toff<T的条件不成立,跳出程序。
{
P0=0X01;//转换为二进制就是0000 0001 意思是P0口的最位输出高电平,点亮LED.
Delay(Toff); // 这里的延时从1自加到499 每运行一次程序延时加长一点
P0=0X00;//转换为二进制就是0000 0000 意思是P0口全输出低电平,LED灭
Delay(T-Toff); //这里的延时从499减到1每运行一次程序延时缩短一点
for(Toff=T-1;Toff>0;Toff--)//for循环,先初始化Toff=T-1,然判断Toff>0是否成立,如果成立则执行下面大括内的程序,再进行Toff--,因为T=500, Toff=T-1(499) , 当Toff自减499次时Toff=0。Toff>0的条件不成立,跳出程序。
{
P0=0X01;//转换为二进制就是0000 0001 意思是P0口的最位输出高电平,点亮LED.
Delay(Toff); // 这里的延时从499减到1每运行一次程序延时缩短一点
P0=0X00;//转换为二进制就是0000 0000 意思是P0口全输出低电平,LED灭
Delay(T-Toff); 这里的延时从1自加到499 每运行一次程序延时加长一点
}
}
}
上电之后,Led的亮度从最暗逐渐变到最亮,然后从最亮又慢慢的变到最暗的状态,从而实现了一个呼吸灯的效果。
这是我学习了一段时间总结下来的经验。当然有很多地方我自己理解的,也不是很到位,希望大家可以指出来
以上内容纯手打,请不要搬运哦。如果你觉得不错请关注!
相关问答
利用 单片机 做一个让灯随着音乐节奏闪烁的系统?单纯地做一个呼吸灯并不厉害,买个开发版,接上几个灯泡,最后程序写进去,这用不了多长时间。难的是把呼吸灯做成一款产品。我大学期间和搭档也做过呼吸灯,大概...
怎样用STM32点亮LED灯?怎样用STM32让LED闪烁?对于单片机编程而言,点亮LED是单片机编程的入门操作。对于STM32,本人习惯使用寄存器操作,所以本文将以KEIL4.12作为开发环境,以寄存器操作试验为编程思路讲...
自己做了一个 单片机 控制的32个LED,因为面包板小,把所有的IO口都用上了, 程序 怎么写,要很多效果?既然你的P0到P3都用上了,那就用一个unsignedlong型变量最合适不过了,定义一个变量port,主函数中一直将port变量的值赋给各个端口即可。这样在定时器中就可以...