蓝桥杯电子类单片机提升三——NE555
目录
单片机资源数据包_2023
一、NE555和定时器工作模式
1.NE555的介绍
2.定时器的计数模式
二、NE555频率读取代码的实现
1.定时器0初始化
2.通过读取TH0和TL0来读取频率
3.通过中断读取频率
三、完整代码演示
通过读取TH0和TL0来读取频率
main.c
通过中断读取频率
main.c
前言
关于蓝桥杯比赛时会提供的资料前几篇都有提到,这里就不在赘述了,只放一个下载链接:
单片机资源数据包_2023
除了基础部分的按键、LED灯,数码管扫描,还有温度传感器,AD/DA转化,EEPROM存储器,RTC之外,还有三个模块考试的时候可能会考,分别是超声波,NE555和串口。近几年的题也是越来越难,这三个模块也逐渐出现在了省赛的舞台上(当然如果进国赛了,这几个模块就都可能考了)。提升篇主要针对这三个模块进行介绍。
由于这三个模块比赛时不会提供底层代码,所以许多都需要咱们自己来完成,不同人写的代码,差异性可能会更大。此外这些代码会涉及到单片机运行的底层知识,关于单片机基础部分的内容,提升篇也会尽可能介绍一部分(当然如果你不会也没关系,文章会教你如何用stc生成或者查数据手册,就算不知道原理,小背一背也是能自己实现的)
一、NE555和定时器工作模式
这一章主要介绍一下NE555和单片机定时器有关的基础知识,当然,正如前边提到的,这些知识并不需要去背,在后面代码实现时,会教大家如何借助isp获取这些代码。
最近几年NE555也是和超声波一样,频繁出现在省赛考场上。
1.NE555的介绍
NE555是一款经典的集成电路,也被称为555定时器。555定时器在蓝桥杯板子上的主要作用是产生脉冲,让我们读取它的频率,真的是一个十分经典的集成电路,当然,蓝桥杯比赛不会考NE555该怎么连接电路,感兴趣的小伙伴可以自己查找一下555定时器的资料。
NE555由比较器、SR触发器和输出级组成。它通常有8个引脚,包括正电源引脚(VCC)、负电源引脚(GND)、控制电压引脚(CV)、复位引脚(RESET)、输出引脚(OUT)、触发引脚(TRIG)、非控制触发引脚(THRES)、控制电压引脚(DIS)。
NE555有三种工作模式,可以被设置为工作在单稳态(单触发)模式、多稳态模式或脉冲生成模式。它的工作稳定性高,可以通过改变电阻和电容的数值来调节脉冲宽度、周期和频率。同时,NE555还具有较高的输出驱动能力,可以直接驱动大功率装置。
NE555广泛应用于定时器、频率分频器、频率多倍器、脉冲宽度调制、脉冲位置调制、电压控制振荡器等各种电路中。它易于使用,功能强大,是电子爱好者和工程师常用的集成电路之一。
下图蓝桥杯原理图上的NE555电路:
我们只需要读取NET SIG引脚上电平的变化,我们可以通过P34引脚读取,因此在读取之前,我们需要使用跳线帽。将J13上的P34和NET SIG短接,如下图所示的两个引脚:
刚才已经提到,读取NE555的信号,只需要读取其电平变化,也就是与NET 相连的P34引脚的电平变化即可。当然,选择P34引脚也是有原因的,通过查询stc15f2k60s2的引脚定义可知,P34的其中一个复用功能就是定时器0外部计数(引脚定义的内容有点多,关于P34的大概在stc15数据手册的第51页)这里也附上stc15的数据手册下载链接
stc15数据手册(点击查看或下载)
前几篇文章已经提到,定时器不止有定时功能,还有计数功能,读取NE555,通俗点说就是要“记录电平变化次数”,这就用到定时器0的计数功能了。通过计数器记录电平在一段时间内的变化次数,就可以推算出1秒电平变化的次数,而1秒电平变化的次数就是频率了。
2.定时器的计数模式
通过配置定时器的TMOD寄存器,即可控制定时器的工作模式。我们需要使用定时器0记录NE555的电平变化,也就是需要使用定时器0的外部计数模式,此外定时器模式我们还是选择16位自动重载。
由上图可知,我们需要将TMOD2置为1,使其处在外部计数模式,其他各位为0即可(定时器1初始化时,会自己在配置关于定时器1的模式)。也就是需要配置:
TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式
这样我们就可以用定时器0读取NE555的频率了。
二、NE555频率读取代码的实现
上文已经介绍了如何配置定时器的模式,接下来就是如何使用定时器读取NE555频率。主流的方法主要有两种,一种方法是是和读取超声波时间信息一样,将TH0和TL0置为0,过一段时间后读取TH0和TL0的值在经过换算就可以得到频率;另一种方法是将TH0和TL0都置为0xFF,同时允许中断,这样只要有一个脉冲过来,就会触发中断,只需要在中断服务函数里,写上频率++,每隔一段时间读取一次频率,并把频率清0,我们就可以读取到一段时间内有多少个脉冲,再算换成1s有多少个脉冲,这个值就是频率值。接下来会介绍这两种方法,在介绍这两中方法之前,我们需要配置定时器0,这里也先告诉大家定时器具体如何使用isp现成的代码进行配置。
1.定时器0初始化
其实,有了第一章的介绍,再小背一下代码,就能记住定时器0如何配置,但是isp已经提供了范例代码,现成的总是更香嘛。
与串口代码的类似,我们打开isp,找到范例程序里的外部中断0的范例程序
这串代码中,提供了一种外部计数的方法,具体代码如下:
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 T0扩展为外部下降沿中断举例--------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*///本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz#include "reg51.h"
#include "intrins.h"//-----------------------------------------------sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;sfr AUXR = 0x8e; //辅助寄存器
sbit P10 = P1^0;//-----------------------------------------------
//中断服务程序
void t0int() interrupt 1 //中断入口
{P10 = !P10; //将测试口取反
}void main()
{P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;P6M0 = 0x00;P6M1 = 0x00;P7M0 = 0x00;P7M1 = 0x00;AUXR = 0x80; //定时器0为1T模式TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式TH0 = TL0 = 0xff; //设置定时器0初始值TR0 = 1; //定时器0开始工作ET0 = 1; //开定时器0中断EA = 1;while (1);
}
我们现在只需要从中“提取”出我们想要的代码——定时器0初始化代码即可。初始化代码其实就是while(1)上边的那几行代码,我们写一个定时器0的初始化函数来包装一下那几行代码
void Time0_Init(void)
{
AUXR = 0x80; //定时器0为1T模式
TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式
TH0 = TL0 = 0xff; //设置定时器0初始值
TR0 = 1; //定时器0开始工作
ET0 = 1; //开定时器0中断
}
如果需要定时器中断(前面提到的第二种读取NE555的方法),我们还需要加上中断服务函数,中断号为1.
void Timer0_Isr(void) interrupt 1
{
}
2.通过读取TH0和TL0来读取频率
我们需要先将TH0和TL0置为0,过1s之后再来读取TH0和TL0的值,这样读取出来的值就是频率值,注意读取时需要先停止定时器,如何1s读取一次已经在第七届代码中介绍过了,这里不再赘述,这里的is_read_NE555为0时,每隔1s就会被置为1。由于定时器0用来读取NE555了,所以我们这里是开启了定时器1来完成数码管等的处理
unsigned int fre=0;//频率
void Time0_Init(void)
{
AUXR = 0x80; //定时器0为1T模式
TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式
TH0 = TL0 = 0x00; //设置定时器0初始值
TR0 = 1; //定时器0开始工作
//ET0 = 1; //开定时器0中断
}void main()
{
Time0_Init();
Timer1_Init();
EA=1;
while(1)
{
if(is_read_NE555==1)//1s读取一次,这样读取到的值刚好是频率
{
is_read_NE555=0;
TR0=0;//先暂停
fre=TH0;//再读取
fre<<=8;
fre|=TL0;
TH0=0;
TL0=0;
TR0=1;
Nixie_num[0]=fre/10000%10;//数码管显示频率
Nixie_num[1]=fre/1000%10;
Nixie_num[2]=fre/100%10;
Nixie_num[3]=fre/10%10;
Nixie_num[4]=fre/1%10;
}}
}
注意这里的fre必须使用unsigned int。
3.通过中断读取频率
接下来介绍第二种方式,现将TH0和TL0置为0xFF,这样检查到一个脉冲之后就会进入中断服务函数,再中断服务函数内将频率++,每隔1s读取一次频率并将频率置为0.
void Timer0_Isr(void) interrupt 1
{
fre++;
}
void Time0_Init(void)
{
AUXR = 0x80; //定时器0为1T模式
TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式
TH0 = TL0 = 0xFF; //设置定时器0初始值
TR0 = 1; //定时器0开始工作
ET0 = 1; //开定时器0中断
}void main()
{
Time0_Init();
Timer1_Init();
EA=1;
while(1)
{
if(is_read_NE555==1)
{
is_read_NE555=0;
Nixie_num[0]=fre/10000%10;
Nixie_num[1]=fre/1000%10;
Nixie_num[2]=fre/100%10;
Nixie_num[3]=fre/10%10;
Nixie_num[4]=fre/1%10;
fre=0;
}
}
}
三、完整代码演示
读取NE555其实很简单,但是需要提醒一点,P34和NE555相连的那个跳线帽用完记得拔下来,其他项目可能需要用到矩阵键盘,如果那个跳线帽忘记拔了会影响矩阵键盘的读取。
下面的代码是读取NE555频率并将其显示到数码管上
通过读取TH0和TL0来读取频率
main.c
#include <stc15.h>
#include "intrins.h"code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xFF
};
unsigned char Led_Num=0xFF;
#define LED_ON(x) Led_Num&=~(0x01<<x);P0=Led_Num; P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x) Led_Num|=0x01<<x; P0=Led_Num; P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF_ALL() Led_Num=0xFF; P0=0xFF; P2|=0x80;P2&=0x9F;P2&=0x1F;#define NIXIE_CHECK() P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON() P2|=0xE0;P2&=0xFF;P2&=0x1F;void Time0_Init(void);
void Timer1_Init(void); //1毫秒@11.0592MHzunsigned char Nixie_num[]={10,10,10,10,10,10,10,10};//数码管要显示的数据
unsigned char location=0;
unsigned int fre=0;//定义频率
bit is_read_NE555=0;//每隔1s读取一次
void main()
{Time0_Init();//注意定时器0的初始化一定要放在定时器1的前边,因为定时器0初始化代码是抄的,写的不够完备,初始化时会干扰定时器1Timer1_Init();EA=1;while(1){if(is_read_NE555==1){TR0=0;fre=TH0;fre<<=8;fre|=TL0;TH0=0;//TH0和TL0清零TL0=0;TR0=1;//重新开始计数is_read_NE555=0;//为了1s数的更精确,在重新开始计时之后,才重新开始数1s(其实影响不大)/*数码管显示读取到的数据*/Nixie_num[0]=fre/10000%10;Nixie_num[1]=fre/1000%10;Nixie_num[2]=fre/100%10;Nixie_num[3]=fre/10%10;Nixie_num[4]=fre/1%10;}}
}
unsigned int count_1s=0;//中间变量
void Timer1_Isr(void) interrupt 3
{P0=0x01<<location;NIXIE_CHECK();P0=Seg_Table[Nixie_num[location]];NIXIE_ON();if(++location==8)location=0;if(is_read_NE555==0)//is_read_NE555为0时{if(++count_1s>1000){is_read_NE555=1;count_1s=0;}}
}void Time0_Init(void)
{AUXR = 0x80; //定时器0为1T模式TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式TH0 = TL0 = 0x00; //设置定时器0初始值TR0 = 1; //定时器0开始工作ET0 = 1; //开定时器0中断
}
void Timer1_Init(void) //1毫秒@11.0592MHz
{AUXR |= 0x40; //定时器时钟1T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0xCD; //设置定时初始值TH1 = 0xD4; //设置定时初始值TF1 = 0; //清除TF1标志TR1 = 1; //定时器1开始计时ET1 = 1; //使能定时器1中断
}
通过中断读取频率
main.c
#include <stc15.h>
#include "intrins.h"code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xFF
};
unsigned char Led_Num=0xFF;
#define LED_ON(x) Led_Num&=~(0x01<<x);P0=Led_Num; P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x) Led_Num|=0x01<<x; P0=Led_Num; P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF_ALL() Led_Num=0xFF; P0=0xFF; P2|=0x80;P2&=0x9F;P2&=0x1F;#define NIXIE_CHECK() P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON() P2|=0xE0;P2&=0xFF;P2&=0x1F;void Time0_Init(void);
void Timer1_Init(void); //1毫秒@11.0592MHzunsigned char Nixie_num[]={10,10,10,10,10,10,10,10};//数码管要显示的数据
unsigned char location=0;
unsigned int fre=0;//定义频率
bit is_read_NE555=0;//每隔1s读取一次
void main()
{Time0_Init();//注意定时器0的初始化一定要放在定时器1的前边,因为定时器0初始化代码是抄的,写的不够完备,初始化时会干扰定时器1Timer1_Init();EA=1;while(1){if(is_read_NE555==1){is_read_NE555=0;/*数码管显示读取到的数据*/Nixie_num[0]=fre/10000%10;Nixie_num[1]=fre/1000%10;Nixie_num[2]=fre/100%10;Nixie_num[3]=fre/10%10;Nixie_num[4]=fre/1%10;fre=0;}}
}
unsigned int count_1s=0;//中间变量
void Timer1_Isr(void) interrupt 3
{P0=0x01<<location;NIXIE_CHECK();P0=Seg_Table[Nixie_num[location]];NIXIE_ON();if(++location==8)location=0;if(is_read_NE555==0)//is_read_NE555为0时{if(++count_1s>1000){is_read_NE555=1;count_1s=0;}}
}
void Timer0_Isr(void) interrupt 1
{fre++;
}
void Time0_Init(void)
{AUXR = 0x80; //定时器0为1T模式TMOD = 0x04; //设置定时器0为16位自动重装载外部记数模式TH0 = TL0 = 0xFF; //设置定时器0初始值TR0 = 1; //定时器0开始工作ET0 = 1; //开定时器0中断
}
void Timer1_Init(void) //1毫秒@11.0592MHz
{AUXR |= 0x40; //定时器时钟1T模式TMOD &= 0x0F; //设置定时器模式TL1 = 0xCD; //设置定时初始值TH1 = 0xD4; //设置定时初始值TF1 = 0; //清除TF1标志TR1 = 1; //定时器1开始计时ET1 = 1; //使能定时器1中断
}
相关文章:

蓝桥杯电子类单片机提升三——NE555
目录 单片机资源数据包_2023 一、NE555和定时器工作模式 1.NE555的介绍 2.定时器的计数模式 二、NE555频率读取代码的实现 1.定时器0初始化 2.通过读取TH0和TL0来读取频率 3.通过中断读取频率 三、完整代码演示 通过读取TH0和TL0来读取频率 main.c 通过中断读取频…...

发掘GPT-4商业创新的潜力
GPT-4在商业创新方面的应用潜力巨大,它能够基于庞大的训练数据集和强大的语言生成能力,协助企业或个人用户在多个商业场景中推动创新: 市场分析与战略规划:GPT-4可以对历史数据、行业趋势、竞争对手信息进行深度分析,并…...

LeetCode42.接雨水(单调栈)
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 : 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,…...
黄东旭:“向量数据库”还是“向量搜索插件 + SQL 数据库”?丨我对 2024 年数据库发展趋势的思考
本文由 PingCAP 黄东旭撰写,讨论了数据库技术在 2023 年的快速变革,并对 2024 年的数据库发展趋势进行了预测。文章重点关注了 GenAI 时代对数据库的影响,提出了在数据库选择上的两种路径:“向量数据库”和“向量搜索插件 SQL 数…...
Spark编程实验五:Spark Structured Streaming编程
目录 一、目的与要求 二、实验内容 三、实验步骤 1、Syslog介绍 2、通过Socket传送Syslog到Spark 3、Syslog日志拆分为DateFrame 4、对Syslog进行查询 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Structured Streaming的基本编程方法; 2、掌握…...

【已解决】引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
这种问题产生一般都会手足无措,包括笔者,但是不要慌,这种问题一般都是内存泄漏引起的。例如读者要访问一个已经被析构或者释放的变量,当然访问不了,导致存在问题。这时候读者应该从哪里产生内存泄漏这方面进行考虑&…...

Python Flask高级编程之RESTFul API前后端分离(学习笔记)
Flask-RESTful是一个强大的Python库,用于构建RESTful APIs。它建立在Flask框架之上,提供了一套简单易用的工具,可以帮助你快速地创建API接口。Flask-RESTful遵循REST原则,支持常见的HTTP请求方法,如GET、POST、PUT和DE…...

Windows如何打开投影到此电脑
1.首先点开设置 找到系统 点击投影到此电脑,如果这3行都显示灰色说明没有开启。 2.如何开启投影到此电脑 ①回到设置,点击应用 ②点击可选应用 ③ 安装无线显示器 投影设置可以和我一样...

【BUG】段错误
1. 问题 8核工程,核4在运行了20分钟以上,发生了段错误。 [C66xx_4] A00x53 A10x53 A20x4 A30x167e A40x1600 A50x850e2e A60x845097 A70xbad9f5e0 A80x0 A90x33 A100x53535353 A110x0 A120x0 A130x0 A140x0 A150x0 A160x36312e35 A170x20 A180x844df0 …...

深入理解指针(3)
目录 一、 字符指针变量二、 数组指针变量1.数组指针变量是什么?2.数组指针变量怎么初始化? 三、 二维数组传参的本质四、 函数指针变量1. 函数指针变量的创建2.函数指针变量的使用3.typedef关键字 五、 函数指针数组六、 转移表 一、 字符指针变量 在指针的类型中…...

ssm在线学习平台-计算机毕业设计源码09650
目 录 摘要 1 绪论 1.1 选题背景及意义 1.2国内外现状分析 1.3论文结构与章节安排 2 在线学习平台系统分析 2.1 可行性分析 2.2 系统业务流程分析 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 在线学习平台总体设计 …...
【Linux 内核源码分析】内存映射(mmap)机制原理
内存映射(mmap)是 Linux 内核的一个重要机制,它为程序提供了一种将文件内容直接映射到进程虚拟地址空间的方式。同时内存映射也是虚拟内存管理和文件 IO 的重要组成部分。 在 Linux 中,虚拟内存管理是基于内存映射来实现的。在调用 mmap 函数时…...

贪心算法之合并区间
“任世界多宽广,停泊在这港口~” 区间问题,涉及到最多的就是 取交集 和 并集的概念。我们使用C排序算法后,其默认规则就是按照 “左排序”进行的。因而,我们实质上注意的是每一个区间的 右端点,根据题目要求ÿ…...

Eclipse - Colors and Fonts
Eclipse - Colors and Fonts References 编码最好使用等宽字体,Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…...

java 数据结构LinkedList类
目录 什么是LinkedList 链表的概念及结构 链表的结构 无头单向非循环链表 addFirst方法(头插法) addLast方法(尾插法) addIndex方法 contains方法 removeAllKey方法 size和clear方法 链表oj题 无头双向非循环链表 ad…...

第五次作业(防御安全)
需求: 1.办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP 不能用来转换) 2.分公司设备可以通过总公司的移动链路和电信链路访问到DMZ区的http服务器 3.分公司内部的客户端可以通过公网地址访问到内部的服务…...

阿里云香港轻量应用服务器是什么线路?
阿里云香港轻量应用服务器是什么线路?不是cn2。 阿里云香港轻量服务器是cn2吗?香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器,通过mtr traceroute测试了一下,最后一跳是202.97开头的ip,1…...

C# Winform .net6自绘的圆形进度条
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;namespace Net6_GeneralUiWinFrm {public class CircularProgressBar : Control{private int progress 0;private int borderWidth 20; // 增加的边框宽度public int Progr…...

Git基本操作(超详细)
文章目录 创建Git本地仓库配置Git配置命令查看是否配置成功重置配置 工作区、暂存区、版本库添加文件--场景一概述实例操作 查看.git文件添加文件--场景二修改文件版本回退撤销修改情况⼀:对于工作区的代码,还没有 add情况⼆:已经 add &#…...

【AGI视频】Sora的奇幻之旅:未来影视创作的无限可能
在五年后的未来,科技的发展为影视创作带来了翻天覆地的变化。其中,Sora视频生成软件成为了行业的翘楚,引领着全新的创作潮流。Sora基于先进的Transformer架构,将AI与人类的创造力完美结合,为观众带来了前所未有的视听盛…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...