IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32点亮LED灯程序 -> 正文阅读

[嵌入式]基于STM32点亮LED灯程序

今天学习了STM32固件库点灯程序 点灯也可以玩过很多好玩的东西,在这里做一下总结。

1:新建固件库工程文件

1.1找到一个固件库模板

在这里插入图片描述

1.2:打开KEIL5新建工程

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
最终效果:
在这里插入图片描述

1.3:添加相关文件

然后我们针对不同文件夹 我们添加不同的文件进来。
双击STARTUP 添加我们固件库的启动文件

STARTUP:添加Libraries——>CMSIS——>startup中的启动文件
在这里插入图片描述

USER:添加固件库的User文件夹中的.c文件

CMSIS 添加Libraries——>CMSIS文件夹中的.c文件
DOC:添加固件库中Doc文件夹的readme.txt
FWLIB:添加Libraries——>STM32F10x_StdPeriph_Driver文件夹中的.c文件

添加完效果
在这里插入图片描述

1.4:手动添加其他文件路径进来

打开stm32f0x.h文件
在这里插入图片描述

按 Ctrl + F 查找 stm32f10x_conf

会调到一下的代码 我们得宏定义加载一下
在这里插入图片描述
在这里插入图片描述
添加其他文件夹.h路径
在这里插入图片描述
这样就是新建固件库工程文件完成了。。。。。
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯
下面就开始点灯 点灯 点灯

2:STM32固件库点灯

首先你得有个固件库手册来参考 我这里直接上代码。
在这里插入图片描述
我这个用的STM32C8T6板子 PC13是LED灯 根据原理图 给个低电平则点亮

LED配置代码
led.c

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

void LED_Init(void)
{	
	//1.打开控制GPIOC的时钟(APB2)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	//2.配置结构体	
	GPIO_InitTypeDef led_init;
	led_init.GPIO_Pin   = GPIO_Pin_13;      //GPIOC13引脚
	led_init.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出	
	led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
	
	//3.对成员进行初始化
	GPIO_Init(GPIOC, &led_init);
}

led.h

#ifndef _LED_H_
#define _LED_H_

#include "stm32f10x.h"

void LED_Init(void); //LED初始化函数声明

#endif

2.1: 方式1点灯

main.c

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

int  main()
{
	LED_Init(); //LED初始化
	
	while(1)
	{
		//方式1
		//GPIO_SetBits(GPIOC,GPIO_Pin_13);		//P13引脚输出高电平
		GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//P13引脚输出低电平	
	}   
}

2.2 :方式2点灯

main.c

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

int  main()
{
	LED_Init(); //LED初始化
	
	while(1)
	{
		//方式2
		//GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_SET);   //P13引脚输出高电平
		GPIO_WriteBit(GPIOC,GPIO_Pin_13, Bit_RESET); //P13引脚输出低电平
	}   
}

2.3 :方式3点灯

main.c

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

int  main()
{
	LED_Init(); //LED初始化
	
	while(1)
	{
		//方式3
		//GPIO_Write(GPIOC, 0X2000); 	 	//P13引脚输出高电平
		GPIO_Write(GPIOC, 0X0000); 		//整组端口输出低电平
	}   
}

点灯效果

在这里插入图片描述

3:STM32闪烁灯

加一个延时函数 我们就可以做一个 LED闪烁效果了
这里的延时我们没有用到定时器 ,只是简单的通过循环来延时。

delay.c

#include "stm32f10x.h"
#include "delay.h"

void delay_ms(uint16_t time)
{
	uint16_t i = 0;
	while(time--)
	{
		i = 10000;
		while(i--);
	}
}


main.c

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

int  main()
{
	LED_Init(); //LED初始化
	
	while(1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
		delay_ms(1000); //亮灯大约1秒
		GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
		delay_ms(1000); //熄灭灯大约1秒
	}   
}

闪烁灯效果

在这里插入图片描述

4:STM32呼吸灯

呼吸灯就像我们人呼吸那样,我们可以让灯慢慢的亮 慢慢的暗,这个就是通过占空比来调节。(可以理解为LED高电平时间和LED低电平时间)
比如 LED 亮延时100us 然后 暗 100us 这时候他们占空比是百分之50.
那如果我们 LED 亮10us 然后暗 还是100us 这个时候 你会发现 LED灯变暗了很多。 这个其实是我们的视觉暂停 原因导致的。
所以我们可以通过调节 LED点亮的时间 和 LED 熄灭的时间的比例来调节,让LED 慢慢的亮 然后 慢慢的 暗。

慢慢的亮 意思就是 LED的低电平时间慢慢的增加。
比如从1us 慢慢 到500us 然后LED高电平时间则是 从500us 慢慢到1us。
如果是想着LED灯 亮慢慢 暗 则相反。

main.c

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

int  main()
{
	LED_Init(); //LED初始化
	unsigned char i = 0;
	unsigned int t = 1;
	unsigned char flag = 1;
	while(1)
	{
		if(flag == 1) //LED由暗到亮
		{
			for(i=0;i<10;i++)
			{
				GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
				delay_us(t);
				GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
				delay_us(501-t);
			}
			t++;	
			if(t == 500)
			{
				flag = 0;
			}
		}
		if(flag == 0) //LED由亮到暗
		{
			for(i=0;i<10;i++)
			{	
				GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
				delay_us(t);
				GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
				delay_us(501-t);
			}
			t--;
			if(t == 1)
			{
				flag = 1;
			}
		}
	} 
}

呼吸灯效果

在这里插入图片描述

5:STM32按键点灯

我们玩了呼吸灯 也可以玩玩按键点灯,按键其实也是挺简单的,我用的按键是只有两个引脚的,我们任意的一脚接单片机的GND ,另一个接单片机的GPIO 当按下按键 这个GPIO则会是低电平。 那我们就检测这个GPIO是否是低电平 如果是 我们则点亮LED灯。

key.c

#include "stm32f10x.h"
#include "key.h"

/*按键初始化函数*/
void KEY_Init(void)
{
	//1.打开控制GPIOA的时钟(APB2)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//2.配置结构体	
	GPIO_InitTypeDef key_init;
	key_init.GPIO_Pin   = GPIO_Pin_5;      	//GPIOC13引脚
	key_init.GPIO_Mode  = GPIO_Mode_IPU; 	//上拉输入	
	//led_init.GPIO_Speed = GPIO_Speed_10MHz; //10MHz
	
	//3.对成员进行初始化
	GPIO_Init(GPIOA, &key_init);
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "delay.h"

int  main()
{
	LED_Init(); //LED初始化
	KEY_Init(); //按键初始化
	GPIO_SetBits(GPIOC,GPIO_Pin_13);	//LED设置高电平
	GPIO_SetBits(GPIOA,GPIO_Pin_5);		//按键设置高电平
	
	while(1)
	{
		//如果按键被按下
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0) 	
		{
				delay_ms(20); //消抖再次判断是否按下
				if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5) == 0)
				{
					GPIO_ResetBits(GPIOC, GPIO_Pin_13); 	//LED点亮
					delay_ms(1000); //延时大约1秒				
				}
		}
		else
		{
				GPIO_SetBits(GPIOC,GPIO_Pin_13);		//LED熄灭
		}
	} 
}

按键点灯效果

在这里插入图片描述

6:STM32震动感应灯

需要材料:

6.1:震动传感器

在这里插入图片描述

2.继电器

(我用的这个是高电平导通)
在这里插入图片描述

这种是震动传感器,我们可以也通过震动来点灯,我用的这个模块是当发生震动时,会变成低电平。那其实就是相当于我们的按键,我们去检测一下这个模块到底是不是低电平如果是低电平,那么我们让LED灯点亮1秒啥的都有可以。
直接上代码:
配置震动传感器模块代码

代码

shake.c

#include "stm32f10x.h"
#include "shake.h"

/*震动传感器初始化函数*/
void SHAKE_Init(void)
{
	//打开GPIOC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//配置结构体
	GPIO_InitTypeDef shake_init;
	shake_init.GPIO_Mode  = GPIO_Mode_IPU; 	//上拉输入
	shake_init.GPIO_Pin   = GPIO_Pin_3;		//A3引脚
	//shake_init.GPIO_Speed = GPIO_Speed_50MHz;
	
	//成员初始化
	GPIO_Init(GPIOA, &shake_init);		
}

继电器模块配置代码:

relay.c

#include "relay.h"

/*继电器模块初始化函数*/
void RELAY_Init(void)
{
	//打开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//配置结构体
	GPIO_InitTypeDef relay_init;
	relay_init.GPIO_Mode  = GPIO_Mode_Out_PP; 	//推挽输出
	relay_init.GPIO_Pin   = GPIO_Pin_4;			//3引脚
	relay_init.GPIO_Speed = GPIO_Speed_50MHz;
	
	//成员初始化
	GPIO_Init(GPIOA, &relay_init);
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "relay.h"
#include "delay.h"
#include "shake.h"

/*主程序入口*/
int  main()
{
	LED_Init();  //LED模块初始化
	RELAY_Init();//继电器模块初始化
	SHAKE_Init();//震动传感器初始化
	
	GPIO_SetBits(GPIOC, GPIO_Pin_13); 	//LED高电平
   	GPIO_SetBits(GPIOA, GPIO_Pin_3); 	//震动传感器高电平
	GPIO_ResetBits(GPIOA, GPIO_Pin_4); 	//继电器低电平(关闭)
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) == 0)
		{
			GPIO_ResetBits(GPIOC, GPIO_Pin_13); //LED点亮
			GPIO_SetBits(GPIOA, GPIO_Pin_4); 	//继电器导通 (高电平)
			delay_ms(1000);
		}
		else
		{
			GPIO_SetBits(GPIOC, GPIO_Pin_13); 	//LED不亮
			GPIO_ResetBits(GPIOA, GPIO_Pin_4); 	//继电器不导通 (低电平)
		}
			
	} 
}

如何接线

STM32震动传感器
3.3VVCC
GNDGND
A3DO
STM32继电器
5VVCC
GNDGND
A4IN
GND公共端
STM32LED灯
3.3V正极
继电器LED灯
常开端负极

项目效果

在这里插入图片描述

如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈

需要整个工程代码和 模块的相关资料,私信我 或者 +我扣扣:844797079 。或者评论区留下的你的联系方式。

继续加油!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:59:50  更:2021-08-06 10:02:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:29:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码