庫函數蜂鳴器的使用(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.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;悄然升級為了…