首先,选择模块化编程,使代码结构更加的清晰,整洁,便于更改。此处需要对蜂鸣器部分,光敏电阻传感器部分进行模块化编程。
电路原理图
对蜂鸣器以及光敏电阻传感器的电路原理图进行介绍。
如图所示为蜂鸣器的电路原理图:
采用三级管进行驱动,当PNP的基级引脚接低电平时,蜂鸣器启动,高电平时不启动。
如图所示为光敏电阻的电路原理图:
查找模块说明书,可知:模块在环境光线亮度达不到设定阈值时,DO端输出高电平,当外界环境光线亮度超过设定阈值时,DO端输出低电平;
硬件电路
主要包括面包板、ST-Link、STM32最小系统板、蜂鸣器模块、光敏电阻传感器模块。
①将最小系统板的3.3v和GND在面包板上进行连接。
②将蜂鸣器的3.3v和GND端口进行连接,I/O口本例中接在PB12上。
③将光敏电阻传感器的3.3v和GND端口进行连接,将DO口连接在PB13上。
程序编写
首先是对蜂鸣器模块进行编写,蜂鸣器模块的.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);
}
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);
}
}
①对蜂鸣器模块进行初始化,主要包括APB2时钟初始化、结构体定义,配置为推挽输出。
②蜂鸣器低电平打开,故采用GPIO_ResetBits函数进行置低电平,写在函数Buzzer_ON中;同理写出函数Buzzer_OFF。
③通过if循环语句进行端口电平反转,但此处不需要进行这一步,只需简单的给PB12置位高低电平即可。
蜂鸣器.h文件如下:
#ifndef _BUZZER_H
#define _BUZZER_H
void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);
void Buzzer_Turn(void);
#endif
然后是光敏电阻模块的.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);
}
uint8_t LightSensor_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}
①同样先打开APB2时钟,定义结构体变量。
②采用GPIO_ReadInputDataBit函数读取PB13的输入电平,并将其以无符号整型数返回出来。既可以得出是否存在光源。若光源低于阈值,则返回值应该为1高电平,否则为低电平。
光敏电阻.h文件:
#ifndef _LIGHT_SENSOR_H
#define _LIGHT_SENSOR_H_
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif
最后是主函数文件:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "Buzzer.h"
#include "LightSensor.h"
int main(void)
{
Buzzer_Init();
LightSensor_Init();
while(1)
{
if (LightSensor_Get() ==1) //光敏电阻传感器当光线强度低于阈值时,DO段输出高点平。
{
Buzzer_ON(); //暗时蜂鸣器打开
}
else
{
Buzzer_OFF();
}
}
}
利用if语句判断返回值是否等于1,即光源强度低于阈值,蜂鸣器打开。否则,蜂鸣器关闭。
总结
此案例为利用光敏传感器对蜂鸣器进行控制,最后的现象为:光源较弱时,蜂鸣器启动;光源较强时,蜂鸣器关闭。
标签:Buzzer,GPIOB,光敏电阻,Pin,void,stm32,GPIO,蜂鸣器 From: https://blog.csdn.net/2403_87367556/article/details/143067101