(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 灯的闪烁亮度。