江科大stm32学习笔记——【3-3】GPIO输入:按键控制led&光敏传感器控制蜂鸣器

一.原理

1.传感器模块

传感器元件的电阻会随外界模拟量的变化而变化,通过定值电阻分压 即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出。

2.硬件电路

1)按键电路

上面两个是下接按键,下面两个是上接按键。++一般用下接按键的方式++。

图一:当按键按下时,PA0被直接下拉到GND,此时读取PA0口的电压就是低电平。

当按键松手时,PA0被悬空,引脚电压不确定,所以必须要求PA0是上拉输入的模式,否则会出现引脚电压不确定的情况,这样引脚再悬空,PA0就是高电平。

图二:外部接了上拉电阻。

当按键松手时,引脚由于上拉作用,自然保持高电平。

当按键按下时,引脚直接接到GND。

2)传感器模块电路

二.按键控制LED

1.硬件连接

2.程序代码

在工程文件夹里新建一个"Hardware"文件夹来存放LED和按键的驱动程序

LED.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header

void LED_Init(void)//初始化LED
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_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_SetBits(GPIOA,GPIO_Pin_2);//都设为高电平关掉LED方便后续亮灯

}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_2);
}

void LED1_Turn(void)//灯取反
{
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_1);
	}
}

void LED2_Turn(void)//灯取反
{
	if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
	}
}

LED.h:

cs 复制代码
#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_Turn(void);
void LED2_Turn(void);
#endif

Key.c:

cs 复制代码
#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
	//读取PB1端口的值:
	if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
	{
		Delay_ms(20);//刚按下按键时会抖动
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);//直到松手
		Delay_ms(20);//再消一下抖动
		KeyNum = 1;
	}
	
	//读取PB11端口的值:
	if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0)
	{
		Delay_ms(20);//刚按下按键时会抖动
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);//直到松手
		Delay_ms(20);//再消一下抖动
		KeyNum = 2;
	}
	
	return KeyNum;
}

Key.h:

cs 复制代码
#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

main.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;//这里的KeyNum是全局变量,作用域不同

int main(void)
{
	LED_Init();
	Key_Init();
	
	//按一下按键亮灭变一下
	while(1)
	{
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			LED1_Turn();
		}
		if(KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

三.光敏传感器控制蜂鸣器

1.硬件

2.程序

蜂鸣器的光敏传感器的驱动程序(和LED类似)

Buzzer.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header

void Buzzer_Init(void)//初始化LED
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}

void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
void Buzzer_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_12);
	}
	else
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
	}
}

Buzzer.h:

cs 复制代码
#ifndef __BUZZER_H
#define __BUZZER_H

void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);

#endif

LightSensor.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header

void LightSensor_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_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}

LightSensor.h:

cs 复制代码
#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_H

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif

main.c:

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "BUZZER.h"
#include "LightSensor.h"

int main(void)
{
	Buzzer_Init();
	LightSensor_Init();
	
	while(1)
	{
		if (LightSensor_Get() == 1)//当光线暗
		{
			Buzzer_ON();
		}
		else//当光线亮
		{
			Buzzer_OFF();
		}
	}
}
相关推荐
一路往蓝-Anbo3 分钟前
C语言从句柄到对象 (四) —— 接口抽象:从 Switch-Case 到通用接口
c语言·开发语言·stm32·嵌入式硬件
硬件yun6 分钟前
Flyback反激电路学习参数计算
学习
mudtools9 分钟前
如何设计易维护、低学习成本的飞书.NET SDK组件
学习·.net·飞书
弘毅 失败的 mian23 分钟前
Git 标签管理
经验分享·笔记·git
崇山峻岭之间24 分钟前
Matlab学习记录19
学习·算法·matlab
.鸣28 分钟前
CSDN Java反射
java·学习
雅欣鱼子酱30 分钟前
Type-C 终端应用里 给产品增加PD快充取电 PD取电诱骗芯片有什么推荐?
人工智能·单片机·芯片·电子元器件
2501_9462139032 分钟前
Zettlr(科研笔记) v4.0.0 中文免费版
java·经验分享·笔记·pdf·github·ocr·开源软件
兜兜转转了多少年38 分钟前
《Python 应用机器学习:代码实战指南》笔记2 从0理解机器学习 —— 核心概念全解析
笔记·python·机器学习
MarkHD1 小时前
智能体在车联网中的应用:第37天 CARLA仿真中的端到端车道保持:基于CNN模仿学习的自动驾驶实践
学习·cnn·自动驾驶