当前位置: 首页 > news >正文

【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 超声波代码思路

  1. 发送8个40KHz的超声波信号
  2. 检测接收管脚高电平时间
  3. 根据时间计算距离值


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文件的一些解释说明

  1. Ultrasonic_Delay25us函数是Send_wave的内部调用函数,就是生成一个40KHz方波信号的函数
  2. 超声波测距函数,带float类型返回值,直接调用Ultrasonic_Ranging函数返回float类型的距离
  3. 注意Distance /= 12.0; 不能写Distance /= 12; 因为Distance是float类型!!!
  4. 定时器0中断服务函数放在本文件中,因为方便使用200ms的标志位Ultrasonic_Time_Flag

1.3.3 距离计算

计算公式:s = v*t  

  1. s:距离
  2. v:声音的传播速度
  3. 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
由于这个计数时间是双程距离(来回),所以时间要/2  

t = (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 传播速度

声音在空气中传播的影响因素有许多

  1. 声音的传播速度跟介质的反抗平衡力有关,反抗平衡力就是当物质的某个分子偏离其平衡位置时,其周围的分子就要把它挤回到平衡位置上,而反抗平衡力越大,声音就传播的越快。水的反抗平衡力要比空气的大,而铁的反抗平衡力又比水的大。
  2. 声音在空气中的传播速度还与压强有关。
  3. 声音在空气中的速度随温度的变化而变化,温度每上升/下降5℃,声音的速度上升/下降3m/s。声音在空气中的传播速度是:空气(15℃)340m/s ,空气(25℃)346m/s 。
  4. 声音的传播速度随物质的坚韧性的增大而增加,物质的密度减小而减少。一般情况下,同温度下,固体传声最快,液体次之,气体最慢;而在同种介质中,温度越低声速越慢。
  5. 声音的传播与阻力有关。声音会因外界物质的阻挡而发生折射,例如人面对群山呼喊,就可以听得到自己的回声。

声音在空气中的传播速度=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 动态操作定时任务&#xff08;启动、停止、修改执行周期&#xff0c;该篇博客还是帮助了很多同学。 但是该篇博客中的方法有些不足的地方&#xff1a; 只能通过前端控制器controller手动注册任务。【具体的应该是我们提前配置好我们的任务&am…...

快排函数 -- qsort函数(Quick Sort)

文章目录&#x1f50e;1.qsort函数简介&#x1f4a1;1.1.函数原型&#x1f4a1;1.2.参数含义&#x1f50e;2.比较函数介绍&#x1f50e;3.比较函数使用案例&#x1f4a1;3.1.整型数组&#x1f4a1;3.2.浮点型数组&#x1f4a1;3.3.结构体类型 - 字符串&#x1f50e;4.利用冒泡排…...

条形码和二维码

前言&#xff1a;需要的包的相关文档 1. Barcode&#xff1a;https://pypi.org/project/python-barcode/0.8.1/ 2. Qrcode&#xff1a;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叠氮,酯溶性染料修饰叠氮基团,相关知识

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;N/A中文名&#xff1a;IR-808叠氮英文名&#xff1a;IR-808 N3&#xff0c;IR-808 azideIR-808结构式&#xff08;Structural&#xff09;&#xff1a;详细产品数据&#xff08;Detailed …...

面试官:MQ的好处到底有哪些?

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…...

事务机制:Redis能实现ACID属性吗?

ACID特性无需多言。我们知道关系数据库比如mysql可以实现事务的ACID特性&#xff0c;begin,commit,回滚实现。 那么redis可以实现ACID吗&#xff0c;结论是不能完全保证。 首先要知道redis通过MULTI关键字开启事务&#xff0c;中间一系列操作&#xff0c;加到操作队列中并不执…...

如何在 Apinto 实现 HTTP 与 gRPC 的协议转换(上)

什么是 gRPC 像 gRPC 是由 google 开发的一个高性能、通用的开源 RPC 框架&#xff0c;主要面向移动应用开发且基于 HTTP/2 协议标准而设计&#xff0c;同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输&#xff0c;而 HTTP/2 相比 HTTP1.x &#xff0c;有以下优势:…...

3分钟看完-丄-Python自动化测试【项目实战解析】经验分享

目录&#xff1a;导读 引言 自动化测试 背景 测试团队 测试体系发展 测试平台 自动化测试现状 现状一&#xff1a; 现状二&#xff1a; 现状三&#xff1a; 现状四&#xff1a; 现状五&#xff1a; 现状六&#xff1a; 失败的背景 失败的经历 失败总结 引言 内…...

Web漏洞-命令执行和代码执行漏洞

命令执行原理就是指用户通过浏览器或其他辅助程序提交执行命令&#xff0c;由于服务器端没有针对执行函数做过滤&#xff0c;导致在没有指定绝对路径的情况下就执行命令。漏洞成因它所执行的命令会继承WebServer的权限&#xff0c;也就是说可以任意读取、修改、执行Web目录下的…...

Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings

Towards Unsupervised Text Classification Leveraging Experts and Word Embeddings Abstract 该论文提出了一种无监督的方法&#xff0c;使用每个文档中相关单词之间的文本相似度以及每个类别的关键字字典将文档分为几类。所提出的方法通过人类专业知识和语言模型丰富了类别…...

linux进程管理

进程管理 进程是启动的可执行程序的一个指令 1、进程简介 &#xff08;1&#xff09;进程的组成部分 已分配内存的地址空间安全属性&#xff0c;包括所有权凭据和特权程序代码的一个或多个执行线程进程状态 &#xff08;2&#xff09;程序和进程的区别 程序是一个静态的二进制…...

【深度强化学习】(6) PPO 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下深度强化学习中的近端策略优化算法&#xff08;proximal policy optimization&#xff0c;PPO&#xff09;&#xff0c;并借助 OpenAI 的 gym 环境完成一个小案例&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://gith…...

【数据结构】第二站:顺序表

目录 一、线性表 二、顺序表 1.顺序表的概念以及结构 2.顺序表的接口实现 3.顺序表完整代码 三、顺序表的经典题目 1.移除元素 2.删除有序数组中的重复项 3.合并两个有序数组 一、线性表 在了解顺序表前&#xff0c;我们得先了解线性表的概念 线性表&#xff08;linear…...

嵌入式安防监控项目——实现真实数据的上传

目录 一、相关驱动开发 二、A9主框架 三、脚本及数据上传实验 https://www.yuque.com/uh1h8r/dqrma0/tx0fq08mw1ar1sor?singleDoc# 《常见问题》 上个笔记的相关问题 一、相关驱动开发 /* mpu6050六轴传感器 */ i2c138B0000 { /* #address-cells <1>…...

SAP 生成UUID

UUID含义是通用唯一识别码 (Universally Unique Identifier)&#xff0c;这 是一个软件建构的标准&#xff0c;也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。 UUID-Universally…...

DevOPs介绍,这一篇就足够了

一、什么是DevOps&#xff1f; DevOps是一种将软件开发和IT运维进行整合的文化和运动。它的目标是通过加强软件开发、测试和运维之间的协作和沟通&#xff0c;使整个软件开发和交付过程更加高效、快速、安全和可靠。DevOps涵盖了从计划和设计到开发、测试、交付和部署的全生命…...

libcurl库简介

一、libcurl简介libcurl是一个跨平台的网络协议库&#xff0c;支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传&#xff0c;代理&#xff0c;cookies,和用户认证。…...

Spark SQL支持DataFrame操作的数据源

DataFrame提供统一接口加载和保存数据源中的数据&#xff0c;包括&#xff1a;结构化数据、Parquet文件、JSON文件、Hive表&#xff0c;以及通过JDBC连接外部数据源。一个DataFrame可以作为普通的RDD操作&#xff0c;也可以通过&#xff08;registerTempTable&#xff09;注册成…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...