毕业设计 基于STM32与wifi的天气预报网时钟系统 - 物联网 单片机

news2024/10/6 14:33:07

文章目录

  • 0 前言
  • 1 设计内容
  • 2 软件设计
  • 3 关键代码
  • 4 最后


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于STM32与wifi的天气预报网时钟系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

在这里插入图片描述

🧿 项目分享:

https://gitee.com/sinonfin/sharing


1 设计内容

该项目中学长是以实时时钟芯片DS1302和STM32F103C8T6 单片机为主要研究对象,着重进行嵌入式控制系统的设计研究和如何读取DS1302内部时钟信息的研究。以及运用18B20进行实时温度检测。

主要内容包括:

  • 1)实时温度显示;
  • 2)年月日星期时分秒显示;
  • 3)年月日星期时分秒调整;
  • 4)闹钟定时小时分钟和秒;

在这里插入图片描述
原理图如下
在这里插入图片描述

2 软件设计

主程序开始初始化,并打开中断,然后执行扫描闹钟、键盘及读取18B20值。当有S1键按下时,执行时钟设置,当有S4键按下时,则进入闹钟设置,无论是时钟还是闹钟,设置完后退出,温度、时钟恢复实时显示。主程序流程图如图

在这里插入图片描述

通过单片机判断S1按下的次数来设置,由s1num标志位来记录次数,用if语句判断执行命令。系统程序不断扫面键盘,当s1键按下后产生一个低电平,即s1num加一。在调节时间之前首先进行各个变量初始化,及设置起始时间,同时为读取数据作准备。当s1=1时进入秒的设置,地址指针指向miao显示位置处,通过两个if语句分别循环控制显示秒数的加和减。当s1=2时,地址指针指向fen显示位置处,变量最大值为59。当s1=3时,地址指针指向shi显示位置处,变量最大值设为23。当s1=4时,地址指针指向week显示位置处,最大值设为7,1至7分别用MON、TUE、WED、THU 、FRI、SAT、SUN字符串显示。随着s2、s3值的的变化显示不同的字符串。当s1=5时,地址指针指向day显示位置,变量最大值为31。当s1=6时,地址指针指向month显示位置,变量最大值为12。
当s1=7时,地址指针指向year显示位置,最大值为99。

在这里插入图片描述

时间设置程序流程图如图3-3所示。在开始时间设置之前程序会关闭全局中断,直至设置结束,中断又会重新开启,进入计时状态。
闹钟的设置时通过S1键的按下次数来判断的。当单片机检测到S4键按下一次时则进入闹钟设置界面,光标并自动跳到秒设置位置,可以对秒进行设置,当S1键依次按下1、2、3次时,则分别进入闹钟的秒、分、时关的设置。:

在这里插入图片描述

3 关键代码

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "sys.h"
#include "1302.h"
#include "key.h"
#include "timer.h"
#include "flash.h"
#include "ds18b20.h"
#include "time2.h"
#include "beep.h"
#include "lcd1602.h"
u8 key = 0;
u8 keyflag = 0;
u8 time[8];
int flag1 = 0;
u8 flag2 = 0;//闹钟开关状态
u8 flag3;
int beepflag1 = 0;
u8 n = ' ';
u8 memory_flag=0;
extern u8 flag4;
extern u8 flag5;
extern  my_time TIME;
extern u8 time4flag; 
u8 nolock[] = {15,30};
#define size sizeof(nolock)
u8 nolock1[size];
short temperature;					//接收读取到的温度
//#define FLASH_SAVE_ADDR  0X0800b000		//存储的地址p
//#define FLASH_SAVE_ADDR1  0X0800C000		//存储的地址
//#define FLASH_SAVE_ADDR2  0X0800CB00		//存储的地址
u8 state,s0;
u8 key1_flag=1,key2_flag=1,key3_flag=1,key4_flag=1;
u8 sec1,sec2;
u8 ms=0;
u8 read_flag=1;
u8 time_data[7];
u8 time_data_1[7];
u8 time_data_2[7];
u8 time_data_3[7];
u8 time_data_4[7];
u8 beep1=0;

void memory()
{//08002400
	STMFLASH_Write(0X0800b000,(u16*)nolock1,2);
	STMFLASH_Write(0X0800C000,(u16*)&flag2,1);
}

void read_memory()
{
	STMFLASH_Read(0X0800b000,(u16*)nolock1,2);
	STMFLASH_Read(0X0800C000,(u16*)&flag2,1);
	if(nolock1[0]>23||nolock1[1]>59||flag2>1)
	{
		nolock1[0]=6;
		nolock1[1]=30;
		flag2=1;
	}
}

void dis_play()
{
	if(state<7)
	{
		LCD1602_Set_Cursor(0,0);
		if(state==1&&s0)
		{
			LCD1602_Show_Str("    ");
		}
		else
		{
			LCD1602_Show_Str("20");
			LCD1602_Set_Cursor(2,0);
			LCD1602_Write_Dat('0'+TIME.year/10%10);
			LCD1602_Write_Dat('0'+TIME.year%10);		//年
		}
		LCD1602_Show_Str("-");
		if(state==2&&s0)
		{
			LCD1602_Show_Str("  ");
		}
		else
		{
			LCD1602_Write_Dat('0'+TIME.month/10%10);
			LCD1602_Write_Dat('0'+TIME.month%10);		//月
		}
	
		LCD1602_Show_Str("-");
		if(state==3&&s0)
		{
			LCD1602_Show_Str("  ");	
		}
		else
		{
			LCD1602_Write_Dat('0'+TIME.date/10%10);
			LCD1602_Write_Dat('0'+TIME.date%10);		//日
		}
		LCD1602_Show_Str("   ");		   
		switch(Conver_week(TIME.year,TIME.month,TIME.date))	//星期
		{
			case 0:LCD1602_Show_Str("Sun");  break;
			case 1:LCD1602_Show_Str("Mon");  break;
			case 2:LCD1602_Show_Str("Tue");  break;
			case 3:LCD1602_Show_Str("Wed"); break;
			case 4:LCD1602_Show_Str("Thu");  break;
			case 5:LCD1602_Show_Str("Fri");  break;
			case 6:LCD1602_Show_Str("Sat");  break;
		}
		LCD1602_Set_Cursor(0,1);
		if(state==4&&s0)
		{
			LCD1602_Show_Str("  ")	;
		}
		else
		{
		LCD1602_Write_Dat('0'+TIME.hour/10%10);
		LCD1602_Write_Dat('0'+TIME.hour%10);		 //时
		}
		LCD1602_Show_Str(":");
		if(state==5&&s0)
		{
			LCD1602_Show_Str("  ");	
		}
		else
		{
		LCD1602_Write_Dat('0'+TIME.minute/10%10);	 //分
		LCD1602_Write_Dat('0'+TIME.minute%10);
		}
		LCD1602_Show_Str(":");
		if(state==6&&s0)
		{
			LCD1602_Show_Str("  ");	
		}
		else
		{
		LCD1602_Write_Dat('0'+TIME.second/10%10);	//秒
		LCD1602_Write_Dat('0'+TIME.second%10);
		}
		LCD1602_Show_Str(" ");
		if(temperature<0)
		{  
			temperature=-temperature;
			LCD1602_Write_Dat('-');
			LCD1602_Write_Dat(0x30+temperature/100%10);	//取出第一位
			LCD1602_Write_Dat(0x30+temperature%100/10);	//取出第二位
			LCD1602_Write_Dat(0x2E);				
			LCD1602_Write_Dat(0x30+temperature%10);		//取出最后一位
			LCD1602_Write_Dat(0xDF);
			LCD1602_Write_Dat('C');
		}
		else if(temperature>999)
		{
			LCD1602_Write_Dat(0x30+temperature/1000%10);	//取出第一位
			LCD1602_Write_Dat(0x30+temperature%1000/100);	//取出第一位
			LCD1602_Write_Dat(0x30+temperature%1000/10%10);	//取出第二位
			LCD1602_Write_Dat(0x2E);				
			LCD1602_Write_Dat(0x30+temperature%10);		//取出最后一位
			LCD1602_Write_Dat(0xDF);
			LCD1602_Write_Dat('C');
			
		}
		else
		{
			//LCD1602_Write_Cmd(0x80+0x40+0x09);
			LCD1602_Write_Dat(' ');
			LCD1602_Write_Dat(0x30+temperature/100%10);	//取出第一位
			LCD1602_Write_Dat(0x30+temperature%100/10);	//取出第二位
			LCD1602_Write_Dat(0x2E);				
			LCD1602_Write_Dat(0x30+temperature%10);		//取出最后一位
			LCD1602_Write_Dat(0xDF);
			LCD1602_Write_Dat('C');
		}
	}
	else
	{
		LCD1602_Set_Cursor(0,0);
		LCD1602_Show_Str("     clock:     ");
		LCD1602_Set_Cursor(0,1);
		LCD1602_Show_Str("     ");
		if(state==7&&s0)
		{
			LCD1602_Show_Str("  ");
		}
		else
		{
			LCD1602_Write_Dat('0'+nolock1[0]/10%10);
			LCD1602_Write_Dat('0'+nolock1[0]%10);		//闹钟-时
		}
		LCD1602_Show_Str(":");
		if(state==8&&s0)
		{
			LCD1602_Show_Str("  ");
		}
		else
		{
			LCD1602_Write_Dat('0'+nolock1[1]/10%10);
			LCD1602_Write_Dat('0'+nolock1[1]%10);		//闹钟-分
		}
		LCD1602_Show_Str("   ");
		if(state==9&&s0)
		{
			LCD1602_Show_Str("   ");
		}
		else
		{
			if(flag2 == 0) LCD1602_Show_Str(" on");
			else if(flag2 == 1) LCD1602_Show_Str("off");
		}
		LCD1602_Show_Str("   ");
	}
}

void key_scan()	 //系统按键控制程序
{
	if(key1==0)
	{
		if(key1_flag)
		{
			key1_flag=0;
			state=(state+1)%10;
		}
	}
	else
	{
		key1_flag=1;
	}
	if(!key2)	  //手动上转动控制
	{
		if(key2_flag)
		{
			key2_flag=0;
			if(state>0&&state<7)
			{
				if(state==1)
				{
					TIME.year=(TIME.year+1)%100;
				}
				else if(state==2)
				{
					TIME.month=TIME.month%12+1;
					if(TIME.month==2)
					{
						if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
						{
							if(TIME.date>29)TIME.date=29;
						}
						else
						{
							if(TIME.date>28) TIME.date=28;
						}
					}
					else if(TIME.month==4||TIME.month==6||TIME.month==9||TIME.month==11)
					{
						if(TIME.date>30) TIME.date=30;
					}
				}
				else if(state==3)
				{
					if(TIME.month==2)
					{
						if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
						{
							TIME.date=TIME.date%29+1;
						}
						else
						{
							TIME.date=TIME.date%28+1;
						}
					}
					else if(TIME.month==1||TIME.month==3||TIME.month==5||TIME.month==7||TIME.month==8||TIME.month==10||TIME.month==12)
					{
						TIME.date=TIME.date%31+1;
					}
					else 
					{
						TIME.date=TIME.date%30+1;
					}
				}
				else if(state==4)
				{
					TIME.hour=(TIME.hour+1)%24;
				}
				else if(state==5)
				{
					TIME.minute=(TIME.minute+1)%60;
				}
				else if(state==6)
				{
					TIME.second=(TIME.second+1)%60;
				}
			}
			else if(state!=0)
			{
				if(state==7)
				{
					nolock1[0]=(nolock1[0]+1)%24;
				}
				else if(state==8)
				{
					nolock1[1]=(nolock1[1]+1)%60;
				}
				else if(state==9)
				{
					flag2=0;
				}
			}
		}
		if(sec1==0)	  //判断是否长按,如果长按,实现连加效果
		{
			if(state!=0&&state<7)   //设置万年历
			{
				if(state==1)
				{
					TIME.year=(TIME.year+1)%100;
				}
				else if(state==2)
				{
					TIME.month=TIME.month%12+1;
					if(TIME.month==2)
					{
						if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
						{
							if(TIME.date>29)TIME.date=29;
						}
						else
						{
							if(TIME.date>28) TIME.date=28;
						}
					}
					else if(TIME.month==4||TIME.month==6||TIME.month==9||TIME.month==11)
					{
						if(TIME.date>30) TIME.date=30;
					}
				}
				else if(state==3)
				{
					if(TIME.month==2)
					{
						if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
						{
							TIME.date=TIME.date%29+1;
						}
						else
						{
							TIME.date=TIME.date%28+1;
						}
					}
					else if(TIME.month==1||TIME.month==3||TIME.month==5||TIME.month==7||TIME.month==8||TIME.month==10||TIME.month==12)
					{
						TIME.date=TIME.date%31+1;
					}
					else 
					{
						TIME.date=TIME.date%30+1;
					}
				}
				else if(state==4)
				{
					TIME.hour=(TIME.hour+1)%24;
				}
				else if(state==5)
				{
					TIME.minute=(TIME.minute+1)%60;
				}
				else if(state==6)
				{
					TIME.second=(TIME.second+1)%60;
				}
			}
			else if(state!=0)
			{
				if(state==7)
				{
					nolock1[0]=(nolock1[0]+1)%24;
				}
				else if(state==8)
				{
					nolock1[1]=(nolock1[1]+1)%60;
				}
				else if(state==9)
				{
					flag2=0;
				}
			}
		}	
	}
	else 
	{
		sec1=2;
		if(key2_flag==0)
		{
			memory_flag=1;
			key2_flag=1;
		}
	}
	if(!key3)	   //手动下转动控制监测
	{
		if(key3_flag)
		{
			key3_flag=0;
			if(state!=0&&state<7)
			{
				if(state==1)
				{
					TIME.year--;
					if(TIME.year>120) TIME.year=99; 
				}
				else if(state==2)
				{
					TIME.month--;
					if(TIME.month==0) TIME.month=12; 
					if(TIME.month==2)
					{
						if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
						{
							if(TIME.date>29)TIME.date=29;
						}
						else
						{
							if(TIME.date>28) TIME.date=28;
						}
					}
					else if(TIME.month==4||TIME.month==6||TIME.month==9||TIME.month==11)
					{
						if(TIME.date>30) TIME.date=30;
					}
				}
				else if(state==3)
				{
					TIME.date--;
					if(TIME.date==0)
					{
						if(TIME.month==2)
						{
							if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
							{
								TIME.date=29;
							}
							else
							{
								TIME.date=28;
							}
						}
						else if(TIME.month==1||TIME.month==3||TIME.month==5||TIME.month==7||TIME.month==8||TIME.month==10||TIME.month==12)
						{
							TIME.date=31;
						}
						else 
						{
							TIME.date=30;
						}
					} 
				}
				else if(state==4)
				{
					TIME.hour--;
					if(TIME.hour>25) TIME.hour=23;
				}
				else if(state==5)
				{
					TIME.minute--;
					if(TIME.minute>60) TIME.minute=59;
				}
				else if(state==6)
				{
					TIME.second--;
					if(TIME.second>60) TIME.second=59;
				}
			}
			else if(state!=0)
			{
				if(state==7)
				{
					nolock1[0]--;
					if(nolock1[0]>25) nolock1[0]=23;
				}
				else if(state==8)
				{
					nolock1[1]--;
					if(nolock1[1]>60) nolock1[1]=59;
				}
				else if(state==9)
				{
					flag2=1;
				}
			}
		}
		if(sec2==0)		//判断是否长按,如果长按,实现连减效果
		{
			if(state!=0&&state<7)
			{
				if(state==1)
				{
					TIME.year--;
					if(TIME.year>120) TIME.year=99; 
				}
				else if(state==2)
				{
					TIME.month--;
					if(TIME.month==0) TIME.month=12; 
					if(TIME.month==2)
					{
						if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
						{
							if(TIME.date>29)TIME.date=29;
						}
						else
						{
							if(TIME.date>28) TIME.date=28;
						}
					}
					else if(TIME.month==4||TIME.month==6||TIME.month==9||TIME.month==11)
					{
						if(TIME.date>30) TIME.date=30;
					}
				}
				else if(state==3)
				{
					TIME.date--;
					if(TIME.date==0)
					{
						if(TIME.month==2)
						{
							if((TIME.year%4==0&&TIME.year%100!=0)||TIME.year==0)
							{
								TIME.date=29;
							}
							else
							{
								TIME.date=28;
							}
						}
						else if(TIME.month==1||TIME.month==3||TIME.month==5||TIME.month==7||TIME.month==8||TIME.month==10||TIME.month==12)
						{
							TIME.date=31;
						}
						else 
						{
							TIME.date=30;
						}
					} 
				}
				else if(state==4)
				{
					TIME.hour--;
					if(TIME.hour>25) TIME.hour=23;
				}
				else if(state==5)
				{
					TIME.minute--;
					if(TIME.minute>60) TIME.minute=59;
				}
				else if(state==6)
				{
					TIME.second--;
					if(TIME.second>60) TIME.second=59;
				}
			}
			else if(state!=0)
			{
				if(state==7)
				{
					nolock1[0]--;
					if(nolock1[0]>25) nolock1[0]=23;
				}
				else if(state==8)
				{
					nolock1[1]--;
					if(nolock1[1]>60) nolock1[1]=59;
				}
				else if(state==9)
				{
					flag2=1;
				}
			}
		}
	}else			   //否则上下转动标志位清0
	{
		if(key3_flag==0)
		{
			memory_flag=1;
			key3_flag=1;
		}
		sec2=2;
	}
	if(key4==0)
	{
		if(key4_flag)
		{
			key4_flag=0;
			state=0;
		}
	}
	else 
	{
		key4_flag=1;
	}
}



void clock_dispose()
{
	if(state==0&&flag2==0&&nolock1[0]==TIME.hour&&nolock1[1] == TIME.minute) 
	{
		if(TIME.second==0) beep1=1;
	}
	else 
	{
		beep1=0;
	}
}

int main(void)
{   
	delay_init();
	BEEP_Init();
	 delay_ms(20); 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    LCD1602_Init();
	KEY_Init();
	ds1302_gpio_init();
	do
	{
		temperature=DS18B20_Get_Temp();
	}while(temperature == 850);
	TIM3_Int_Init(4999, 7199);
	TIM4_Int_Init(499 ,7199);
	read_memory();
	while(1) 
	{		
		if(read_flag)
		{
			read_flag=0;
			temperature=DS18B20_Get_Temp();	//获取温度 返回的是一个三位数short型的整数
		}
		read_time1();
		clock_dispose();
		dis_play();
		if(memory_flag)
		{
			memory_flag=0;
			memory();
		}
	}	
}


void TIM4_IRQHandler(void)   //TIM4中断
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM2更新中断发生与否
		{
			
			if(beep1)
			{
				if(key1==0||key2==0||key3==0||key4==0)
				{
					beep1=0;
				}
			}
			else
			{
				key_scan();
			}
			ms++;
			if(ms%5==0) 
			{
				if(beep1)
				{
					BEEP=~BEEP;
				}
				else
				{
					BEEP=0;
				}
				s0=~s0;	
			}
			if(ms%10==0)
			{
				if(sec1!=0) sec1--;
				if(sec2!=0) sec2--;
			}
			if(ms>=20)
			{
				ms=0;
				read_flag=1;
			}
		}
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
}

4 最后

🧿 项目分享:

https://gitee.com/sinonfin/sharing

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

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

相关文章

为社区成员提供的全新在线分析仪表板(Analytics Dashboard)!

开发者们大家好&#xff01; 我们非常激动地与您分享我们为每个社区成员提供的在线分析仪表板(Online Analytics Dashboard)这一全新的强大功能&#x1f525; 从现在开始&#xff0c;您可以看到您自己的当周、月和所有时间的详细统计数据&#xff0c;包括&#xff1a; 浏览量&a…

The Sandbox Alpha 第三季排行榜公布

排行榜名单已经揭晓&#xff0c;祝贺所有玩家&#xff01; Alpha 第三季已于 11 月 1 日落下帷幕&#xff0c;这是我们目前最大的一季活动&#xff0c;也是展示社区和合作伙伴在过去一年中所创造的诸多体验的机会。 这次也是我们测试新的「边玩边赚」机制的机会&#xff0c;其中…

Vue响应式系统的作用与实现(二)

响应式系统的作用与实现&#xff08;二&#xff09; 这章主要是介绍非原始值的响应式方案。 1.理解Proxy和Reflect&#xff1a; Vue3的响应式数据是基于Proxy实现的&#xff0c;那么我们非常有必要了解Proxy和Refelct。 参考资料&#xff1a;阮一峰的 官方参考资料 简单来…

Python Flask框架 入门详解与进阶

Python Flask框架 入门详解与进阶1.Flask框架 入门2.环境搭建2.1.安装flask1.创建虚拟环境2.激活虚拟环境3.安装flask2.2.flask程序编写1.创建test.py文件2.启动运行2.3.参数说明1.Flask对象的初始化参数第一种 &#xff1a;从配置对象中加载 app.config.from_object(DefaultCo…

chrome108 版本跨域问题

前言 近期&#xff0c;chrome又更新了&#xff0c;自动更新到了chrome的108.0.5359.95&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09;&#xff0c;更新到这个版本后&#xff0c;公司业务收到了一个故障&#xff0c;下面我们就来看看。背景&#xff1a; 客户…

Python——requests模块详解

1、模块说明 requests是使用Apache2 licensed 许可证的HTTP库。 用python编写。 比urllib2模块更简洁。 Request支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动响应内容的编码&#xff0c;支持国际化的URL和POS…

公众号查题系统

公众号查题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转…

Unity计算着色器 02

序 在百度了一下显卡以后&#xff0c;总结的话就是这个图。 这个图再总结的话就是左下角的那个框子&#xff0c;一个任务可以分为若干个线程组&#xff0c;每个线程组包含若干个线程。 两个若干&#xff0c;可以看成是两个变量&#xff0c;而且是有关系的——它俩乘积是一个…

如何使用PowerShell脚本进行数字签名?

如何对PowerShell脚本进行数字签名以进行身份验证和保护的快速指南。 您是否希望确保您的脚本可以安全使用并且没有被篡改&#xff0c;从而伤害用户&#xff1f;如果是这种情况&#xff0c;那么您将需要使用由已知证书颁发机构&#xff08;如Sectigo、DigiCert&#xff09;提供…

简谈Spring Boot3.0升级后的踩坑之旅,另附解决方案!

注&#xff1a;本文基于 newbeemall 项目升级Spring Boot3.0踩坑总结而来。 一. 编译报错&#xff0c;import javax.servlet.*; 不存在 这个报错主要是Spring Boot3.0已经为所有依赖项从 Java EE 迁移到 Jakarta EE API&#xff0c;导致 servlet 包名的修改&#xff0c;Sprin…

写了30000字 用 shell 脚本做自动化测试实战项目(全面、完整)

前言 项目中有一个功能&#xff0c;需要监控本地文件系统的变更&#xff0c;例如文件的增、删、改名、文件数据变动等等。之前只在 windows 上有实现&#xff0c;采用的是 iocp ReadDirectoryChanges 方案&#xff0c;现在随着整个应用移植到 mac 上&#xff0c;需要对这一部…

大数据智能交通未来会是怎样的交通状况?

大数据智能交通未来会是怎样的交通状况&#xff1f;智能交通也是智慧城市的一个重要组成部分将会改变我们的交通&#xff0c;交通少不了大数据的处理&#xff0c;人工智能自动驾驶离不开大数据的支撑。 实现智能交通需要高效地从海量数据中分析、挖掘所需的信息和规律&#xf…

缺少微信小程序测试经验?这篇文章带你从0开始

微信小程序已经越来越普遍&#xff0c;但目前接触小程序的项目相对较少&#xff0c;对小程序的特性也不了解&#xff0c;缺少小程序测试实战经验。 本文主要通过对微信小程序特性和测试点进行总结&#xff0c;储备测试知识&#xff0c;提高测试效率。 小程序发布审核 发布前…

Linux jprobe的使用和原理

文章目录前言一、demo1.1 demo演示1.2 struct jprobe二、jprobe 原理2.1 原理简介1.2 原理详解三、源码解析3.1 struct jprobe3.2 register_jprobe3.3 setjmp_pre_handler3.4 jprobe_return3.5 longjmp_break_handler四、Deprecated Features五、使用 perf-probe 获取函数参数总…

CentOS7一键安装OpenStack

环境 CentOS 7 CPU核心数&#xff1a;2x2 RAM&#xff1a;8G DISK&#xff1a;60G 问题说明 在安装openstack过程中&#xff0c;一直卡在下面过程&#xff1a; Testing if puppet apply is finished: 192.168.100.132_controller.pp [ | ]等待一会儿之后会报各种不同的错误…

crontab 实现秒级定时任务的执行(学习笔记)

crontab 实现秒级定时任务的执行 传统暴力法 crontab -e ***** /usr/bin/curl 地址 ***** sleep 10; /usr/bin/curl 地址 ***** sleep 20; /usr/bin/curl 地址地址 ***** sleep 30; /usr/bin/curl 地址 ***** sleep 40; /usr/bin/curl 地址 ***** sleep 50; /usr/bin/cu…

进程和计划任务管理

查看进程信息 ps ps命令 查看静态的进程统计信息 ps -elf 查看进程信息 top top命令 查看动态的进程排名信息 top 查看进程信息 pgrep pgrep命令 根据特定条件查询进程 PID 信息 pgrep -l “log” pgrep -l -U teacher -t tty1 查看进程信息 pstree pstree命令 以树…

面试害怕考到JVM? 看这一篇就够了~

目录 前言 一、JVM内存划分 二、类加载 2.1、类加载是在干什么&#xff1f; 2.2、类加载的过程 2.3、何时触发类加载&#xff1f; 2.4、双亲委派模型&#xff08;重点考察&#xff09; 2.4.1、什么是双亲委派模型&#xff1f; 2.4.2、涉及到的类加载器 2.4.3、详细过…

【树莓派】raspberry pi控制超声波测距

目录一、超声波1、模块介绍2、工作原理二、gettimeofday函数三、树莓派控制超声波测距一、超声波 1、模块介绍 简介&#xff1a;   超声波传感器模块上面通常有两个超声波元器件&#xff0c;一个用于发射&#xff0c;一个用于接收。 硬件: 电路板上有4个引脚&#xff1a; …

测试面试被问“期望薪资多少”,不要傻傻直接报价,高情商都这样说

对于软件测试从业者而言&#xff0c;面试很重要&#xff0c;因为那是拿到薪资报酬丰厚程度的关键&#xff0c;你的理论及实操经验确实都很棒&#xff0c;那就尽量别让自己的面试表现拖自己的后腿&#xff0c;否则大概率会让你的薪水大打折扣。 你在面试中是否也遇到很多次以下…