蓝桥杯第十一届电子类单片机组程序设计

目录

前言

单片机资源数据包_2023(点击下载)

一、第十一届比赛原题

1.比赛题目

2.赛题解读

1)计数功能

2)连续按下无效按键

二、部分功能实现

1.计数功能的实现

2.连续按下无效按键的处理

3.其他处理

1)对于小数的处理

2)对于高位为0时熄灭的处理

3)对于连续5s,V小于Vp的处理

三、完整代码

main.c

iic.c

iic.h


前言

虽然第十一届省赛题目跟十四届相比,也很简单,但是里面确实也需要许多特殊的处理,这里也跟大家分享一下,我对里面的一些特殊处理的方式。

老规矩,先放资源链接

单片机资源数据包_2023(点击下载)

一、第十一届比赛原题

1.比赛题目

2.赛题解读

平平常常的四个菜单,简简单单按键功能,只是对参数的加减,这次题目难就难在计数和LED显示部分。所以如果能把按键和数码管写好,按键功能实现,感觉冲个省二都没问题了。这里只针对上边两个部分进行介绍:

1)计数功能

计数界面:

计数规则

从图上可以看出,它想表达的计数时机,其实就是当VAIN3电压值从高于Vp,也就是电压参数或者说电压预支,到低于电压阈值之后,计数就+1,当然从低于阈值到高于阈值这个过程计数不会增加,这个VAIN3就是PCF8591的第三个通道。对应到板子上的话,就是读取到的电位计的电压。其实这个跟第十四届从亮到暗或者从暗到亮有异曲同工之妙,相当于第十四届是这个的升级版。我把第十四届的链接放在下边,感兴趣的可以去瞅瞅。至于这个计数怎么实现,下边会介绍。

蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客

2)连续按下无效按键

题目上的要求如下

指示灯 L3: 连续 3 次以上(含 3 次) 的无效按键操作触发 L3 点亮,直到出现有效的按键操作, L3 熄灭。
之前的题目要求,只说某某按键的功能只在某某菜单才可以生效之类的,当然这个题目也有这样要求,如果在当前菜单按下某个按键后,不会响应,或者说当前按下的按键,没有在它指定的菜单时,那就应该记为一次“无效按键操作”。

除此之外呢,我个人感觉比如一些本身就没有功能,题目没有用到的按键按下之后,也应该被标记为“无效的按键操作”,因为题目上也没写使用哪些按键完成操作。

同样的,具体的实现下边会提到。

二、部分功能实现

1.计数功能的实现

要想精确计数,我们肯定得实时读取电压值V,这个肯定是不可避免的了。我们知道PCF8591读取到的都是数字量(取值0到255),我们需要先把它转化为模拟量,加上题目要求的Vp以及需要显示的电压值要精确到小数点后两位,这里在转换时就直接把V的值扩大100倍方便计算和处理。

unsigned char ad=0;//读取到的AD值
unsigned int V=0;//当前读取到的电压值,由AD值转化而来。为便于显示小数点后两位,电压的数值扩大了100倍
ad=get_pcf(3);//读取ad
V=(unsigned int)(ad*100/255*5);//获得当前读取到的电压,为方便保留小数点后两位,这里已经扩大100倍

读取的处理,我放在了定时器里。大致思路如下:

1)定义一个标志位is_up,当读取到的电压值V高于Vp,并且is_up=0时,则将is_up置为1,也就是记录第一个状态:当前电压值高于Vp

2)当当前电压值V低于阈值Vp,并且is_up=1,则将is_up置为0,并且计数+1.

这样就是实现了,只有当电压从高于阈值跳到低于阈值时,计数才会+1了。具体代码如下:

if(is_up==0&&V/10>Vp)//如果当前电压V小于Vp,则is_up置为1(记录此时前一次电压大于Vp的状态)
{
    is_up=1;
}
else if(is_up==1&&V/10<Vp)//如果上一次电压V大于Vp,且下一次电压V小于Vp,则计数+1
{
    is_up=0;//记录此时电压小于Vp
    count++;//计数+1
}
 

2.连续按下无效按键的处理

如果是按照我之前写代码的习惯的话,我都是在按键处理函数中,先读取按键,再根据读取到的按键的键值,对其进行处理,最后将按键的键值清零。

这里对无效的按键处理也用了类似的方法。如果按下了按键,并且这个按键被某个if  else if语句处理了,则将按键的键值清零。如果所有的按键处理都进行完了,并且此时按键的键值还不为0,则说明按下了一个没有被处理的按键,或者说是“无效的按键”,因为它没产生任何效果嘛,此时记录错误按键次数的标志位count_wrong就+1.同时将按键键值清零。如果count_wrong大于三,也就是连续三次都按下了无效的按键,则将点亮L3的标志位置1(题目要求的,连续三次无效按键就点亮L3)。

至于对于按下有效按键的处理那就好办了,只要在按键处理时的每一次处理之后,加上count_wrong清零,以及将点亮L3的标志位置为0即可。这里就把题目中用到的按键操作也都写出来,方便演示对于按下有效按键的处理了。

 代码如下:

void get_key(void)
{
    unsigned char key_P3=P3;
    unsigned char key_P4=P4;
    static unsigned char count_wrong=0;//记录连续多少次按错了按键(也就是按下了不被处理的按键)
    
    P3=0xFF;
    P4=0xFF;
    
    P44=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=7;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=6;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=5;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=4;}
    
    P42=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=11;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=10;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=9;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=8;}
    
    P35=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=15;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=14;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=13;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=12;}
    P35=1;
    
    P34=0;
    if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=19;}
    else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=18;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=17;}
    else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=16;}
    P34=1;
    
    //S12 切换菜单
    if(key_value==12)
    {
        if(mod==0)
            mod=1;
        else if(mod==1)
        {
            mod=2;
            write_at(0,Vp);//当退出参数界面时,记录一次当前Vp参数到AT24C02
        }
        else if(mod==2)
            mod=0;
        key_value=0;
        count_wrong=0;//读取到的有效的按键,错误按键记录清零(下同)
        is_led3_on=0;//熄灭L3
    }
    
    else if(mod==2&&key_value==13)
    {
        count=0;//情况记录次数
        key_value=0;
        count_wrong=0;
        is_led3_on=0;
    }
    
    else if(mod==1&&key_value==16)
    {
        Vp= Vp<50 ? Vp+5:0;
        key_value=0;
        count_wrong=0;
        is_led3_on=0;
    }
    
    else if(mod==1&&key_value==17)
    {
        Vp=Vp>0 ? Vp-5:50;
        key_value=0;
        count_wrong=0;
        is_led3_on=0;
    }
    
    if(key_value!=0)//如果走到这一步,key_value还不为0,则说明读取到的按键未被处理,也就是题目上说的无效的按键
    {
        if(++count_wrong>=3)
        {
            is_led3_on=1;
        }
    }
    
    key_value=0;
    P3=key_P3;
    P4=key_P4;
}

3.其他处理

其他大部分处理前面的文章都已经提到了,这里一一列举出来,并做简单介绍:

1)对于小数的处理

处理方式就是扩大相应倍数,比如要求精确到小数点后一位,就把它扩大十倍。同时在Seg_Table修改一下,将Seg_Table中10到19显示为0.到9.。显示第一位显示对应的数据+10,即可把小数点显示出来。具体可以从下边那篇文章中的目录中寻找

蓝桥杯第十四届电子类单片机组程序设计_蓝桥杯单片机哪一届最难-CSDN博客

2)对于高位为0时熄灭的处理

我们需要判断这个数的大小,主要是位数,这里可以用到三目运算符,以获得其位数信息。比如对于(倒数)第三位数码管,如果value/100还大于0,则说明这位需要显示数据value/100%10(也有可能会显示0欧),想反,如果value/100等于0,则这位数码管就需要熄灭,而非显示数据.

这样判断可能会消耗一些单片机算力,但是我目前还不知道其他有效的方法,也欢迎大家不吝赐教。具体介绍可以看下边这篇文章

蓝桥杯第十四届电子类单片机组决赛程序设计_蓝桥杯第十四届单片机资源包-CSDN博客

示例代码:

Nixie_num[1]=count/10000000>0 ? count/10000000%10:20;
Nixie_num[2]=count/1000000>0 ? count/1000000%10:20;
Nixie_num[3]=count/100000>0 ? count/100000%10:20;
Nixie_num[4]=count/10000>0 ? count/10000%10:20;
Nixie_num[5]=count/1000>0 ? count/1000%10:20;
Nixie_num[5]=count/100>0 ? count/100%10:20;
Nixie_num[6]=count/10>0 ? count/10%10:20;
Nixie_num[7]=count/1>0 ? count/1%10:20;
 

3)对于连续5s,V小于Vp的处理

总的来说就是,当L1标志位为0,并且V小于Vp,则开始计数,当计数够5s了,就将L1标志位置为1,否则重新计数。

if(is_led1_on==0&&V/10<Vp)//如果当前电压小于Vp,则开始计数
{
    if(++count_5s>5000)//当过来5s当前电压还小于Vp,则点亮L1
        is_led1_on=1;
}
else//如果不满足上述条件,则一切清零重来
{
    count_5s=0;
    is_led1_on=0;
}
 

三、完整代码

main.c

#include <stc15.h>
#include <intrins.h>
#include "iic.h"
code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xFF,
0xC1,//U 21
0x8C,//P 22
0xC8,//n 23
};

unsigned char Led_Num=0xFF;
#define LED_ON(x)				Led_Num&=~(0x01<<x);	P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x)			Led_Num|=0x01<<x;			P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF_ALL()		Led_Num=0xFF;					P0=Led_Num;P2|=0x80;P2&=0x9F;P2&=0x1F;

#define NIXIE_CHECK()	P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON()		P2|=0xE0;P2&=0xFF;P2&=0x1F;

void get_key(void);
void Delay100ms(void);	//@12.000MHz
void Timer0_Init(void);		//1毫秒@12.000MHz
void show_menu(void);
void led_run(void);

unsigned char location=0;//记录当前数码管扫描的位置,中间变量
unsigned char key_value=0;//记录按键的键值,中间变量
unsigned char Nixie_num[]={20,20,20,20,20,20,20,20};//数码管需要显示的数据,默认全部熄灭
unsigned char ad=0;//读取到的AD值
unsigned char at=0;//读取到的AT24C02的值
unsigned char mod=0;//菜单,0:数据采集,1:参数设置,2:计数
unsigned char Vp=0;//Vp的值,已扩大10倍
unsigned char count=0;//计数值,V从大于Vp到小于Vp一次,计数+1
unsigned int V=0;//当前读取到的电压值,由AD值转化而来。为便于显示小数点后两位,电压的数值扩大了100倍

void main()
{
	LED_OFF_ALL();
	Delay100ms();
	Vp=read_at(0);//从AT读取一次Vp
	Timer0_Init();
	EA=1;
	Delay100ms();
	
	while(1)
	{
		get_key();//读取按键
		ad=get_pcf(3);//读取ad
		V=(unsigned int)(ad*100/255*5);//获得当前读取到的电压,为方便保留小数点后两位,这里已经扩大倍
		show_menu();//显示菜单
		led_run();//控制LED
		Delay100ms();
	}
}
bit is_up=0;//记录上一次电压V是否大于Vp
bit is_led1_on=0;//点亮L1
bit is_led3_on=0;//点亮L3
unsigned int count_5s=0;//数数,数5s
void Timer0_Isr(void) interrupt 1
{
	P0=0x01<<location;NIXIE_CHECK();//数码管选择
	P0=Seg_Table[Nixie_num[location]];NIXIE_ON();//数码管显示
	
	if(++location==8)
		location=0;
	
	if(is_up==0&&V/10>Vp)//如果当前电压V小于Vp,则is_up置为1(记录此时前一次电压大于Vp的状态)
	{
		is_up=1;
	}
	else if(is_up==1&&V/10<Vp)//如果上一次电压V大于Vp,且下一次电压V小于Vp,则计数+1
	{
		is_up=0;//记录此时电压小于Vp
		count++;//计数+1
	}
	
	if(is_led1_on==0&&V/10<Vp)//如果当前电压小于Vp,则开始计数
	{
		if(++count_5s>5000)//当过来5s当前电压还小于Vp,则点亮L1
			is_led1_on=1;
	}
	else//如果不满足上述条件,则一切清零重来
	{
		count_5s=0;
		is_led1_on=0;
	}
}
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x20;				//设置定时初始值
	TH0 = 0xD1;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}

void Delay100ms(void)	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 5;
	j = 144;
	k = 71;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void Delay5ms(void)	//@12.000MHz
{
	unsigned char data i, j;

	i = 59;
	j = 90;
	do
	{
		while (--j);
	} while (--i);
}

void get_key(void)
{
	unsigned char key_P3=P3;
	unsigned char key_P4=P4;
	static unsigned char count_wrong=0;//记录连续多少次按错了按键(也就是按下了不被处理的按键)
	
	P3=0xFF;
	P4=0xFF;
	
	P44=0;
	if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=7;}
	else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=6;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=5;}
	else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=4;}
	
	P42=0;
	if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=11;}
	else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=10;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=9;}
	else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=8;}
	
	P35=0;
	if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=15;}
	else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=14;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=13;}
	else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=12;}
	P35=1;
	
	P34=0;
	if(P30==0){Delay5ms();while(P30==0);Delay5ms();key_value=19;}
	else if(P31==0){Delay5ms();while(P31==0);Delay5ms();key_value=18;}
  else if(P32==0){Delay5ms();while(P32==0);Delay5ms();key_value=17;}
	else if(P33==0){Delay5ms();while(P33==0);Delay5ms();key_value=16;}
	P34=1;
	
	//S12 切换菜单
	if(key_value==12)
	{
		if(mod==0)
			mod=1;
		else if(mod==1)
		{
			mod=2;
			write_at(0,Vp);//当退出参数界面时,记录一次当前Vp参数到AT24C02
		}
		else if(mod==2)
			mod=0;
		key_value=0;
		count_wrong=0;//读取到的有效的按键,错误按键记录清零(下同)
		is_led3_on=0;//熄灭L3
	}
	
	else if(mod==2&&key_value==13)
	{
		count=0;//情况记录次数
		key_value=0;
		count_wrong=0;
		is_led3_on=0;
	}
	
	else if(mod==1&&key_value==16)
	{
		Vp= Vp<50 ? Vp+5:0;
		key_value=0;
		count_wrong=0;
		is_led3_on=0;
	}
	
	else if(mod==1&&key_value==17)
	{
		Vp=Vp>0 ? Vp-5:50;
		key_value=0;
		count_wrong=0;
		is_led3_on=0;
	}
	
	if(key_value!=0)//如果走到这一步,key_value还不为0,则说明读取到的按键未被处理,也就是题目上说的无效的按键
	{
		if(++count_wrong>=3)
		{
			is_led3_on=1;
		}
	}
	
	key_value=0;
	P3=key_P3;
	P4=key_P4;
}

void show_menu(void)
{
	if(mod==0)//数据读取
	{
		Nixie_num[0]=21;
		Nixie_num[1]=20;
		Nixie_num[2]=20;
		Nixie_num[3]=20;
		Nixie_num[4]=20;
		Nixie_num[5]=V/100%10+10;
		Nixie_num[6]=V/10%10;
		Nixie_num[7]=V/1%10;
	}
	else if(mod==1)//参数显示
	{
		Nixie_num[0]=22;
		Nixie_num[1]=20;
		Nixie_num[2]=20;
		Nixie_num[3]=20;
		Nixie_num[4]=20;
		Nixie_num[5]=Vp/10%10+10;
		Nixie_num[6]=Vp/1%10;
		Nixie_num[7]=0;
	}
	else if(mod==2)//记录次数显示
	{
		Nixie_num[0]=23;
		//一下处理为让数码管显示count数量,并自动调整需要显示的位数
		Nixie_num[1]=count/10000000>0 ? count/10000000%10:20;
		Nixie_num[2]=count/1000000>0 ? count/1000000%10:20;
		Nixie_num[3]=count/100000>0 ? count/100000%10:20;
		Nixie_num[4]=count/10000>0 ? count/10000%10:20;
		Nixie_num[5]=count/1000>0 ? count/1000%10:20;
		Nixie_num[5]=count/100>0 ? count/100%10:20;
		Nixie_num[6]=count/10>0 ? count/10%10:20;
		Nixie_num[7]=count/1>0 ? count/1%10:20;
	}
}
bit L1_on=0;
bit L2_on=0;
bit L3_on=0;
void led_run(void)
{
	if(is_led1_on==1&&L1_on==0)
	{
		LED_ON(0);
		L1_on=1;
	}
	else if(is_led1_on==0&&L1_on==1)
	{
		LED_OFF(0);
		L1_on=0;
	}
	
	if(count%2==1&&L2_on==0)//如果记录的次数为奇数,由于这个条件十分简单,所以就直接在这里判断了
	{
		LED_ON(1);
		L2_on=1;
	}
	else if(count%2!=1&&L2_on==1)
	{
		LED_OFF(1);
		L2_on=0;	
	}
		
	if(is_led3_on==1&&L3_on==0)
	{
		LED_ON(2);
		L3_on=1;
	}
	else if(is_led3_on==0&&L3_on==1)
	{
		LED_OFF(2);
		L3_on=0;	
	}
}

iic.c

/*	#   I2C代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

#define DELAY_TIME	5
#include <stc15.h>
#include <intrins.h>
sbit sda=P2^1;
sbit scl=P2^0;
//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

unsigned char get_pcf(unsigned char add)
{
	unsigned char ad=0;
	
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(add);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	ad=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	return ad;
}

void write_at(unsigned char add,dat)
{
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(add);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

unsigned char read_at(unsigned char add)
{
	unsigned char at=0;
	
	I2CStart();
	I2CSendByte(0xA0);
	I2CWaitAck();
	I2CSendByte(add);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0xA1);
	I2CWaitAck();
	at=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	return at;
}

iic.h

#ifndef _IIC_H_
#define _IIC_H_


unsigned char get_pcf(unsigned char add);

void write_at(unsigned char add,dat);
unsigned char read_at(unsigned char add);

#endif

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

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

相关文章

指针篇章-(4)+qsort函数的模拟

学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

WPF Button去除按钮边框,添加下划线

<Button Width"45" Height"25" FontSize"20" Background"Transparent" BorderBrush"Transparent" Foreground"#FFC9A322" Click"Btn_Retry_Click" ><TextBlock><Underline>重试</…

Jenkins自动构建 CI/CD流水线学习笔记(从入门到入土,理论+示例)

文章目录 1、什么是Jenkins的流水线?2、流水线语法2.1、声明式流水线2.2、脚本化流水线 3、流水线示例3.1、使用声明式流水线的语法编写的 Jenkinsfile 文件3.2、Pipeline 各种语言示例3.2.1 Java&#xff1a;3.2.2 Node.js / JavaScript3.2.3 Python 4、一套完整的Devops Jen…

[云原生] K8s之ingress

1.Ingress的相关知识 1.1 Ingress的简介 service的作用体现在两个方面&#xff0c;对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b;对集群外部&#xff0c;他类似负载均衡器…

09-设计模式 面试题

你之前项目中用过设计模式吗? 工厂方法模式分类 简单工厂模式工厂方法模式抽象工厂模式工厂模式 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore)…

机器学习-04-分类算法-01决策树案例

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

20240308-使用VS2022编译VLD-v2.5.4内存泄漏工具

20240308-使用VS2022编译VLD-v2.5.4内存泄漏工具 一、软件环境 Win10 x64 22h2 JuneVS2022 v17.9.0GIT v2.29.2标签&#xff1a;win10 22h2 vs2022分栏&#xff1a;C 二、硬件环境 Win10 x64的PC台式机 三、获取源码 方法一 git clone https://gitee.com/gdnh22/vld254.…

案例分析篇01:软件架构设计考点架构风格及质量属性(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(二)

前言 上篇内容已经介绍接口测试流程以及了解如何用jmeter接口测试&#xff0c;本篇将介绍如何在实战中应用 一、Jmeter接口关联 1.使用正则表达式实现接口关联&#xff08;可以作用于任意值&#xff09; 如果说一个请求里面有多次请求服务器。 2.使用Jsonpath表达式实现接口关…

Python教程-SchemDraw绘制电路图

电路图是电子工程师和电子爱好者的重要工具&#xff0c;用于图形化表示电子元件之间的连接关系。在Python中&#xff0c;有许多库可以用于绘制电路图&#xff0c;其中之一就是SchemDraw。本文将介绍如何使用SchemDraw库&#xff0c;通过简单的Python代码绘制出清晰、美观的电路…

电子价签前景璀璨,汉朔科技革新零售行业的数字化新篇章

新型商超模式数字化“秘密武器”——电子价签 传统纸质价签&#xff0c;只要商品价格、日期等信息发生变化&#xff0c;就必须重新打印进行手动替换。电子价签的应用使传统的人工申请、调价、打印、营业员去货架前端更换等变价流程均可省略&#xff0c;所有门店的价格由后台统…

2024 年系统架构设计师(全套资料)

2024年5月系统架构设计师最新第2版教材对应的全套视频教程、历年真题及解析、章节分类真题及解析、论文写作及范文、教材、讲义、模拟题、答题卡等资料 1、2023年11月最新第2版本教材对应全套教程视频&#xff0c;2022年、2021年、2020年、2018年、2016年五套基础知识精讲视频、…

YOLOv5改进 | 独家创新篇 | 利用DCNv3结合DLKA形成全新的注意力机制(全网独家创新)

一、本文介绍 本文给大家带来的机制是由我独家创新结合Deformable Large Kernel Attention (D-LKA) 注意力机制和DCNv3可变形卷积的全新注意力机制模块&#xff08;算是二次创新&#xff09;&#xff0c;D-LKA的基本原理是结合了大卷积核和可变形卷积的注意力机制&#xff0c;…

python基础及网络爬虫

网络爬虫(Web crawler)&#xff0c;有时候也叫网络蜘蛛(Web spider)&#xff0c;是指这样一类程序——它们可以自动连接到互联网站点&#xff0c;并读取网页中的内容或者存放在网络上的各种信息&#xff0c;并按照某种策略对目标信息进行采集&#xff08;如对某个网站的全部页面…

案例分析篇08:Web架构设计相关20个考点(1~6)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Acer宏碁非凡Swift SFG16-71工厂模式原厂Win11系统,预装OEM系统恢复开箱状态

宏基笔记本电脑SFG16-71原装出厂Windows11系统安装工厂包下载&#xff0c;带恢复重置功能 链接&#xff1a;https://pan.baidu.com/s/1JK02kBbwKG_cIBNlEOzrOw?pwdzdfm 提取码&#xff1a;zdfm 原装工厂包系统自带所有驱动、Office办公软件、出厂时自带主题壁纸图片、系统…

汽车软件市场迅猛扩张,Perforce Helix Core与Helix IPLM助力汽车软件开发的版本控制及IP生命周期管理

汽车软件世界正处于持续变革和转型之中。从自动驾驶汽车到电动汽车和先进的驾驶辅助系统&#xff0c;汽车软件的集成度和复杂性不断提升。 据美国电气与电子工程师协会的研究&#xff0c;如今大多数汽车都集成了超过1亿行代码&#xff0c;而仅仅十年前&#xff0c;这种水平的汽…

Go语言简介

一.Go语言简介 1.1 优点 自带gc静态编译&#xff0c;编译好后&#xff0c;扔服务器直接运行简单思想&#xff0c;没有继承&#xff0c;多态和类等丰富的库和详细开发文档语法层支持并发&#xff0c;和拥有同步并发的channel类型&#xff0c;使并发开发变得非常方便简洁语法&am…

网站实现HTTPS必须要使用SSL证书吗?

网站实现https必须要使用https协议&#xff0c;而要使用https协议就必须要安装SSL证书来实现。https协议可以通过SSL证书来实现加密传输数据&#xff0c;从而保证访客的隐私信息不回被窃取到。SSL证书就是浏览器跟服务器之间建立起来的安全通信的重要组成部分。 当访客在访问一…

跨城容灾与异地多活常见的架构设计

跨城容灾与异地多活常见的架构设计 1. 同城IDC与跨城IDC2. 几种不同的部署方式1.1 无复制的异地部署&#xff08;单地存储&#xff09;1.2 无复制的异地部署&#xff08;异地存储&#xff09;1.3 两地三中心部署&#xff08;同城同步复制&#xff0c;跨城异步复制&#xff09;1…