【江科大STM32合集】day2按键控制LED&光敏传感器控制峰鸣器

发布时间:2024年01月15日

【STM32合集】day2按键控制LED&光敏传感器控制峰鸣器

电路基础

运算放大器-在江科大51单片机b站视频(AD/DA)复习
原理:两个极端
同相输入端电压 》反相输入端 电压输出最大值 接Vcc
同相输入端电压《 反向输入端 电压输出最小值 接GNd

c语言基础

LED.c用来存放驱动程序的主体代码 (ps:逻辑运算代码都在这
LED.h用来存放驱动程序可以对外提供的函数或变量的声明 (ps:相当于java接口的概念

1.3.1 c文件模块化规范演示-主体代码

这里注意是GPIO_Mode_Out_PP别用成了GPIO_Mode_AF_PP模式
在这里插入图片描述

1.3.2 h头文件模块化-外部可以调用声明
在这里插入图片描述

使用模块化的函数

在这里插入图片描述

记得编译下载一下,检查有没有报错

main.c

#include "stm32f10x.h" // Device header
#include "delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;//变量存键码返回值

int main(void)
{
		LED_Init();
		Key_Init();
		while(1)
		{
					KeyNum=Key_GetNum();
					if(KeyNum==1)
					{
						LED1_ON();

					}	
					if(KeyNum==2)
					{
						LED1_OFF();
					}	
		}
}
key.c
#include "stm32f10x.h"                  // Device header
#include	"Delay.h"
void Key_Init(void)
{
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
		
		GPIO_InitTypeDef GPIO_InitStructure;
		GPIO_InitStructure.GPIO_Mode	=	GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Pin		=	GPIO_Pin_1	| GPIO_Pin_11;
		GPIO_InitStructure.GPIO_Speed	=	GPIO_Speed_50MHz;
	
		GPIO_Init(GPIOB,	&GPIO_InitStructure);
	
}
//按键读取
uint8_t Key_GetNum(void)
{
		uint8_t KeyNum=0;//按键默认返回0,默认低电平
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)	==0){//按下B1端口的键
				Delay_ms(20);//消抖
				while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)	==0);
				Delay_ms(20);//消抖
				KeyNum=1;
		}
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)	==0){//按下B11端口的键
				Delay_ms(20);//消抖
				while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)	==0);
				Delay_ms(20);//消抖
				KeyNum=2;
		}
		return KeyNum;
}	


结果
按一下B1键实现亮灯,B2键关灯

实现一个键开关灯

led.c

#include "stm32f10x.h"

void LED_Init(void){

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode =	GPIO_Mode_Out_PP;//别快捷键成了GPIO_Mode_AF_PP模式
	GPIO_InitStructure.GPIO_Pin  =	GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed =	GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);//亮了一个灯,我这里误写成用了GPIO_Mode_AF_PP模式

}

//开关灯1
void LED1_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)
	{	
			GPIO_SetBits(GPIOA, GPIO_Pin_1);//赋值1,高电平熄灭
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);//赋值0,低电平点亮
	}
	
}
//开关灯2
void LED2_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)
	{	
			GPIO_SetBits(GPIOA, GPIO_Pin_2);//赋值1,高电平熄灭
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);//赋值0,低电平点亮
	}
	
}


//点亮灯1
void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);//赋值0,低电平点亮
	
}
//熄灭灯1
void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);//赋值1,高电平熄灭
}
//点亮灯2
void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);//赋值0,低电平点亮
	
}
//熄灭灯2
void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);//赋值1,高电平熄灭
}

main.c

#include "stm32f10x.h" // Device header
#include "delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;//变量存键码返回值

int main(void)
{
		LED_Init();
		Key_Init();
		while(1)
		{
					KeyNum=Key_GetNum();
					if(KeyNum==1)//控制开关led2
					{
						LED1_Turn();

					}	
					if(KeyNum==2)//控制开关led2
					{
						LED2_Turn();
					}	
		}
}

实验结果+避坑

按B1键 A1引脚的灯 能开关
按B11键 A2引脚的灯 能开关
过程中间没有亮灯的,检查引脚是否插好或者正确
not target 报错可以检查下是否单片机上的电源灯正确亮了,我的vcc引脚两端当时都松动了
文章来源:https://blog.csdn.net/weixin_44106334/article/details/135539386
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。