【蓝桥杯单片机-0.基于定时器的时钟程序设计】

news2024/9/25 11:20:15

蓝桥杯单片机-0.基于定时器的时钟程序设计

  • 题目
  • 小注意点
    • 按键三行
    • 矩形按键
    • 按键功能
    • 时间更新
    • 显示界面的小数点
    • LED灯闪烁
    • 其他功能
  • 完整代码

链接: 视频搭配视频,这里只是一些笔记,并不完整

题目

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

小注意点

按键三行

Key_Val = Key_Read();//实时读取键码值
Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
Key_Old = Key_Val;//辅助扫描变量

1.Key_Val = Key_Read();
作用:实时读取按键的当前状态。
Key_Read() 是一个函数,用来读取键盘的当前按键状态,返回的值通常是一个整数或位掩码,每一位代表一个按键的状态(0 表示松开,1 表示按下)。

2.Key_Down = Key_Val & (Key_Old ^ Key_Val);
作用:检测按键的下降沿。
这行代码的目的是捕捉按键的下降沿(即按键从松开状态转变为按下状态的瞬间)。
Key_Old 是之前保存的按键状态(历史状态)。
Key_Old ^ Key_Val 通过异或运算可以得到按键状态的变化情况。如果按键状态有变化(即按键从松开变为按下或从按下变为松开),那么该位会变成 1。
Key_Val & (Key_Old ^ Key_Val) 进一步与 Key_Val(当前按键状态)相与,只保留按键由“松开”变为“按下”的变化(即下降沿)。这样可以排除由按下变为松开的情况。
结果:Key_Down 中的某一位为1,表示该位对应的按键刚刚被按下。
情况 1:按键从“松开”变为“按下”
假设有一个按键从松开(0)变为按下(1),那时:
Key_Old = 0(之前松开)
Key_Val = 1(现在按下)
那么:
Key_Old ^ Key_Val = 0 ^ 1 = 1(变化发生了)
Key_Val & (Key_Old ^ Key_Val) = 1 & 1 = 1(当前状态是按下,且状态发生了变化)
结果:此时结果为 1,表示捕捉到按键从松开到按下的“下降沿”。
情况 2:按键从“按下”变为“松开”
如果按键从按下(1)变为松开(0),那时:
Key_Old = 1(之前按下)
Key_Val = 0(现在松开)
那么:
Key_Old ^ Key_Val = 1 ^ 0 = 1(变化发生了)
Key_Val & (Key_Old ^ Key_Val) = 0 & 1 = 0(当前状态是松开,即 Key_Val 为 0)
结果:此时结果为 0,表示按键从按下到松开的变化被忽略。
情况 3:按键没有变化
如果按键保持不变,无论是持续按下或持续松开,异或运算会得到 0:
Key_Old ^ Key_Val = 0(没有变化)
不管按键是保持按下还是松开:
Key_Val & 0 = 0
结果:结果为 0,表示没有变化发生。

3.Key_Old = Key_Val;
作用:保存当前的按键状态,作为下一次检测的历史状态。
这行代码的目的是更新历史状态变量 Key_Old,将当前的按键状态 Key_Val 保存下来,以便下次检测时可以比较按键状态的变化。

矩形按键

在这里插入图片描述
左边是矩阵按键,右边是独立按键。

unsigned char Key_Read()
{
	unsigned char temp = 0;
	P3_0=0; P3_1 =1; P3_2 = 1; P3_3 = 1;
	if(P3_4 == 0) temp = 1;
	if(P3_5 == 0) temp = 2;
	if(P3_6 == 0) temp = 3;
	if(P3_7 == 0) temp = 4;
	P3_0=1; P3_1 =0; P3_2 = 1; P3_3 = 1;
	if(P3_4 == 0) temp = 5;
	if(P3_5 == 0) temp = 6;
	if(P3_6 == 0) temp = 7;
	if(P3_7 == 0) temp = 8;
	P3_0=1; P3_1 =1; P3_2 = 0; P3_3 = 1;
	if(P3_4 == 0) temp = 9;
	if(P3_5 == 0) temp = 10;
	if(P3_6 == 0) temp = 11;
	if(P3_7 == 0) temp = 12;
	P3_0=1; P3_1 =1; P3_2 = 1; P3_3 = 0;
	if(P3_4 == 0) temp = 13;
	if(P3_5 == 0) temp = 14;
	if(P3_6 == 0) temp = 15;
	if(P3_7 == 0) temp = 16;
	return temp;
}

按键功能

在这里插入图片描述

/* 键盘处理函数 */
void Key_Proc()
{
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;//键盘减速程序

	Key_Val = Key_Read();//实时读取键码值
	Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
	Key_Old = Key_Val;//辅助扫描变量
	
	if(Key_Down != 0)
		Alarm_Enable_Flag = 0;
		
	switch(Key_Down)
	{
		case 1:
			Clock_Set_Index = 0;
			Clock_Set[0] = Clock_Disp[0];
			Clock_Set[1] = Clock_Disp[1];
			Clock_Set[2] = Clock_Disp[2];
			Seg_Disp_Mode = 1;
	    break;
		
		case 2:
			Clock_Set_Index = 0;
			Alara_Set[0] = Alara[0];
			Alara_Set[1] = Alara[1];
			Alara_Set[2] = Alara[2];
			Seg_Disp_Mode = 2;
		break;
		
		case 3:
			if(Seg_Disp_Mode ==1 )
			{
				Clock_Set_Index++;
				if(Clock_Set_Index == 3)
					Clock_Set_Index = 0;
			}	
		break;
			
		case 4:
			Alarm_Flag ^=1;
		break;
		
		case 5: 
			if(Seg_Disp_Mode == 1)
			{
				Clock_Set[Clock_Set_Index]++;
				if(Clock_Set[Clock_Set_Index] == (Clock_Set_Index==0?24:60))
					Clock_Set[Clock_Set_Index] = 0;
			}
			if(Seg_Disp_Mode == 2)
			{
				Alara_Set[Clock_Set_Index]++;
				if(Alara_Set[Clock_Set_Index] == (Clock_Set_Index==0?24:60))
					Alara_Set[Clock_Set_Index] = 0;
			}
			
		break;
			
		case 6:
			if(Seg_Disp_Mode == 1)
			{
				Clock_Set[Clock_Set_Index]--;
				if(Clock_Set[Clock_Set_Index] == 255)
					Clock_Set[Clock_Set_Index] = Clock_Set_Index == 0?23:59;
			}
			
			if(Seg_Disp_Mode == 2)
			{
				Alara_Set[Clock_Set_Index]--;
				if(Alara_Set[Clock_Set_Index] == 255)
					Alara_Set[Clock_Set_Index] = Clock_Set_Index == 0?23:59;
			}
			
		break;
		
		case 7:
			if(Seg_Disp_Mode == 1)
			{
				Clock_Disp[0] = Clock_Set[0];
				Clock_Disp[1] = Clock_Set[1];
				Clock_Disp[2] = Clock_Set[2];
			}
			
			if(Seg_Disp_Mode == 2)
			{
				Clock_Disp[0] = Alara_Set[0];
				Clock_Disp[1] = Alara_Set[1];
				Clock_Disp[2] = Alara_Set[2];
			}
			Seg_Disp_Mode = 0;
		break;
		
		case 8:
			Seg_Disp_Mode = 0;
		break;
		
	}
}

时间更新

Timer_1000Ms++;
if(Timer_1000Ms == 1000)
{
	Timer_1000Ms = 0;
	Clock_Disp[2]++;
	if (Clock_Disp[2]==60)
	{
		Clock_Disp[2]=0;
		Clock_Disp[1]++;
		if (Clock_Disp[1]==60)
		{	
			Clock_Disp[1]=0;
			Clock_Disp[0]++;
			if(Clock_Disp[0]==24)
				Clock_Disp[0] = 0;									
		}
	}
}

显示界面的小数点

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

void Seg_Disp(unsigned char wela,dula,point)
{
	P0 = 0x00; 
	P2_6 = 1;
	P2_6 = 0;
	
	P0 = Seg_Wela[wela];
	P2_7 = 1;
	P2_7 = 0;	

	if(point == 1) 
		P0 = Seg_Dula[dula] | 0x80;
	else 
		P0 = Seg_Dula[dula];
	
	
	P2_6 = 1;
	P2_6 = 0;	
}

P0 = Seg_Dula[dula] | 0x80;这一句就是现实小点,让最高位为1.

unsigned char Seg_Point[6] = {0,1,0,1,0,1};

Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);

LED灯闪烁

bit Seg_Flag;

Seg_Buf[0+Clock_Set_Index*2] = Seg_Flag?Clock_Set[Clock_Set_Index]/10%10:10;

其他功能

在这里插入图片描述

/* 其他显示函数 */
void Led_Proc()
{
	if(Alarm_Flag == 1)
	{
		if(Clock_Disp[0] == Alara[0] && Clock_Disp[1] == Alara[1] && Clock_Disp[2] == Alara[2])
			Alarm_Enable_Flag = 1;
		if(Alarm_Enable_Flag == 1)
		{
			P2_3 = 0;//蜂鸣器
			P1 = Led;	//不断变化	
		}
		else
		{
			P2_3 = 1;//关闭
			P1 = 0xff;//关闭
		}
	}
	else
	{
		P2_3 = 1;//关闭
		P1 = 0xff;//关闭
	}
}

if(Key_Down != 0)
		Alarm_Enable_Flag = 0;

用Alarm_Enable_Flag来判断是否使能,到定时时间了开启,否则按任意按键复位。

完整代码

main.c

/* 头文件声明区 */
#include <REGX52.H>//单片机寄存器专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件

/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Old;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned int Seg_Slow_Down;//数码管减速专用变量
unsigned char Seg_Disp_Mode; //0-时钟显示模式 1-时钟设置界面 2-闹钟显示界面
unsigned char Clock_Disp[3] = {23,59,55};
unsigned int Timer_1000Ms;
unsigned char Seg_Point[6] = {0,1,0,1,0,1};
unsigned char Clock_Set[3];
unsigned char Clock_Set_Index;//0-小时 1-分钟 2-秒种
unsigned int Timer_500Ms;
bit Seg_Flag;
unsigned char Alara[] = {0,0,0};
unsigned char Alara_Set[3];
bit Alarm_Flag = 1;
unsigned char Led;
bit Alarm_Enable_Flag;


/* 键盘处理函数 */
void Key_Proc()
{
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;//键盘减速程序

	Key_Val = Key_Read();//实时读取键码值
	Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿
	Key_Old = Key_Val;//辅助扫描变量
	
	if(Key_Down != 0)
		Alarm_Enable_Flag = 0;
		
	switch(Key_Down)
	{
		case 1:
			Clock_Set_Index = 0;
			Clock_Set[0] = Clock_Disp[0];
			Clock_Set[1] = Clock_Disp[1];
			Clock_Set[2] = Clock_Disp[2];
			Seg_Disp_Mode = 1;
	    break;
		
		case 2:
			Clock_Set_Index = 0;
			Alara_Set[0] = Alara[0];
			Alara_Set[1] = Alara[1];
			Alara_Set[2] = Alara[2];
			Seg_Disp_Mode = 2;
		break;
		
		case 3:
			if(Seg_Disp_Mode ==1 )
			{
				Clock_Set_Index++;
				if(Clock_Set_Index == 3)
					Clock_Set_Index = 0;
			}	
		break;
			
		case 4:
			Alarm_Flag ^=1;
		break;
		
		case 5: 
			if(Seg_Disp_Mode == 1)
			{
				Clock_Set[Clock_Set_Index]++;
				if(Clock_Set[Clock_Set_Index] == (Clock_Set_Index==0?24:60))
					Clock_Set[Clock_Set_Index] = 0;
			}
			if(Seg_Disp_Mode == 2)
			{
				Alara_Set[Clock_Set_Index]++;
				if(Alara_Set[Clock_Set_Index] == (Clock_Set_Index==0?24:60))
					Alara_Set[Clock_Set_Index] = 0;
			}
			
		break;
			
		case 6:
			if(Seg_Disp_Mode == 1)
			{
				Clock_Set[Clock_Set_Index]--;
				if(Clock_Set[Clock_Set_Index] == 255)
					Clock_Set[Clock_Set_Index] = Clock_Set_Index == 0?23:59;
			}
			
			if(Seg_Disp_Mode == 2)
			{
				Alara_Set[Clock_Set_Index]--;
				if(Alara_Set[Clock_Set_Index] == 255)
					Alara_Set[Clock_Set_Index] = Clock_Set_Index == 0?23:59;
			}
			
		break;
		
		case 7:
			if(Seg_Disp_Mode == 1)
			{
				Clock_Disp[0] = Clock_Set[0];
				Clock_Disp[1] = Clock_Set[1];
				Clock_Disp[2] = Clock_Set[2];
			}
			
			if(Seg_Disp_Mode == 2)
			{
				Clock_Disp[0] = Alara_Set[0];
				Clock_Disp[1] = Alara_Set[1];
				Clock_Disp[2] = Alara_Set[2];
			}
			Seg_Disp_Mode = 0;
		break;
		
		case 8:
			Seg_Disp_Mode = 0;
		break;
		
	}
}

/* 信息处理函数 */
void Seg_Proc()
{
	//unsigned char i;//用于for循环
	if(Seg_Slow_Down) return;
	Seg_Slow_Down = 1;//数码管减速程序
	
	switch(Seg_Disp_Mode)
	{
		case 0://时钟显示模式
			Seg_Buf[0] = Clock_Disp[0]/10%10;
			Seg_Buf[1] = Clock_Disp[0]%10;
			Seg_Buf[2] = Clock_Disp[1]/10%10;
			Seg_Buf[3] = Clock_Disp[1]%10;
			Seg_Buf[4] = Clock_Disp[2]/10%10;
			Seg_Buf[5] = Clock_Disp[2]%10;
//		for(i=0;i<3;i++)
//		{
//			Seg_Buf[0+2*i] = Clock_Disp[i]/10%10;
//			Seg_Buf[1+2*i] = Clock_Disp[i]%10;
//		}
		break;
		
		case 1://时钟显示模式
			Seg_Buf[0] = Clock_Set[0]/10%10;
			Seg_Buf[1] = Clock_Set[0]%10;
			Seg_Buf[2] = Clock_Set[1]/10%10;
			Seg_Buf[3] = Clock_Set[1]%10;
			Seg_Buf[4] = Clock_Set[2]/10%10;
			Seg_Buf[5] = Clock_Set[2]%10;
		
//			switch(Clock_Set_Index)
//			{
//				case 0:
//					Seg_Buf[0] = Seg_Flag?Clock_Set[0]/10%10:10;
//					Seg_Buf[1] = Seg_Flag?Clock_Set[0]%10:10;
//				break;
//				
//				case 1:
//					Seg_Buf[2] = Seg_Flag?Clock_Set[1]/10%10:10;
//					Seg_Buf[3] = Seg_Flag?Clock_Set[1]%10:10;
//				break;
//				
//				case 2:
//					Seg_Buf[4] = Seg_Flag?Clock_Set[2]/10%10:10;
//					Seg_Buf[5] = Seg_Flag?Clock_Set[2]%10:10;
//				break;
//			
//			}
			Seg_Buf[0+Clock_Set_Index*2] = Seg_Flag?Clock_Set[Clock_Set_Index]/10%10:10;
			Seg_Buf[1+Clock_Set_Index*2] = Seg_Flag?Clock_Set[Clock_Set_Index]%10:10;
			
		break;
		
		case 2:
			Seg_Buf[0] = Alara_Set[0]/10%10;
			Seg_Buf[1] = Alara_Set[0]%10;
			Seg_Buf[2] = Alara_Set[1]/10%10;
			Seg_Buf[3] = Alara_Set[1]%10;
			Seg_Buf[4] = Alara_Set[2]/10%10;
			Seg_Buf[5] = Alara_Set[2]%10;
			Seg_Buf[0+Clock_Set_Index*2] = Seg_Flag?Alara_Set[Clock_Set_Index]/10%10:10;
			Seg_Buf[1+Clock_Set_Index*2] = Seg_Flag?Alara_Set[Clock_Set_Index]%10:10;
		break;
	}

}

/* 其他显示函数 */
void Led_Proc()
{
	if(Alarm_Flag == 1)
	{
		if(Clock_Disp[0] == Alara[0] && Clock_Disp[1] == Alara[1] && Clock_Disp[2] == Alara[2])
			Alarm_Enable_Flag = 1;
		if(Alarm_Enable_Flag == 1)
		{
			P2_3 = 0;//蜂鸣器
			P1 = Led;	//不断变化	
		}
		else
		{
			P2_3 = 1;//关闭
			P1 = 0xff;//关闭
		}
	}
	else
	{
		P2_3 = 1;//关闭
		P1 = 0xff;//关闭
	}
}

/* 定时器0中断初始化函数 */
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;        //定时器0中断打开
	EA = 1;         //总中断打开
}

/* 定时器0中断服务函数 */
void Timer0Server() interrupt 1
{
 	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值   
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//键盘减速专用
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;//数码管减速专用
	if(++Seg_Pos == 6) Seg_Pos = 0;//数码管显示专用
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	Timer_1000Ms++;
	if(Timer_1000Ms == 1000)
	{
		Timer_1000Ms = 0;
		Clock_Disp[2]++;
		if (Clock_Disp[2]==60)
		{
			Clock_Disp[2]=0;
			Clock_Disp[1]++;
			if (Clock_Disp[1]==60)
			{	
				Clock_Disp[1]=0;
				Clock_Disp[0]++;
				if(Clock_Disp[0]==24)
				
					Clock_Disp[0] = 0;
				
					
			}
		}
	
	}
	Timer_500Ms++;
	if(Timer_500Ms == 500)
	{
		Timer_500Ms = 0;
		Seg_Flag ^= 1;
		if(Clock_Disp[0]>=12)//后4个灯闪烁
		{
			Led ^= 0xf0;//高4位取反,低4位不变
		}
		else
		{
			Led ^= 0x0f;
		}
	}
}

/* Main */
void main()
{
	Timer0Init();
	while (1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

Key.c

#include <Key.h>

unsigned char Key_Read()
{
	unsigned char temp = 0;
	P3_0=0; P3_1 =1; P3_2 = 1; P3_3 = 1;
	if(P3_4 == 0) temp = 1;
	if(P3_5 == 0) temp = 2;
	if(P3_6 == 0) temp = 3;
	if(P3_7 == 0) temp = 4;
	P3_0=1; P3_1 =0; P3_2 = 1; P3_3 = 1;
	if(P3_4 == 0) temp = 5;
	if(P3_5 == 0) temp = 6;
	if(P3_6 == 0) temp = 7;
	if(P3_7 == 0) temp = 8;
	P3_0=1; P3_1 =1; P3_2 = 0; P3_3 = 1;
	if(P3_4 == 0) temp = 9;
	if(P3_5 == 0) temp = 10;
	if(P3_6 == 0) temp = 11;
	if(P3_7 == 0) temp = 12;
	P3_0=1; P3_1 =1; P3_2 = 1; P3_3 = 0;
	if(P3_4 == 0) temp = 13;
	if(P3_5 == 0) temp = 14;
	if(P3_6 == 0) temp = 15;
	if(P3_7 == 0) temp = 16;
	return temp;
}

Key.h

#include <REGX52.H>

unsigned char Key_Read();

Seg.c

#include "Seg.h"

unsigned char Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char Seg_Wela[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void Seg_Disp(unsigned char wela,dula,point)
{
	P0 = 0x00; 
	P2_6 = 1;
	P2_6 = 0;
	
	P0 = Seg_Wela[wela];
	P2_7 = 1;
	P2_7 = 0;	

	if(point == 1) 
		P0 = Seg_Dula[dula] | 0x80;
	else 
		P0 = Seg_Dula[dula];
	
	
	P2_6 = 1;
	P2_6 = 0;	
}

Seg.h

#include <REGX52.H>

void Seg_Disp(unsigned char wela,dula,point);

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

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

相关文章

JDBC知识点总结概括(day29)

1 学习目标 了解JDBC的概念重点掌握JDBC的CRUD重点掌握JDBC的各个对象的使用 2 GIT 查看安装手册 3 JDBC概述 3.1 数据的持久化 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持…

【人工智能学习笔记】5 计算机视觉基础

计算机视觉概述 定义&#xff1a;计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何使机器“看”的科学&#xff0c;也可以看作是研究如何使人工系统从图像活多维数据中“感知”的科学终极目标&#xff1a;计算机视觉成为机器认知世界的基础&#xff0c;终极目…

Linux——高流量 高并发(访问场景) 高可用(架构要求)

高并发通用设计逻辑&#xff1a; 定位单点&#xff0c;拆分问题 架构调整的顺序&#xff1a; 动静分离 // 没有实现动静分离 // 静态请求 交给 nginx或者 httpd 这种对于静态资源处理效率更高的服务&#xff0c;动态请求 交给php-fpm 服务来处理 使用云服务提供商 &#xff…

怎么翻译图片上的文字?6种方法教你快速翻译

现如今&#xff0c;图片已经成为传播信息的重要载体之一&#xff0c;然而&#xff0c;图片上的文字往往成为我们获取信息的障碍。幸运的是&#xff0c;随着技术的发展&#xff0c;多种图片文字翻译工具应运而生&#xff0c;让翻译变得简单快捷。很多小伙伴不清楚哪些翻译工具简…

《JavaEE进阶》----15.<Spring Boot 日志>

本篇文章将记录我学习SpringBoot日志 1.日志文件的用途 2.SpringBoot日志文件的配置 3.用lombook依赖引入Slf4j注解&#xff0c;从而引入log对象。方便我们打印日志。 一、日志的作用 日志主要是为了发现问题、分析问题、定位问题。除此之外、日志还有许多其他的用途。 1.系统监…

玩转西门子 S7-1200/1500 的 Modbus RTU 通信诊断

01 概述工控人加入PLC工业自动化精英社群 Modbus RTU 是一种串行通信协议&#xff0c;由于具有协议透明&#xff0c;实现成本低&#xff0c;简单易用等诸多特点&#xff0c;至今仍然广泛应用在工业控制的各个领域。 为了通信可以长期稳定的运行&#xff0c;并且可以在故障时可…

Vue组件:依赖注入provide和inject的使用

1、Prop 逐级透传问题 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一棵巨大的组件树&#xff0c;而某个深层的子组件需要一个较远的祖先组件中的部分数据…

智慧水务建设的核心内容

智慧水务解决方案的主要对象客户是全国各地水务投资集团、水务局、水司、水厂、农水办,也会有少量项目涉及到住建局或城管局。解决方案通常会以具体的某个业务单位的职能工作为切入点,配合物联感知、大数据分析、人工智能等技术手段,为城市供水、乡村供水的水质安全、供水调…

一文彻底了解DNS协议工作原理,恐怕没有比这更通俗易懂的了吧?

了解DNS工作原理有助于深入理解互联网通信的基础机制&#xff0c;对于网络运维、开发以及优化网站访问速度至关重要。它能帮助解决域名解析问题&#xff0c;提升用户体验&#xff0c;同时对于网络安全和防护也具有重要意义。本文博主反反复复、前前后后斟酌了三天&#xff0c;就…

【学习笔记】手写Tomcat 二

目录 响应静态资源 HTTP协议请求格式 1. 解析请求信息 创建解析请求类 HttpRequest 2. 创建静态资源目录 webs 3. 封装响应信息 创建静态资源处理器 StaticResourceHandler 创建响应类 HttpResponse 作业 1. 绘制 请求解析类 HttpRequest 和响应类 HttpResponse 的封…

动手学深度学习(pytorch土堆)-03常见的Transforms

Compose transforms.Compose 是 PyTorch 中的一个函数&#xff0c;用于将多个图像变换操作组合在一起&#xff0c;形成一个变换流水线。这样可以将一系列的图像处理操作整合为一个步骤&#xff0c;便于对图像进行批量预处理或增强。 基本用法 transforms.Compose 接受一个列表…

vue + Lodop 制作可视化设计页面 实现打印设计功能(四)

历史&#xff1a; vue2 Lodop 制作可视化设计页面 实现打印设计功能&#xff08;一&#xff09; vue Lodop 制作可视化设计页面 实现打印设计功能&#xff08;二&#xff09; vue Lodop 制作可视化设计页面 实现打印设计功能&#xff08;三&#xff09; 前言&#xff1a…

必看!实网环境下,合宙Cat.1模组低功耗详细数据

一、背景说明 合宙4G Cat.1模组以低功耗为显著特点&#xff0c;提供了三种功耗模式以适应不同需求。 分别是&#xff1a;常规模式&#xff0c;低功耗模式&#xff0c;PSM模式。 在实际应用中&#xff0c;用户可以根据不同的应用场景和需求&#xff0c;灵活选择合宙4G Cat.1模…

数据结构与算法图论 并查集

前言 写一道并查集的题 判断是否为亲戚 原题目&#xff1a;现在有若干家族图谱关系&#xff0c;给出了一些亲戚关系&#xff0c;如Marrv和Tom是亲戚&#xff0c;Tom和Ben是亲戚等等。从这些信息中&#xff0c;你可以推导出Marry和Ben是亲戚。请写一个程序&#xff0c;对于我…

一文读懂在线学习凸优化技术

一文读懂在线学习凸优化技术 在当今的数据驱动时代&#xff0c;机器学习算法已成为解决复杂问题的关键工具。在线学习凸优化作为机器学习中的一项核心技术&#xff0c;不仅在理论研究上具有重要意义&#xff0c;还在实际应用中展现出巨大的潜力。本文将深入浅出地介绍在线学习…

C++(三)----内存管理

1.C/C内存分布 看下面这个问题&#xff08;考考你们之前学的咋样&#xff09;&#xff1a; int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pCh…

【leetcode C++】 动态规划

4. 91 解码方法 题目&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; "1" -> A "2" -> B ... "25" -> Y "26" -> Z 然而&#xff0c;在 解码 已编码的消息时&#xff0c;你意识到有许多不同的…

数据湖-方案对比

数据湖架构结合了数据湖和数据仓库。虽然它不仅仅是两者之间的简单集成&#xff0c;但其理念是充分发挥两种架构的优势&#xff1a;数据仓库的可靠交易以及数据湖的可扩展性和低成本。 Lakehouse 架构支持管理各种数据类型&#xff0c;例如结构化、半结构化和非结构化数据&…

巧用工具,Vue 集成 medium-zoom 实现图片缩放

文章目录 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放介绍medium-zoomVue3集成 medium-zoom 示例Vue2集成 medium-zoom 示例进阶 - 可选参数 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放 在现代网页开发中&#xff0c;为用户提供良好的视觉体验至关重…

爬虫逆向学习(六):补环境过某数四代

声明&#xff1a;本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客&#xff1a; https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/127699273 https://blog.csdn.net/weixin_…