小工具知识网

当前位置: 首页 > 行业知识 > 江科大stm32学习笔记——【3-3】GPIO输入:按键控制led&光敏传感器控制蜂鸣器

行业知识

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

2026-11-02 10:19:48 来源:互联网转载

一.原���

1.传感器模块

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

2.硬件电路

1)按键电路

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

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

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

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

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

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

2)传感器模块电路 

 

 二.按键控制LED

1.硬件连接

2.程序代码

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

LED.c:

#include "stm32f10x.h"                  // Device headervoid 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:

#ifndef __LED_H#define __LED_Hvoid 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:

#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:

#ifndef __KEY_H#define __KEY_Hvoid Key_Init(void);uint8_t Key_GetNum(void);#endif

main.c:

#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:

#include "stm32f10x.h"                  // Device headervoid 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:

#ifndef __BUZZER_H#define __BUZZER_Hvoid Buzzer_Init(void);void Buzzer_ON(void);void Buzzer_OFF(void);void Buzzer_Turn(void);#endif

LightSensor.c:

#include "stm32f10x.h"                  // Device headervoid 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:

#ifndef __LIGHT_SENSOR_H#define __LIGHT_SENSOR_Hvoid LightSensor_Init(void);uint8_t LightSensor_Get(void);#endif

main.c:

#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();}}}

上一篇:东营怎么制作?

下一篇:服务器换主ip怎么换?