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和按键,具体看程序代码

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口来接线,具体看程序代码

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
本文来自博客园,作者:LI,Yi-han,转载请注明原文链接:https://www.cnblogs.com/LiYi-han/p/19026826

浙公网安备 33010602011771号