51单片机定时炸弹-准确计时-两根线随机一根触发中断可“拆弹“(AT89C52)

news2024/12/26 16:35:27

一、设计介绍:

1、使用定时器按照精确时间读秒倒计时,倒计时在LCD1602中居中显示,格式为mm:ss,每秒变化一次

2、默认倒计时10分钟,时间到后显示“Time over”“(((Boom))))”,同事文字开始闪烁。

3、加入两根线,使用中断判断当正确的一根被“剪断”时计时停止跳动。并且在第二行显示“SUCESS”,有且只有第二行文字闪烁。

4、加入随机因素,随机一根线为正确的线,如果“剪”错无事发生。

二、程序解释:

(1)逻辑解释:

初始状态:进行各部分的初始化,将中断标志位置0;

待机状态:初始化完成后直接进入, 然后会在LCD1602中显示"Press To Plant",然后开始检测按钮状态,按钮按下开始生成随机数,然后进入已放置状态。

已放置状态(倒计时状态):不断刷新显示LCD1602上的倒计时,然后判断标志位的变化,如果满足要求则进入对应的状态,已拆除或者爆炸状态。

已拆解状态:倒计时停止,第二行“Success”闪烁显示。

倒计时结束爆炸状态:显示“Time Over”“(((Boom)))”。

(2)模块功能解释

1、LCD1602模块:

  1. lcd1602_write_cmd(u8 cmd): 向LCD发送命令,根据LCD1602_4OR8_DATA_INTERFACE选择8位或4位数据接口发送命令。

  2. lcd1602_write_data(u8 dat): 向LCD发送数据,根据LCD1602_4OR8_DATA_INTERFACE选择8位或4位数据接口发送数据。

  3. lcd1602_init(void): 初始化LCD,根据LCD1602_4OR8_DATA_INTERFACE选择8位或4位数据接口初始化LCD参数。

  4. lcd1602_clear(void): 清空LCD屏幕。

  5. lcd1602_show_string(u8 x, u8 y, u8 *str): 在LCD上显示字符串,根据参数x、y定位显示的起始位置,根据LCD1602_4OR8_DATA_INTERFACE选择8位或4位数据接口显示字符串。

代码中根据宏LCD1602_4OR8_DATA_INTERFACE的设置,可以选择LCD的数据接口为8位或4位。

 LCD1602使用:

  1. 通信接口:LCD1602可以使用4位数据接口或8位数据接口。通过控制使能引脚、RS引脚和数据引脚,可以向LCD1602发送指令或数据。

  2. 初始化:在使用LCD1602之前,需要初始化LCD1602的参数,包括显示模式、光标设置、显示清屏等。初始化完成后,才能正常使用LCD1602进行显示操作。

  3. 操作速度:LCD1602的操作速度不能太快,因为LCD1602的内部需要一定的时间来响应和处理指令。因此,在发送指令或数据之间需要添加适当的延时。

  4. 电源供应:LCD1602通常需要接入适当的电压,一般是5V。同时,LCD1602还需接入背光灯的供电源。

  5. 坐标设置:LCD1602有两行16个字符的显示区域,可以通过设置行号和列号来设置显示字符的位置。要注意LCD1602的寻址范围。

  6. 清屏操作:在需要清空LCD屏幕内容的时候,需要发送清屏命令,并等待清屏完成。

  7. 字符显示:通过发送数据命令,可以在LCD1602上显示字符、数字和其他符号。可以通过控制光标位置来实现不同位置的显示。

  8. 可读性:LCD1602具有特定的观察角度和反射性,要确保LCD1602安装在合适的位置以得到最佳的显示效果。

2、 定时模块

  1. void time0_init(void): 这个函数用于初始化定时器0。在函数中的操作包括:

    • TMOD|=0X01;: 设置定时器0为工作方式1,即16位定时器。
    • TH0=0XFC; 和 TL0=0X18;: 给定时器0赋初值,将TH0和TL0寄存器设置为0xFC18,使定时器初值为0xFC18,定时1ms。
    • ET0=1;: 打开定时器0中断允许。
    • EA=1;: 打开总中断。
    • TR0=1;: 打开定时器0,开始定时器计时。
  2. void time0() interrupt 1: 这是定时器0的中断函数,当定时器0计时完成时,会触发这个中断。在中断函数中的操作包括:

    • 重置定时器初值为0xFC18,以便下一次定时。
    • 静态变量i自增。
    • 如果i达到1000(1秒),则将_seconds减一,即实现了一个1秒的计时效果。
    • 重置计数器i为0,以便下一次计时。

3、延时模块

  1. void delay_10us(u16 ten_us): 这个函数实现了以10微秒为单位的延时函数。函数的实现是通过一个while循环,使变量ten_us递减直到为0。在每次循环中,都会消耗大约10微秒的时间。这个函数适用于较小的延时粒度,例如在控制LCD1602等设备时可能需要较精确的延时。

  2. void delay_ms(u16 ms): 这个函数实现了以毫秒为单位的延时函数。函数通过两层for循环实现延时。外层for循环控制延时的毫秒数,内层for循环为确保每个毫秒都持续一定时间而循环110次。这个函数适用于相对较长的延时,例如在需要较长暂停或延时操作时使用。

4、拆弹模块

  1. void cut_line_init_32(void): 这个函数用于初始化外部中断0,其中的操作包括:

    • IE0=0;: 中断标志位触发。
    • EX0=1;: 打开外部中断0。
    • EA=1;: 打开总中断开关。
    • IT0=1;: 外部中断0设为下降沿触发。
    • PX0=1;: 设置外部中断0的中断优先级。

    中断服务程序 void int0() interrupt 0 using 1:这是外部中断0的中断服务程序。当外部中断0触发时,执行其中的操作:

    • cut变量赋值为1,表示切割操作。
    • ss变量赋值为32,表示对应的索引值为32。
  2. void cut_line_init_33(void): 这个函数用于初始化外部中断1,其中的操作类似于外部中断0的初始化,包括:

    • IE1=0;: 中断标志位触发。
    • EX1=1;: 打开外部中断1。
    • EA=1;: 打开总中断开关。
    • IT1=1;: 外部中断1设为下降沿触发。
    • PX1=1;: 设置外部中断1的中断优先级。

    中断服务程序 void int1() interrupt 2 using 1:这是外部中断1的中断服务程序。当外部中断1触发时,执行其中的操作:

    • cut变量赋值为1,表示切割操作。
    • ss变量赋值为33,表示对应的索引值为33。

其中,cut被置为1意味着引线已经被“剪断了”,改变ss的值用于判断是哪根引线断开了,两根引线分别连接P32和P33引脚,另外一段连接3.3V,当跳线被拔出时,出现电平跳变触发中断。

5、随机数模块

  1. void initTimer(void): 这个函数用于初始化定时器,其中的操作包括:

    • TMOD = 0x01;: 设置定时器0为工作模式1,即16位定时器模式。
    • TH0 = 0xFC;: 初始化定时器初值的高8位。
    • TL0 = 0x18;: 初始化定时器初值的低8位。
    • TR0 = 1;: 启动定时器0,开始计时。
  2. unsigned char getRandom(void): 这个函数用于生成随机数,其中的操作包括:

    • TR0 = 0;: 停止定时器0,暂停计时。
    • randomNum = TH0;: 将定时器0的计数值作为随机数。
    • 重新初始化定时器,以便下次生成随机数:
      • TH0 = 0xFC;: 初始化定时器初值的高8位。
      • TL0 = 0x18;: 初始化定时器初值的低8位。
      • TR0 = 1;: 重新启动定时器0,继续计时。

然后我们将随机数模2,这样通过这个变量来影响哪个跳线是真正可以影响炸弹的引线,具体操作方法为将随机数模2之后的right加ss后的和模2,如果等于0则进入已解除状态,反之没有影响。

三、代码示例

LCD1602控制模块使用的是江协科技的封装:

lcd1602.c

#include "lcd1602.h"

#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_cmd(u8 cmd)
{
	LCD1602_RS=0;//选择命令
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=cmd;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入	
}
#else	//4位LCD
void lcd1602_write_cmd(u8 cmd)
{
	LCD1602_RS=0;//选择命令
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=cmd;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入
	
	LCD1602_DATAPORT=cmd<<4;//准备命令
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入	
}
#endif

#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_write_data(u8 dat) 
{
	LCD1602_RS=1;//选择数据
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=dat;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入		
}
#else
void lcd1602_write_data(u8 dat) 
{
	LCD1602_RS=1;//选择数据
	LCD1602_RW=0;//选择写
	LCD1602_E=0;
	LCD1602_DATAPORT=dat;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入
	
	LCD1602_DATAPORT=dat<<4;//准备数据
	delay_ms(1);
	LCD1602_E=1;//使能脚E先上升沿写入
	delay_ms(1);
	LCD1602_E=0;//使能脚E后负跳变完成写入		
}
#endif

#if (LCD1602_4OR8_DATA_INTERFACE==0)//8位LCD
void lcd1602_init(void)
{
	lcd1602_write_cmd(0x38);//数据总线8位,显示2行,5*7点阵/字符
	lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
	lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
	lcd1602_write_cmd(0x01);//清屏	
}
#else
void lcd1602_init(void)
{
	lcd1602_write_cmd(0x28);//数据总线4位,显示2行,5*7点阵/字符
	lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
	lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
	lcd1602_write_cmd(0x01);//清屏	
}
#endif


void lcd1602_clear(void)
{
	lcd1602_write_cmd(0x01);	
}

void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
	u8 i=0;

	if(y>1||x>15)return;//行列参数不对则强制退出

	if(y<1)	//第1行显示
	{	
		while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
		{
			if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
			{
				lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置	
			}
			else
			{
				lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置	
			}
			lcd1602_write_data(*str);//显示内容
			str++;//指针递增
			i++;	
		}	
	}
	else	//第2行显示
	{
		while(*str!='\0')
		{
			if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
			{
				lcd1602_write_cmd(0x80+0x40+i+x);	
			}
			else
			{
				lcd1602_write_cmd(0x80+i+x-16);	
			}
			lcd1602_write_data(*str);
			str++;
			i++;	
		}	
	}				
}

lcd1602.h

#ifndef _lcd1602_H
#define _lcd1602_H

#include "public.h"

//LCD1602数据口4位和8位定义,若为1,则为LCD1602四位数据口驱动,反之为8位
#define LCD1602_4OR8_DATA_INTERFACE	0	//默认使用8位数据口LCD1602

//管脚定义
sbit LCD1602_RS=P2^6;//数据命令选择
sbit LCD1602_RW=P2^5;//读写选择
sbit LCD1602_E=P2^7; //使能信号
#define LCD1602_DATAPORT P0	//宏定义LCD1602数据端口


//函数声明
void lcd1602_init(void);
void lcd1602_clear(void);
void lcd1602_show_string(u8 x,u8 y,u8 *str);

#endif

延时部分:

public.c

#include "public.h"
void delay_10us(u16 ten_us)
{
	while(ten_us--);	
}

void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
}

public.h

#ifndef _public_H
#define _public_H

#include "reg52.h"

typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;
typedef unsigned long u32;

void delay_10us(u16 ten_us);
void delay_ms(u16 ms);

#endif

还没做定义和声明分离的其他部分:

main.c

#include "public.h"
#include "lcd1602.h"
#include "stdio.h"
#include "string.h"
int cut = 0;
int right = 0;
int randomValue = 0;
int ss = 0;//标志位
unsigned int 	_seconds = 600;//设置默认读秒数为600
char 					_min[2] = {0};
char 					_second[2] = {0};
sbit button = P3^1;
sbit red = P3^2; // 设置k3为红线
sbit blue = P3^3;//设置k4为蓝线
void Sucess(void);

// 初始化定时器
void initTimer(void) {
    TMOD = 0x01;  // 设置为定时器模式
    TH0 = 0xFC;   // 初始化定时器初值
    TL0 = 0x18;
    TR0 = 1;      // 启动定时器
}

// 生成随机数
unsigned char getRandom(void) {
    unsigned char randomNum;
    
    TR0 = 0;  // 停止定时器
    randomNum = TH0;  // 获取定时器计数值作为随机数
    
    // 重新初始化定时器
    TH0 = 0xFC;
    TL0 = 0x18;
    TR0 = 1;
    
    return randomNum;
}

void get_second(unsigned int All_seconds)//参数为总秒数
{
	int second = All_seconds % 60;//对应的余下的秒数
	char second_temp[2] = {0};
	// 提取十位和个位
	int tens = second / 10; // 十位数
	int ones = second % 10; // 个位数
	
	second_temp[0] = tens + 48;
	second_temp[1] = ones + 48;
	
	_second[0] = second_temp[0];
	_second[1] = second_temp[1];

}

void get_min(unsigned int All_seconds)//参数为总秒数,返回值是存储在数组中的分钟数
{
	char min_temp[2] = {0};
	
	int minutes;
	int tens;
	int ones;
	
	if(All_seconds >= 60)
	{
		minutes = All_seconds / 60;
	}
	if(All_seconds < 60)
	{
		minutes = 0;
	}
	// 提取十位和个位
	tens = minutes / 10; // 十位数
	ones = minutes % 10; // 个位数
	
	min_temp[0] = tens + 48;
	min_temp[1] = ones + 48;
	
	_min[0] = min_temp[0];
	_min[1] = min_temp[1];

}

void time0_init(void)//定时器初始化
{
	TMOD|=0X01;//选择为定时器0 模式,工作方式1
	TH0=0XFC; //给定时器赋初值,定时1ms
	TL0=0X18;
	ET0=1;//打开定时器0 中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器
}

void time0() interrupt 1 //定时器0 中断函数
{
	
	
		static u16 i;//定义静态变量i
		TH0=0XFC; //给定时器赋初值,定时1ms
		TL0=0X18;
		i++;
		if(i==1000)//如果达到时间
		{
			i=0;//重置计数器
			_seconds--;//发生效果:读秒数减一
		}
	
}


void cut_line_init_32(void)
{
    IE0=0;        //中断标志位触发
    EX0= 1;        //打开外部中断0
    EA= 1;        //打开总中断开关 
    IT0= 1;        //外部中断0设为低电平触发 // 1则为下降沿触发
    PX0=1;        //中断优先级
}
void int0() interrupt 0 using 1
{
	//编写用户所需的功能代码
	cut = 1;
	ss = 32;
}

void cut_line_init_33(void)
{
    IE1=0;        //中断标志位触发
    EX1= 1;        //打开外部中断0
    EA= 1;        //打开总中断开关 
    IT1= 1;        //外部中断1设为低电平触发 // 1则为下降沿触发
    PX1=1;        //中断优先级
}
void int1() interrupt 2 using 1
{
	//编写用户所需的功能代码
	cut = 1;
	ss = 33;
}
//拆弹成功状态 
void Sucess(void)
{
	int time = _seconds;
	char min[2] = {0};
	char second[2] = {0};
	strcpy(min,_min);
	strcpy(second,_second);
	
	
	lcd1602_show_string(0,0,"                 ");//第一行显示	
	lcd1602_show_string(0,1,"                 ");//第二行显示
	
	lcd1602_show_string(5,0,min);//第一行显示
	lcd1602_show_string(7,0,":");//第一行显示		
	lcd1602_show_string(8,0,second);//第一行显示
	lcd1602_show_string(5,1,"Sucess");//第er行显示
	lcd1602_show_string(10,0,"    ");//第一行显示	
	while(1)
	{
		delay_ms(200);
		lcd1602_show_string(0,1,"                 ");//第二行显示
		lcd1602_show_string(5,1,"Sucess");//第er行显示
	}
}

//爆炸状态
void Boom(void)
{
	while(1)
	{
		lcd1602_show_string(0,0,"              ");//第一行显示	
		lcd1602_show_string(0,1,"              ");//第二行显示
		delay_10us(20000);
		lcd1602_show_string(0,0,"   Time Over");//第一行显示
		lcd1602_show_string(0,1,"   (((Boom)))");//第二行显示
		delay_10us(80000);		
	}		
}

//倒计时状态
void Planted(void)
{
	lcd1602_show_string(0,1,"                ");//第er行显示
	lcd1602_show_string(0,0,"                ");//第er行显示	
	time0_init();
	//*********************************************ce shi
	
	
	while(1)
	{
		get_min(_seconds);
		get_second(_seconds);
		lcd1602_show_string(5,0,_min);//第一行显示
		lcd1602_show_string(7,0,":");//第一行显示		
		lcd1602_show_string(8,0,_second);//第一行显示
		lcd1602_show_string(10,0,"     ");//第一行显示
	
		if(_seconds == 0)
		{
			Boom();//进入爆炸状态
		}
		if((ss + right) % 2== 0 && cut == 1)
		{
			Sucess();//进入成功状态
		}
		
	}  
}
//待机状态
void Standby(void)
{
	while(1)
	{
		lcd1602_show_string(0,0,"Press to ");//第一行显示
		lcd1602_show_string(0,1,"Plant.");//第二行显示
		if(button == 0)
		{
			delay_ms(50);//防抖
			randomValue = getRandom();  // 获取随机数
        // 在这里可以使用随机数进行其他操作
			right = randomValue % 2;
			Planted();//状态切换
			
		}
	}
}

void main()
{	
	initTimer();  // 初始化定时器
	cut_line_init_32();
	cut_line_init_33();
	lcd1602_init();//LCD1602初始化
	
	red = 0; 
	blue = 0;
	while(1)
	{
		Standby();      // 进入待机模式
	}	
}

四、遇到的问题

  1. 语法问题:if中的判断没有使用双等号,导致程序一旦进入“待机模式”就会直接跳入“已拆解模式”。
  2. 细节问题:在初始化中断时,复制粘贴后记得修改寄存器名称,例如将IE0 = 0,改为IE1 = 0,不然中断无法正常触发。
  3. 细节问题:使用引脚前要查看对应开发版原理图手册和开发手册,避免使用了冲突的引脚,或者该引脚没有需要的功能。
  4. 编辑器使用问题:由于有段时间没有使用keil创建新工程,导致忘了如何添加路径,只需要在三个小箱子里加入文件后点击小魔术棒,然后点击C51加入路径就行了。

五、资源共享

Gitee下载:Keil_5_51project: 51学习示例icon-default.png?t=N7T8https://gitee.com/haozhe34866/keil_5_51project.git

效果视频:

【[51单片机]可随机引线“拆弹”LCD1602显示精确读秒】 https://www.bilibili.com/video/BV1FG3ne1EdF/?share_source=copy_web&vd_source=33adf9f4b4c4b1221219d2246aa376b1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible-综合练习-生产案例

斌的招儿 网上教程大多都是官网模板化的教程和文档&#xff0c;这里小斌用自己实际生产环境使用的例子给大家做一个详解。涉及到一整套ansible的使用&#xff0c;对于roles的使用&#xff0c;也仅涉及到tasks和files目录&#xff0c;方便大家快速上手并规范化管理。 0.环境配置…

Spring(核心概念:IoC/DI思想)

目录 一、引言 &#xff08;1&#xff09;如今的代码书写现状 1、业务层 2、数据层 3、假如当项目上线发布之后&#xff0c;想把数据层的实现换一下 二、核心概念 &#xff08;1&#xff09;IoC&#xff08; Inversion of Control ) 控制反转 &#xff08;2&#xff09;…

XML 外部实体注入漏洞

XML&#xff08;可扩展标记语言&#xff09; XML 的定义 XML&#xff08;eXtensible Markup Language&#xff0c;扩展标记语言&#xff09;是一种用于描述结构化数据的标记语言&#xff0c;它类似于 HTML&#xff0c;但它的标签是自定义的。XML 的主要目的是传输和存储数据&…

刷题日记6.25

136. 只出现一次的数字 这道题考察的是异或算法&#xff0c;也是异或算法的一个典型作用例子。 注意题目要求实现线性时间复杂度算法解决&#xff0c;所以就不要想着排序或者用set数组之类的了。 先讲讲异或算法。 异或&#xff08;XOR&#xff09;是一种常用的位运算操作&am…

GIF转字符画

前言 上一次我们实现了静态图片转字符画&#xff1a; https://blog.csdn.net/weixin_54143563/article/details/139778645 由此我们不禁思考&#xff0c;对于动态的gif应该怎么转换呢&#xff1f; 思路 在网上我学习到了一种思路&#xff1a; 1.创建中间的临时文件夹tmp&a…

Web前端期末大作业--绿色自适应医疗健康医院网页设计(HTML+CSS+JavaScript+)实现

Toggle navigation Hospital 首页 关于我们医疗动态医疗资源联系我们 我们的服务 心脏监测 XXX的通道有许多变化&#xff0c;但大多数人以某种形式遭受了改变&#xff0c;通过注射幽默 康复治疗 XXX的通道有许多变化&#xff0c;但大多数人以某种形式遭受了改变&#xff0c;通…

Java技术栈总结:数据库MySQL篇

一、慢查询 1、常见情形 聚合查询 多表查询 表数据量过大查询 深度分页查询 2、定位慢查询 方案一、开源工具 调试工具&#xff1a;Arthas运维工具&#xff1a;Prometheus、Skywalking 方案二、MySQL自带慢日志 在MySQL配置文件 /etc/my.conf 中配置&#xff1a; # …

音频傅里叶变换(基于开源kissffs)

主要参考资料&#xff1a; 深入浅出的讲解傅里叶变换&#xff08;真正的通俗易懂&#xff09;: https://zhuanlan.zhihu.com/p/19763358 推荐开源项目&#xff1a;KISS FFT&#xff1a; https://blog.csdn.net/gitblog_00031/article/details/138840117 数字硅麦数据的处理&…

【Android】实现图片和视频混合轮播(无限循环、视频自动播放)

目录 前言一、实现效果二、具体实现1. 导入依赖2. 布局3. Banner基础配置4. Banner无限循环机制5. 轮播适配器6. 视频播放处理7. 完整源码 总结 前言 我们日常的需求基本上都是图片的轮播&#xff0c;而在一些特殊需求&#xff0c;例如用于展览的的数据大屏&#xff0c;又想展…

使用 Swift 6 语言模式构建 Swift 包

文章目录 前言下载 Swift 6 工具链Swiftenv - macOSSwiftly - Linux在 SPM 中启用语言模式命令行包清单文件输出结论前言 我最近了解到,Swift 6 的一些重大变更(如完整的数据隔离和数据竞争安全检查)将成为 Swift 6 语言模式的一部分,该模式将在 Swift 6 编译器中作为可选…

【征服数据结构】:期末通关秘籍

【征服数据结构】&#xff1a;期末通关秘籍 &#x1f498; 数据结构的基本概念&#x1f608; 数据结构的基本概念&#x1f608; 逻辑结构和存储结构的区别和联系&#x1f608; 算法及其特性&#x1f608; 简答题 &#x1f498; 线性表&#xff08;链表、单链表&#xff09;&…

怎么查找企业的经营动态信息?

很多人都会查询企业的经营动态&#xff0c;比如很多投资者会关注企业的财务状况&#xff0c;市场战略&#xff0c;经营决策等信息&#xff1b;职场上也需要了解竞争对手和合作伙伴的相关经营动态&#xff0c;新品发布&#xff0c;技术专利申请等等。还有一些行业研究人员需要了…

STM32单片机WDG看门狗详解

文章目录 1. WDG简介 2. IWDG框图 3. IWDG键寄存器 4. IWDG超时时间 5. WWDG框图 6. WWDG工作特性 7. WWDG超时时间 8. IWDG和WWDG对比 9. 代码示例 1. WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计…

钡铼技术BL101串口6路Modbus转MQTT网关加速智慧城市部署

随着物联网技术的飞速发展&#xff0c;如何高效地整合传统设备与现代云端系统&#xff0c;成为了亟待解决的关键问题。钡铼技术&#xff0c;作为物联网领域的硬件设备制造商&#xff0c;近期推出的BL101六路串口Modbus转MQTT网关&#xff0c;正以其独特优势&#xff0c;为智慧城…

LabVIEW在光学与光子学实验室中的应用

光学与光子学实验室致力于光学和光子学前沿领域的研究&#xff0c;涉及超快光学、非线性光学、光纤通信、光子晶体等多个方向。实验室需要高精度的实验控制和数据采集系统&#xff0c;以进行复杂的光学实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监…

CMDB详解及对企业的作用

CMDB即配置管理数据库&#xff08;Configuration Management Database&#xff09;&#xff0c;是一种专门用于管理IT资产、配置信息和关系的数据库。CMDB以规划、监控、分析和存档企业的所有IT基础设施和应用程序为目的&#xff0c;成为企业IT管理和运营的重要工具。 CMDB的…

MySQL数据库(二):数据库基本操作

MySQL是一种流行的关系型数据库管理系统&#xff0c;广泛用于Web应用和各种数据存储需求。通过本次介绍&#xff0c;您将学习如何进行MySQL数据库的基本操作&#xff0c;包括创建数据库和表、插入和查询数据、更新和删除记录。这些基础知识将为您打下坚实的数据库操作基础。 目…

Hadoop04【集群环境搭建】

1 dfs.secondary.http.address hadoop-node01:50090 4.mapred-site.xml 首先需要将文件名称修改了。原文件名称为mapred-site.xml.template。指定MapReduce的资源调度方式为yarn。 mapreduce.framework.name yarn 5.yarn-site.xml 指定ResourceManager(yarn的老大)的地址和…

Maven编译打包时报“PKIX path building failed”异常

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 方法11.报错信息2.InstallCert.java3.生成证书文件 jssecacerts4.复制 jssecacerts 文件5. 然后重启Jenkins 或者maven即可 方法21.下载证书2. 导入证书执行keytool…

.NET使用原生方法实现文件压缩和解压

前言 在.NET中实现文件或文件目录压缩和解压可以通过多种方式来完成&#xff0c;包括使用原生方法&#xff08;System.IO.Compression命名空间中的类&#xff09;和第三方库&#xff08;如&#xff1a;SharpZipLib、SharpCompress、K4os.Compression.LZ4等&#xff09;。本文我…