使用库函数控制蜂鸣器(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.pswp.cn/diannao/94904.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94904.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94904.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis8.0.3部署于mac

macOS11因版本过低&#xff0c;安装redis时&#xff0c;Homebrew和源码编译两种方式都无法成功。将操作系统升级至macOS15再安装。Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值…

【和春笋一起学C++】(三十三)名称空间的其他特性

目录 嵌套式名称空间 拓展——未命名的名称空间 嵌套式名称空间 示例代码1&#xff1a; namespace electronicEquipment {namespace computer{double price 4999.0;string modelNumber;string name;}namespace ElectronicWatch{double price 99.0;string modelNumber;stri…

异步电动机负载运行特性全解析

异步电动机负载运行特性详解 ——从空载到负载的完整分析一、为什么需要再谈“负载运行” 在上一篇《感应电动机空载特性深度剖析》中&#xff0c;我们已经看到&#xff1a;空载时&#xff0c;若定子加额定电压&#xff0c;转子转速 $n \approx n_s$&#xff08;同步转速&#…

使用 Ansys Discovery 进行动态设计和分析

Ansys Discovery 是一款多功能工具&#xff0c;为创建模型、探索仿真设计和分析解决方案提供了一个单一的交互式工作区。它允许用户使用直接建模技术创建和修改几何结构&#xff0c;定义仿真并与结果实时交互。Discovery 支持结构、流体流动、热和电磁设计&#xff0c;提供直观…

力扣热题100-----118.杨辉三角

案例 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1]] 提示: 1 …

NTP /Chrony 网络时间协议

一、NTP&#xff08;network time protocol&#xff09;网络时间协议&#xff1a;实现时间同步&#xff0c;让设备时间与国际标准时间保持一致设备日志、服务日志需要记录时间分布式系统&#xff08;分布式数据库、分布式缓存、分布式储存、消息队列&#xff09;时间戳&#xf…

VSCode 刷 LeetCode 算法题配置教程

LeetCode 在线刷题地址&#xff1a;https://leetcode-cn.com/ 一、安装 Node.js 环境 LeetCode 插件依赖 node.js 运行环境&#xff0c;因此必须先安装&#xff1a; 前往官网下载安装&#xff1a;https://nodejs.cn/download/下载好的压缩包解压&#xff0c;可以看到当前文件…

非常简单!从零学习如何免费制作一个lofi视频

想必大家在网上会看到如下类似的音乐频道&#xff0c;这类频道都只是上传简单的Lo-Fi音乐带着循环播放的背景就可以赚钱。 那么上面的效果如何实现的呢&#xff1f;今天做一个可以免费制作lo-Fi音乐的教程。 Lo-Fi音乐&#xff1a; Lo-Fi音乐是一种以低保真度和模拟音色为特点…

基于 RAUC 的 Jetson OTA 升级全攻略

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry 基于 RAUC 的 Jetson OTA 升级全攻略 0. 引子&#xff1a;常见问题 在 Jetson 平台做 OTA 升级时&#xff0c;你可能会问&…

MySQL 主备(Master-Slave)复制 的搭建

一、主备架构简介 Master&#xff08;主库&#xff09;&#xff1a;负责处理所有写操作&#xff08;INSERT/UPDATE/DELETE&#xff09;&#xff0c;并记录二进制日志&#xff08;binlog&#xff09;。Slave&#xff08;备库&#xff09;&#xff1a;从主库拉取 binlog&#xff…

【三个数绝对值排序】2022-10-10

缘由绝对值比较&#xff0c;总是跑不过怎么办-编程语言-CSDN问答 template <class 形参> inline void 算交换(形参& a, 形参& b){ 形参 ab a - b; a - ab; b ab; } template <class 形参> void 三个升序(形参& a, 形参& b, 形参& c) {if (a…

【LoRA模型训练】Stable Diffusion LoRA 模型秋叶训练器详细教程

一、工具简介与安装指南 1.1 秋叶 LoRA 训练器概述 秋叶 LoRA 训练器&#xff08;基于 Akegarasu/lora-scripts 项目&#xff09;是针对 Stable Diffusion 模型的轻量化微调工具&#xff0c;通过低秩适应&#xff08;LoRA&#xff09;技术实现高效参数微调。其核心优势在于&a…

C++2024 年一级

1 单选题 (每题 2 分,共 30 分) 12 ⽉ 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 C C D B B D B C C C D C D B D 第 1 题 2024年10⽉8⽇ &#xff0c;诺贝尔物理学奖“意外地”颁给了两位计算机科学家约翰霍普菲尔德&#xff08;John J. Hopfield&#xff09;和杰 弗⾥⾟…

react-window

下面&#xff0c;我们来系统的梳理关于 React 虚拟化列表&#xff1a;react-window 的基本知识点&#xff1a;一、虚拟化列表核心概念 1.1 什么是虚拟化列表&#xff1f; 虚拟化列表&#xff08;也称为窗口化&#xff09;是一种只渲染当前可见区域列表项的技术&#xff0c;而不…

2025AI颠覆认知!解锁智能新纪元

清晨的城市还裹着薄雾时&#xff0c;通勤族的手机已经自动规划好最优路线——避开施工路段、实时更新交通状况&#xff0c;连早餐店排队人数都能精准预测。这不是科幻电影里的片段&#xff0c;而是2025年AI深度融入生活的寻常场景。当数字化与智能化浪潮席卷而来&#xff0c;我…

实用Shell高级视频课程

实用Shell高级视频课程 Shell三剑客sed我网盘给你分享了「实用Shell高级视频课程」&#xff0c;点击链接或复制整段内容&#xff0c;打开「APP」即可获取。/bc3b37jg8i:/链接&#xff1a;http://t.cn/A6swtV7u提取码&#xff1a;ePV4 ​​​

hive-日期拆分为多行

hive-日期拆分为多行 代码 SELECT begin_date,date_add(begin_date, tmp.pos),end_date,d_days,tmp.pos,tmp.val FROM (SELECT begin_date,end_date,DATEDIFF(end_date, begin_date) AS d_daysFROM (SELECT 2025-08-01 AS begin_date,2025-08-10 AS end_date) a) b LA…

全志MPP学习(1)-全志MPP概念理清

文章目录1、全志MPP1.1、MPP-Framework1.2、MPP-Middleware1.3、MPP-Framework和MPP-Middleware之间的关系2、总结1、全志MPP 全志MPP&#xff08;Media Process Platform&#xff09;媒体处理软件平台&#xff0c;分为 mpp-middleware 和 mpp-framework 两部分。 mpp-middlew…

Linux操作系统启动项相关研究与总结

Linux操作系统启动项相关研究与总结 一、Linux Systemd 服务创建与管理研究 1. Systemd 服务基础 1.1 Systemd 服务文件位置 1.2 服务文件基本结构 2. 创建自定义 Systemd 服务 2.1 基本服务文件示例 2.2 服务文件详细配置选项 [Unit] 部分常用指令: [Service] 部分常用指令:…

Go map 的性能革命:深入解析从链表到 Swiss Table 的优化之路

你好&#xff0c;Gopher&#xff01;map 作为 Go 语言中最核心、最常用的数据结构之一&#xff0c;其性能直接影响着我们程序的效率。在 Go 1.24 版本中&#xff0c;map的底层实现迎来了一次意义深远的变革&#xff0c;从沿用多年的“哈希桶链表”结构&#xff0c;悄然升级为了…