当前位置: 首页 > news >正文

3-4 ~ 3-5 GPIO输入 - LI,Yi

视频选集(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_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口来接线,具体看程序代码

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_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
http://www.sczhlp.com/news/7367/

相关文章:

  • chrome mcp server
  • Helm 动态参数配置模版
  • 8.7 闲话
  • 自定义Chart并部署一个应用
  • P12213 [蓝桥杯 2023 国 Python B] 最长回文前后缀(Manacher)
  • 二分图最大匹配
  • SGX Externals sgx外部组件
  • 全志T527/A527 AIOT LinuxSDK的安装与简介-盈鹏飞嵌入式
  • 智能制造网络质量保障:德承 DX-1200多网口工控机在windows系统下的网络性能测试指南 - Johnny
  • 目录导航
  • 初三文化课生涯回忆
  • 标准/实际扣料分析系统使用帮助
  • Krisp 推出对话轮次转换模型,基于纯音频信号;DeepMind 发布世界模型 Genie 3 ,可保持数分钟一致性丨日报
  • Windows XP/Server 2003帮助中心漏洞全披露与技术防护方案
  • Python - ipaddress模块
  • 金融级 ZooKeeper 来袭:性能提升100%,SLA 99.99%,数据防护升级
  • 13kB JavaScript实现的MOBA游戏网络同步技术
  • 飞书应用平台-Tita 新CRM销售一体化:重塑企业销售与交付全链路管理
  • SM30 维护视图增强 (添加自定义按钮,隐藏按钮)(转)
  • Java变量与常量全解析(包含常量类、interface 与 final 的比较)
  • 【PostgreSQL17】4 复杂查询
  • 机房散记
  • 《深入理解计算机系统》学习笔记
  • 读开源项目成功之道06让项目受欢迎
  • P5244 [USACO19FEB] Mowing Mischief P
  • Solidity学习之代理合约
  • 微积分笔记
  • 求数组中未出现的最小正整数(408-18/力扣41)
  • xxx
  • 一步到位配置你本地PHP开发环境