【STC15单片机】 超声波模块的使用
目录
1 基于STC15F2K60S2的超声波测距代码
1.1 基本注意事项
1.1.1 跳线帽接法
1.1.2 晶振设置
1.2 板载超声波工作原理
1.2.1 原理总结
1.2.2 超声波代码思路
1.3 STC15单片机代码部分
1.3.1 定时器0&定时器1初始化
1.3.2 超声波ultrasonic.c ultrasonic.h文件配置
1.3.3 距离计算
1.3.4 数码管
1.3.5 主函数
2 缺陷
2.1 传播速度
2.2 代码
3 超声波距离报警器
4 超声波模块(HC-SR04)代码(51单片机)
1 基于STC15F2K60S2的超声波测距代码
单片机型号说明:IAP15F2K61S2
新建工程时单片机型号选择STC15F2K60S2
超声波测距模块的工作原理及应用
使用定时器产生超声波发射频率
1.1 基本注意事项
1.1.1 跳线帽接法
蓝桥杯单片机开发板 J13跳线帽 选择I/O模式
超声波和数码管之间的两个跳线帽接法:横着接(1-3)(2-4),J2两个跳线帽接到左边是超声波,接到右边是红外通信模块

本开发板用到的芯片是 CX20106A芯片
1.1.2 晶振设置
说明STC15单片机默认晶振频率是11.0592MHz
历年赛题 一般要求选择12MHz
我们只需要在STC-ISP里设置一下即可

1.2 板载超声波工作原理


1.2.1 原理总结
只需要在Trig管脚(TX管脚)发送8个40KHz的超声波脉冲(方波信号),驱动超声波发送探头工作,然后检测回波信号。当检测到回波信号后,通过Echo管脚(RX管脚)输出
根据Echo管脚输出高电平的持续时间可以继续距离值
即距离值为:(高电平时间*340m/s)/2
1.2.2 超声波代码思路
- 发送8个40KHz的超声波信号
- 检测接收管脚高电平时间
- 根据时间计算距离值

1.3 STC15单片机代码部分
1.3.1 定时器0&定时器1初始化
定时器0用作基准定时
定时器1用作超声波距离检测,定时器1不需要中断
void Timer0_Init(void) //1毫秒 @12.000MHz @16位自动重载模式
{AUXR |= 0x80; //定时器时钟1T模式TMOD &= 0xF0; //设置定时器模式TL0 = 0x20; //设置定时初始值TH0 = 0xD1; //设置定时初始值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0 = 1;EA = 1;
}void Timer1_Init(void)
{AUXR |= 0x40; //定时器时钟1T模式TMOD &= 0x0F; //设置定时器模式
}
1.3.2 超声波ultrasonic.c ultrasonic.h文件配置
这里先粘贴超声波模块的代码,具体计算过程放在1.3.3距离计算讲解
#include "ultrasonic.h"unsigned char Ultrasonic_Time_Flag; //200ms置1/*TX引脚发送40KHz方波信号驱动超声波发送探头1/40KHz = 0.000025s = 0.025ms = 25us使用软件延时注意RC振荡器频率
*/
void Ultrasonic_Delay25us() //@12.000MHz 超声波专用的延时函数
{unsigned char i;_nop_();_nop_();i = 72;while (--i);
}
void Send_wave(void) //发送40KHz的方波信号函数
{unsigned char i;for (i = 0; i < 8; i ++ ){TX = 1; Ultrasonic_Delay25us();
// somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;TX = 0; Ultrasonic_Delay25us();
// somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;}
}//超声波测距函数
float Ultrasonic_Ranging(void)
{unsigned int Ranging_Time; //测距的时间float Distance;if (1 == Ultrasonic_Time_Flag) //200ms接受一次数据{Ultrasonic_Time_Flag = 0; //200ms时间标志位置0Send_wave(); //发送方波信号TR1 = 1; //启动计时while ((1 == RX) && (0 == TF1)); //等待收到脉冲TR1 = 0; //关闭计时if (1 == TF1) //发生溢出{TF1 = 0;Distance = 99; //报错误数据}else{//Ranging_Time = (TH1<<8) | TL1;Ranging_Time = TH1*256 + TL1; Distance = Ranging_Time*0.017; //0.017 @12MHz 和 0.18446 @11.0592MHzDistance /= 12.0; //STC15单片机运行速度是51单片机的12倍,这里要除以12.0if (Distance >= 99) Distance = 99; //限幅}TH1 = 0; //复位清零TL1 = 0; }return Distance;
}//定时器0中断服务函数
void Timer0_Rountine(void) interrupt 1
{static unsigned int T0Count0;T0Count0++;if(T0Count0 >= 200) //200ms{//执行操作Ultrasonic_Time_Flag = 1;T0Count0 = 0; //软件复位}
}
//ultrasonic.h 文件#ifndef __ULTRASONIC_H__
#define __ULTRASONIC_H__#include <STC15F2K60S2.H>
#include "intrins.h"#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();}sbit TX = P1^0; //发射引脚
sbit RX = P1^1; //接收引脚float Ultrasonic_Ranging(void);#endif
关于ultrasonic.c文件的一些解释说明
- Ultrasonic_Delay25us函数是Send_wave的内部调用函数,就是生成一个40KHz方波信号的函数
- 超声波测距函数,带float类型返回值,直接调用Ultrasonic_Ranging函数返回float类型的距离
- 注意Distance /= 12.0; 不能写Distance /= 12; 因为Distance是float类型!!!
- 定时器0中断服务函数放在本文件中,因为方便使用200ms的标志位Ultrasonic_Time_Flag
1.3.3 距离计算
计算公式:s = v*t
- s:距离
- v:声音的传播速度
- t:传播时间!
对于51单片机@12.000MHz晶振而言,1个时钟周期 = 1 /(时钟源频率) = 1/12,000,000
1个机器周期 = 12个时钟周期
所以一个机器周期的时间就是 1 / 12,000,000 * 12 s = 12/12,000,000 = 1/1,000,000s
一个机器周期定时器计数加一
这里讲清楚了定时器计数加一的时间, 所以我们只需要获得定时器1的计数次数就能计算出超声波模块的传播时间,进而求的距离
高电平计数次数:TH1 * 256 + TL1
超声波模块计时时间 t =(TH1 * 256 + TL1)* 12 / 12000000
由于这个计数时间是双程距离(一个来回的距离),所以时间应该除以2
t = (TH1 * 256 + TL1)* 12 / 12000000 / 2
声速 = 340m/s,s = v*t 单位是米(m),最后乘以100,将单位换算成厘米(cm)
t = (TH1 * 256 + TL1)* 12 / 12000000 / 2
∴ 距离 = (TH1 * 256 + TL1)* 12 / 12000000 / 2 * 340 * 100(cm)
∴距离 = (TH1 * 256 + TL1)*0.017 (cm)
上述式子 用橙色标记的数据是一个机器周期
注意:
如果STC15单片机没用使用AUXR寄存器,使用12T模式,那么蓝桥杯单片机开发板运行速度和51单片机一致,到这里距离计算就ok了,可以直接拿到数码管上显示。
!!!
但是我们配置的定时器0使用AUXR寄存器,配置为1T模式,所以蓝桥杯单片机开发板运行速度是51单片机的12倍,所以最后要修正一下距离数据,最后将距离数据除以12.0,就得到真正的距离了
对于@11.0592MHz的晶振而言
一个机器周期时间就是12/11.0592MHz = 12/11059200s,一个机器周期定时器计数加一
所以用超声波模块计时时间 t = (TH1*256+TL1)*12/11.0595/1000/1000
由于这个计数时间是双程距离(来回),所以时间要/2t = (TH1*256+TL1)*12/11.0595/1000/1000/2
声速340m/s ,s = v*t 单位是m,最后乘以100 单位化成cm
将后面计算简化得0.01844618(TH1*256+TL1)*12/11.0595/1000/1000/2*340*100 (cm)
=(TH1*256+TL1)*1.085/58
=(TH1*256+TL1)*0.01844618
1.3.4 数码管
由于本人懒得一批,直接copy之前写过的数码管代码

#include "smg.h"//关闭 蜂鸣器继电器LED数码管
void All_Init(void)
{P2 = 0xA0; // 1010 0000P0 = 0x00; //off蜂鸣器继电器P2 = 0x80; // 1000 0000P0 = 0xFF; //offLEDP2 = 0xC0; //使能锁存器U8 1100 0000P0 = 0xFF; //选择所有数码管P2 = 0xFF; //使能锁存器U7 1111 1111P0 = 0xFF; //关闭所有数码管
}//15单片机延时函数 @11.0592MHz
void Delay_ms(int xms)
{unsigned char i, j; while(xms--){_nop_(); _nop_(); _nop_();i = 11; j = 190;do{while (--j);} while (--i);}
}/*共阳极码表 ABCDEF都是大写*///0 1 2 3 4 5 6 7 8 9 A B C D E F - 灭
unsigned char NixieTable[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF, \0xC0 & 0x7F, \0xF9 & 0x7F, \0xA4 & 0x7F, \0xB0 & 0x7F, \0x99 & 0x7F, \0x92 & 0x7F, \0x82 & 0x7F, \0xF8 & 0x7F, \0x80 & 0x7F, \0x90 & 0x7F, \0xC1 //U
};//如果想显示小数点,就 &0x7F void Nixie(unsigned char location, unsigned char number)
{P2 = 0xC0; //Y6=0;Y6C=1; 使能锁存器U8 P27 = 1; P26 = 1; P25 = 0;switch(location)//选中LED位置,位选{case 1:P0 = 0x01;break;case 2:P0 = 0x02;break;case 3:P0 = 0x04;break;case 4:P0 = 0x08;break;case 5:P0 = 0x10;break;case 6:P0 = 0x20;break;case 7:P0 = 0x40;break;case 8:P0 = 0x80;break;}P2 = 0xFF; //Y7=0;Y7C=1; 使能锁存器U7 P27 = 1; P26 = 1; P25 = 1;P0=NixieTable[number];//数字Delay_ms(1);P0=0xFF;//消影清零
}/*数码管显示浮点数,支持0-1000以内的浮点数*/
void SMG_ShowFloatNum(float num)
{unsigned char Sep_Num[8]; //一次存放 千百十个...long temp;if (num >= 0) //正数temp = (long)(num*1000); else temp = (long)(-num*1000);Sep_Num[0] = temp / 1000000 % 10; //千位Sep_Num[1] = temp / 100000 % 10; //百位Sep_Num[2] = temp / 10000 % 10; //十位Sep_Num[3] = temp / 1000 % 10; //个位Sep_Num[4] = temp / 100 % 10; //小数点后第一位Sep_Num[5] = temp / 10 % 10; //小数点后第二位Sep_Num[6] = temp % 10; //小数点后第三位 Nixie(4, Sep_Num[3] + 18); //下标+18代表显示小数点Nixie(5, Sep_Num[4]);Nixie(6, Sep_Num[5]);Nixie(7, Sep_Num[6]);if (num >=10 && num < 100 ) {Nixie(3, Sep_Num[2]);} //显示十位else if (num >=100 && num < 1000 ) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]);} //显示十位百位else if (num >=1000 && num <= 9999) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]); Nixie(1, Sep_Num[0]);} //显示十位百位千位else if (num > -100 && num <= -10 ) {Nixie(3, Sep_Num[2]); Nixie(2,16);} //显示十位,并且显示负号else if (num > -1000 && num <= -100) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]); Nixie(1,16);} //显示十位百位,并且显示负号else if (num >= -9999 && num <=-1000) {Nixie(3, Sep_Num[2]); Nixie(2, Sep_Num[1]); Nixie(1, Sep_Num[0]);} //显示十位百位千位,但是数码管不够了后续想显示出来,就把数码管显示的内容整体往后挪动一个位置即可else if (num > -10 && num < 0 ) {Nixie(3,16);} //大于-10小于0的负数
}
#ifndef __SMG_H__
#define __SMG_H__#include <STC15F2K60S2.H>
#include "intrins.h"#define OFF_CODE 17 //数码管熄灭码void All_Init(void); //关闭 蜂鸣器继电器LED数码管
void Delay_ms(int xms); //15单片机延时函数 @11.0592MHzextern unsigned char NixieTable[];
void Nixie(unsigned char location, unsigned char number);
void SMG_ShowFloatNum(float num);#endif
1.3.5 主函数
/* 实验名称:超声波测距实验开发平台:STC15F2K60S2 @12.000MHz
*/#include <STC15F2K60S2.H>
#include "smg.h"
#include "ultrasonic.h"
#include "Timer0.h"
#include "Timer1.h"float distance;void main()
{All_Init();Timer0_Init(); //基准定时1ms @12.000MHz @16位自动重载模式 Timer1_Init(); //仅初始化定时器1,不需要 计时、中断while(1){distance = Ultrasonic_Ranging();SMG_ShowFloatNum(distance);}
}
2 缺陷
2.1 传播速度
声音在空气中传播的影响因素有许多
- 声音的传播速度跟介质的反抗平衡力有关,反抗平衡力就是当物质的某个分子偏离其平衡位置时,其周围的分子就要把它挤回到平衡位置上,而反抗平衡力越大,声音就传播的越快。水的反抗平衡力要比空气的大,而铁的反抗平衡力又比水的大。
- 声音在空气中的传播速度还与压强有关。
- 声音在空气中的速度随温度的变化而变化,温度每上升/下降5℃,声音的速度上升/下降3m/s。声音在空气中的传播速度是:空气(15℃)340m/s ,空气(25℃)346m/s 。
- 声音的传播速度随物质的坚韧性的增大而增加,物质的密度减小而减少。一般情况下,同温度下,固体传声最快,液体次之,气体最慢;而在同种介质中,温度越低声速越慢。
- 声音的传播与阻力有关。声音会因外界物质的阻挡而发生折射,例如人面对群山呼喊,就可以听得到自己的回声。
声音在空气中的传播速度=340m/s,受这么多因素影响,声音的传播速度不一定是标准的340m/s,但是代码中用的就是340这个数据,所以测量距离并不是非常准确
2.2 代码
所测的距离经常超出范围,原因是直接输出所测的距离,解决方案:优化输出距离的数据,用简单的滤波即可
数码管不稳定,能看到闪烁,可以使用定时器刷新数码管,或者采集数据时间更长一点(大概500ms采集一次?)这里留个疑问

3 超声波距离报警器
使用超声波模块测距,数码管显示距离,蜂鸣器根据距离长短发出不同频率鸣叫
距离越远鸣叫时间越长(频率越小),距离越近鸣叫时间越短(频率越大)
代码有一些小修改
main.c里的float distance;变量拿到ultrasonic.c中定义,然后在.h文件中externa外部声明出去,这样方便数据调用
在ultrasonic.c里声明两个变量
unsigned int Buzzer_Time_Flag = 1000; //蜂鸣器报警时间长短标志位
unsigned char Buzzer_Alarm_Flag; //蜂鸣器报警标志位
定时器0中断服务函数有修改
//定时器0中断服务函数
void Timer0_Rountine(void) interrupt 1
{static unsigned int T0Count0, Buzzer_Count;T0Count0++;if(T0Count0 >= 200) //200ms{//执行操作Ultrasonic_Time_Flag = 1;T0Count0 = 0; //软件复位}Buzzer_Count++;if(Buzzer_Count >= Buzzer_Time_Flag) //大于等于时间标志位(大概是**ms){Buzzer_Alarm_Flag = !Buzzer_Alarm_Flag; //鸣叫标志位状态反转,根据这个状态判断是否鸣叫Buzzer_Count = 0;}
}
编写蜂鸣器函数
//蜂鸣器 开启P06 =1,关闭P06 = 0;
void Buzzer_Alarm(void)
{//将main.c的distance变量拿到本文件中,然后外部声明出去,方便这里和主函数的数据调用if (distance) { Buzzer_Time_Flag = distance*10; } //鸣叫时间 = 距离*10,实现了距离越近,鸣叫时间越短P2 = 0xA0; // 1010 0000 选中if (1 == Buzzer_Alarm_Flag) //鸣叫{
// P06 = 1;P0 = 0x40; //0100 0000 }else if((0 == Buzzer_Alarm_Flag)) //不鸣叫{
// P06 = 0;P0 = 0x00;}
}
控制蜂鸣器最好控制整个P0口,但是P06也能控制
如果没有障碍物,数据就溢出,数码管默认显示99.000,蜂鸣器默认以0.5Hz的频率鸣叫
声明void Buzzer_Alarm(void)函数,在while(1)里调用即可实现功能
4 超声波模块(HC-SR04)代码(51单片机)
更新中...

相关文章:
【STC15单片机】 超声波模块的使用
目录 1 基于STC15F2K60S2的超声波测距代码 1.1 基本注意事项 1.1.1 跳线帽接法 1.1.2 晶振设置 1.2 板载超声波工作原理 1.2.1 原理总结 1.2.2 超声波代码思路 1.3 STC15单片机代码部分 1.3.1 定时器0&定时器1初始化 1.3.2 超声波ultrasonic.c ultrasonic.h文件配…...
SpringBoot 动态操作定时任务(启动、停止、修改执行周期)增强版
前段时间编写了一篇博客SpringBoot 动态操作定时任务(启动、停止、修改执行周期,该篇博客还是帮助了很多同学。 但是该篇博客中的方法有些不足的地方: 只能通过前端控制器controller手动注册任务。【具体的应该是我们提前配置好我们的任务&am…...
快排函数 -- qsort函数(Quick Sort)
文章目录🔎1.qsort函数简介💡1.1.函数原型💡1.2.参数含义🔎2.比较函数介绍🔎3.比较函数使用案例💡3.1.整型数组💡3.2.浮点型数组💡3.3.结构体类型 - 字符串🔎4.利用冒泡排…...
条形码和二维码
前言:需要的包的相关文档 1. Barcode:https://pypi.org/project/python-barcode/0.8.1/ 2. Qrcode:https://pypi.org/project/qrcode/ 3. Zbar: https://pypi.org/project/pyzbar/ 4. Opencv: https://docs.opencv.org/3.4.11/ 5. OpenC…...
大数据-学习实践-5企业级解决方案
大数据-学习实践-5企业级解决方案 (大数据系列) 文章目录大数据-学习实践-5企业级解决方案1知识点2具体内容2.1小文件问题2.1.1 SequenceFile2.1.2 MapFile2.1.3 小文件存储计算2.2数据倾斜2.3 YARN2.3.1 YARN架构2.3.2 YARN调度器2.3.2 YARN多资源队列配置和使用2.4Hadoop官方…...
破解吲哚花菁素IR-808 N3,IR-808 azide,IR-808叠氮,酯溶性染料修饰叠氮基团,相关知识
基础产品数据(Basic Product Data):CAS号:N/A中文名:IR-808叠氮英文名:IR-808 N3,IR-808 azideIR-808结构式(Structural):详细产品数据(Detailed …...
面试官:MQ的好处到底有哪些?
💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…...
事务机制:Redis能实现ACID属性吗?
ACID特性无需多言。我们知道关系数据库比如mysql可以实现事务的ACID特性,begin,commit,回滚实现。 那么redis可以实现ACID吗,结论是不能完全保证。 首先要知道redis通过MULTI关键字开启事务,中间一系列操作,加到操作队列中并不执…...
如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)
什么是 gRPC 像 gRPC 是由 google 开发的一个高性能、通用的开源 RPC 框架,主要面向移动应用开发且基于 HTTP/2 协议标准而设计,同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输,而 HTTP/2 相比 HTTP1.x ,有以下优势:…...
3分钟看完-丄-Python自动化测试【项目实战解析】经验分享
目录:导读 引言 自动化测试 背景 测试团队 测试体系发展 测试平台 自动化测试现状 现状一: 现状二: 现状三: 现状四: 现状五: 现状六: 失败的背景 失败的经历 失败总结 引言 内…...
Web漏洞-命令执行和代码执行漏洞
命令执行原理就是指用户通过浏览器或其他辅助程序提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。漏洞成因它所执行的命令会继承WebServer的权限,也就是说可以任意读取、修改、执行Web目录下的…...
Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings
Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings Abstract 该论文提出了一种无监督的方法,使用每个文档中相关单词之间的文本相似度以及每个类别的关键字字典将文档分为几类。所提出的方法通过人类专业知识和语言模型丰富了类别…...
linux进程管理
进程管理 进程是启动的可执行程序的一个指令 1、进程简介 (1)进程的组成部分 已分配内存的地址空间安全属性,包括所有权凭据和特权程序代码的一个或多个执行线程进程状态 (2)程序和进程的区别 程序是一个静态的二进制…...
【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码
大家好,今天和各位分享一下深度强化学习中的近端策略优化算法(proximal policy optimization,PPO),并借助 OpenAI 的 gym 环境完成一个小案例,完整代码可以从我的 GitHub 中获得: https://gith…...
【数据结构】第二站:顺序表
目录 一、线性表 二、顺序表 1.顺序表的概念以及结构 2.顺序表的接口实现 3.顺序表完整代码 三、顺序表的经典题目 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 一、线性表 在了解顺序表前,我们得先了解线性表的概念 线性表(linear…...
嵌入式安防监控项目——实现真实数据的上传
目录 一、相关驱动开发 二、A9主框架 三、脚本及数据上传实验 https://www.yuque.com/uh1h8r/dqrma0/tx0fq08mw1ar1sor?singleDoc# 《常见问题》 上个笔记的相关问题 一、相关驱动开发 /* mpu6050六轴传感器 */ i2c138B0000 { /* #address-cells <1>…...
SAP 生成UUID
UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。 UUID-Universally…...
DevOPs介绍,这一篇就足够了
一、什么是DevOps? DevOps是一种将软件开发和IT运维进行整合的文化和运动。它的目标是通过加强软件开发、测试和运维之间的协作和沟通,使整个软件开发和交付过程更加高效、快速、安全和可靠。DevOps涵盖了从计划和设计到开发、测试、交付和部署的全生命…...
libcurl库简介
一、libcurl简介libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。…...
Spark SQL支持DataFrame操作的数据源
DataFrame提供统一接口加载和保存数据源中的数据,包括:结构化数据、Parquet文件、JSON文件、Hive表,以及通过JDBC连接外部数据源。一个DataFrame可以作为普通的RDD操作,也可以通过(registerTempTable)注册成…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

我们只需要在STC-ISP里设置一下即可