视频选集(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_Hvoid 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_Hvoid 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_Hvoid 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_Htypedef enum
{ ON = 0,OFF = 1
}BuzzerState_TypeDef;void Buzzer_Init(void);
void Buzzer_Control(BuzzerState_TypeDef buzzer_state);#endif