当前位置:   article > 正文

【STM32学习笔记-LED呼吸灯】_stm32呼吸灯代码

stm32呼吸灯代码

STM32学习笔记-点亮LED灯


一、呼吸灯原理

占空比:占空比指的是高低电平所占的时间的比率(即LED灯点亮和熄灭的时间比例)
以下利用点亮LED灯的原理进行说明

GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
delay_us(500); 
GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0)
delay_us(500); 
  • 1
  • 2
  • 3
  • 4

以上代码的高低电平输出时间都为500,占空比为1,输出结果为小灯常亮(见下图)
在这里插入图片描述
当我们将高电平输出时间降低为5时,代码如下:

GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)
delay_us(5); 
GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0)
delay_us(500);
  • 1
  • 2
  • 3
  • 4

此时的占空比为1/100,小灯常亮,但是输出的亮度明显降低(见下图)
在这里插入图片描述
利用该原理,我们就可以制作处一个呼吸灯了

二、呼吸灯代码

1、main.c

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "led.h"


int main (void){//主程序
	//定义需要的变量
	u8 MENU;
	u16 t,i;
	//初始化程序
	RCC_Configuration(); //时钟设置
	LED_Init();
	//设置变量的初始值
	MENU = 0;
	t = 1;
	//主循环
	while(1){
		//菜单0
		if(MENU == 0){ //变亮循环
			for(i = 0; i < 40; i++){
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
				delay_us(t); //延时
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
				delay_us(501-t); //延时
			}
			t++;
			if(t==500){
				MENU = 1;
			}
		}
		//菜单1
		if(MENU == 1){ //变暗循环
			for(i = 0; i < 40; i++){
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
				delay_us(t); //延时
				GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
				delay_us(501-t); //延时
			}
			t--;
			if(t==1){
				MENU = 0;
			}
		}		
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

2、led.c

#include "led.h"

void LED_Init(void){ //LED灯的接口初始化
	GPIO_InitTypeDef  GPIO_InitStructure; 	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);       
    GPIO_InitStructure.GPIO_Pin = LED1 | LED2; //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
	GPIO_Init(LEDPORT, &GPIO_InitStructure);			
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3、led.h

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"
//#define LED1 PBout(0)// PB0
//#define LED2 PBout(1)// PB1	
#define LEDPORT	GPIOB	//定义IO接口
#define LED1	GPIO_Pin_0	//定义IO接口
#define LED2	GPIO_Pin_1	//定义IO接口
void LED_Init(void);//初始化	 				    
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三、代码分析

	u8 MENU;
	u16 t,i;
  • 1
  • 2

定义一个名为MUNE的8位无符号变量和分别名为t,i的16位无符号变量。变量含义详情如下:

数据类型变量定义
u32 a定义32位无符号变量a
u16 a定义16位无符号变量a
u8 a定义8位无符号变量a
vu32 a/定义易变的32位无符号变量a
vu16 a定义易变的 16位无符号变量a
vu8 a定义易变的 8位无符号变量a
uc32 a定义只读的32位无符号变量a
uc16 a定义只读 的16位无符号变量a
uc8 a定义只读 的8位无符号变量a
if(MENU == 0){ //变亮循环
	for(i = 0; i < 40; i++){
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1
		delay_us(t); //延时
		GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0
		delay_us(501-t); //延时
	}
	t++;
	if(t==500){
		MENU = 1;
			}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

利用占空比让小灯变量(变暗则将变量t–)通过改变i小于的值控制呼吸灯的速度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/302255
推荐阅读
相关标签
  

闽ICP备14008679号