3-4按键控制LED&光敏传感器控制蜂鸣器

系列文章目录

 


 

 

文章目录

 


前言

本小结为3-4按键控制LED&光敏传感器控制蜂鸣器

准备:

在项目工程文件夹中新建Hardware文件夹,用于编写外设驱动和头文件。

新建完成后记得在keil工程组管理中添加同名组,并在C/C++将新建文件夹路径添加进来;

详情请见:2-2新建工程

847b64f86b88fe478aa80bdffe7e1694.png

图:工程文件夹


一、按键控制LED

1.1原理图:

87fb7ad4659388796f3e85a43a60ed95.png

图1.1.1:按键控制LED原理图

1.2代码:

1.2.1 LED部分

LED.c: 这部分的LED亮灭状态有多种写法,我是直接采用UP主的方法了

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	// 配置外设时钟
	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);
	
	// 设置输出口为高电平(LED熄灭)
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
	
}
/**
  * @brief 控制LED亮灭
  * @param LEDNum GPIOA口的第几个LED 范围:1,2
		   OPEN 1为打开,2为关闭
  * @retval 
  */

/**自己写的函数
void CONTROL_LED(int LEDNum, int OPEN)	
{
	if(LEDNum == 1)
	{
		if(OPEN == 1)
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_1);
		}
		if(OPEN == 0)
		{
			GPIO_SetBits(GPIOA, GPIO_Pin_1);
		}
	}
	
	if(LEDNum == 2)
	{
		if(OPEN == 1)
		{
			GPIO_ResetBits(GPIOA, GPIO_Pin_2);
		}
		if(OPEN == 0)
		{
			GPIO_SetBits(GPIOA, GPIO_Pin_2);
		}
	}
}
*/


void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}


void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

/**
  * @brief GPIOA_1端口输出翻转
  * @param 无
  * @retval 无
  */
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_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}


void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

/**
  * @brief GPIOA_2端口输出翻转
  * @param 无
  * @retval 无
  */
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:LED驱动函数声明

#ifndef __LED_H__
#define __LED_H__

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);

//void CONTROL_LED(int LEDNum, int OPEN);

#endif

1.2.2按键部分

Keyc: 因为接线就接在GPIOA_Pin_1和11空,所以初始化函数只驱动他们

#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);
}
/**
  * @brief 获取按下按键的键码 KeyNum;
  * @param 无
  * @retval 返回按键键码; 1为按键1,2为按键2
  */
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	// 按键1
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		// 消抖
		Delay_ms(20);
		// 未松手
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	// 按键2
	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_H__

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

main.c

按键1按下调用LED_1Turn()函数进行状态翻转:因为LED初始化设置为熄灭(高电平输出),所以第一次按下按键时LED会亮,再按下会熄灭。按键2同理。

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

uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	while(1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}	

1.3实验结果:

初始状态下LED为熄灭状态, 第一次按下按键时对应LED会亮,再按下会熄灭

225bca5b01000189ad858b33fc05e995.png

图1.3.1:初始状态

af912d9665019df1b650bcaef0ccec28.png

图1.3.2按键1,2第一次按下

165a12aaf449485882831aac52c48803.png

图1.3.3:按键2第二次按下

二、光敏传感器控制蜂鸣器

2.1原理图:

39a1c7a1e4827be944e76b088dbeac04.png

图 2.2.1: 光敏传感器控制蜂鸣器

2.2代码

蜂鸣器驱动模块

Buzzer.c

#include "stm32f10x.h"                  // Device header

void Buzzer_Init(void)
{
	// 配置外设时钟
	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);
	
	// 设置输出口为高电平
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
	
}

void Buzzer_ON(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}


void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_12);
}

/**
  * @brief GPIOB_12端口输出翻转
  * @param 无
  * @retval 无
  */
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_H__

void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);

#endif

光敏电阻:

LightSensor.c

#include "stm32f10x.h"                  // Device header


// 初始化
void 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);
}


// 获取PB13口的输出电平
uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

LightSensor.h

#ifndef __LightSensor_H__
#define __LightSensor_H__

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);

#endif

main.c:

光照弱的时候,蜂鸣器响,

光照强的时候,蜂鸣器关。

光敏传感器的具体电路没有仔细去画,没有画放大电路,导致光敏电阻光照跳到最大时,虽然LightSensor_Get() 的值变了,但蜂鸣器还是会响。

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

2.3实验结果

7e52269ba639a497a2a96f75d96ec31c.png

图2.3.1:光照弱蜂鸣器响

0e42d6c6863b7ff83a9eee1ef18c5f84.png

图2.3.2:光照强时


总结

光敏传感器具体电路部分不会画,导致实验现象不明显。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值