51单片机电子琴实战:从方波发声到PCB设计的完整指南

简介:这是一份基于51单片机的电子琴课程设计文档,以STC89C52为核心控制器,覆盖复位与震荡电路、4×4矩阵键盘、数码管与LED节拍指示、蜂鸣器发声、定时器中断等完整知识链,适合电子、测控等专业学生完成课程设计或入门嵌入式开发时参考。文档共1个文件,为doc格式,压缩包大小867KB,内附设计说明书正文,包含总体方案、程序框图、关键单元电路与程序代码、调试过程、原理图与PCB图、实物图及附录总程序,可按目录快速定位。目前已有148人浏览学习。作者以实际项目出发,详细讲解了音乐音调与节拍如何编码成数据表、T0高优先级驱动蜂鸣器、T1做节拍指示等实现细节,并给出C51程序与调试排错经验,不仅能帮助理解单片机工作原理,也能直接作为电子琴设计的方案模板和答辩参考资料。 做51单片机电子琴,最容易翻车的地方不在程序逻辑,而在两件事上:一是蜂鸣器怎么弄都不响,二是响是响了,声音听起来却完全不对味。我自己前前后后做过好几套不同方案的电子琴,从最早洞洞板搭的8键版本,到后来画PCB的14键升级版,踩过的坑基本都集中在发声原理的理解、硬件驱动选型和PCB布局这三个层面。这篇博文把整套设计流程完整拆一遍,从音符频率的计算、元器件的选型思路,到原理图、PCB和程序的具体设计,再到联调阶段的排错方法,全部按我实际走过的路线来写。手里有原理图、PCB和程序文件但还没完全看懂设计逻辑的朋友,以及正在准备课程设计、毕业设计或者单纯想自己焊一台电子琴玩的人,都可以直接拿这份内容做参考。

1. 发声原理先行:51单片机如何用方波“唱”出音符

1.1 定时器驱动IO翻转:最简单的“电子音乐”实现方式

51单片机本质上是数字器件,本身不能直接产生连续变化的模拟音频信号。它唯一能做的就是让某个IO口以特定频率在高电平和低电平之间来回切换,输出一串方波。方波送到蜂鸣器或者喇叭上,振膜被推动,空气跟着振动,人耳就听到了声音。翻转频率决定音高,频率越高声音越尖,频率越低声音越沉。整个电子琴项目最底层的原理就这么一句话。

但“让IO口按特定频率翻转”这件事,实现方式有讲究。最笨的办法是延时翻转:IO拉高、延时、拉低、延时,循环往复。这种方式代码写起来很简单,但有个致命问题——CPU被延时函数占死了,翻转期间没法扫描按键,也没法驱动数码管显示,整个系统只能干“发声”这一件事。所以实际项目里普遍用定时器中断来做:定时器计数到设定值后触发中断,在中断服务函数里翻转IO口,然后立刻返回主循环。翻转频率由定时器初值精确控制,主循环则腾出手来处理按键扫描和显示刷新,两部分互不干扰。这就是电子琴软件架构的地基。

1.2 音符频率与定时器初值:一张表看懂乐理和数学的换算

频率怎么定?标准乐理里,国际标准音A4的频�率是440Hz,十二平均律规定相邻两个半音之间的频率比恒定为2的1/12次方,约等于1.05946。但入门设计完全不用从这么底层开始算,直接用C大调自然音阶的频率表就行。中音do(C4)是262Hz,re(D4)是294Hz,mi(E4)是330Hz,fa(F4)是349Hz,sol(G4)是392Hz,la(A4)是440Hz,si(B4)是494Hz,高音do(C5)是523Hz,后面每个音依此类推。

有了目标频率,接下来就是定时器初值的计算。以最常见的12MHz晶振加STC89C52单片机为例,12T模式下机器周期等于12除以晶振频率,正好是1微秒。定时器0工作在方式1,也就是16位计数模式,从初值x开始向上计数,直到65536溢出。要产生频率为f的方波,IO口必须在1/(2f)秒内翻转一次,翻转两次才是一个完整的方波周期。所以定时时长T等于1/(2f),初值就等于65536减去T除以1微秒的商。

这里有两个容易搞错的点,我在检查别人代码时经常看到。第一,有人忘了算半周期,直接用1/f去算,结果声音整体高了一个八度。第二,有人把频率换算成微秒时小数点处理错了,导致每个音都偏。我自己的习惯是每个初值算完后都用公式反算一遍实际频率,偏差超过0.2%就回头检查晶振频率和换算过程。下面这组数据是我在12MHz晶振下算好的,可以直接抄进代码里。

音名 频率(Hz) 定时时长(μs) 计数初值(十进制) 初值(Hex)
中音1 (C4) 262 1908 63628 0xF88C
中音2 (D4) 294 1701 63835 0xF95B
中音3 (E4) 330 1515 64021 0xFA15
中音4 (F4) 349 1433 64103 0xFA67
中音5 (G4) 392 1276 64260 0xFB04
中音6 (A4) 440 1136 64400 0xFB90
中音7 (B4) 494 1012 64524 0xFC0C
高音1 (C5) 523 956 64580 0xFC44
高音2 (D5) 587 852 64684 0xFCAC
高音3 (E5) 659 759 64777 0xFD09
高音4 (F5) 698 716 64820 0xFD34
高音5 (G5) 784 638 64898 0xFD82
高音6 (A5) 880 568 64968 0xFDC8
高音7 (B5) 988 506 65030 0xFE06

2. 硬件方案选型:喇叭怎么选、按键怎么排、显示要不要加

2.1 发声器件与驱动电路:有源蜂鸣器第一个出局

很多人第一次买蜂鸣器就踩了坑。蜂鸣器分有源和无源两类,有源蜂鸣器内部自带振荡电路,一上电就以固定频率发声,只能当“闹钟”用,完全没法改变音调,做电子琴直接出局。无源蜂鸣器没有内部振荡源,需要外部方波驱动,这才是我们要的。无源蜂鸣器又分压电式和电磁式,压电式便宜但声音偏小,适合做门铃那种提示音;电磁式声音更饱满,配合驱动三极管使用,在室内环境已经足够。

音量的需求决定了驱动方案。如果只用8键入门版,一个S8050三极管就够用:P2.0输出方波,经过1kΩ电阻限流后进三极管基极,集电极接蜂鸣器或者8Ω/0.5W小喇叭,发射极接地。这个电路是典型的开关放大,单片机IO口只输出几毫安的电流,三极管把功率放大到几百毫安级别去驱动发声器件。如果要更接近真实电子琴的音量,可以把末级换成LM386功放芯片,声音会厚实得多,但我测下来S8050方案在普通教室做演示已经够用,成本还低。

有个细节我特意提一下:喇叭是感性负载,三极管关断瞬间会产生反向尖峰电压,反向并联一个1N4148二极管在喇叭两端续流,可以防止尖峰击穿三极管。很多人画原理图时容易漏掉这个二极管,结果用不了多久驱动管就烧了或者声音变破。

2.2 琴键设计思路:独立按键为何是中小型电子琴的首选

琴键数量决定了IO口占用和扫描逻辑复杂度。8键是最精简的版本,覆盖一个八度的自然音阶,代码最简单,适合第一次做项目练手。想显得完整一点,可以做14键,从中音do到高音si,弹普通儿歌绰绰有余。如果想走更远,加到16键甚至更多,按键逻辑就要认真规划了。

按键数量不超过8个时,独立按键是绝对的首选。每个按键占一个IO口,按下为低电平,松开为高电平,扫描代码只需要读一次IO口再判断就能知道哪个键被按下。一旦按键数量超过8个,就面临抉择:是扩IO口还是上矩阵键盘?矩阵键盘用行列扫描可以省IO,但有个隐藏问题——多键同时按下时会串音,按键之间必须加二极管隔离,BOM成本和焊接复杂度都会涨。所以我的建议很简单:中小型电子琴直接用独立按键,IO口不够就加一片74HC165移位寄存器扩展输入,性价比高,代码也更直白。按键布局则按照钢琴黑键白键的直觉来,一字排开,键与键之间留出10mm左右的间距,演奏时不容易误碰。

2.3 显示与附加功能:让作品不只有“响”这一个卖点

课程设计和毕设评审时,一台只能响的电子琴和一个带显示、带自动演奏、带音调切换的电子琴,档次完全不一样。显示模块建议无论如何都要加一个,最便宜的就是3位数码管动态扫描,用来显示当前按下的音名编号或者音符名称。相比LCD1602,数码管的驱动代码简单,而且夜里演示时非常醒目。

数码管的驱动方式很固定:P0口做段选接数码管a到dp引脚,P2口做位选控制哪一位点亮。这里有个51单片机的经典坑——P0口是准双向口,内部没有上拉电阻,输出高电平是很弱的,必须外接一个4.7kΩ的排阻,否则数码管亮度很低或者干脆点不亮。除了显示,还可以顺手做两个加分功能:一个是预置几首儿歌的自动演奏模式,另一个是八度切换,也就是通过按键把整个音域整体向上或向下平移,演奏曲目时表现力会强很多。这些功能后面在程序章节展开说。

3. 原理图设计的四个可靠性细节

3.1 最小系统的“三件套”:晶振、复位、去耦电容

原理图的第一课永远是“最小系统”的可靠性。很多初学者在洞洞板上做实验时发现单片机工作正常,等画成PCB打样回来反而不启动了,大概率是最小系统设计得太随意。

晶振部分,12MHz晶振配两个30pF负载电容,分别接在晶振两端到地,电容和晶振三者要尽量靠近单片机的X1和X2引脚。这里不建议省钱省掉负载电容,虽然有些单片机在某些条件下不装电容也能跑,但稳定性完全靠运气。复位电路用经典的10μF电解电容加10kΩ电阻方案,上电瞬间RST引脚会被电容充电电流拉高一小段时间,足够完成复位动作。电源部分,在系统电源入口放一个10μF电解电容和一个0.1μF陶瓷电容并联,分别滤除低频纹波和高频噪声;单片机VCC引脚旁边再单独放一个0.1μF去耦电容,越靠近引脚越好。这三个部分只要做到“就近放置、走线短粗”,最小系统的可靠性就有了基础。

3.2 IO口分配:把有限引脚花在刀刃上

STC89C52的IO口说多不多,说少不少,规划好了完全够用。我这套设计里的分配方案是:P1.0到P1.7接8个独立按键,作为琴键输入;P2.0接音频方波输出;P0.0到P0.7接数码管段选,外接4.7kΩ排阻上拉;P2.1到P2.3接3位位选。如果做14键版本,可以把剩余按键接到P3口或者P2口的剩余引脚上,按引脚分组扫描,逻辑上就是多读两组IO的问题。

选IO口时有一个原则:优先把键盘输入放在P1口,因为P1口是准双向口,复位后默认带内部上拉,按键悬空时读到的就是高电平,不需要额外加外部上拉电阻。P0口因为要驱动数码管,必须外加上拉排阻,这个不能省略。P2.0作为音频输出口,靠近哪个位置都行,但布线时要注意音频线不要和晶振线平行走太长距离,具体在第4章说。

3.3 音频输出电路细节:从数字方波到喇叭声音

音频输出电路是原理图里“看起来简单、实际全是细节”的部分。最基本的连接是P2.0串一个1kΩ电阻到S8050三极管基极,三极管集电极接发声器件,发射极接地。1kΩ电阻用来限制基极电流,同时防止IO口被过流冲击。

如果驱动的是电磁蜂鸣器或小喇叭,要分清它是电流型还是电压型器件。压电蜂鸣器本质是电容性负载,对电压敏感,但驱动电流需求小,三极管驱动时最好并联一个1MΩ左右的放电电阻,否则关断后电荷释放慢,声音尾音会拖泥带水。电磁蜂鸣器和喇叭是感性负载,需要的是电流,三极管放大电流是对的,但必须并联续流二极管。这里我踩过坑:第一版没加二极管,用了一段时间后S8050偶尔发烫,后来才知道是感性负载关断尖峰造成的,加了1N4148之后再没出过问题。

还想让音色柔和一点的话,可以在P2.0输出端串联一个100Ω电阻再进驱动级,然后对地并联一个0.1μF电容,构成简单的RC低通滤波,把方波的高频毛刺削掉一部分。这个改动成本极低,效果却能明显减少方波带来的“电锯感”。

4. PCB布局布线:影响音质和稳定性的隐形因素

4.1 布局顺序:先把功能分区想清楚再摆件

拿到原理图就急着往PCB里摆元件是大忌。正确做法是先画一个功能分区草图:电源接口和滤波电容放板子一角,蜂鸣器或喇叭驱动级放在远离单片机晶振的一侧,单片机最小系统居中,按键区放在便于弹奏的方向,数码管放在按键上方或者独立架起来。

我常用的布局流程是这样的:先把板框定好,比如100mm乘80mm,适合放在一个普通外壳里。电源入口区放USB座或DC座、电源开关、10μF电解电容和0.1μF陶瓷电容。单片机放板子中部偏左,晶振和两个30pF电容紧紧贴着单片机右侧边缘,走线短且对称。复位电路的电容电阻靠近RST引脚。S8050、续流二极管和喇叭接口放在板子左下角,尽量远离晶振区域。按键阵列放在板子右侧,从左到右一字排开,模拟钢琴键盘的逻辑顺序。

这样分区的好处是让每个功能模块的信号路径都尽可能短,强弱信号天然隔离,比布线阶段再想办法补强要省事得多。

4.2 布线优先级:晶振、电源、音频线谁都不能将就

布线时按优先级来,先从最不能妥协的部分走起。晶振走线是第一条红线:走线要短、要粗,两条引脚线尽量等长对称,走线正下方不要布置其他信号线,周围用地包围起来,减少外界的电磁干扰。电源线和地线是第二条红线:主干电源线宽度至少1mm,地线能用铺铜就用铺铜,不要用一个细走线串联所有地引脚。音频输出线虽然只是一根信号线,但它是模拟量输出,要尽量避开晶振和复位电路区域,条件允许的话在音频走线两侧各铺一条地线做保护。

铺铜这件事我强调一下。整板地铺铜不是“锦上添花”,而是“基本操作”,尤其对音频电路来说,铺铜能有效降低环路面积、减少干扰。铺完之后反复检查地过孔是否足够,特别是驱动级和电源入口附近要多打过孔,保证地电位一致。按键焊盘的孔径要比普通信号焊盘大一圈,因为按键要承受反复按压的机械应力,焊盘太小时间久了容易脱落。

5. 程序实现:定时器中断 + 音符表 + 按键扫描

5.1 代码骨架:中断翻转和主循环扫描,两部分互不干扰

程序架构就两个任务:定时器中断负责输出方波,主循环负责扫描按键。这两个任务通过全局变量通信,不互相阻塞。定时器0工作在方式1,也就是16位计数模式。初始化时只开中断、不启动计数;按键检测到按下后,把对应的音符索引写入全局变量,然后启动定时器TR0=1;按键松开后停止定时器,并把输出口拉低,避免蜂鸣器里残存电压发出杂音。

下面这版代码是完整的核心逻辑,8个按键版本,对应中音1到高音1的8个音。14键版本只是把音符表变长、多扫描一组IO口,思路完全一样。

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit BEEP = P2^0;

// 8个音符对应的高8位、低8位初值,12MHz晶振,0xF88C开始
uchar code ToneH[] = {0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC};
uchar code ToneL[] = {0x8C, 0x5B, 0x15, 0x67, 0x04, 0x90, 0x0C, 0x44};

uchar ToneIndex = 0;   // 当前按下音符的索引

void Timer0_Init()
{
    TMOD &= 0xF0;
    TMOD |= 0x01;      // 定时器0,方式1,16位
    ET0 = 1;           // 开定时器0中断
    EA = 1;            // 开总中断
    TR0 = 0;           // 先不启动
}

void Timer0_ISR() interrupt 1
{
    TH0 = ToneH[ToneIndex];
    TL0 = ToneL[ToneIndex];
    BEEP = ~BEEP;      // 翻转IO口,输出方波
}

void Delay10ms()
{
    uchar i, j;
    for (i = 0; i < 20; i++)
        for (j = 0; j < 250; j++);
}

void ScanKey()
{
    uchar i;
    for (i = 0; i < 8; i++) {
        if ((P1 & (1 << i)) == 0) {     // 检测到第i个按键按下
            Delay10ms();                 // 消抖
            if ((P1 & (1 << i)) == 0) {
                ToneIndex = i;
                TR0 = 1;                 // 启动定时器,开始发声
                while ((P1 & (1 << i)) == 0);  // 等待按键松开
                TR0 = 0;                 // 松开后停止发声
                BEEP = 0;                // 输出口拉低,消除残余
            }
        }
    }
}

void main()
{
    Timer0_Init();
    while (1) {
        ScanKey();
    }
}

5.2 音符-初值表的建立与误差控制

程序里的核心数据表就是前面那张音符频率对应表。使用const数组存到程序存储区,不占用宝贵的内部RAM。有一点特别提醒:中断服务函数里每次都必须重新给TH0和TL0赋值。因为定时器工作在方式1时不是自动重装模式,溢出后TH0和TL0会变成0,如果中断里不重新赋值,计数会从0开始,相当于以65536微秒的周期溢出,输出的频率完全不对,听上去就像刺耳的连续噪声。

取整误差方面,每个音符的理论初值都已经四舍五入到整数,产生的实际频率和标准频率偏差都在0.1%以内,人耳基本无感。但如果你的系统改成11.0592MHz晶振,机器周期不再是整数的1微秒,计算时就要更仔细,建议用浮点算完再取整,不要手算近似值。顺带一提,11.0592MHz晶振更常用于带串口通信的项目,因为它可以精确产生9600波特率;纯电子琴项目就用12MHz,初值计算变成口算,调试时方便太多。

5.3 按键扫描、消抖与连续触发问题

按键扫描的经典问题是抖动和重复触发。机械按键按下和松开的瞬间,内部触点会经历几十微秒到几毫秒的抖动,如果用第一次检测到低电平就立刻触发发声,那么一次按键按下可能会被误判成多次。代码里的方案是检测到低电平后延时10毫秒再读一次,如果仍然是低电平,确认是有效按下,这叫软件消抖。

另一个容易忽略的问题是一次按键只触发一次。如果按下后不松开,程序一直启动定时器并反复赋值,会有一个音调延续的“自动连弹”效果,不是我们想要的。代码里使用while ((P1 & (1 << i)) == 0);来等待松开,实现按住只响一次的效果。但这种方法有个局限:主循环在等待某个按键松开时,其他按键被暂时屏蔽了。对入门级电子琴来说这不是大问题,毕竟正常演奏就是一次按一个键。如果要支持复杂的和弦,就得改成中断方式扫描按键,或者加上多键状态记录表,复杂度会高不少,入门阶段不必强求。

5.4 自动演奏和变调:给作品加分的小功能

自动演奏功能的实现很简单。预置儿歌的曲谱,用二维数组存,每一行的两个元素分别是音符索引和音长(比如用“四分音符=400毫秒”作为基准单位)。主循环里按顺序取出音符,把ToneIndex改为曲谱中的值,启动定时器发声,同时用另一个延迟或计时器控制持续时间,时间到就切换到下一个音符。这样一个“电子琴”就升级成了“会弹琴的电子琴”,展示时效果完全不同。

变调功能更简单,有两种思路。第一种是把整个音符索引整体平移:比如C调升到D调,每个音对应的索引加2,让按键和音高的映射关系整体改变。第二种是重新计算一组音符频率初值表,预置几套不同调式的表,用按键切换。第二种的好处是按键本身的“绝对音高”变了,更接近真实乐器的变调逻辑。我个人建议第二种,因为音符表本来就是const数组,再存两三套也不占多少空间。

6. 焊接、烧录与联调排错:从Proteus仿真到实物响起来的最后一公里

6.1 上电之前和烧录之后:先验证最小系统本身

实物调试最大的忌讳是直接烧电子琴程序。我的固定流程分三步走:第一步,上电前先用万用表测量电源正负极是否短路,确认没有低级焊接错误再通电。第二步,烧一个最简单的LED闪烁程序,验证单片机、晶振、复位电路和电源是否都正常工作。STC单片机用串口下载,下载软件界面提示“冷启动”时,如果能够顺利烧录,基本说明单片机核心和晶振都活着。第三步,再烧电子琴程序,用示波器或者万用表的频率档测P2.0的输出,看是否有对应音符的方波频率。不要跳过第二步,因为如果直接烧电子琴程序没反应,你很难判断是单片机没工作还是音频驱动电路有问题。

没有示波器的情况下,有一个很实用的土办法:把P2.0断开,临时接一个LED串联电阻到地。按下琴键时,LED亮灭的闪烁频率能大致反馈输出状态。频率很低时肉眼可见闪烁,频率高时看起来亮但暗一些,至少能区分“有输出”和“没输出”。

6.2 常见故障现象与排查对照表

联调阶段遇到问题别慌,按现象定位原因。下面这张表是我这些年实践中最常见的故障和对应排查方向:

现象 优先检查 常见原因
完全没有声音 程序是否烧录成功,P2.0是否有方波 单片机没工作、晶振未起振、蜂鸣器接反
声音非常小 三极管集电极电压和喇叭规格 三极管放大倍数不足、压电蜂鸣器电压驱动不匹配
音调整体偏高或偏低 晶振频率和初值表 晶振选错、机器周期算错、初值取整误差
按下琴键偶尔不发声 消抖延时长短、IO口配置 按键抖动没消干净、IO口被复用冲突
有连续嘶嘶杂音 电源去耦和地线走线 去耦电容缺失、音频线离晶振太近
长时间使用后声音变破 三极管温度和喇叭续流二极管 感性负载尖峰击穿、三极管散热不足

还有一个经验之谈:Proteus仿真跑通绝不等于实物能响。仿真软件里的蜂鸣器模型和真实器件特性差异巨大,仿真里随便用一个数字口就能“响”,实物里你得操心电流、极性、驱动管选型。我见过很多同学仿真调得天花乱坠,实物一上电傻眼。所以我的建议是,真心要做一个能展示的电子琴,先洞洞板验证电路,再画PCB打样,虽然多一道工序,但能省掉后面反复改板的钱和时间。

最后再分享一个让作品在展示时明显加分的小技巧:PCB发出去打样之后,顺手设计一张和按键布局对应的面板贴纸,把白键和黑键的颜色和位置标出来,盖在按键区域上方。这样评委或者观众一眼就能看出这是一台“琴”,而不是一堆散落的按键。我自己在第二次做PCB时就是这么干的,展示环节的观感提升非常明显。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板) 本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。 阅读详情

相关推荐

22版本Altium Designer导出生产文件的规范化操作指南

本文详细介绍了PCB设计中的Gerber文件导出流程及相关文件生成方法。主要内容包括:1)Gerber文件导出的5个关键设置步骤;2)NC钻孔文件的导出方法;3)坐标文件的生成方式;4)文件打包规范要求必须包含Gerber文件、NC钻孔文件和坐标文件;5)文件提交的两种方式(新手推荐提交原始工程文件,量产推荐仅提交Gerber文件包)。文章还特别强调了单位一致性、精度验证等注意事项,为PCB设计文件的规范输出提供了完整指导。

qq_56506325的博客 1055

oracle statspack 安装详解---03

oracle statspack详解这是我的学习笔记,根据eygle老师的及君三思的学习并整理的。eygle老师的(原链接找不到了,放到我的共享里了):http://down.qiannao.com/space/fi ... -...

congnianmi7492的博客 461

储能系统架构和控制

探讨了储能系统中EMS(能源管理系统)、BMS(电池管理系统)和PCS(功率转换系统)之间的协同机制,以及组串式和集中式储能系统的技术架构、优势和局限性。EMS根据电价、电网需求和电池状态制定充放电策略,BMS提供电池数据,PCS执行充放电控制。组串式系统具有独立管理和灵活扩展的优势,但成本较高;集中式系统成本效益高,但存在环流和木桶效应问题。

蓝龙宝藏的博客 3967

[itpub.net]详细解读 STATSPACK (一)

说在前面,很容易被忽略的几个点:在读报告的时候,我们首先需要看清楚,留意3个内容,这份报告所对应的数据库版本,cluster方式,以及报告的时间段。尤其需要注意的就是时间段,脱离了时间段的statspck将是毫无意义的,甚至会得出错误的结果。

2301_76957510的博客 1059

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1044

多标签损失之Hamming Loss(PyTorch和sklearn)、Focal Loss、交叉熵和ASL损失

多标签损失

wuli_xin的博客 4461

详细解读 STATSPACK 报告(完结)

7、I/O统计信息 下面两个报表是面向I/O的。通常,在这里期望在各设备上的读取和写入操作是均匀分布的。要找出什么文件可能非常“热”。一旦DBA了解了如何读取和写入这些数据,他们也许能够通过磁盘间更均匀的分配I/O而得到某些性能提升。 在这里主要关注Av Rd(ms)列 (reads per millisecond)的值,一般来说,大部分的磁盘系统的这个值都能调整到14ms以下,oracle认为该值超过20ms都是不必要的。如果该值超过1000ms,基本可以肯定存在I/O的性能瓶颈。如果在这一列上出现#

2301_76957510的博客 1074

6、基于深度强化学习的无人机路径规划

本文研究了基于深度强化学习的无人机路径规划方法,提出了一种融合改进DQN算法与人工势场法的路径规划策略。通过设计合理的网络结构、状态空间、动作空间和奖励函数,结合ε-贪心策略进行动作选择,实现了无人机在复杂环境中的自主避障与目标导向飞行。仿真实验表明,该方法具有收敛速度快、实时性强和可操作性高等优点,能有效完成室内环境下的路径规划任务。文章还总结了算法优势,并对未来在连续动作、复杂环境适应及多无人机协同等方面的发展方向进行了展望。

web39explorer的博客 166

详细解读 STATSPACK 报告(一)

/* 报表头信息,数据库实例相关信息,包括数据库名称、ID、版本号及主机明等信息。 另外,重点还需要关注一下报告产生的时间跨度(在这里是14分钟),以及并发数(在这里是272)。DB Name DB Id Instance Inst Num Release Cluster Host------------ ----------- ------------ -------- ----------- ------- ------------ORA92 1

2301_76957510的博客 606

SAP ABAP 缓冲同步揭秘——从 DDLOG 表到 RSDBBUF3 的完整实践指南

DDLOG 看似一张不起眼的系统表,却承担着 SAP 多实例环境下的数据一致性重任。通过掌握其字段意义、解析方法及周边监控工具,你可以在性能与一致性之间找到最佳平衡;通过精细化的参数管理与主动刷新策略,更能在关键业务场景中确保“数据永远是最新的”。愿本文能成为你日常排障与架构决策的参考手册。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 312

【中科院一区Top-源码复现】Day-ahead photovoltaic power forecastingwith multi-source temporal-featureconvoluti

【中科院一区Top-源码复现】Day-ahead photovoltaic power forecastingwith multi-source temporal-featureconvoluti

739

plsqldeveloper7调试的缓慢 大量的pipe get等事件

oracle 是10g 10.2.3 主要是调试一个软件包中的过程 cursor cur_mont_lis_resutl is --计算月登录人数和次数 SELECT PROVCODE, AREACODE, VENDER_ID, OPERATE_TYPE_ID, count(USERNUMBER) as use_pepo_mon, ...

yangzhiyong77 766

osgearth添加经纬度网格,并显示鼠标所指经纬高度信息

一、代码 osgearth官方例子 #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> #

ljjjjjjjjjjj的博客 3564

详细解读 STATSPACK 报告

ZT[@more@] 说在前面,很容易被忽略的几个点:在读报告的时候,我们首先需要看清楚,留意3个内容,这份报告所对应的数据库版本,cluster方式,以及报告的时间段。尤其需要注意的就是时间段,脱离了时间段的stats...

csdn_201601的博客 697

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Statspack分析报告详解 (zt)

Statspack分析报告的一个例子,非常好,转自:http://tolywang.itpub.net/post/48/418073[@more@](1) 调整的先后次序 1. Tune the design. -- Appli...

ckomuo086028的博客 131

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PERF--Advanced Tuning with Statspack(ZT)

Advanced Tuning with Statspack By Rich Niemiec But wait, there's more! What waits mean in Statspack reports and ho...

cuifan5176的博客 252

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

(ZT)如何定义statspack作业的工作时间,让作业只在工作时间采集系统的数据

这篇总结应该在几个月前写的,但自己一直懒得动笔,拖到现在! BITI在这篇文章(http://www.itpub.net/268049.html)里提到了,只在高峰期对数据库作statspack,当时他提到了该JOB的间隔时间...

cuantiaowei3015的博客 169

oracle性能调整笔记[zt]

ref: http://www.itpub.net/422928.html[@more@]第二章 调整的信息来源 Alert Log 文件中记录的与性能有关的信息:1. ORA-01652,不能扩展临时段;2. ORA-0165...

cuihu5034的博客 224

Statspack中几个指标说明(ZT)

Oracle注:以下指标取自Oracle的性能分析工具Statspack所提供的性能分析指标。指标名称指标描述指标范围指标单位1.关于实例效率(Instance Efficiency Percentages)的性能指标缓冲区未等...

cuixian7271的博客 375

Oracle RAC 的监控和调整 (zt)

创建RAC的视图 $ORACLE_HOME/rdbms/admin/catclust.sql statspack报告里关于Cluster的统计:1、GCS的工作负荷的特性2、GES的统计信息3、GCS和GES的信息统计4、G...

cuixie2370的博客 225

Oracle学习的一些建议 zt

学习Oracle是一个漫长艰辛的过程。如果没有兴趣,只是被迫学习,那么是很难学好的。学习到一定程度的时候,要想进一步提高,就不得不接触很多Oracle之外的东西,如Unix,如网络、存储等。因此,要真的决心学好Oracle,就一...

cuixiejiao6874的博客 154

Oracle 性能优化的基本方法概述[ZT]

1)设立合理的性能优化目标。2)测量并记录当前性能。3)确定当前Oracle性能瓶颈(Oracle等待什么、哪些SQL语句是该等待事件的成分)。4)把等待事件记入跟踪文件。5)确定当前的OS瓶颈。6)优化所需的成分(应用程序、数...

csqm87956的博客 157

数据库优化项目的流程之实施 zt

http://blog.oraclefans.cn/baishan1/entry/dba%E6%97%A5%E8%AE%B0_%E7%AC%AC%E4%B8%80%E9%83%A8_%E8%A1%A5%E5%85%85_3[@m...

csdn_201601的博客 186

oracle文档集锦(1)

EXPIMP--從實驗中來看exp,imp之間的規則HOWTO--如何在10g不支持的Linux版本安装10gHOWTO--讓Linux下的oracle自動啟動SQL--收集网上的一些精妙的SQL的例子(ZT)EXP-IMP--在8i中的中文说明英文版的STATSPACK Readme EXPIMP--從實驗中來看exp,imp之間的規則发表人:vongates | 发表时间: 2005年七月1

航海日志 556

数据库性能分析及调整一例(zt)

故障现象2004年6月8日上午10:00,内蒙古巴盟网通用户反映在OSS系统界面“话单查询”里查询单个用户五天的话单特别慢,查询很长时间无结果。 例如:在OSS系统界面“综合查询”内点击“收费”-〉“话单查询”,键入“用户号码,...

cuixie2370的博客 111

[Q]我创建了数据库的所有用户,我可以删除这些用户吗 zt

[A]ORACLE数据库创建的时候,创建了一系列默认的用户和表空间,以下是他们的列表 ·SYS/CHANGE_ON_INSTALL or INTERNAL 系统用户,数据字典所有者,超级权限所有者(SYSDBA) 创建脚本:?/...

cinashu1164的博客 167
上一篇: 商用HTTP代理选型实战:避开低价陷阱,聚焦存活率、去重率与业务匹配
下一篇: 岩雀瞬秒机制拆解:W-E联动爆发逻辑与斩杀线实战教学
cuixie2370
博客等级 码龄10年 16粉丝 842原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值