STM32F103 呼吸灯的实现

呼吸灯,也就是让灯的亮度随着时间的变化而变化,而要实现这个变化,我们需要通过占空比来完成,也就是是通过PWM来实现这个操作,只要我们发送的频率足够的快,因为人眼的视觉暂留的原因,人是不能看到灯灭掉的,所以只要脉冲的宽度越宽,可以看到的灯也就越亮。
下面就是通过STM32103这块板子的代码实现。

先写关于点灯的c文件

#include "led.h"
#include "stm32f10x.h"
#include "delay.h"
//初始化GPIO端口
void Led_Init(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIOB的系统时钟
	GPIO_InitStructure.GPIO_Pin = LED1 | LED2;                       
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    
	GPIO_Init( GPIOB,GPIO_InitStructure)}
//实现呼吸灯
void Led_Breathe(void){
	u16 t,i;
	u8 flag = 0;
	t = 1;
	if(flag == 0){ //变量的循环
		for(i = 0 ; i <= 10 ; i++){
			GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));
			delay_us(t);
			GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0));
			delay_us(501-t);
		}
		t++;
		if(t == 500) flag = 1;
	}
	if(flag == 1){ //变暗操作
		for(i = 0 ; i <= 10 ; i++){
			GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));
			delay_us(t);
			GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0));
			delay_us(501-t);
		}
		t --
		if(t == 1) flag = 0;
	}
}

上面我们已经完成了.c 文件,接下来就是完成.h文件.
.h文件一般都是.c里面的宏定义和.c文件里面函数的声明

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"

#define LED1	GPIO_Pin_0	
#define LED2	GPIO_Pin_1	

void Led_Init(void)void Led_Breathe(void);

这样我们就已经完成了90%了,我们接下来只要把.c和.h文件按照之前的方法添加都project里面,然后再在main函数里面实现一下就可以了

下面就是main函数的实现代码

#include "led.h"
#include "stm32f10x.h"

void main(){
	while(1){ // 让呼吸灯一直进行
		Led_Init();
		Led_Breathe();
	}
}

这样就完成了一个呼吸灯的操作,里面使用的函数,比如GPIO口的初始化,为什么是那样写的,我们可以去参考ST公司对于板子的芯片手册,里面有详细的解释,至于led灯的原理图,需要的也可以在问我来要。
里面的delay函数,这块是自己实现的,和这个实现的流程一样,我们要写.h,.c以及main函数,具体的实现,可以看我的STM32F103-delay函数的实现,这里面有详细的解释。

你可能感兴趣的:(STM32F103)