STM32:快速制作简单呼吸灯,附代码和效果视频
目的:
实现呼吸灯。逐渐亮,逐渐灭。
一.呼吸灯原理分析
外设工作靠电流,因此要改变电流大小,所以要动电阻或电压。
电阻:阻值固定,不可更改。
电压:怎么改变电压大小呢?
方法1:在单位时间(4s),通过GPIO口,给高电平的时间逐渐变长,给低电平时间逐渐变短,来实现灯逐渐变亮。反之,灯逐渐变暗。
方法2:通过PWM实现,跟定时器有关,咱以后再说。
二:代码实现
- 设置亮暗的循环周期
for(i = 0; i < 4000; i++)
解释:在四秒的单位时间中,时间是逐渐增加的。那我可不可以把高电平的时间逐渐增加Delay(i)呢?把低电平的时间逐渐减少Delay(4000 – i)呢?
-
这样单位时间的平均电流就变小了!!!
如下:
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); }
-
最后的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); } } }
-
用到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); }
-
全部函数, 复制粘贴就能用, 看看效果
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-- ) { } }
-
三:效果展示
-
9.呼吸灯