ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单片机很好玩 ,制作呼吸灯(转载)

2021-06-17 14:58:22  阅读:284  来源: 互联网

标签:小灯 LED twinkle 呼吸 单片机 darkTime 转载 好玩


上一节为了解决单片机 IO 电流驱动能力不足,导致 LED 小灯亮度不高的问题,借助了三极管。单片机的 IO 通过三极管开关 LED 小灯的电流,最后的确明显让小灯的亮度更高了。

使用电路模拟软件

还记得上一节的这张图吗?

这个是我手绘的原理图,看着很丑。我还记得一年前发现了一款比较轻量级的模拟软件,非常好用,所以今天又找出来了,推荐初学者使用。现在将上面的原理图画出:

画好原理图后,就可以模拟了。

现在将开关拨向高电平,模拟单片机 IO 输出高电平,可以看出此时 LED 小灯的阳极电压只有 54.64 mV,这显然不能驱动LED小灯,所以小灯没有亮。现在再将开关拨向地:

此时,LED 小灯的阳极电压达到 4.83V,所以小灯亮起来了。

虽然不能迷信模拟软件,但是它(DesignSoft Tina 9 - Industrial)的确是一个不错的参考,尤其对于和我一样的初学者朋友来说。

使用C语言制作呼吸灯

现在既然 LED 小灯足够亮,那么就能做些更好玩的东西了。相信不少朋友使用过带“呼吸灯”的手机,指示灯慢慢的变暗,再慢慢的变亮,看起来就跟动物呼吸一样,所以称为“呼吸灯”。

那么,它是怎么实现的呢?我们的使用的普通 LED 小灯也能实现吗?当然是可以的,纯硬件电路就不说了,这里主要介绍下如何使用 C语言编程控制单片机实现“呼吸灯”。

C语言控制小灯亮度

“呼吸灯”其实就是小灯的亮度是逐渐变化的。也就是说,只要能够使用单片机控制我们的 LED 小灯的亮度,“呼吸灯”效果也就实现了。

上一节使用 C语言控制单片机 IO 交替输出高低电平,实现了 LED 小灯的闪烁效果,核心代码如下:

 while(1){
        P20 = 0;
        delay(10);
        P20 = 1;
        delay(10);
    }

IO 输出的高低电平持续时间都是 10 个单位,一个完整的周期内,LED 小灯的亮灭时间都是相等的。那么,现在有下面这两种情况:

  • 一个周期内,LED 小灯亮的时间比灭的时间持续时间长。
  • 一个周期内,LED 小灯亮的时间比灭的时间持续时间短。

想象一下,哪种情况下的小灯更亮呢?答案是显而易见的,所以使用 C语言编程单片机控制小灯亮度的思路就有了,就是控制一个周期内,LED 小灯的亮灭持续时间长短而已。如此一来,假设一个亮灭周期为 100 个时间单位,就可以写出下面这个函数:

void twinkle_once(unsigned char darkTime)
{
    P20 = 0;
    delay(100-darkTime);
    P20 = 1;
    delay(darkTime);
}

现在在 main 函数里测试一下该函数,分两次,一次传入的参数为 10,一次为 90:

int main()
{
    while(1){
        twinkle_once(10);   // 分别测试
        //twinkle_once(90);     // 分别测试
    }
    return 0;
}

可以看出,twinkle_once() 函数的确会因为参数不同,驱动小灯的亮度也不同。

实现“呼吸灯”

既然已经能够使用 C语言编程单片机控制 LED 小灯的亮度,实现“呼吸灯”就不难了。只要传递给 twinkle_once() 函数的参数由小变大,再有大变小就可以了。所以可以写出如下控制代码,请看:

int main()
{
    char darkTime = 0, dir = 1;
    unsigned int cnt = 0;
    while(1){

        cnt ++;
        twinkle_once(darkTime);
        if(cnt == 4){
            cnt = 0;
            if(dir)
                darkTime += 1;
            else
                darkTime -= 1;

            if(darkTime >= 100)
                dir = 0;
            if(darkTime <= 60)
                dir = 1;
        }
    }
}

最终完整代码如下:

变量 cnt 可以控制“呼吸灯”的呼吸节奏,cnt 越小,呼吸速度越快,反之呼吸速度越快。变量 dir 决定小灯是逐渐变暗还是逐渐变亮。编译,烧写程序到单片机,还是按照上一节一样连线,最终可以得到如下效果:
[video width="544" height="960" mp4="https://blog.popkx.com/usr/uploads/2019/01/1-1.mp4"][/video]

能够看出, twinkle_once() 函数控制 LED 小灯的亮度并不是线性的,所以呼吸灯的“呼吸”效果并不是特别好。因此,更理想的做法不应该只是简单加减 1 修改 darkTime ,而是按照 LED 小灯的响应曲线修改之。限于篇幅,这里就不写了。

原文连接

https://blog.popkx.com/mcu-is-fun-3-making-a-breathing-lamp/

 

 

标签:小灯,LED,twinkle,呼吸,单片机,darkTime,转载,好玩
来源: https://blog.csdn.net/weixin_45147985/article/details/117993597

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有