【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时间标志位置0
		Send_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.0592MHz
			Distance /= 12.0;	//STC15单片机运行速度是51单片机的12倍,这里要除以12.0
            if (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 0000
	P0 = 0x00;	//off蜂鸣器继电器
	
	P2 = 0x80;	// 1000 0000
	P0 = 0xFF;	//offLED
	
	P2 = 0xC0;	//使能锁存器U8 1100 0000
	P0 = 0xFF;	//选择所有数码管
	P2 = 0xFF;	//使能锁存器U7 1111 1111
	P0 = 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.0592MHz

extern 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单片机)

更新中...

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

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

相关文章

C++修炼之练气期第八层——内联函数

文章目录 一、宏的缺点 引例 改正一 改正二 改正三 宏的缺陷 二、内联函数的概念 三、内联与非内联的区别 四、内联函数的特性 专栏导读 &#x1f338;作者简介&#xff1a;花想云&#xff0c;在读本科生一枚&#xff0c;致力于 C/C、Linux 学习。 &#x1f338;本文收…

【linux】:进程地址空间

文章目录 前言一、进程地址空间总结前言 本篇文章接着上一篇文章继续讲解进程&#xff0c;主要讲述了进程在运行过程中是如何在内存中被读取的以及为什么要有虚拟地址的存在&#xff0c;CPU在运行过程中是拿到程序的虚拟地址还是真实的物理内存。 一、进程地址空间 下面我们先…

【Spring从入门到实战】第 5 讲:SpringBoot实现拦截器及其原理

本文已收录于专栏&#x1f332;《Spring从入门到实战》&#x1f332;专栏前言 大家好&#xff0c;我是执梗。本专栏将从Spring入门开始讲起&#xff0c;详细讲解各类配置的使用以及原因&#xff0c;到使用SpringBoot进行开发实战&#xff0c;旨在记录学习生活的同时也希望能帮到…

【Maven】Maven的安装与下载

目录 一、Maven 软件的下载 二、Maven 软件的安装 三、JDK 的准备与统一 1. JDK 环境: 2. Maven 及 JDK 配置 四、Maven 软件版本测试 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、Maven 软件的下载 为了使用 Maven 管理…

6万字144道耗时72小时吐血整理【金三银四(金九银十)面试小抄之Java经典面试题基础篇总结】(附答案)

目录一.前言二.Java基础面试篇1. 什么是Java&#xff1f;2.Java 和 C的区别&#xff1f;3.Java中常用的注释以及作用&#xff1f;4.标识符的命名规则5.JVM、JRE和JDK的关系6.Oracle JDK 和 OpenJDK 的对比7.Java中基本数据类型8.int 和 Integer 有什么区别9.switch 是否能作用在…

【Effective C++详细总结】第二章 构造/析构/赋值运算

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…

理清gcc、g++、libc、glibc、libstdc++的关系

0 理清gcc、g++、libc、glibc、libstdc++的关系 0.1 $ dpkg -L libc6 $ dpkg -L libc6 /lib/x86_64-linux-gnu /lib/x86_64-linux-gnu/ld-2.31.so /lib/x86_64-linux-gnu/libBrokenLocale-2.31.so /lib/x86_64-linux-gnu/libSegFault.so /lib/x86_64-linux-gnu/libanl-2.31.s…

Java NIO Buffer

Buffer是一块内存&#xff0c;主要用在NIO Channel&#xff0c;比如FileChannel,SocketChannel。 对Channel的读写都是直接操作Buffer对象。 Buffer是一个工具类&#xff0c;提供了操作这个内存块的方法。 Buffer的实现主要有以下几种&#xff1a; Buffer的类型&#xff1a; …

我一个普通程序员,光靠GitHub打赏就年入70万,

一个国外程序员名叫 Caleb Porzio在网上公开了自己用GitHub打赏年入70万的消息和具体做法。 Caleb Porzio 发推庆祝自己靠 GitHub 打赏&#xff08;GitHub Sponsors&#xff09;赚到了 10 万美元。 GitHub Sponsors是 GitHub 2019 年 5 月份推出的一个功能&#xff0c;允许开发…

ConvMixer:Patches Are All You Need

Patches Are All You Need 发表时间&#xff1a;[Submitted on 24 Jan 2022]&#xff1b; 发表期刊/会议&#xff1a;Computer Vision and Pattern Recognition&#xff1b; 论文地址&#xff1a;https://arxiv.org/abs/2201.09792&#xff1b; 代码地址&#xff1a;https:…

Redis 主从库如何实现数据一致?

目录 1、主从库间如何进行第一次同步&#xff1f; 2、主从级联模式分担全量复制时的主库压力 3、主从库间网络断了怎么办&#xff1f; 总结 // 好的文章&#xff0c;值得反复去读 Redis 具有高可靠性&#xff0c;这里有两层含义&#xff1a;一是数据尽量少丢失&#xff0c;…

【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SpringBoot:SpringBoot 的底层运行原理解析

声明原文出处&#xff1a;狂神说 文章目录1. pom.xml1 . 父依赖2 . 启动器 spring-boot-starter2. 主启动类的注解1. 默认的主启动类2. SpringBootApplication3. ComponentScan4. SpringBootConfiguration5. SpringBootApplication 注解6. spring.factories7. 结论8. 简单图解3…

【Python】如何使用Pandas进行数据可视化?

如何使用Pandas进行数据可视化&#xff1f;1. 如何创建简单图&#xff1f;1.1 创建线型图1.2 绘制直方图1.3 绘制条形图1.4 绘制饼图1.5 绘制散点图2. Plot方法有哪些&#xff1f;3. 如何定制图表的样式和颜色&#xff1f;4. 如何同时对多个DataFrame绘图&#xff1f;5. 总结参…

K8s运维-高级网络策略介绍

1什么是NetworkPolicy&#xff1f;如果你希望在 IP 地址或端口层面&#xff08;OSI 第 3 层或第 4 层&#xff09;控制网络流量&#xff0c; 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略&#xff08;NetworkPolicy&#xff09;。NetworkPolicy 是一种以应用为中心的…

【1615. 最大网络秩】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。 两座不同城市构成的 城市对 的 网络秩 定义为&#xff…

从0到1构建springboot web应用镜像并使用容器部署

文章目录一、生成镜像的两种方法1.1、使用commit生成镜像1.1.1、拉取Centos基础镜像1.1.2、启动Centos容器并安装Go1.1.3、commit生成新镜像1.1.4、使用新镜像验证Golang环境1.2、使用Dockerfile生成镜像二、基于Dockerfile生成一个springboot镜像2.1、准备springboot应用jar包…

python自动化办公(一)

本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数&#xff0c;常用前4个&#xff0c;除了file参数外&#xff0c;其他参数都有默认值。file指定了要打开的文件名称&a…

FreeRTOS系列第1篇---为什么选择FreeRTOS?

1.为什么学习RTOS&#xff1f; 作为基于ARM7、Cortex-M3硬件开发的嵌入式工程师&#xff0c;我一直反对使用RTOS。不仅因为不恰当的使用RTOS会给项目带来额外的稳定性风险&#xff0c;更重要的是我认为绝大多数基于ARM7、Cortex-M3硬件的项目&#xff0c;还没复杂到使用RTOS的地…

【华为机试真题详解 Python实现】最差产品奖【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…
最新文章