初学者刚入门,希望能够分享一下经验

(1) 在单片机的控制下可以实现 8 个 LED 灯的循环依次闪烁,可以使用 8 个 LED 灯, 也可
以使用数码管中任意 8 个段(点)作为 8 个 LED 灯。
(2) 在(1)的基础上实现 8 个 LED 灯的闪烁频率变换和闪烁亮度变换操作。
( 3) 在(1)的基础上使用按键控制其中某一个LED灯的闪烁,闪烁频率变换和闪烁亮度变
换操作。
希望写出每一步的仿真代码和protues仿真图,使用的是stm32,请大家能够帮我解决这几个问题,最好能1 2 3步都能有一个仿真图

学校作业建议还是自己做吧,这种基础的都不会,将来出来能干啥

问题1、相对来讲可以参考这个实例,该实例相对来讲整个流程较为完整,执行度高,链接:https://blog.csdn.net/qq_43085848/article/details/121552519

循环点亮是用固定的电平高低控制led等,亮度控制是用一定占空比的脉冲串控制led,闪灯频率的控制取决于各个灯亮灭的时间长短,所有这些,一组定时器控制足矣

单片机原理及其应用——单片机控制8只发光二极管交替闪烁
非常详细,借鉴下
https://blog.csdn.net/qq_43085848/article/details/121552519

在单片机的控制下实现 8 个 LED 灯的循环依次闪烁,可以使用 8 个 LED 灯或者使用数码管中任意 8 个段(点)作为 8 个 LED 灯。

下面是一个示例代码,使用 8 个 LED 灯实现循环依次闪烁:

#include "stm32f10x.h"

#define LED1_PIN   GPIO_Pin_0  // LED1 灯的引脚
#define LED2_PIN   GPIO_Pin_1  // LED2 灯的引脚
#define LED3_PIN   GPIO_Pin_2  // LED3 灯的引脚
#define LED4_PIN   GPIO_Pin_3  // LED4 灯的引脚
#define LED5_PIN   GPIO_Pin_4  // LED5 灯的引脚
#define LED6_PIN   GPIO_Pin_5  // LED6 灯的引脚
#define LED7_PIN   GPIO_Pin_6  // LED7 灯的引脚
#define LED8_PIN   GPIO_Pin_7  // LED8 灯的引脚

#define LED_PORT   GPIOC       // LED 灯的端口

int main(void)
{
  // 初始化 LED 灯的端口
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitTypeDef gpio_init;
  gpio_init.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN | LED8_PIN;
  gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
  gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(LED_PORT, &gpio_init);

  // 循环依次闪烁 8 个 LED 灯
  while (1)
  {
    // LED1 灯亮
    LED_PORT->ODR |= LED1_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED1 灯灭
    LED_PORT->ODR &= ~LED1_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED2 灯亮
    LED_PORT->ODR |= LED2_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED2 灯灭
    LED_PORT->ODR &= ~LED2_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED3 灯亮
    LED_PORT->ODR |= LED3_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED3 灯灭
    LED_PORT->ODR &= ~LED3_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED4 灯亮
    LED_PORT->ODR |= LED4_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED4 灯灭
    LED_PORT->ODR &= ~LED4_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED5 灯亮
    LED_PORT->ODR |= LED5_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED5 灯灭
    LED_PORT->ODR &= ~LED5_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED6 灯亮
    LED_PORT->ODR |= LED6_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED6 灯灭
    LED_PORT->ODR &= ~LED6_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED7 灯亮
    LED_PORT->ODR |= LED7_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED7 灯灭
    LED_PORT->ODR &= ~LED7_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED8 灯亮
    LED_PORT->ODR |= LED8_PIN;
    // 等待 1 秒
    Delay(1000);
    // LED8 灯灭
    LED_PORT->ODR &= ~LED8_PIN;
    // 等待 1 秒
    Delay(1000);
  }
    
  return 0;
}

使用数码管中任意 8 个段(点)作为 8 个 LED 灯的示例代码如下:

#include "stm32f10x.h"

#define LED1_PIN GPIO_Pin_0 // LED1 灯的引脚
#define LED2_PIN GPIO_Pin_1 // LED2 灯的引脚
#define LED3_PIN GPIO_Pin_2 // LED3 灯的引脚
#define LED4_PIN GPIO_Pin_3 // LED4 灯的引脚
#define LED5_PINGPIO_Pin_4 // LED5 灯的引脚
#define LED6_PIN GPIO_Pin_5 // LED6 灯的引脚
#define LED7_PIN GPIO_Pin_6 // LED7 灯的引脚
#define LED8_PIN GPIO_Pin_7 // LED8 灯的引脚

#define LED_PORT GPIOC // LED 灯的端口
#define DIGIT_PORT GPIOB // 数码管的端口

int main(void)
{
    // 初始化 LED 灯的端口
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitTypeDef gpio_init;
    gpio_init.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN | LED8_PIN;
    gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &gpio_init);
    
    // 初始化数码管的端口
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    gpio_init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DIGIT_PORT, &gpio_init);
    
    // 循环依次闪烁 8 个 LED 灯
    while (1)
    {
        // LED1 灯亮,数码管的第一个段(点)亮
        LED_PORT->ODR |= LED1_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_0;
        // 等待 1 秒
        Delay(1000);
        // LED1 灯灭,数码管的第一个段(点)灭
        LED_PORT->ODR &= ~LED1_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_0;
        // 等待 1 秒
        Delay(1000);
        // LED2 灯亮,数码管的第二个段(点)亮
        LED_PORT->ODR |= LED2_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_1;
        // 等待 1 秒
        Delay(1000);
        // LED2 灯灭,数码管的第二个段(点)灭
        LED_PORT->ODR &= ~LED2_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_1;
        // 等待 1 秒
        Delay(1000);
        // LED3 灯亮,数码管的第三个段(点)亮
        LED_PORT->ODR |= LED3_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_2;
        // 等待 1 秒
        Delay(1000);
        // LED3 灯灭,数码管的第三个段(点)灭
        LED_PORT->ODR &= ~LED3_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_2;
        // 等待 1 秒
        Delay(1000);
        // LED4 灯亮,数码管的第四个段(点)亮
        LED_PORT->ODR |= LED4_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_3;
        // 等待 1 秒
        Delay(1000);
        // LED4 灯灭,数码管的第四个段(点)灭
        LED_PORT->ODR &= ~LED4_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_3;
        // 等待 1 秒
        Delay(1000);
        // LED5 灯亮,数码管的第五个段(点)亮
        LED_PORT->ODR |= LED5_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_4;
        // 等待 1 秒
        Delay(1000);
        // LED5 灯灭,数码管的第五个段(点)灭
        LED_PORT->ODR &= ~LED5_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_4;
        // 等待 1 秒
        Delay(1000);
        // LED6 灯亮,数码管的第六个段(点)亮
        LED_PORT->ODR |= LED6_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_5;
        // 等待 1 秒
        Delay(1000);
        // LED6 灯灭,数码管的第六个段(点)灭
        LED_PORT->ODR &= ~LED6_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_5;
        // 等待 1 秒
        Delay(1000);
        // LED7 灯亮,数码管的第七个段(点)亮
        LED_PORT->ODR |= LED7_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_6;
        // 等待 1 秒
        Delay(1000);
        // LED7 灯灭,数码管的第七个段(点)灭
        LED_PORT->ODR &= ~LED7_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_6;
        // 等待 1 秒
        Delay(1000);
        // LED8 灯亮,数码管的第八个段(点)亮
        LED_PORT->ODR |= LED8_PIN;
        DIGIT_PORT->ODR |= GPIO_Pin_7;
        // 等待 1 秒
        Delay(1000);
        // LED8 灯灭,数码管的第八个段(点)灭
        LED_PORT->ODR &= ~LED8_PIN;
        DIGIT_PORT->ODR &= ~GPIO_Pin_7;
        // 等待 1 秒
        Delay(1000);
    }
    
    return 0;
}

在单片机的控制下实现 8 个 LED 灯的闪烁频率变换和闪烁亮度变换操作,可以使用定时器和 PWM 脉宽调制技术来实现。

首先,使用定时器可以控制 LED 灯的闪烁频率。可以使用 STM32 内置的定时器,如 TIM2、TIM3 等,设置定时器的计数周期和计数器初值,然后使用定时器的比较输出功能,在定时器计数器达到指定值时触发比较输出事件,从而控制 LED 灯的闪烁频率。

例如,要实现 8 个 LED 灯的频率为 1 Hz 的循环依次闪烁,可以使用如下代码:

#include "stm32f10x.h"

#define LED1_PIN   GPIO_Pin_0  // LED1 灯的引脚
#define LED2_PIN   GPIO_Pin_1  // LED2 灯的引脚
#define LED3_PIN   GPIO_Pin_2  // LED3 灯的引脚
#define LED4_PIN   GPIO_Pin_3  // LED4 灯的引脚
#define LED5_PIN   GPIO_Pin_4  // LED5 灯的引脚
#define LED6_PIN   GPIO_Pin_5  // LED6 灯的引脚
#define LED7_PIN   GPIO_Pin_6  // LED7 灯的引脚
#define LED8_PIN   GPIO_Pin_7  // LED8 灯的引脚

#define LED_PORT   GPIOC       // LED 灯的端口

int main(void)
{
    // 初始化 LED 灯的端口
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitTypeDef gpio_init;
    gpio_init.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN | LED8_PIN;
    gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(LED_PORT, &gpio_init);

    // 初始化 TIM2 定时器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    TIM_TimeBaseInitTypeDef tim_init;
    tim_init.TIM_Period = 999; // 计数周期为 1000,即 1 秒
    tim_init.TIM_Prescaler = 7199; // 预分频系数为 7200,即 72 MHz / 7200 = 10 KHz
    tim_init.TIM_ClockDivision = TIM_CKD_DIV1;
    tim_init.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &tim_init);
    
    // 使用 TIM2 的比较输出功能控制 LED 灯的闪烁频率
    TIM_OCInitTypeDef tim_oc_init;
    tim_oc_init.TIM_OCMode = TIM_OCMode_Toggle;
    tim_oc_init.TIM_OutputState = TIM_OutputState_Enable;
    tim_oc_init.TIM_Pulse = 500; // 触发比较输出事件的计数值为 500,即 500 / 10 KHz = 50 毫秒
    TIM_OC1Init(TIM2, &tim_oc_init);
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
    
    // 开启定时器
    TIM_Cmd(TIM2, ENABLE);
    
    while (1)
    {
    // 等待定时器触发比较输出事件
    }
    
    return 0;
}

其中,TIM2 定时器的计数周期为 1000,预分频系数为 7200,触发比较输出事件的计数值为 500,因此 TIM2 定时器每隔 50 毫秒就会触发一次比较输出事件,从而控制 LED 灯的闪烁频率。

使用 PWM 脉宽调制技术可以控制 LED 灯的闪烁亮度。可以使用 STM32 内置的 PWM 输出模拟,如 TIM1、TIM2 等,设置 PWM 脉冲的计数周期和脉冲占空比,然后使用 PWM 输出功能,在 PWM 脉冲的计数值达到脉冲占空比时输出高电平,从而控制 LED 灯的闪烁亮度。