全自动调节灯光强度的实现(仿真+程序+文档)

news2025/1/6 19:29:47

目 录
摘 要 I
Abstract II

  1. 绪论 1
    1.1 选题背景及意义 1
    1.2 国内外研究现状 1
    1.3 研究主要内容 3
  2. 图书馆学习桌台灯智能控制系统简介与方案分析 4
    2.1 大学图书馆照明控制现状 4
    2.2 图书馆学习桌台灯智能控制系统简介 4
    2.3 系统控制方案分析 4
    2.4 本章小节 5
  3. 系统硬件设计 6
    3.1 系统的硬件构成 6
    3.2 系统控制的主要硬件电路 7
    3.2.1 系统主控电路 7
    3.2.2 系统供电电路 7
    3.2.3 系统复位电路 8
    3.2.4 数据采集电路 10
    3.2.5 系统时钟电路 13
    3.2.6 继电器驱动电路 14
    3.2.7 蜂鸣报警电路 15
    3.2.8 按键控制电路 16
  4. 系统软件设计 17
    4.1系统监控主程序模块 17
    4.1.1 系统自检初始化 17
    4.1.2 定时中断处理设计 18
    4.2 数据采集模块 18
    4.2.1 人体存在传感器的优缺点 18
    4.2.2 数据采集软件的实现 18
    4.2.3 人体存在传感器的抗干扰措施 19
    4.2.4 人体存在传感器的安装要求 20
    4.3 时钟模块 20
    4.3.1 数据输入输出 20
    4.3.2 时钟自检初始化 21
    4.3.3 时钟程序设计 23
    4.4 系统工作总流程 24
    4.5 本章小节 24
  5. 系统调试运行及问题分析 26
    5.1 单片机系统调试方法及步骤 26
    5.2 主要问题分析 28
  6. 结论 29
    参考文献 30
    附 录 31
    谢 辞 32
    1.3 研究主要内容
    本论文分析了当前中国的用电现状,并针对图书馆用电大量浪费的现象,提出了图书馆学习桌台灯智能控制控制的思想,分析了图书馆学习桌台灯智能控制的原理和实现方法,并采用单片机作为整个系统的核心智能控制部件。本系统采用AT89S51单片机作为控制装置的智能部件,在图书馆前门和后门,采用热释电红外传感器检测人体的存在;采用光敏电阻组成的电路检测外界环境的光照强度;利用液晶显示器,能与单片机系统的接口简单可靠,使用方便;通过按键完成手动与自动模式的切换,实现手动控制灯的亮灭;本系统就会通过对人体的存在信号与外界环境的光照强度信号的识别来智能判断,当有人靠近学习桌时(人体感应),灯光会自动打开。灯光的亮度会根据自然光的光照强度来自动来自动调节。同时根据某个时段灯光处于不同的颜色。调试结果证明该系统具有很好的人机交互界面,能对图书馆学习桌台灯智能控制进行智能控制,可以避免学校图书馆用电的大量浪费。

2.图书馆学习桌台灯智能控制系统简介与方案分析
2.1 大学图书馆照明控制现状
很多大学的图书馆,在白天上课期间主要是以自然光为主,只有在阴天下雨或者有树木遮挡的图书馆才使用灯光来补偿;晚上大多数学生会去图书馆上自习,有的教师用来上课,为了不让学生的视力受到灯光的损坏,给学生提供一个良好的光照环境,那么就必须考虑到灯光的合理分配,这样就需要投入资金来安装这些自动控制系统。
能够通过两种方法来达到节能的目的:第一可以使用节能灯,因为在明质量达到要求的情况下,只有通过使用照明设备效率高的产品才能节约能源;另一种是研究出一种智能化的照明控制系统,在满足照明需求的情况下,通过智能化的控制灯具来达到节约能的目的[10]。
2.2 图书馆学习桌台灯智能控制系统简介
图书馆学习桌台灯智能控制系统就是对大学图书馆内的灯光进行智能化的控制,它主要是通过对人体信号以及光环境信号进行采集,环境强度只要达到一定值那么就不开灯,光照强度在一定值一下并且有人体存在时才开灯,只有对图书馆灯安装智能控制系统才可以实现上述目标。
2.3 系统控制方案分析
该控制器主要依靠输入的自然光强度以及人体存在信息这些参数来进行控制,自动控制和手动控制能够同时存。一般情况下,系统会默认为自动控制,只有人为的把按键模块按下时,这时系统就会改为强制控制。如果灯光控制系统处在自动控制模式,并且还要保证自然光照比较足够,那么此时无论图书馆内有人还是无人,灯都不会被打开;在自然光照强度较弱时,并且图书馆内有人存在且超过一定时间,那么控制器就会自动打开电灯,只有当图书馆人全都离开后且延时一定时间后,灯就会自动熄灭。同时,还应该设置作息时间来进行控制系统的运行,夜晚只要超过10点,如果图书馆内还有人在上自习,那么系统就会自动关闭控制器,这时就可以启动手动控制,这样就可以解决特殊情况下,自动控制器的缺陷。
关于图书馆中用到的灯光控制器一般都由硬件和软件组成。整个控制系统的运行首先离不开硬件,硬件的作用就是为软件中程序的运行提供平台。然而软件部分的作用则是对硬件端口所能体现出的信号加以采集,并且经过综合分析、处理,最后才能实现控制器的各种功能,最终才能达到设计的目的。

 #include<reg51.h>
 #include<intrins.h>
  #include<string.h>
 #define uchar unsigned char
 #define uint unsigned int
 #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
 sbit SDA=P1^0;  // DS1302数据线
 sbit CLK=P1^1;  //	 DS1302时钟线
 sbit RST=P1^2;  // DS1302复位线
 //DS18B20数据端口定义
sbit DQ=P2^4;    //DS18B20数据端口
 sbit LCD_RS=P2^5;   // LCD寄存器选择
 sbit LCD_RW=P2^6;   // 	LCD读写/写控制
 sbit LCD_EN=P2^7;   //  LCD启用
 sbit K1=P3^2;   //  选择
 sbit K2=P3^3;   // 确定 
 sbit K3=P3^5;   // 加
 sbit K4=P3^6;  // 减

 
sbit key_1=P3^0;	//自动手动切换
sbit key_2=P3^1;	//关灯,按一下,关一个
sbit key_3=P3^4;	//开灯,按一下,开一个
uchar code zz[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
uchar code fz[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};  
sbit R_LED=P2^0;   //红灯
sbit Y_LED=P2^1;   //黄灯
sbit G_LED=P2^2;   //绿灯
sbit B_LED=P2^3;   //蓝灯

sbit guangmin=P1^3;	  //光敏电阻传感器
sbit ren1=P1^4;		  //红外热释电传感器1
sbit ren2=P1^5;		  //红外热释电传感器2
sbit ren3=P1^6;		  //红外热释电传感器3
sbit ren4=P1^7;		  //红外热释电传感器4



//温度字符
 uchar code Temperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};
//温度小数对照表
 uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
 uchar CurrentT=0; //当前读取温度的整数部分
 uchar Temp_Value[]={0x00,0x00};	 //从DS18B20读取的温度值
 uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位
bit DS18B20_IS_OK=1;//传感器正常标志

 uchar tCount=0;
 //一年中每个月的天数,2月的天数由年份决定
 uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
 //周日,每周一到周六(0,1-6)【读取DS1302时分别是1-7】
 uchar *WEEK[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};

//LCD显示缓冲
uchar LCD_DSY_BUFFER1[]={"00-00-00        "};
uchar LCD_DSY_BUFFER2[]={"00-00-00      "};
uchar DateTime[7];  //所读取的日期时间
uchar Adjust_flag=0; //当前调节的时间对像:秒,分,时,日,月,年(1,2,3,4,5,6)
uchar Change_Flag[]=" YMDHM";//(分,时,日,月,年)(不调节秒与周)

//延时
void DelayMS(uchar x)
{uchar i;
while(x--)
for(i=0;i<120;i++);
}

//向DS1302写入一个字节
void Write_A_Byte_TO_DS1302(uchar x)
{uchar i;
for(i=0;i<8;i++)
{SDA=x&1;  CLK=1;  CLK=0; x>>=1;
}
}

//从DS11302读取一个字节
uchar Get_A_Byte_FROM_DS1302()
{uchar i,b,t;
for(i=0;i<8;i++)
{b>>=1; t=SDA; b|=t<<7;  CLK=1;CLK=0;
}
//BCD码转换
return b/16*10+b%16;
}
//从DS1302指定位置读数据
uchar Read_Data(uchar addr)
{uchar dat;
RST=0; CLK=0; RST=1;
Write_A_Byte_TO_DS1302(addr);
dat=Get_A_Byte_FROM_DS1302();
CLK=1;RST=0;
return dat;
}

//向DS1302某地址写入数据
void Write_DS1302(uchar addr,uchar dat)
{CLK=0;RST=1;
Write_A_Byte_TO_DS1302(addr);
Write_A_Byte_TO_DS1302(dat);
CLK=0;RST=0;
}

//设置时间
void SET_DS1302()
{ uchar i;
Write_DS1302(0x8e,0x00); //写控制字,取消写保护
//分时日月年依次写入
for(i=0;i<7;i++)
{
//分的起始地址10000010(0x82),后面连续依次是时,日,月,周,年,写入 地址每次增2
Write_DS1302(0X80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));
}
Write_DS1302(0x8e,0x80);//加保护
}

//读取当前的时间
void GetTime()
{
  uchar i;
  for(i=0;i<7;i++)
   {
     DateTime[i]=Read_Data(0x81+2*i);
   }
}


//LCD忙等待
 bit LCD_Busy_Check()
 {bit result;
 LCD_RS=0;
 LCD_RW=1;
 LCD_EN=1;
 delayNOP();
 result=(bit)(P0&0x80);
 LCD_EN=0;
 return result;
 }

 //写指令
void Write_LCD_Command(uchar cmd)
{while(LCD_Busy_Check());
LCD_RS=0;LCD_RW=0;LCD_EN=0;	_nop_(); 	_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
 //写数据
void Write_LCD_Data(uchar dat)
{while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}

//初始化
void Init_LCD()
{Write_LCD_Command(0x01);DelayMS(5);
Write_LCD_Command(0x38);DelayMS(5);
Write_LCD_Command(0x0c);DelayMS(5);
Write_LCD_Command(0x06);DelayMS(5);
}
//设置显示位置
 void Set_LCD_POS(uchar pos)
 {	Write_LCD_Command(pos|0x80);
  }

//在LCD上显示字符串
void Display_LCD_String(uchar p,uchar *s)
{uchar i;
Set_LCD_POS(p);
for(i=0;i<16;i++)
{Write_LCD_Data(s[i]);
DelayMS(1);
}
}

//日期与时间值转换为数字字符
void Format_DateTime(uchar d,uchar *a)
{a[0]=d/10+'0';
a[1]=d%10+'0';
}

//判断是否为闰年
uchar isLeapYear(uint y)
{return (y%4==0&&y%100!=0)||(y%400==0);
}

//求自2000.1.1开始的任何一天是星期几
void RefreshWeekDay()
{uint i,d,w=5; //已知1999.12.31是星期五
for(i=2000;i<2000+DateTime[6];i++)
{ d=isLeapYear(i)?366:365;
w=(w+d)%7;
}
d=0;
for(i=1;i<DateTime[4];i++)
d+=MonthsDays[i];
d+=DateTime[3];
//保存星期,0~6表示星期日,星期一,二.....六,为了与DS1302的星期格式匹配,返回值需要加1
DateTime[5]=(w+d)%7+1;
}

 //延时函数2
 void Delay(uint x)
 {while(--x);
 }
 /***************初始化18B20温度函数******************/
uchar Init_DS18B20()
{
   uchar status;
   DQ=1;
   Delay(8);
   DQ=0;
   Delay(90);
   DQ=1;
   Delay(8);
   status=DQ;
   Delay(100);
   DQ=1;
   return status;
}
 
//读一字节
uchar ReadOneByte()
{uchar i,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
if(DQ)dat|=0x80;
Delay(30);
DQ=1;
}
return dat;
}

//写一字节
void WriteOneByte(uchar dat)
{uchar i;
for(i=0;i<8;i++)
{ DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
}
}

//读取温度值
void Read_Temperature()
{
//延时值与负数标识
uchar t=150,ng=0;
//高5位全为1(0xf8)则为负数,为负数时取反加1,并设置负数标识

if(Init_DS18B20()==1)  //DS18B20故障
DS18B20_IS_OK=0;
else
{WriteOneByte(0xcc);   //跳过序列号
WriteOneByte(0x44);//启动温度转换
 Init_DS18B20();
 WriteOneByte(0xcc);   //跳过序列号
WriteOneByte(0xBE);//读取温度寄存器
Temp_Value[0]=ReadOneByte();  //温度低8位
Temp_Value[1]=ReadOneByte();  //温度高8位
DS18B20_IS_OK=1;
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
//负数标志置1
ng=1;
}
//查表得到温度的小数部分
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
//获取温度整数部分(高字节中的低三位与低字节中的高4位,无符号)
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0X07)<<4);
//将整数部分分解为3位待显示数字
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;

//刷新LCD显示缓冲
LCD_DSY_BUFFER2[13]= Display_Digit[0]+'0';
LCD_DSY_BUFFER2[12]='.'	;
LCD_DSY_BUFFER2[11]=Display_Digit[1]+'0';
LCD_DSY_BUFFER2[10]=Display_Digit[2]+'0';
LCD_DSY_BUFFER2[9]=Display_Digit[3]+'0';
//高位为0时不显示
if(Display_Digit[3]==0)	 LCD_DSY_BUFFER2[9]=' ';
//高位为0,且次高位为0时,次高位不显示
if(Display_Digit[2]==0&&Display_Digit[3]==0)
LCD_DSY_BUFFER2[10]=' ';

 //负数符号显示在恰当的位置
 if(ng)
 {if(LCD_DSY_BUFFER2[10]==' ')
LCD_DSY_BUFFER2[10]='-';
 else
if(LCD_DSY_BUFFER2[9]==' ')
LCD_DSY_BUFFER2[9]='-';
 else
  LCD_DSY_BUFFER2[8]='-';
 }
}
}


//键盘中断 0
void EX_INT0() interrupt 0
{if(K1==0)  //选择调整对象(Y M D H M)
{ while(K1==0);
 Adjust_flag++;
 LCD_DSY_BUFFER1[13]='[';
 LCD_DSY_BUFFER1[14]=Change_Flag[Adjust_flag];
 LCD_DSY_BUFFER1[15]=']';
 if(Adjust_flag==6)
{Adjust_flag=0;
 LCD_DSY_BUFFER1[13]=' ';
 LCD_DSY_BUFFER1[14]=' ';
 LCD_DSY_BUFFER1[15]=' ';
 
 }
}
}

//键盘中断1
void EX_INT1() interrupt 2
{
while(K2==0);
SET_DS1302();//将调整后的时间写入DS1302
LCD_DSY_BUFFER1[13]=' ';
LCD_DSY_BUFFER1[14]=' ';
LCD_DSY_BUFFER1[15]=' ';
Adjust_flag=0;//操作索引重设为-1,时间继续正常显示
}


//定时器0每秒刷新LCD显示
void T0_INT() interrupt 1
{ uchar i;
TH0=-50000/256;
TL0=-50000%256;
 Set_LCD_POS(0X4e);Write_LCD_Data(0Xdf); 
 Set_LCD_POS(0X4f);Write_LCD_Data('C'); 
if(++tCount!=2) return;
tCount=0;
Read_Temperature();
//按指定的格式生成待显示的日期时间串
Format_DateTime(DateTime[6],LCD_DSY_BUFFER1);
Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+3);
Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+6);
//星期
strcpy(LCD_DSY_BUFFER1+9,WEEK[DateTime[5]-1]);
//时分秒
Format_DateTime(DateTime[2],LCD_DSY_BUFFER2);
Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+3);
Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+6);
//显示年月日,星期,时分秒
Display_LCD_String(0x00,LCD_DSY_BUFFER1);
Set_LCD_POS(0x40);
for(i=0;i<14;i++)
{
Write_LCD_Data(LCD_DSY_BUFFER2[i]);
DelayMS(1);
}
}

//手动按键控制灯函数
void key_LED()
{ 
  R_LED=1;
  Y_LED=1;
  G_LED=1;
  B_LED=1;
  if(key_2==0)
   {
       R_LED=0;
       Y_LED=0;
       G_LED=0;
       B_LED=0;  
   }
  if(key_3==0)
   {
       R_LED=1;
       Y_LED=1;
       G_LED=1;
       B_LED=1;  
   }
  
} 


//主程序
void main()
{
Init_LCD();//液晶初始化
IE=0X87;//允许INT0,T0中断
IP=0X05;
IT0=0X01;
IT1=0X01;
TMOD=0X01;
TH0=-50000/256;
TL0=-50000%256;
TR0=1;
while(1)
{  
  R_LED=Y_LED=G_LED=B_LED=1;
  if(key_1==0)	//手动模式
   {
   	 key_LED();	 //按键控制灯函数
   }
  else
   {
   	 if(DateTime[2]>18||DateTime[2]<6||guangmin==0)
      {
	    if(ren1==0)
		 {
		   R_LED=0;
	       Y_LED=1;
	       G_LED=1;
	       B_LED=1;
		 }
		if(ren2==0)
		 {
		   R_LED=0;
	       Y_LED=0;
	       G_LED=1;
	       B_LED=1; 
		 }
	    if(ren3==0)
		 {
		   R_LED=0;
	       Y_LED=0;
	       G_LED=0;
	       B_LED=1;
		 }
		if(ren4==0)
		 {
		   R_LED=0;
	       Y_LED=0;
	       G_LED=0;
	       B_LED=0;	 
		 }
	  }
   
   }
switch(Adjust_flag)
{
case 0:GetTime(); break;
case 1:
if(K3==0&&DateTime[6]<99)
{
while(K3==0);
DateTime[6]++;}

if(K4==0&&DateTime[6]>0) 
{
while(K4==0);
DateTime[6]--;
}
MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
//如果年份变化后当前月份的天数大于上限则设为上限
if(DateTime[3]>MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();//刷新星期
 break;
       
case 2:
if(K3==0&&DateTime[4]<12)
{
while(K3==0);
DateTime[4]++;}

if(K4==0&&DateTime[4]>1)
{
while(K4==0);
DateTime[4]--;
}
//获取2月份天数
MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
//如果变化后当前月份的天数大于上限则设为上限
if(DateTime[3]>MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();//刷新星期
 break;

case 3://日00-28/29/30/31,调节之前首先根据年份得出该年中2月的天数
MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
//根据当前的月份决定调节日期的上限
if(K3==0&&DateTime[3]<MonthsDays[DateTime[4]])
{
while(K3==0);
 DateTime[3]++;}
if(K4==0&&DateTime[3]>0) 
{
while(K4==0);
DateTime[3]--;
}
break;

case 4://时
if(K3==0&&DateTime[2]<23) 
{
while(K3==0);
DateTime[2]++;}
if(K4==0&&DateTime[2]>0)
{
while(K4==0);
 DateTime[2]--; }
break;
case 5://分
if(K3==0&&DateTime[1]<59)
{ while(K3==0);
DateTime[1]++;   }
if(K4==0&&DateTime[1]>0) 
{while(K4==0);
DateTime[1]--;	
 }
break;
}
}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

JavaScript练手小技巧:我破解了原神官网全屏滚动的秘密

这个标题有点夺人眼球&#xff0c;哈啊哈~骗点击率的。 “原神”官网当真的做的很漂亮&#xff0c;虽然我没玩过这个游戏&#xff0c;但是禁不住喜欢这个网站啊。 https://ys.mihoyo.com/ 最近居家教学上网课。除了上课&#xff0c;实在不想做学校安排的其它任务&#xff0c…

热量衡算习题课

第一部分 --- 传热计算综合例题 1.qm是质量流量&#xff0c;T1&#xff0c;2和 t1,2对应的是热流体和冷流体分别在管道进口和出口的温度 2.吊塔tm是传热温差 3.α1是热流体的对流传热系数&#xff0c;α2是冷流体的对流传热系数&#xff0c;K是整个对流传热过程的总的传热系…

【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug

【Linux】在Xilinx平台上实现UVC Gadget&#xff08;2&#xff09;- 解决dwc3驱动bug一、bug描述二、具体修改方法1. 找到内核源码位置并复制到其他目录2. Petalinux里面设置使用自定义内核源码1) 选第2个Linux Components Selection2) 选linux-kernel&#xff0c;回车&#xf…

【笔试题】【day22】

文章目录第一题&#xff08;循环队列的元素个数&#xff09;第二题&#xff08;二叉排序树插入规则&#xff09;第三题&#xff08;线性探测的平均查找长度&#xff09;第四题&#xff08;关键字比较次数与初始序列无关的&#xff09;第一题&#xff08;循环队列的元素个数&…

m短波宽带通信系统的信道建模matlab仿真

目录 1.算法概述 1.1 Watterson信道模型理论简介 1.2 Nakagami信道模型 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 宽带短波信道的研究是设计宽带大容量短波通信的基础&#xff0c;但是传统的短波信道的研究仅限于窄带信号传输&#xff0c;这已经…

论文阅读-Whisper语音识别(OpenAI)

一、论文信息 论文名称&#xff1a;Robust Speech Recognition via Large-Scale Weak Supervision 代码地址&#xff1a;https://github.com/openai/whisper 官方博客&#xff1a;https://openai.com/blog/whisper 作者团队&#xff1a;OpenAI 二、介绍 Whisper是一个通用…

HAProxy实现负载均衡

目录 一、HAProxy介绍 二、环境准备 三、实验拓扑 四、HAProxy部署 五、配置HAProxy状态页面 一、HAProxy介绍 ha-proxy是一款高性能的负载均衡软件&#xff0c;主要是做7层负载均衡&#xff0c;也可以做4层负载均衡。因为其专注于负载均衡这一些事情&#xff0c;因此与ng…

8、如何使用FactoryBean向Spring容器中注册bean?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

openEuler快速入门-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls&#xff1a;cd&#xff1a;pwd&…

tkinter绘制组件(36)——树状图

tkinter绘制组件&#xff08;36&#xff09;——树状图引言布局函数结构内容数据格式整体框架绘制元素与重绘宽度标识元素展开与闭合完整函数代码效果测试代码最终效果github项目pip下载结语引言 TinUI的第38个元素控件&#xff0c;也是TinUI-4.0-添加的第一个组件&#xff0c…

Rsync下行同步+inotify实时同步介绍和部署

一、Rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限&#xff0c;且采用优化的同步算法&#xff0c;传输前执行压缩&#xf…

2022世界杯结果预测,简单AI模型最有效?附代码!

2022世界杯冠军是谁&#xff1f;本文将为你揭晓一个利用简单AI模型得到的靠谱预测。 许多人称足球为“不可预测的比赛”&#xff0c;因为一场足球比赛有不同的因素可以改变最终比分。 这是真的……在某种程度上。 北大出版社&#xff0c;人工智能原理与实践 人工智能和数据科…

面试官:什么是伪共享,如何避免?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入 Android 交流群。 前言 大家好&#xff0c;我是小彭。 在前面的文章里&#xff0c;我们聊到了 CPU 的高速缓存机制。…

【electron】判断当前进程是否是开发环境的五种方案(获取一些资源的路径)

文章目录导读需求开发环境判断是否是开发环境方案一&#xff1a;location.protocol方案二&#xff1a;全局变量__static方案三&#xff1a;全局变量process.resourcesPath方案四&#xff1a;全局变量process.env.WEBPACK_DEV_SERVER方案五&#xff1a;app.isPackaged获取配置目…

OS-process

process 什么是进程 进程是被加载到内存中、正在运行的程序&#xff1b;多个进程可能对于同一个程序、一个正在运行的OS中会有多个进程 进程是程序的一次执行过程&#xff0c;是操作系统分配资源的基本单位 作业等同于进程 进程的布局&#xff1a; 每个进程都有一个不同的…

内网渗透中最常见的十种漏洞分析总结

【环境搭建资料、工具包、全套视频…等籽料】私信聆取 以下信息是根据2020年和2019年为全球各种中型组织和企业完成的60多个渗透测试报告汇总而来的&#xff0c;在跳转到列表之前&#xff0c;让我们简要介绍一下全面的测试方法。 一、测试方法 目的是使用白盒(灰盒)方法在现场…

spirngboot项目.mvn/wrapper/maven-wrapper.properties‘ does not exist.

rm -rf ~ 命令后&#xff0c;项目出现一些问题&#xff0c;如下 执行命令&#xff1a; ./mvnw clean package -am -pl bistoury-dist -P$PROFILR -Dmaven.test.skip -Denforcer.skiptrue 报异常&#xff1a; starting to build bistoury agent Exception in thread "ma…

[附源码]java毕业设计同德佳苑物业管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

SpringBoot数据层解决方案/ 内置持久化解决方案JdbcTemplate使用/内置数据库H2使用以及RedisNoSql使用

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.4 数据层解决方案 3.4.1 使用项目 新建空项目&a…

redis的事务

Redis的事务&#xff1a;一次事务操作&#xff0c;改成功的成功&#xff0c;该失败的失败。 提交事务 如果遇见错误 成功的成功&#xff0c;失败的失败&#xff0c;不会回滚 先开启事务&#xff0c;执行一些列的命令&#xff0c;但是命令不会立即执行&#xff0c;会被放在一…