当前位置: 首页 > 工具软件 > Buzzer > 使用案例 >

蜂鸣器(buzzer)延时函数(delay)和继电器(relay)驱动

储承
2023-12-01

蜂鸣器(buzzer)

CUBEMX [BEEP1]

使用方法

BUZZER_SOLO1();//蜂鸣器输出单音的报警音(样式1:HAL库的精准延时函数)
BUZZER_SOLO2();{//蜂鸣器输出单音的报警音(样式2:CPU微秒级延时)

buzzer.c

#include "buzzer.h"
#define time1 50 //单音的时长
#define hz1 1 //单音的音调(单位毫秒)
void BUZZER_SOLO1(void){//蜂鸣器输出单音的报警音(样式1:HAL库的精准延时函数)
    uint16_t i;
    for(i=0;i<time1;i++){//循环次数决定单音的时长
       HAL_GPIO_WritePin(BEEP1_GPIO_Port,BEEP1_Pin,GPIO_PIN_RESET); //蜂鸣器接口输出低电平0
       HAL_Delay(hz1); //延时(毫秒级延时最小1微秒,实现的单调较低,因不需要额外编写微秒级延时函数所以最简单实用)
       HAL_GPIO_WritePin(BEEP1_GPIO_Port,BEEP1_Pin,GPIO_PIN_SET); //蜂鸣器接口输出高电平1
       HAL_Delay(hz1); //延时
    }
}
#define time2 200 //单音的时长
#define hz2 500 //单音的音调(单位微秒)
void BUZZER_SOLO2(void){//蜂鸣器输出单音的报警音(样式2:CPU微秒级延时)
    uint16_t i;
    for(i=0;i<time2;i++){//循环次数决定单音的时长
       HAL_GPIO_WritePin(BEEP1_GPIO_Port,BEEP1_Pin,GPIO_PIN_RESET); //蜂鸣器接口输出低电平0
       delay_us(hz2); //延时
       HAL_GPIO_WritePin(BEEP1_GPIO_Port,BEEP1_Pin,GPIO_PIN_SET); //蜂鸣器接口输出高电平1
       delay_us(hz2); //延时
    }
}

buzzer.h

#ifndef BUZZER_BUZZER_H_
#define BUZZER_BUZZER_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
#include "main.h"
#include "../delay/delay.h"
void BUZZER_SOLO1(void);
void BUZZER_SOLO2(void);

#endif /* BUZZER_BUZZER_H_ */

CPU微秒级延时(delay)

使用方法

delay_us(500);//延时500微秒

delay.c

#include "delay.h"

void delay_us(uint32_t us) //利用CPU循环实现的非精准应用的微秒延时函数
{
    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 8000000 * us); //使用HAL_RCC_GetHCLKFreq()函数获取主频值,经算法得到1微秒的循环次数
    while (delay--); //循环delay次,达到1微秒延时
}

delay.h

#ifndef DELAY_DELAY_H_
#define DELAY_DELAY_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
void delay_us(uint32_t us); //C文件中的函数声明

#endif /* DELAY_DELAY_H_ */

继电器(relay)

CUBEMX [RELAY1]

使用方法

RELAY_1(1);//继电器吸合
RELAY_1(0);//继电器松开

relay.c

#include "relay.h"

void RELAY_1(uint8_t c){ //继电器的控制程序(c=0继电器放开,c=1继电器吸合)
    if(c)HAL_GPIO_WritePin(GPIOA,RELAY1_Pin,GPIO_PIN_RESET); //继电器吸
    else  HAL_GPIO_WritePin(GPIOA,RELAY1_Pin,GPIO_PIN_SET); //继电器松
}

relay.h

#ifndef INC_RELAY_H_
#define INC_RELAY_H_

//继电器接口定义与初始化函数在MX中设置并生成在main.c文件中
#include "stm32f1xx_hal.h" //HAL库文件声明
#include "main.h" //IO定义与初始化函数在main.c文件中,必须引用

void RELAY_1(uint8_t c);//继电器控制1

#endif /* INC_RELAY_H_ */

MIDI音乐

使用方法

MIDI_PLAY();
uint16_t music1[78]={ //音乐1的数据表(奇数是音调,偶数是长度)
330,750,
440,375,
494,375,
523,750,
587,375,
659,375,
587,750,
494,375,
392,375,
440,1500,
330,750,
440,375,
494,375,
523,750,
587,375,
659,375,
587,750,
494,375,
392,375,
784,1500,
659,750,
698,375,
784,375,
880,750,
784,375,
698,375,
659,750,
587,750,
659,750,
523,375,
494,375,
440,750,
440,375,
494,375,
523,750,
523,750,
494,750,
392,750,
440,3000
};

void MIDI_PLAY(void){ //MIDI音乐
	uint16_t i,e;
	for(i=0;i<39;i++){
		for(e=0;e<music1[i*2]*music1[i*2+1]/1000;e++){
			HAL_GPIO_WritePin(BEEP1_GPIO_Port,BEEP1_Pin,GPIO_PIN_RESET);
			//蜂鸣器接口输出低电平0/*GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0*/
			delay_us(500000/music1[i*2]); //延时
			HAL_GPIO_WritePin(BEEP1_GPIO_Port,BEEP1_Pin,GPIO_PIN_SET);
			/*GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1*/
			delay_us(500000/music1[i*2]); //延时
		}
	}
}


在BUZZER.H中声明函数

void MIDI_PLAY(void);//midi音乐

小星星

uint16_t music2[64]={ //音乐1的数据表(奇数是对应音调频率,偶数是发声时间长度
523,600,
523,600,
784,600,
784,600,
880,600,
880,600,
784,600,
0,1200,
698,600,
698,600,
659,600,
659,600,
587,600,
587,600,
523,600,
0,1200,
784,600,
784,600,
698,600,
698,600,
659,600,
659,600,
587,600,
0,1200,
784,600,
784,600,
698,600,
698,600,
659,600,
659,600,
587,600,
0,1200
};

 类似资料: