stm32 光敏电阻控制蜂鸣器(标准库)

注意

有一些端口主功能是调试或者其他的选择时要注意

例如:PA14 是 STM32 微控制器上的一个引脚,通常用于 JTCK/SWCLK,这是一种调试和编程的信号线。

如果你的 STM32 微控制器的 PA15 引脚主功能是 JTDI(JTAG 调试接口的一部分),而你需要使用该引脚控制蜂鸣器,你可能会面临以下几个问题和解决方法:

问题与解决方法:

  1. JTAG 调试接口冲突:

    • 问题:如果 PA15 被配置为 JTDI,这意味着该引脚用于 JTAG 调试,这可能与 GPIO 功能发生冲突。
    • 解决方法:检查是否可以在 STM32 的配置中禁用 JTAG 接口并将 PA15 配置为普通 GPIO。如果你不需要 JTAG 调试功能,可以使用 STM32 的配置工具(如 STM32CubeMX)来禁用 JTAG 接口或将其改为 SWD(Serial Wire Debug)模式。
  2. 引脚功能复用:

    • 问题:STM32 的引脚通常可以配置为多种功能。PA15 可能被设置为 JTAG 功能。
    • 解决方法:使用 STM32CubeMX 或手动修改寄存器配置,设置 PA15 为 GPIO 模式而不是 JTAG 模式。确保在代码中正确配置引脚功能。
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 启用 GPIOA 时钟 */
__HAL_RCC_GPIOA_CLK_ENABLE();

/* 配置 PA15 为普通 GPIO 输出 */
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

  1. 代码和调试:

    • 问题:代码中可能没有正确初始化 PA15 或没有正确设置其状态。
    • 解决方法:确保你的代码中初始化了 PA15 引脚,并使用正确的逻辑来控制蜂鸣器。
  2. 使用其他引脚:

    • 问题:如果无法禁用 JTAG 接口,可能需要寻找其他引脚来控制蜂鸣器。
    • 解决方法:选择一个没有被占用的 GPIO 引脚,并将其配置为控制蜂鸣器。检查 STM32 的引脚复用表,选择合适的替代引脚。
  3. 硬件连接:

    • 问题:确保蜂鸣器的电源和接地连接正确。
    • 解决方法:确认蜂鸣器的连接线和电源连接是否稳固。

蜂鸣器

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

蜂鸣器电路结构是三极管,本代码用的是图1的原理图

Buzzer.c

#include "stm32f10x.h"                  // Device header
/**
  * 函    数:蜂鸣器初始化
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	
	/*GPIO初始化*/
	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);						//将PB12引脚初始化为推挽输出
	
	/*设置GPIO初始化后的默认电平*/
	GPIO_SetBits(GPIOB, GPIO_Pin_12);							//设置PB12引脚为高电平(作者的元器件蜂鸣器为低电平触发)
}	

/**
  * 函    数:蜂鸣器开启
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_Open(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//设置PB12引脚为低电平
}



/**
  * 函    数:蜂鸣器关闭
  * 参    数:无
  * 返 回 值:无
  */
void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_12);		//设置PB12引脚为高电平
}

Buzzer.h

#ifndef __BUZZER_H
#define __BUZZER_H
void Buzzer_Init(void);
void Buzzer_Open(void);
void Buzzer_OFF(void);
#endif

传感器模块

传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

基本电路图

LIghtSensor.c

#include "stm32f10x.h"                  // Device header

/**
  * 函    数:光敏传感器初始化
  * 参    数:无
  * 返 回 值:无
  */
void LightSensor_Init(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	
	/*GPIO初始化*/
	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);						
}

/**
  * 函    数:获取当前光敏传感器输出的高低电平
  * 参    数: GPIO_ReadInputDataBit 读取io输入管脚的值
  * 返 回 值:光敏传感器输出的高低电平,范围:0/1
  */
uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);			//返回PB13输入寄存器的状态
}

 LightSensor.h

#ifndef __LIGHTSENSOR_H
#define __LIGHTSENSOR_H
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif

main.c

#include "stm32f10x.h"   // Device header
#include "Delay.h"
#include "LightSensor.h"
#include "Buzzer.h"

int main(void)
{
	/*模块初始化*/
	Buzzer_Init();			//蜂鸣器初始化
	LightSensor_Init();		//光敏传感器初始化
	
	while(1)
	{
		
	   if (LightSensor_Get() == 1)		//如果当前光敏输出1
		{
			Buzzer_Open();				//蜂鸣器开启
		}
		else							//否则
		{
			Buzzer_OFF();				//蜂鸣器关闭
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值