3-4 ~ 3-5 GPIO输入

视频选集(8/50)[3-4] 按键控制LED&光敏传感器控制蜂鸣器

0. GPIO读取-库函数

/**
  * @brief  读取指定 输入GPIO 的数据值
  * @param  GPIOx: 指定GPIO
  * @retval GPIO输入数据值
  */
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

/**
  * @brief  读取指定 输出GPIO 的数据值
  * @param  GPIOx: 指定GPIO
  * @retval GPIO输出数据值
  */
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
/**
  * @brief  读取指定的输入端口
  * @param  GPIOx: 选择GPIO
  * @param  GPIO_Pin: 指定端口
  * @retval 指定端口的输入电平
  */
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

/**
  * @brief  读取指定的输出端口
  * @param  GPIOx: 选择GPIO
  * @param  GPIO_Pin: 指定端口
  * @retval 指定端口的输出电平
  */
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

1. 按键控制LED

1.1器件

  • STM32最小系统板
  • ST-LINK V2下载器
  • LED*2
  • 按键*2

1.2 实现目标

  • 在LED1熄灭的情况下,按下key1,LED1亮起;在LED1点亮的情况下,按下key1,LED1熄灭;
  • 在LED2熄灭的情况下,按下key2,LED2亮起;在LED2点亮的情况下,按下key2,LED2熄灭;

1.3 配置工程文件

注.模块化编程更加便于管理和移植

  • 创建Hardware文件夹,用来存放硬件驱动,将LED.h、LED.c、Key.h、Key.c放在该文件夹下

1.4 接线图

注.我没有按照图中的IO口来接LED和按键,具体看程序代码

3-4 按键控制LED

1.5 程序

main.c文件如下:

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

/*------------------------------主函数------------------------------*/
int main(void)
{
	/*-----变量声明和初始化-----*/
	uint8_t key_flag = 0;
	
	/*-----硬件初始化-----*/
	LED_Init();
	Key_Init();
	
	/*-----输出控制-----*/
	while(1){
		key_flag = Key_Read();
		LED_Turn(key_flag);
		key_flag = 0; // 清除标志位
	}
}

LED.c文件如下:

#include "stm32f10x.h"                  // Device header

/*------------------------------LED初始化函数(低电平有效)------------------------------
	@LED1 A1
	@LED2 A6
*/
void LED_Init(void)
{
	/*-----变量声明-----*/
	GPIO_InitTypeDef GPIO_InitStruct; // 定义包含配置参数的结构体变量
	
	/*-----时钟使能-----*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟
	
	/*-----端口配置-----*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 通用推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的所有端口
	
	/*-----初始化熄灭-----*/
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_6); // A1, A6端口输出高电平
}


/*------------------------------LED翻转函数------------------------------
	@brief 使指定LED控制引脚的输出电平翻转,从而控制LED的亮灭
	@param  LED_no: 选择LED。该参数可以是以下值
		@arg 1: LED1
		@arg 2: LED2
*/
void LED_Turn(uint8_t LED_no)
{	
	/*-----变量声明和初始化-----*/
	uint8_t temp_state = 0; // 存储读取到的电平值
	uint16_t temp_pin = 0; // 存储引脚地址
	
	/*-----输出控制-----*/
	if(LED_no == 1){
		temp_pin = GPIO_Pin_1;
	}
	if(LED_no == 2){
		temp_pin = GPIO_Pin_6;
	}
	
	temp_state = GPIO_ReadOutputDataBit(GPIOA, temp_pin); // 读取
	if(temp_state){
		GPIO_ResetBits(GPIOA, temp_pin); // 高电平置反
	}else{
		GPIO_SetBits(GPIOA, temp_pin); // 低电平置反
	}
}

LED.h文件如下:

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED_Turn(uint8_t LED_no);

#endif

Key.c文件如下:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

/*------------------------------按键初始化函数(低电平有效)------------------------------
	@key1 B0
	@key2 B1
*/
void Key_Init(void)
{
	/*-----变量声明-----*/
	GPIO_InitTypeDef GPIO_InitStruct; // 定义包含配置参数的结构体变量
	
	/*-----时钟使能-----*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
	
	/*-----端口配置-----*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入:悬空时默认高电平
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct); 
}


/*------------------------------按键读取函数------------------------------
	@brief 通过参数传递按键状态数组
*/
uint8_t Key_Read(void)
{
	if(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))){ // 【key1被按下】
		Delay_ms(20); // 按下按键消抖
		while(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0))); // 未松开时阻塞
		Delay_ms(20); // 松开按键消抖
		return 1;
	}
	if(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1))){ // 【key2被按下】
		Delay_ms(20); // 按下按键消抖
		while(!(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1))); // 未松开时阻塞
		Delay_ms(20); // 松开按键消抖
		return 2;
	}
	return 0;
}

Key.h文件如下:

#ifndef __KEY_H
#define __KEY_H


void Key_Init(void);
uint8_t Key_Read(void);

#endif

2. 光敏控制蜂鸣器报警

2.1 器件

  • STM32最小系统板
  • ST-LINK V2下载器
  • 蜂鸣器
  • 光敏传感器

2.2 实现目标

  • 光线正常,蜂鸣器不报警
  • 光线被遮挡,蜂鸣器报警

2.3 接线图

注.我没有按照图中的IO口来接线,具体看程序代码

3-5 光敏传感器控制蜂鸣器

2.4 程序

main.c文件如下:

#include "stm32f10x.h"                  // Device header
#include "Sensor_Light.h"
#include "Buzzer.h"

/*------------------------------主函数------------------------------*/
int main(void)
{
	/*-----变量声明-----*/
	uint8_t sensor_light_state;
	
	/*-----硬件初始化-----*/
	Sensor_Light_Init();
	Buzzer_Init();
	
	/*-----输出控制-----*/
	while(1){
		sensor_light_state = Sensor_Light_Read();
		if(!sensor_light_state){ // 光线正常,输出低电平:蜂鸣器不发声,DO-LED亮
			Buzzer_Control(OFF);
		}		
		if(sensor_light_state){ // 光线被遮挡,输出高电平:蜂鸣器响,DO-LED灭
			Buzzer_Control(ON);
		}		
	}
}

Sensor_Light.c文件如下:

#include "stm32f10x.h"                  // Device header

/*------------------------------光敏传感器初始化函数------------------------------
	@DO A1
*/
void Sensor_Light_Init(void)
{
	/*-----变量声明-----*/
	GPIO_InitTypeDef GPIO_InitStruct; // 定义包含配置参数的结构体变量
	
	/*-----时钟使能-----*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟
	
	/*-----端口配置-----*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入:悬空时默认高电平
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化A1端口
}



/*------------------------------读取光敏传感器当前输出电平函数------------------------------
	@return 0/1
*/
uint8_t Sensor_Light_Read(void)
{	
	return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); // 返回读取值
}

Sensor_Light.h文件如下:

#ifndef __SENSOR_LIGHT_H
#define __SENSOR_LIGHT_H

void Sensor_Light_Init(void);
uint8_t Sensor_Light_Read(void);

#endif

Buzzer.c文件如下:

#include "stm32f10x.h"                  // Device header
#include "Buzzer.h"

/*------------------------------蜂鸣器初始化函数(低电平有效)------------------------------
	@I/O:B0
*/
void Buzzer_Init(void)
{
	/*-----变量声明-----*/
	GPIO_InitTypeDef GPIO_InitStruct; // 定义包含配置参数的结构体变量
	
	/*-----时钟使能-----*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
	
	/*-----端口配置-----*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出,默认低电平
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct); // 初始化B0端口
	
	/*-----初始化-----*/
	GPIO_SetBits(GPIOB, GPIO_Pin_0); // 输出高电平
}


/*------------------------------蜂鸣器控制函数------------------------------
	@brief 控制蜂鸣器的开/关
	@param buzzer_state: 选择状态。该参数可以是以下值
		@arg 1: ON
		@arg 2: OFF
*/
void Buzzer_Control(BuzzerState_TypeDef buzzer_state)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)buzzer_state);
}

Buzzer.h文件如下:

#ifndef __BUZZER_H
#define __BUZZER_H

typedef enum
{ 
  ON = 0,
  OFF = 1
}BuzzerState_TypeDef;

void Buzzer_Init(void);
void Buzzer_Control(BuzzerState_TypeDef buzzer_state);

#endif

posted @ 2025-08-07 14:35  LI,Yi-han  阅读(11)  评论(0)    收藏  举报