系列文章目录
文章目录
前言
本小结为3-4按键控制LED&光敏传感器控制蜂鸣器
准备:
在项目工程文件夹中新建Hardware文件夹,用于编写外设驱动和头文件。
新建完成后记得在keil工程组管理中添加同名组,并在C/C++将新建文件夹路径添加进来;
详情请见:2-2新建工程
图:工程文件夹
一、按键控制LED
1.1原理图:
图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会亮,再按下会熄灭
图1.3.1:初始状态
图1.3.2按键1,2第一次按下
图1.3.3:按键2第二次按下
二、光敏传感器控制蜂鸣器
2.1原理图:
图 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实验结果
图2.3.1:光照弱蜂鸣器响
图2.3.2:光照强时
总结
光敏传感器具体电路部分不会画,导致实验现象不明显。