一.概要
我们原先的第一个GPIO实验,了解了LED驱动原理,并且成功点亮了一颗LED和实现了LED的闪烁,那么这篇紧接着就来解锁LED的新功能,LED流水灯。
本文介绍了LED流水灯的原理,以及用STM32单片机实现流水灯闪烁。
二.LED流水灯原理图
如图所示, LED 采用共阴极接法(共地),5个LED灯的阳极分别接到单片机小系统板的B13,B15,A9,A11,A15这5个引脚,只要灯相对应的单片机引脚输出高电平,LED灯就亮。
三.流水灯显示原理
流水灯的工作原理是通过控制LED灯的亮灭顺序和时间间隔来实现灯光流动的效果。
流水灯通常由一组LED灯组成,这些LED灯按照一定的顺序排列在一条电路板或灯串上,每个灯都带有一个控制电路,用来控制灯的亮灭。
控制LED灯的主要HAL库函数:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED亮
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED灭
HAL_Delay(200);//等待200ms
四.STM32单片机流水灯实验
LED1正极接板子B13,负极接G
LED2正极接板子B15,负极接G
LED3正极接板子A9,负极接G
LED4正极接板子A11,负极接G
LED5正极接板子A15,负极接G
可以用一根杜邦线连接板子的G与面包板的-,所有LED灯的负极插到面包板-就可以
打开STM32CubeMX软件,新建工程
Part Number处输入STM32F103C8,再双击就创建新的工程
配置下载口引脚
配置外部晶振引脚
GPIO配置
配置系统主频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
主要程序:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for(int i=0;i<1;i++)//逐次点亮
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);//LED5
HAL_Delay(200);
}
for(int i=0;i<1;i++)//反过来逐次点亮
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);//LED5
HAL_Delay(200);//等待200ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);//等待200ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);//等待200ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);//等待200ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(200);//等待200ms
}
for(int i=0;i<1;i++)//逐次点亮
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);
}
for(int i=0;i<1;i++)//中间向两边逐次点亮
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);//LED5
HAL_Delay(300);//等待300ms
}
for(int i=0;i<2;i++)//两边向中间靠拢逐次点亮
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);//LED5
HAL_Delay(300);//等待300ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
}
for(int i=0;i<1;i++)//由中间向第一个灯逐次点亮
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);//LED1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);//LED2
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);//LED3
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);//LED4
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);//LED5
HAL_Delay(300);//等待300ms
}
}
/* USER CODE END 3 */
}
实验效果
LED流水灯
五.CubeMX工程源代码下载
通过百度网盘分享的文件:33.LED流水灯实验.rar
链接:https://pan.baidu.com/s/1_98ZTngK8jAKf5QQh43RoQ
提取码:b4lv
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行
CSDN代码下载
六.小结
通过本次实验基本了解了LED流水灯的工作流程,通过编写C语言程序实现了LED流水灯的设计,复习并更加掌握C语言,尤其是C语言中循环的用法并且学会了用循环还有延时功能。