历史上的今天
今天是:2024年09月27日(星期五)
2021年09月27日 | STM32F103 呼吸灯的实现
2021-09-27 来源:eefocus
呼吸灯,也就是让灯的亮度随着时间的变化而变化,而要实现这个变化,我们需要通过占空比来完成,也就是是通过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函数的实现,这里面有详细的解释。
史海拾趣
|
人们外出旅行时,为手机、MP3等随身设备寻找电源充电是件麻烦事。英国广播公司25日报道,英国科研人员正在设计一种利用太阳能充电的外衣,它可以解决这个问题。 据报道,日本富士通公司和德国西门子公司的合资企业在英国剑桥设有 ...… 查看全部问答> |
|
马上要搞工业控制了,关于工业控制编程怎么入手呢。以前从来没搞过啊,谢谢各位前辈了。(我都不知道把这个问题放在什么论坛区里) 我失业很久了,以前都在小公司搞Java开发,最近爸让我去他那一个朋友那干活,搞什么PID控制,以前没搞过怎么入手呢?… 查看全部问答> |
|
我的LPC2478板子内部512K FLASH用来跑程序,外扩NOR FLASH存放数据,现在开机LOGO太大512放不下,把程序直接放外部FLASH跑,又舍不得这512K,就想把存放LOGO数据的数组文件放外面,程序还在内部跑,不知道怎么搞,貌似应该在分散加载文件里改吧?咋 ...… 查看全部问答> |
|
代码如下 if (m_hComm != INVALID_HANDLE_VALUE) //已经打开,直接返回 { return TRUE; } ...… 查看全部问答> |
|
@echo off md E:\\网络游戏\\魔兽世界 xcopy /e \"U:\\魔兽世界\" \"E:\\网络游戏\\魔兽世界\" start U:\\魔兽世界\\BigFoot.exe echo 复制成功 pause&exit 这个批处理每次都要询问执行 请问怎么样不要执行!谢谢… 查看全部问答> |
|
知道三极管吗、继电器、接触器是干什么用的吗? 如果几极管的输出功率能足够的大,那就完全可以不用在几极管的后面,再加一个继电器,也不用在继电器的后面再加一个接触器,直接利用三极管输出控制负载就行了。 可三极管的输出有那么大吗? 先导 ...… 查看全部问答> |
|
基于LabVIEW图形界面的TI LM3S8962的开发--第二步 第二步:软/硬件开发环境的建立。 此步骤是比较简单的,主要包括LabVIEW软件、DAQ模块、ARM模块以及MDK3.70的安装。所有的安装文件以及所需下载ARM模块、DAQ模块用的可执行文件和破解文件我已经在第零步的帖 ...… 查看全部问答> |




