STM32入坑教程(三)led流水灯

硬件资源

LED灯
STM32开发板
线缆
LED驱动电路

LED灯的驱动

图中T1是NPN型三极管,R2是LED限流电阻,R1是基极电阻,J1是控制信号,原理如下:
STM32入坑教程(三)led流水灯_第1张图片

J1高电平,三极管导通,LED亮;
J1低电平,三极管截止,LED灭;

图中T2是PNP型三极管,R3是LED限流电阻,R4是基极电阻,J2是控制信号,原理如下:
STM32入坑教程(三)led流水灯_第2张图片

J2高电平,三极管截止,LED灭;
J2低电平,三极管导通,LED亮;

可以按照以上介绍,配置LED等的硬件驱动电路。虽然不用驱动有时也可以,但是如果灯的数量过多,负载过大,就有可能烧坏单片机的GPIO口,得不偿失。况且对于学习单片机来说,搭硬件电路是必备技能。

流水灯原理

顾名思义,就是让灯轮流的点亮熄灭,有一种流水的效果。所以其原理就是对灯的亮灭控制,但是需要有顺序了。程序中是实现8个小灯轮流点亮写灭:LED1亮灭->LED2亮灭->LED3亮灭…
对应于单片机,就是控制引脚,使其输出高低电平。
程序中使用的引脚:PB8-11

配置方法及程序

  1. 配置GPIO引脚
void LED_Init(void)
{
		GPIO_InitTypeDef  GPIO_InitStructure;
 	
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	 //使能PB端口时钟

		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
		GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化
		
		GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);// 输出高
}
  1. 编写流水灯函数,注意需要有延时
void LED_Light(void)
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_8);
	delay_ms(1000);
	GPIO_SetBits(GPIOB,GPIO_Pin_8);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_9);
	delay_ms(1000);
	GPIO_SetBits(GPIOB,GPIO_Pin_9);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_10);
	delay_ms(1000);
	GPIO_SetBits(GPIOB,GPIO_Pin_10);
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_11);
	delay_ms(1000);
	GPIO_SetBits(GPIOB,GPIO_Pin_11);
}
  1. led.h文件中声明上述函数
  2. main文件中包含需调用的头文件
  3. 主函数中初始化led和delay
  4. 在while中调用编写的流水灯函数
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

 int main(void)
 {	
	LED_Init();
	delay_init();
	while(1)
	{
		LED_Light();
	}
 }

**

特别注意:

流水灯函数中的延时用在不同的板子上时间可能会不同,具体根据实际情况来。实际延时时间劲量大于200ms,如果延时时间太少就有可能看不到灯亮或者灯比较暗。

**
程序已经调试验证,流水灯可正常运行
最后,怎么可能没有资源呢?附上传送门:
https://download.csdn.net/download/m0_46195580/12503307
什么,1个积分也没有,这里还有个传送门:
链接:https://pan.baidu.com/s/1iJGNiRO8U_gxG2zN8VItKQ
提取码:vhah

你可能感兴趣的:(单片机,单片机,stm32,嵌入式,物联网)