当前位置: 首页 > news >正文

库函数蜂鸣器的使用(STC8)

使用库函数控制蜂鸣器(STC8)

在STC8系列单片机中,可以通过库函数或直接操作寄存器来控制蜂鸣器。以下是基于STC8库函数的常用方法:

GPIO板蜂鸣器

#include    "GPIO.h"
#include	"Delay.h"void GPIO_config() { GPIO_InitTypeDef info;info.Mode = GPIO_OUT_PP; // 推挽输出info.Pin = GPIO_Pin_0;   // 引脚GPIO_Inilize(GPIO_P0, &info);// 拉低引脚P00 = 0;
}void main() {u16 i; // 16位GPIO_config(); // 周期:高低电平和  2ms// 频率:周期的倒数   1s/2ms ===> 1000ms/2ms = 500HZ // 1次循环是2ms,持续2s,控制多少次   2000ms/2ms = 1000for (i = 0; i < 1000; i++) {P00 = 1;delay_ms(1);P00 = 0;delay_ms(1);}while (1){delay_ms(250);}
}

pwm版蜂鸣器

#include    "GPIO.h"
#include	"Delay.h"
#include 	"NVIC.h"	// 中断配置
#include 	"Switch.h"  // 引脚切换 
#include    "STC8H_PWM.h"void GPIO_config() { //推挽输出	P00P0_MODE_OUT_PP(GPIO_Pin_0); // 推挽输出默认是高电平P00 = 0; // 拉低
}// PWMB 配置
// #define PERIOD (MAIN_Fosc / 523)
void	PWM_config(u16 hz) // hz为0,停止,不为0, 播放的频率
{PWMx_InitDefine		PWMx_InitStructure;u16 Period;if (hz != 0) Period = (MAIN_Fosc / hz);// 配置PWM6PWMx_InitStructure.PWM_Mode    		= CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2PWMx_InitStructure.PWM_Duty    		= 0.5 * Period;	//PWM占空比时间, 0~PeriodPWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8PPWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB// 配置PWMBPWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255if (hz != 0) {PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE} else {PWMx_InitStructure.PWM_MainOutEnable= DISABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = DISABLE;			//使能计数器, ENABLE,DISABLE}PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB// 切换PWM通道PWM5_SW(PWM5_SW_P00);				// 初始化PWMB的中断NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}void main() {//			   C	 D    E 	F	 G	 A	  B	   C`u16 hz[] = {523, 587, 659, 698, 784, 880, 988, 1047};//			 C`	   D`     E`   F`	  G`	A`	  B`    C``//u16 hz[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093};u8 i;EAXSFR();		/* 扩展寄存器访问使能 */GPIO_config(); // GPIO配置for (i = 0; i < 8; i++) {PWM_config(hz[i]);  // PWM配置delay_ms(250);delay_ms(250);}PWM_config(0); // 停止while (1){}  
}

生成脉冲信号驱动有源蜂鸣器
对于需脉冲驱动的有源蜂鸣器,可使用延时函数生成PWM信号:

// PWMB 配置
// #define PERIOD (MAIN_Fosc / 523)
void	PWM_config(u16 hz) // hz为0,停止,不为0, 播放的频率
{PWMx_InitDefine		PWMx_InitStructure;u16 Period;if (hz != 0) Period = (MAIN_Fosc / hz);// 配置PWM6PWMx_InitStructure.PWM_Mode    		= CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2PWMx_InitStructure.PWM_Duty    		= 0.5 * Period;	//PWM占空比时间, 0~PeriodPWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8PPWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB// 配置PWMBPWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255if (hz != 0) {PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE} else {PWMx_InitStructure.PWM_MainOutEnable= DISABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = DISABLE;			//使能计数器, ENABLE,DISABLE}PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB// 切换PWM通道PWM5_SW(PWM5_SW_P00);				// 初始化PWMB的中断NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}PWM_config(523);

使用数组中的频率驱动蜂鸣器
若需驱动无源蜂鸣器,需通过定时器生成特定频率的方波:

#include "Buzzer.h"//这个是我封装的库函数// PWMB 配置
static void	PWM_config(u16 hz) // hz为0,停止,不为0, 播放的频率
{PWMx_InitDefine		PWMx_InitStructure;u16 Period;if (hz != 0) Period = (MAIN_Fosc / hz);// 配置PWM6PWMx_InitStructure.PWM_Mode    		= CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2PWMx_InitStructure.PWM_Duty    		= 0.5 * Period;	//PWM占空比时间, 0~PeriodPWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8PPWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB// 配置PWMBPWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255if (hz != 0) {PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE} else {PWMx_InitStructure.PWM_MainOutEnable= DISABLE;			//主输出使能, ENABLE,DISABLEPWMx_InitStructure.PWM_CEN_Enable   = DISABLE;			//使能计数器, ENABLE,DISABLE}PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB// 切换PWM通道PWM5_SW(PWM5_SW_P00);				// 初始化PWMB的中断NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}// 初始化
void Buzzer_init() {EAXSFR();		/* 扩展寄存器访问使能 *///推挽输出	P00P0_MODE_OUT_PP(GPIO_Pin_0); // 推挽输出默认是高电平P00 = 0; // 拉低
}// 按照指定频率播放
void Buzzer_play(u16 hz_value) {if (hz_value == 0) return;PWM_config(hz_value);
}u16 hz[] = {523 * 1, 587 * 1, 659 * 1, 698 * 1, 784 * 1, 880 * 1, 988 * 1, 523 * 2, 587 * 2, 659 * 2, 698 * 2, 784 * 2, 880 * 2, 988 * 2, 523 * 4, 587 * 4, 659 * 4, 698 * 4, 784 * 4, 880 * 4, 988 * 4, 523 * 8, 587 * 8, 659 * 8, 698 * 8, 784 * 8, 880 * 8, 988 * 8, 
};// 按照指定音节播放 1 2 3 4 5 6 7 8 ……
void Buzzer_beep(u8 hz_idx) {if (hz_idx == 0) return;PWM_config(hz[hz_idx - 1]);
}// 停止播放
void Buzzer_stop() {PWM_config(0);
}void  delay_ms_pro(unsigned int ms) {do{delay_ms(1);}while(--ms);
}#define	L1	1
#define	L2	2
#define	L3	3
#define	L4	4
#define	L5	5
#define	L6	6
#define	L7	7#define N0 0#define	N1	L1 + 7
#define	N2	L2 + 7
#define	N3	L3 + 7
#define	N4	L4 + 7
#define	N5	L5 + 7
#define	N6	L6 + 7
#define	N7	L7 + 7#define	H1	N1 + 7
#define	H2	N2 + 7
#define	H3	N3 + 7
#define	H4	N4 + 7
#define	H5	N5 + 7
#define	H6	N6 + 7
#define	H7	N7 + 7u8 code notes[] = {N6, N7, 			 H1, N7, H1, H3, 	  N7, N3, N3, 			N6, N5, N6, H1, 		 N5, N0, N3, N3,		N4, N3, N4, H1,N3, N0, H1, H1, H1,  N7, N4, N4, N7,	  N7, N0, N6, N7, 		H1, N7, H1, H3,			 N7, N0, N3, N3,		N6, N5, N6, H1,N5, N0, N3, 		 N4, H1, N7, N7, H1,  H2, H2, H3, H1, N0,   H1, N7, N6, N6, N7, N5,	 N6, N0, H1, H2,		H3, H2, H3, H5,H2, N0, N5,	N5,		 H1, N7, H1, H3,	  H3, N0, N0,			N6, N7, H1, N7, H2, H2,  H1, N5, N5, N0,		H4, H3, H2, H1,H3, 		 		 H3, N0, H3,		  H6, H5, H5,			H3, H2, H1, N0, H1, 	 H2, H1, H2, H2, H5, 	H3, N0, H3,H6,	H5,				 H3, H2, H1, N0, H1,  H2, H1, H2, H2, N7,   N6, N0, 
};u8 code durations[] = {2, 2, 				6, 2, 4, 4, 		  12, 2, 2, 			6, 2, 4, 4, 			8, 4, 2, 2,				6, 2, 2, 6,8, 2, 2, 2, 2, 	    6, 2, 4, 4,			  8, 4, 2, 2, 			6, 2, 4, 4,				8, 4, 2, 2,				6, 2, 4, 4,12, 2, 2, 			4, 2, 2, 4, 4,		  2, 2, 2, 4, 4, 		4, 2, 2, 2, 4, 4,		8, 4, 2, 2,				6, 2, 4, 4,8, 4, 2, 2,			2, 2, 4, 4,			  8, 4, 4,				2, 2, 4, 4, 2, 2, 		6, 2, 4, 4,				4, 4, 4, 4,16, 				8, 4,	4,			  8, 4, 4,				2, 2, 4, 2, 2, 			4, 2, 2, 2, 4, 		    8, 4, 4,8, 8,				2, 2, 8, 2, 2, 		  4, 2, 2, 2, 4, 		8, 4, 
};// 天空之城
void Buzzer_sky_city() {u8 i;u8 len = sizeof(notes) / sizeof(notes[0]);for (i = 0; i < len; i++) {Buzzer_beep(notes[i]);delay_ms_pro(50 * durations[i]);// 播完一个音,适当停止一下,不是必须得Buzzer_stop();delay_ms(10);}Buzzer_stop(); // 停止
}

注意事项

  • 有源蜂鸣器只需电平控制,无源蜂鸣器需频率信号
  • 驱动电流较大时建议增加三极管或MOS管放大信号
  • STC8系列不同型号的寄存器可能存在差异,需查阅对应数据手册

以上代码示例适用于STC8H系列,其他STC8子系列需根据具体手册调整寄存器配置。实际开发中建议使用STC官方提供的头文件(如STC8H.h)以确保兼容性。

http://www.dtcms.com/a/323468.html

相关文章:

  • ECML PKDD 2025 | 时间序列(Time Series)论文总结
  • “秦时明月”提前布局商标被电视剧侵权!
  • 深入理解 RedisTemplate:简化 Java 与 Redis 的交互!
  • 【系统编程】进程创建
  • 本地进行语音文字互转
  • 国内外大模型体验与评测
  • Vue2 字段值映射通用方法
  • Python 属性描述符(描述符用法建议)
  • 基于Prometheus、Grafana、Loki与Tempo的统一监控平台故障排查与解决方案
  • redis开启局域网访问
  • C++讲解---通过转换函数和运算符函数直接调用类的对象
  • Horse3D引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形
  • Aurora设计注意问题
  • 【递归、搜索和回溯】FloodFill 算法介绍及相关例题
  • 11. 为什么要用static关键字
  • 香橙派 RK3588 部署千问大模型 Qwen2-VL-2B 多轮交互式对话
  • 【工具】Python多环境管理
  • ubuntu安装ollama流程
  • Day 8: 深度学习综合实战与进阶技术 - 从优化到部署的完整流程
  • Java+Vue打造的采购招投标一体化管理系统,涵盖招标、投标、开标、评标全流程,功能完备,附完整可二次开发的源码
  • 数据结构day06
  • 102-基于Spark的招聘数据预测分析推荐系统
  • 物质和暗物质形成机制
  • 【排序算法】④堆排序
  • 工具箱许愿墙项目发布
  • AI_RAG
  • 复现论文关于3-RPRU并联机器人运动学建模与参数优化设计
  • 机器翻译实战:使用Gensim训练中英文词向量模型及可视化
  • Android之gradle和gradlew命令编译项目总结
  • 消息队列核心功能和消息队列做异步的优势