STM32:快速制作简单呼吸灯,附代码和效果视频

目的:

实现呼吸灯。逐渐亮,逐渐灭。

一.呼吸灯原理分析

外设工作靠电流,因此要改变电流大小,所以要动电阻或电压。

电阻:阻值固定,不可更改。

电压:怎么改变电压大小呢?

方法1:在单位时间(4s),通过GPIO口,给高电平的时间逐渐变长,给低电平时间逐渐变短,来实现灯逐渐变亮。反之,灯逐渐变暗。

方法2:通过PWM实现,跟定时器有关,咱以后再说。

二:代码实现

  1. 设置亮暗的循环周期
    for(i = 0; i < 4000; i++)

    解释:在四秒的单位时间中,时间是逐渐增加的。那我可不可以把高电平的时间逐渐增加Delay(i)呢?把低电平的时间逐渐减少Delay(4000 – i)呢?

  2. 这样单位时间的平均电流就变小了!!!

    如下:

    1s:低低低高

    2s:低低高高

    3s: 低高高高

    4s: 高高高高

    逐渐亮的逻辑:

    		for(i = 0; i < 4000; i++)
    		{
    			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(i);
    			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(4000 - i);
    		}

    逐渐暗一样,只需要把高电平时间逐渐减少,低电平时间逐渐增加

    		for(i = 0; i < 4000; i++)
    		{
    			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(i);
    			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(4000 - i);
            }

  3. 最后的main函数

    int main(void)
    {
    	int i;
    	
    	Led_Configuration();
    	
    	while(1)
    	{
    		for(i = 0; i < 4000; i++)
    		{
    			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(i);
    			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(4000 - i);
    		}
    		for(i = 0; i < 4000; i++)
    		{
    			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(i);
    			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(4000 - i);
        }
    	}
    }


  4. 用到led, 所以要包含led初始化函数, 这个很简单就不说了

    void Led_Configuration(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
  5. 全部函数, 复制粘贴就能用, 看看效果

    void Delay(unsigned long nCount);
    
    
    int main(void)
    {
    	int i;
    	
    	Led_Configuration();
    	
    	while(1)
    	{
    		for(i = 0; i < 4000; i++)
    		{
    			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(i);
    			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(4000 - i);
    		}
    		for(i = 0; i < 4000; i++)
    		{
    			GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(i);
    			GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
    			Delay(4000 - i);
        }
    	}
    }
    void Led_Configuration(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;//³õʼ»¯LED(1~4)µÄGPIO
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ʹÄÜAPB2ÍâÉèʱÖÓ
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    void Delay(unsigned long nCount)
    {
    	while(nCount--  )
    	{
    	}
    }
    

  6. 三:效果展示

  7. 9.呼吸灯

物联沃分享整理
物联沃-IOTWORD物联网 » STM32:快速制作简单呼吸灯,附代码和效果视频

发表评论