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

库函数蜂鸣器的使用(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.xdnf.cn/news/17473.html

相关文章:

  • Typora上传图片保存到assets目录下
  • 线程池多反应堆服务器webserver(c++)
  • Web文件上传:本地与云存储实战
  • 数据分析框架从 “工具堆砌” 转向 “智能协同”
  • 每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min
  • 【JVM】深入解析Java虚拟机
  • 全志MPP学习(1)-全志MPP概念理清
  • VisionPro常用标定方式
  • Java学习Collection单列集合中的三种通用遍历方法
  • CPO-SVM分类预测+特征贡献SHAP分析,通过特征贡献分析增强模型透明度,Matlab代码实现,引入SHAP方法打破黑箱限制,提供全局及局部双重解释视角
  • Vue 服务端渲染(SSR)详解
  • 饿了么零售 sign 分析
  • [ MySQL 数据库 ] 环境安装配置和使用
  • 支付宝「安全发-甲方直发」架构详解及与「安全发ISV模式」对比
  • 二十八天(数据结构:图的补充)
  • 仓颉编程语言的match表达式
  • 【科研绘图系列】R语言绘制气泡图
  • 用户、组和目录的磁盘配额
  • GDB 调试全方位指南:从入门到精通
  • CSS--后端也有自己的CSS要学
  • 二、RuoYi-Cloud-Plus 拉取到本地的准备和注意事项
  • 睿抗开发者大赛国赛-24
  • 《设计模式之禅》笔记摘录 - 14.组合模式
  • 库函数NTC采样温度的方法(STC8)
  • Seata分布式事务环境搭建
  • linux-LVM 逻辑卷管理
  • Uniworld-V1、X-Omni论文解读
  • 数据结构(二叉树)
  • 【ee类保研面试】其他类---计算机网络
  • 机器学习之支持向量机(原理)