当前位置: 首页 > news >正文

基于STM32的LED实战 -- 流水灯、呼吸灯、流水呼吸灯

🌈个人主页:羽晨同学

💫个人格言:“成为自己未来的主人~” 

驱动LED

// LED1: PE9
// LED2: PB1
// LED3: PB0

这个是我们板子上的三个LED灯分别对应的引脚名称。

首先,我们需要对这三个引脚进行初始化

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = LED1_PIN;GPIO_Init(LED1_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = LED2_PIN;GPIO_Init(LED2_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = LED3_PIN;GPIO_Init(LED3_PORT, &GPIO_InitStructure);

以上的这些为引脚初始化的代码。

接下来,我们对引脚赋高低电平,就可以使得对应LED灯进行亮灭闪烁。

    while (1){GPIO_SetBits(LED1_PORT, LED1_PIN);cpu_delay();GPIO_ResetBits(LED1_PORT, LED1_PIN);cpu_delay();}

如果这个时候要是没有 cpu_delay();的话,我们会看到LED灯是保持常亮的,这个是因为stm32f407本身的主频就比较大(有168MHz),CPU执行的速度很快,所以我们需要加上一个对应的延时函数。

void cpu_delay(void)
{uint32_t delay = 168 * 1000 * 10;for (uint32_t t = 0; t < delay; t++) { ; }
}

这样,我们就实现了对应的LED灯的闪烁。

三个LED灯同时闪烁的原理也是如此

    while (1){GPIO_SetBits(LED1_PORT, LED1_PIN);GPIO_SetBits(LED2_PORT, LED2_PIN);GPIO_SetBits(LED3_PORT, LED3_PIN);cpu_delay();GPIO_ResetBits(LED1_PORT, LED1_PIN);GPIO_ResetBits(LED2_PORT, LED2_PIN);GPIO_ResetBits(LED3_PORT, LED3_PIN);cpu_delay();}

流水灯

为了方便查看,我们修改一下我们的呈现方式

static void led_set(uint8_t led, uint8_t state)
{if (led == 1){GPIO_WriteBit(GPIOE, GPIO_Pin_9, state ? Bit_RESET : Bit_SET);}else if (led == 2){GPIO_WriteBit(GPIOB, GPIO_Pin_1, state ? Bit_RESET : Bit_SET);}else if (led == 3){GPIO_WriteBit(GPIOB, GPIO_Pin_0, state ? Bit_RESET : Bit_SET);}
}

有了这个函数之后,我们就可以通过以下方式来实现流水灯的效果。

首先,我们先让三个灯全部熄灭

    led_set(1, 0);led_set(2, 0);led_set(3, 0);

然后,我们实现流水灯的效果

    uint32_t ledidx = 1;while (1){led_set(ledidx, 1);cpu_delay();led_set(ledidx, 0);if (++ledidx > 3){ledidx = 1;}}

这样子,我们就可以实现流水灯的效果了。

呼吸灯

呼吸灯就是LED的渐灭和渐亮的过程,我们要利用的便是周期和占空比。

这个灯的亮度是由亮的时间和灭的时间来进行确定的,如果亮的时间长一些,灭的时间短一些,总体看上来就会更亮一些。

所以,我们可以采用除了PWM的方法的另外一个方式来实现这个效果:

    while (1){int period = 2000;for(int d = 0;d<period;d++){led_set(1,1);for(int i = 0;i<d;i++);led_set(1,0);for(int i = d;i<period;i++);}}

浪潮灯

要实现浪潮灯,我们先来使得三个LED灯的亮度不一样,那应该怎么做呢?

当LED1低于20的时候,让LED1亮,当LED2低于40,LED3低于60的时候,让这三个亮,我们就能大概实现出来三个LED亮度不一样的效果

代码如下:

            led_set(1, i < led1_duty ? 1 : 0);led_set(2, i < led2_duty ? 1 : 0);led_set(3, i < led3_duty ? 1 : 0);

所以,最终代码如下:

    //软件模拟PWM//设置频率int period = 250;//设置led的占空比int led1_duty = 0, led2_duty = period * 25 / 100, led3_duty = period * 50 / 100;int led1_inc = 1, led2_inc = 1, led3_inc = 1;while (1){//输出比较,向上计数,i < 占空比时置低电平,灯亮for (int i = 0; i < period; i++){led_set(1, i < led1_duty ? 1 : 0);led_set(2, i < led2_duty ? 1 : 0);led_set(3, i < led3_duty ? 1 : 0);}//占空比在0-100%period中自增或自减led1_duty += led1_inc;led2_duty += led2_inc;led3_duty += led3_inc;if (led1_duty >= period || led1_duty < 0) led1_inc = -led1_inc;if (led2_duty >= period || led2_duty < 0) led2_inc = -led2_inc;if (led3_duty >= period || led3_duty < 0) led3_inc = -led3_inc;}


文章转载自:

http://4U6WYMp9.hhmfp.cn
http://OS8zAB75.hhmfp.cn
http://9czPdcbN.hhmfp.cn
http://WQSjkn83.hhmfp.cn
http://2Gfz6Iav.hhmfp.cn
http://jcVSqkLW.hhmfp.cn
http://J4PMRDiN.hhmfp.cn
http://XGWwlHnR.hhmfp.cn
http://vdR3ja6f.hhmfp.cn
http://0VFBINkB.hhmfp.cn
http://4WDePM76.hhmfp.cn
http://vYK42lMi.hhmfp.cn
http://JkOgS3ro.hhmfp.cn
http://itXUXC9T.hhmfp.cn
http://DhUDQ3O2.hhmfp.cn
http://31DZbd7G.hhmfp.cn
http://VgPxvTep.hhmfp.cn
http://QzGrRX3j.hhmfp.cn
http://bfYNpaBj.hhmfp.cn
http://WHgbmXu8.hhmfp.cn
http://3pZA0Vj0.hhmfp.cn
http://mF9Z4JWD.hhmfp.cn
http://P0CLqkfA.hhmfp.cn
http://5v5vItJu.hhmfp.cn
http://xFol4iwB.hhmfp.cn
http://56Dbi7Gg.hhmfp.cn
http://DRS8L3uX.hhmfp.cn
http://VUfyfLwz.hhmfp.cn
http://s4KO7BtC.hhmfp.cn
http://Fz8Akcb1.hhmfp.cn
http://www.dtcms.com/a/387102.html

相关文章:

  • 【数据结构】——队列,栈(基于链表或数组实现)
  • 任天堂官网更新!“任亏券”不支持兑换NS2专用游戏
  • 大模型数据整理器打包及填充、Flash Attention 2解析(97)
  • 48v转12v芯片48v转5v电源芯片AH7691D
  • Oracle Database 23ai 内置 SQL 防火墙启用
  • MySQL 31 误删数据怎么办?
  • 微前端面试题及详细答案 88道(09-18)-- 核心原理与实现方式
  • VBA技术资料MF362:将窗体控件添加到字典
  • 【Leetcode】高频SQL基础题--1321.餐馆营业额变化增长
  • Redis 中 Intset 的内存结构与存储机制详解
  • uniapp打包前端项目
  • cka解题思路1.32-3
  • 如何解决模型的过拟合问题?
  • 2025牛客周赛108场e题
  • 【课堂笔记】复变函数-2
  • 25、优化算法与正则化技术:深度学习的调优艺术
  • qt QCategoryAxis详解
  • 云游戏时代,游戏盾如何保障新型业务的流畅体验
  • 【Block总结】LRSA,用于语义分割的低分辨率自注意力|TPAMI 2025
  • PY32MD310单片机介绍 电机控制专用,内置三相半桥栅极驱动器
  • Ubuntu服务器挖矿病毒清理
  • 【数据结构】——二叉树
  • 《怪物猎人 荒野》总整理:预载和开放时间、登场怪物
  • web服务解析案例
  • 莫烦Python基础笔记(部分)
  • ACP(四):RAG工作流程及如何创建一个RAG应用
  • qgis导入cad怎么做?
  • 在线图书借阅平台的设计与实现 —— 基于飞算JavaAI的实战开发全流程与优化实践(架构设计与核心模块开发)
  • Spring Cloud - 面试知识点(服务雪崩)
  • 【JQ】使用JS在前端达到存储cookie的效果