嵌入式进阶——蜂鸣器

🎬 秋野酱:《个人主页》
🔥 个人专栏:《Java专栏》《Python专栏》

⛺️心若有所向往,何惧道阻且长

文章目录

    • 蜂鸣器
    • 原理图
    • 测试发声
    • 乐理知识
    • 乐理应用
    • PWM测试发声
    • PWM驱动封装

蜂鸣器

蜂鸣器是一种能够产生固定频率的声音的电子元件。它通常由振膜、震荡器、放大器和声音反馈电路等部分组成。振膜是蜂鸣器中最核心的部分,它能够将电信号转换为机械振动,产生声音。震荡器提供稳定的电信号,用于驱动振膜产生振动。放大器用于放大电信号的幅度,以便产生足够的声音。声音反馈电路可以提供反馈信号,帮助系统稳定。
蜂鸣器广泛应用于电子设备中,例如电子钟、警报器、电子琴等。它们的声音频率通常在1 kHz到10 kHz之间,具有尖锐而刺耳的特点。蜂鸣器的种类很多,例如电磁式蜂鸣器、压电式蜂鸣器、有源蜂鸣器、无源蜂鸣器等等。不同类型的蜂鸣器具有不同的特点和应用场景。
电子爱好者和开发者通常会使用蜂鸣器作为一种简单而有效的提示器件。例如,在嵌入式系统中,可以通过控制蜂鸣器发出不同的声音来实现提示、警报、提醒等功能。一些开发板和单片机也通常带有蜂鸣器接口,方便开发者使用。
通常我们在开发中用到最多的是 有源蜂鸣器和无源蜂鸣器。有源的直接接电源即可发声。无源的需要连接一个变化频率的电源上,才能发出声音。

原理图

在这里插入图片描述

● 采用P0.0引脚控制三极管的导通
肖特基二极管:
当蜂鸣器在工作时,会产生电磁感应。
当电源关闭或蜂鸣器停止振动时,会产生一个瞬态的电压峰值,这会产生反向电流,可能会对电路及蜂鸣器造成损害或影响其寿命。肖特基二极管可以通过其低的正向电压降和快速反向恢复特性,有效地防止反向电流损害电路。
此外,肖特基二极管的快速开关特性也能够减小蜂鸣器电路中的开关噪声和干扰,提高电路的稳定性和可靠性。因此,在蜂鸣器电路中加入肖特基二极管是一种常见的电路保护和稳定化措施。
肖特基二极管的作用

  1. 快速开关:肖特基二极管具有快速的反向恢复特性,可以快速地从导通到截止转变,因此它通常用于高频开关电路中。
  2. 低正向压降:与普通二极管相比,肖特基二极管具有更低的正向电压降,因此在需要低功耗和高效率的电路中使用时,肖特基二极管可以降低电路中的功耗和热损失。
  3. 防反向漏电流:由于肖特基二极管是由金属和半导体接触组成的,因此在正向偏置时,不会发生少数载流子注入的现象,从而降低了漏电流。
  4. 温度特性好:由于金属与半导体接触,所以肖特基二极管具有良好的温度特性。在高温环境下,肖特基二极管的电性能仍能保持稳定。
    因此,肖特基二极管在高频开关电路、低功耗电路和功率电子等领域中得到了广泛的应用。
    三极管并联电阻
    在三极管的放大电路中,通常会并联一个电阻,这个电阻被称为集电极负载电阻。
    这个集电极负载电阻的作用是:
  5. 稳定直流工作点:集电极负载电阻可以使三极管的直流工作点更加稳定。由于三极管是非线性器件,其直流放大倍数随着工作点的改变而变化。通过加入集电极负载电阻,可以限制直流工作点的漂移,保证放大电路的直流稳定性。
  6. 改善交流性能:集电极负载电阻还可以改善放大电路的交流性能。通过控制集电极电流,可以改变三极管的放大倍数,从而实现对输入信号的放大。同时,集电极负载电阻还可以限制输出幅度,避免过度放大造成信号失真。
  7. 防止三极管损坏:当输入信号过大时,三极管的集电极电压可能会超过其最大耐压值,从而造成三极管损坏。通过加入集电极负载电阻,可以限制输出幅度,避免超过三极管的最大耐压值,从而保护三极管。
    因此,三极管放大电路中并联一个集电极负载电阻是一种常见的电路设计技巧,可以提高电路的性能和稳定性,同时保护三极管免受过电压损坏。

在三极管放大电路中,集电极负载电阻的阻值会影响电路的放大倍数、直流工作点以及输出电阻等性能。
通常情况下,集电极负载电阻的阻值需要根据具体的电路设计要求来确定。一般来说,阻值不应过大或过小,一般取值范围在几百欧姆到几千欧姆之间。
如果集电极负载电阻的阻值太大,会导致放大倍数过低,使得电路的放大效果不理想。另外,由于三极管的输出电阻较小,集电极负载电阻的阻值过大还会导致电路的输出电阻过大,降低电路的输出功率。
如果集电极负载电阻的阻值太小,会导致放大倍数过高,使得电路容易失真或产生饱和现象。同时,由于直流工作点的不稳定性,集电极负载电阻的阻值过小还会导致直流工作点的漂移,降低电路的直流稳定性。
因此,在实际电路设计中,需要根据具体要求综合考虑电路性能和稳定性等因素,选取适当的集电极负载电阻阻值。

测试发声

#include "config.h"
#include "GPIO.h"
#include "delay.h"

#define BUZZER	P00

void GPIO_config(void) {
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_0;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化
}

int main() {
	GPIO_config();
	EA = 1;
	
	while(1) { // 每个循环约4ms,每秒1000ms/4ms = 250次,即频率为250Hz
		P00 = 1;
		delay_ms(2);
		P00 = 0;
		delay_ms(2);
	}
}

通过控制delay_ms的时间,控制发声的频率,来观察蜂鸣器的发声情况。

乐理知识

乐理知识从专业角度来说,包含了很多内容,包括音高、音阶、节奏、和声、旋律、调性、节拍等等方面的知识。
补充知识,不做要求。

  1. 音高:音高是音乐中的一个基本元素,指的是声音高低的程度。常用的表示音高的符号是音符,不同的音高可以使用不同的音符来表示。
  2. 音阶:音阶是一组按照音高顺序排列的音符组成的序列。常用的音阶包括了大调音阶和小调音阶等。
  3. 节奏:节奏是指音乐中的强弱、快慢、持续时间等方面的时间关系。节奏可以通过节拍器或其他的打击乐器来表现。
  4. 和声:和声是指多个声音同时进行时的相互关系。和声可以表现出不同的和声效果,如和弦、和声进程等。
  5. 旋律:旋律是指音乐中的主旋律,是由一系列按照音高顺序排列的音符组成的。旋律可以使用不同的节奏来表现出不同的效果。
  6. 调性:调性是指音乐中的调性关系。常用的调性包括了大调和小调等。
  7. 节拍:节拍是指音乐中的基本的时间单位,用于表示节奏的强弱、快慢等方面的特征。节拍通常使用不同的时间符号来表示。
  8. 同音重复:同音重复是指在不同的位置或时间上出现相同的音符或音高。
    在此呢,我们不研究更全面更深入的乐理知识,我们从我们的常识方面入手,了解简单的发声即可。
    哆来咪发唆拉西哆
    哆来咪发唆拉西哆(Do-Re-Mi-Fa-So-La-Ti-Do)是音乐中的一个音阶记号,也是西方音乐中最基本的一个音阶。它由八个不同的音符组成,分别是:Do、Re、Mi、Fa、So、La、Ti、Do。这些音符分别代表了一个八度内的不同音高。
    在音乐教学中,哆来咪发唆拉西哆常常被用来作为基础训练的内容。通过唱出哆来咪发唆拉西哆,可以帮助学生了解不同音符之间的音高关系,掌握音乐中的基本音程和旋律。同时,哆来咪发唆拉西哆也是很多歌曲的基础,学会了这个音阶,就可以更好地理解和演唱这些歌曲。
    哆来咪发唆拉西哆可以用不同的乐谱表示方式来呈现。以下是常见的两种表示方式:
  9. 数字表示法:数字表示法将每个音符用数字来代表,Do为1,Re为2,Mi为3,Fa为4,So为5,La为6,Ti为7,Do(高八度)为8。因此,哆来咪发唆拉西哆的数字表示法为:1 2 3 4 5 6 7 8。
  10. 符号表示法:符号表示法用特定的符号来表示每个音符,包括大写字母(如C、D、E、F、G、A、B)、升降符号(如#、b)和八度符号(如’)。哆来咪发唆拉西哆的符号表示法为:C D E F G A B C’。
    需要注意的是,不同的乐器和音高区间可能使用不同的记谱方式,但哆来咪发唆拉西哆作为最基本的音阶,通常都可以用以上两种方式表示。
    十二平均律
    十二平均律是现代西方音乐中最广泛使用的音高系统,它的作用可以从以下几个方面来理解:
  11. 方便协调和配合:由于十二平均律将八度音程划分成12个等分,每个等分的音高间隔相等,不同的调式可以使用相同的音高间隔,因此方便不同乐器、不同声部之间的协调和配合。
  12. 增加音乐的表现力:十二平均律中的半音音程比纯律(一种古老的音高系统)中的半音更小,因此可以创造更多的音高变化,增加音乐的表现力。
  13. 适应和反映现代音乐的需求:现代音乐中常常出现的复杂和离奇的调性变化,需要更加灵活和多变的音高体系,而十二平均律可以提供这种灵活性和多变性。
    总之,十二平均律作为一种现代音乐基础的音高系统,为不同音乐风格和流派的发展提供了有力的支持,成为现代音乐的不可或缺的一部分。
    专业的术语理解起来比较抽象,对于乐理不是很了解的可以这样理解:
  14. 我们将音乐的音高分为12个等分。类似我们拼音中的4声(类比说法,还是有区别的)
  15. 我们在12个音高中对应了我们的哆来咪发唆拉西哆
  16. 要发出不同的音高,需要不同的频率来发声。

在这里插入图片描述

乐理应用

Timer测试发声
我们通过timer进行 【哆来咪发唆拉西哆】 测试,timer的延时比较准确。

#include "Config.h"
#include "GPIO.h"
#include "Delay.h"

#include "Timer.h"
#include "NVIC.h"

#define BUZZER	P00

//			 C`	   D`     E`   F`	  G`	A`	  B`    C``
u16 hz[] = {1047, 1175, 1319, 1397, 1568, 1760, 1976, 2093};

void GPIO_config() {
    P0_MODE_OUT_PP(GPIO_Pin_0);
}
void	Timer_config(u16 hz_value)
{
    TIM_InitTypeDef		TIM_InitStructure;						//结构定义
    //定时器0做16位自动重装, 中断频率为1000HZ
    TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
    TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;		//指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
    TIM_InitStructure.TIM_ClkOut    = DISABLE;				//是否输出高速脉冲, ENABLE或DISABLE
    TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / (hz_value * 2));		//初值,
    TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLE
    Timer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4
    NVIC_Timer0_Init(ENABLE,Priority_0);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

/**
举例:如下是3个完整周期
--    --    --    
  |  |  |  |  |  
   --    --    --
**/

void timer0_func() {
    BUZZER = ~BUZZER;
}

void main() {
		u8 idx = 0;
    GPIO_config();

//    Timer_config();

    EA = 1;

    // 有源蜂鸣器,才可以直接通过高电平响起
    // BUZZER = 1;

    // 20-20000Hz
    // 舒适: 1000-4000Hz

    while(1) {

        Timer_config(hz[idx]);

        if(++idx > 7){
            idx = 0;
        }
				
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
				
    }

}

PWM测试发声

最准确的方式我们还可以选择PWM进行控制,这个也是常用的方式。
在这里插入图片描述

#include "Config.h"
#include "GPIO.h"
#include "Delay.h"

#include "STC8H_PWM.h"
#include "Switch.h"
#include "NVIC.h"

#define BUZZER	P00

//			   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};

void GPIO_config() {
    P0_MODE_OUT_PP(GPIO_Pin_0);
}

//#define PERIOD (MAIN_Fosc / 1000)
//PWMx_Duty dutyB;
void	PWM_config(u16 hz_value)
{
    PWMx_InitDefine		PWMx_InitStructure;
	
	u16 Period = MAIN_Fosc / hz_value;

    // 配置PWM5
    PWMx_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_MODE2
    PWMx_InitStructure.PWM_Duty   	 	= (u16)(Period * 0.5);	//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB

    // 配置PWMB
    PWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

    // 切换PWM通道
    PWM5_SW(PWM5_SW_P00);					//PWM5_SW_P20,PWM5_SW_P17,PWM5_SW_P00,PWM5_SW_P74

    // 初始化PWMB的中断
    NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}
/**
举例:如下是3个完整周期
--    --    --
  |  |  |  |  |
   --    --    --
**/

void main() {
    u8 idx = 0;
	
	// 扩展寄存器使能
	EAXSFR();
	
    GPIO_config();
	
    EA = 1;

    // 有源蜂鸣器,才可以直接通过高电平响起
    // BUZZER = 1;

    // 20-20000Hz
    // 舒适: 1000-4000Hz

    while(1) {

        PWM_config(hz[idx]);

        if(++idx > 7) {
            idx = 0;
        }

        delay_ms(250);
        delay_ms(250);
        delay_ms(250);
        delay_ms(250);

    }

}

PWM驱动封装

可以将蜂鸣器的代码进行封装,这样方便以后调用

#ifndef __BUZZER_H__
#define __BUZZER_H__

#include "Config.h"

// 初始化蜂鸣器
void Buzzer_init();

// 按照指定频率播放
void Buzzer_play(u16 hz_val);

// 停止播放
void Buzzer_stop();

#endif
#include "Buzzer.h"

#include "GPIO.h"
#include "STC8H_PWM.h"
#include "Switch.h"
#include "NVIC.h"

//			   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};


static void GPIO_config(void) {
	GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
	GPIO_InitStructure.Pin  = GPIO_Pin_0;		//指定要初始化的IO,
	GPIO_InitStructure.Mode = GPIO_OUT_PP;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
	GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化
}

void Buzzer_init(){
	EAXSFR();
	
	GPIO_config();
}

void Buzzer_beep(u8 hz_val_index){ // 1,2,3,4 ... 7
	
	u16 hz_val = hz[hz_val_index - 1];
	
	Buzzer_play(hz_val);
}


void Buzzer_play(u16 hz_val){
	
    u16 Period = MAIN_Fosc / hz_val;
    PWMx_InitDefine		PWMx_InitStructure;

		// PWM5
    PWMx_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_MODE2
    PWMx_InitStructure.PWM_Duty   	 	= (int)(Period * 0.005);	//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect    = ENO5P;			//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM5, &PWMx_InitStructure);			//初始化PWM,  PWMA,PWMB

		// PWMB
    PWMx_InitStructure.PWM_Period   = Period - 1;			//周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

    PWM5_SW(PWM5_SW_P00);					//PWM5_SW_P20,PWM5_SW_P17,PWM5_SW_P00,PWM5_SW_P74

    NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}


void Buzzer_stop(){
		
    PWMx_InitDefine		PWMx_InitStructure;
    PWMx_InitStructure.PWM_MainOutEnable= DISABLE;				//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = DISABLE;				//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);				//初始化PWM,  PWMA,PWMB
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/647302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库中的多表查询/连接查询操作

类型:内连接 ,外连接{左外连接,右外连接} 之所以要使用连接查询的意义就是为了,借助数据库可以避免大量的数据重复。 进行连接查询的前提是要求多张表之间存在相关联的字段。 这里指的相关联的字段就是表与表之间存在着关系&am…

linux 常用命令:find grep ps netstat sudo df du rm

rm 命令 删除 -r 是递归参数(recursive),用于删除目录及其内容。如果不加这个参数,rm 命令无法删除非空目录。-f 是强制参数(force),用于强制删除文件或目录,不会进行任何确认提示…

windows 搭建 go开发环境

go语言(或 Golang)是Google开发的开源编程语言,诞生于2006年1月2日下午15点4分5秒,于2009年11月开源,2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须…

Android network — 进程指定网络发包

Android network — 进程指定网络发包 0. 前言1. 进程绑定网络1.1 App进程绑定网络1.2 Native进程绑定网络 2. 源码原理分析2.1 申请网络requestNetwork2.2 绑定网络 BindProcessToNetwork 3. 总结 0. 前言 在android 中,一个app使用网络,需要在manifest…

从零开始搭建Springboot项目脚手架4:保存操作日志

目的:通过AOP切面,统一记录接口的访问日志 1、加maven依赖 2、 增加日志类RequestLog 3、 配置AOP切面,把请求前的request、返回的response一起记录 package com.template.common.config;import cn.hutool.core.util.ArrayUtil; import cn.hu…

【C/C++】Makefile文件的介绍与基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

烟囱ERP系统

一、烟囱系统定义 “烟囱式”系统&#xff0c;来自维基百科的解释是&#xff1a;一种不能与其他系统进行有效协调工作的信息系统&#xff0c;又称为孤岛系统。 二、烟囱系统的案例 比如&#xff1a;就像以下一样&#xff0c;各个系统之间是独立的&#xff0c;所有对接是通过…

揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!

文章目录 前言1.标题1.1 使用 和 - 标记一级和二级标题1.2 使用 # 号标记 2.段落格式2.1 字体2.2 分割线2.3 删除线2.4 下划线2.5 脚注 3.列表3.1 无序列表3.2 有序列表3.3 列表嵌套 4.区块4.1 区块中使用列表4.2 列表中使用区块 5.代码代码区块 6.链接7.图片8.表格9.高级技巧…

访问元组元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;如果想将元组的内容输出也比较简单&#xff0c;可以直接使用print()函数即可。例如&#xff0c;要想打印上面元组中的untitle…

嵌入式进阶——震动马达

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 原理图控制分析功能设计 原理图 控制分析 S8050 NPN三极管特性 NPN型三极管的工作原理是基于PN结和PNP型晶体管的工作原理。 当外…

【大数据面试题】32 Flink 怎么重复读 Kafka?

一步一个脚印&#xff0c;一天一道面试题 首先&#xff0c;为什么要读过的 Kafka 数据重写读一次呢&#xff1f;什么场景下要怎么做呢&#xff1f; 答&#xff1a;当任务失败&#xff0c;从检查点Checkpoint 开始重启时&#xff0c;检查点的数据是之前的了&#xff0c;就需要…

扩散模型学习1

DDPM 总体训练原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 讲得很好&#xff1a;每次都是输入t和noise-x的图像&#xff0c;预测noise之后得到和加入的noise比较&#xff1b…

【Spring】深入理解 Spring 上下文(Context)层次结构

前言 在使用 Spring 框架进行应用程序开发时&#xff0c;Spring 上下文&#xff08;Context&#xff09;是一个非常重要的概念。Spring 上下文提供了一个环境&#xff0c;用于管理应用程序中的对象&#xff08;通常称为 Bean&#xff09;及其之间的依赖关系。在复杂的应用程序…

Virtual Box安装Ubuntu及设置

Virtual Box安装Ubuntu及设置 本文包含以下内容&#xff1a; 使用Virtual Box安装Ubuntu Desktop。设置虚拟机中的Ubuntu&#xff0c;使之可访问互联网并可通过SSH访问。 Ubuntu Desktop下载 从官网下载&#xff0c;地址为&#xff1a;Download Ubuntu Desktop | Ubuntu U…

HTML.

HTML:超文本标记语言&#xff08;Hyper Text Markup Language&#xff09; 超文本&#xff1a;不同于普通文本&#xff0c;可以定义图片&#xff0c;音频&#xff0c;视频等内容 标记语言&#xff1a;由标签构成的语言 HTML标签都是预定义好的HTML代码直接在浏览器中运行&#…

B站大数据分享视频创作300天100+原创内容4000+粉

以今年五一作为一个里程碑参考点&#xff0c;给明年一个可以比较的数据。 我正经发力创作是2023.06.17 (前面几个视频是试水)&#xff0c;300天不到一年时间 创作了100原创数据相关视频&#xff0c;创作频率应该很高了&#xff0c;收获了下面几个数字&#xff0c;审视自身&…

Cadence OrCAD学习笔记(3)capture使用技巧_1

本期介绍capture的一些使用技巧。资料来源于小破站up主硬小二 1、导出像Visio规格的图纸 2、全局修改元件属性 然后保存、关闭即可。 3、导出BOM 4、导出网表 5、元件自动编号 6、capture软件和allegro关联 7、新建原理图symbol 以上为添加封装库的路径 如果要创建多部分的sy…

Pandas 多层索引中的索引和切片操作你学会了吗

1. Series的索引操作 对于Series来说&#xff0c;直接中括号[]与使用 .loc() 完全一样 显式索引 # 导包import numpy as npimport pandas as pd data np.random.randint(0,100,size6) index [ ["1班","1班","1班","2班","…

MySQL事务篇1:事物的四大特性(ACID)、三类数据读取问题与隔离级别

一、什么是事务&#xff1f; MySQL的事务&#xff08;Transaction&#xff09;是一组由数据库管理系统&#xff08;DBMS&#xff09;执行的一个或多个SQL语句的集合&#xff0c;这些SQL语句作为一个单独的工作单元执行。事务的主要目的是确保数据库的一致性和完整性&#xff0c…

Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放 引言一、设计思路二、进阶版大致思路三、参考链接 引言 Qt控件自适应字体大小可以用adjustSize()函数&#xff0c;但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件…