蓝桥杯第十一届电子类单片机组程序设计
目录
前言
单片机资源数据包_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读取一次VpTimer0_Init();EA=1;Delay100ms();while(1){get_key();//读取按键ad=get_pcf(3);//读取adV=(unsigned int)(ad*100/255*5);//获得当前读取到的电压,为方便保留小数点后两位,这里已经扩大倍show_menu();//显示菜单led_run();//控制LEDDelay100ms();}
}
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;//记录此时电压小于Vpcount++;//计数+1}if(is_led1_on==0&&V/10<Vp)//如果当前电压小于Vp,则开始计数{if(++count_5s>5000)//当过来5s当前电压还小于Vp,则点亮L1is_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
相关文章:

蓝桥杯第十一届电子类单片机组程序设计
目录 前言 单片机资源数据包_2023(点击下载) 一、第十一届比赛原题 1.比赛题目 2.赛题解读 1)计数功能 2)连续按下无效按键 二、部分功能实现 1.计数功能的实现 2.连续按下无效按键的处理 3.其他处理 1)对于…...

Java中文乱码问题解析与解决方案
在日常工作中,我们经常会遇到中文乱码的问题。乱码问题不仅影响用户体验,还可能导致数据丢失或解析错误。因此,了解和掌握中文乱码问题的原因和解决方案,对于Java开发者来说至关重要。本文将分析常见的Java中文乱码场景࿰…...

AIGC笔记--Maya提取和修改FBX动作文件
目录 1--Maya数据解析 2--FBX SDK导出6D数据 3--6D数据映射和Maya可视化 完整项目代码:Data-Processing/FBX_SDK_Maya 1--Maya数据解析 在软件Maya中直接拖入FBX文件,可以播放和查看人体各个骨骼关节点的数据: 对于上图来说,…...

【刷题训练】LeetCode125. 验证回文串
验证回文串 题目要求 示例 1: 输入: s “A man, a plan, a canal: Panama” 输出:true 解释:“amanaplanacanalpanama” 是回文串。 示例 2: 输入:s “race a car” 输出:false 解释:“rac…...

optee默认安全配置
OP-TEE(Open Portable Trusted Execution Environment)是一个开源的可移植的可信执行环境(TEE),用于提供安全和受保护的执行环境。它旨在为基于 ARM 架构的设备提供强大的安全性和隔离能力。 OP-TEE 主要由两部分组成…...

Arcgis新建位置分配求解最佳商店位置
背景 借用Arcgis帮助文档中的说明:在本练习中,您将为连锁零售店选择可以获得最大业务量的商店位置。主要目标是要将商店定位在人口集中地区附近,因为这种区域对商店的需求量较大。设立这一目标的前提是假设人们往往更多光顾附近的商店,而对于距离较远的商店则较少光顾。您…...

【C++初阶】C++入门(上)
C的认识 ①什么是C? C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。 于是1982年,Bjarne Stroustrup(本…...

Vue.js+SpringBoot开发校园疫情防控管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生2.2 老师2.3 学校管理部门 三、系统展示四、核心代码4.1 新增健康情况上报4.2 查询健康咨询4.3 新增离返校申请4.4 查询防疫物资4.5 查询防控宣传数据 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBoot…...

客服销冠偷偷用的提效神器!无广很实用
近期发现我的同事每天上班必登录的一款软件——客服宝聊天助手,用过才发现:真客服办公的提效神器!感兴趣的小伙伴请往下看~一、客服宝的简介:客服宝聊天助手,是一款跨平台快捷回复工具。自带多种功能,有效帮…...
蓝桥杯刷题|02入门真题
[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数…...

Jenkins cron定时构建触发器
from: https://www.jenkins.io/doc/book/pipeline/syntax/#cron-syntax 以下内容为根据Jenkins官方文档cron表达式部分翻译过来,使用机翻加个人理解补充内容,包括举例。 目录 介绍举例:设置方法方法一:方法二…...

【编程向导】JavaScript-创建对象一期讲解
工厂模式 工厂模式 是用来创建对象的一种最常用的设计模式。工厂模式不暴露创建对象的具体逻辑,而是将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式常见于大型项目,例如 jQuery 的 $ 对象,我们创建选择器对…...

【MySQL性能优化】- 一文了解MVCC机制
MySQL理解MVCC 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正ÿ…...

性能测试-Redis
一、测试注意点 1、缓存预热 如果程序初次运行,此时由于数据尚未加载到缓存,则程序的响应时间会明显变长 注意事项: 性能测试的时候 出现 非常不稳定的现象程序刚启动,它的性能 明显 低于 已经运行一段时间的 1.1 测试缓存没…...

浅析C++的指针与引用
浅析C的指针与引用 文章目录 浅析C的指针与引用一、对比引用与指针二、引用左值引用右值引用引用折叠 三、指针与引用的性能差距总结 一、对比引用与指针 总论: 引用指针必须初始化可以不初始化不能为空可以为空不能更换目标可以更换目标 引用必须初始化ÿ…...

【消息队列开发】 实现消息删除逻辑
文章目录 🍃前言🌲实现步骤🚩检验参数的合法性🚩读取Message数据🚩二进制转为message🚩isValid 设置为无效🚩写入文件🚩更新统计文件🚩特别注意🚩完整代码 ⭕…...

【golang】28、用 httptest 做 web server 的 controller 的单测
文章目录 一、构建 HTTP server1.1 model.go1.2 server.go1.3 curl 验证 server 功能1.3.1 新建1.3.2 查询1.3.3 更新1.3.4 删除 二、httptest 测试2.1 完整示例2.2 实现逻辑2.3 其他示例2.4 用 TestMain 避免重复的测试代码2.5 gin 框架的 httptest 一、构建 HTTP server 1.1…...

296.【华为OD机试】污染水域 (图的多源BFS—JavaPythonC++JS实现)
🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-污染水域二.解题思路三.题解代码Python题解代码…...

C语言——动态内存分配
前言:通过前面的学习,我们知道C语言中在内存中开辟空间的方法有:变量和数组。既然拥有了开辟空间的方法,我们为什么还要学习动态内存分配呢? int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…...

瑞_23种设计模式_策略模式
文章目录 1 策略模式(Strategy Pattern)★1.1 介绍1.2 概述1.3 策略模式的结构1.4 策略模式的优缺点1.5 策略模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析(Comparator) 🙊…...

使用 OpenAI 的 text-embedding 构建知识向量库并进行相似搜索
OpenAI的embedding模型的使用 首先第一篇文章中探讨和使用了ChatGPT4的API-Key实现基础的多轮对话和流式输出,完成了对GPT-API的一个初探索,那第二步打算使用OpenAI的embedding模型来构建一个知识向量库,其实知识向量库本质上就是一个包含着一…...

设计模式学习笔记 - 规范与重构 - 5.如何通过封装、抽象、模块化、中间层解耦代码?
前言 《规范与重构 - 1.什么情况下要重构?重构什么?又该如何重构?》讲过,重构可以分为大规模高层重构(简称 “大型重构”)和小规模低层次重构(简称 “小型重构”)。大型重构是对系统…...

YOLOv9实例分割教程|(二)验证教程
专栏地址:目前售价售价59.9,改进点30个 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 一、验证 打开分割验证文件,填入数据集配置文件、训练好的权重文件&…...

python 基础知识点(蓝桥杯python科目个人复习计划63)
今日复习内容:做题 例题1:蓝桥骑士 问题描述: 小蓝是蓝桥王国的骑士,他喜欢不断突破自我。 这天蓝桥国王给他安排了N个对手,他们的战力值分别为a1,a2,...,an,且按顺序阻挡在小蓝的前方。对于这些对手小…...

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)
写在前面 谈及到中国企业走入国际市场,拓展海外营销渠道的时候,如果单纯依靠一个小公司去国外做广告,拉渠道,找代理公司,从售前到售后,都是非常不现实的。我们可以回想一下40年前,30年前&#x…...

Python网络基础爬虫-python基本语法
文章目录 逻辑语句if,else,elifforwhile异常处理 函数与类defpassclass 逻辑语句 熟悉C/C语言的人们可能很希望Python提供switch语句,但Python中并没有这个关键词,也没有这个语句结构。但是可以通过if-elif-elif-…这样的结构代替,或者使用字…...

产品推荐 - 基于星嵌 OMAPL138+国产FPGA的DSP+ARM+FPGA三核开发板
1 评估板简介 基于TI OMAP-L138(定点/浮点DSP C674xARM9) FPGA处理器的开发板; OMAP-L138是TI德州仪器的TMS320C6748ARM926EJ-S异构双核处理器,主频456MHz,高达3648MIPS和2746MFLOPS的运算能力; FPGA…...

【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用
【微服务学习笔记(一)】Nacos、Feign、Gateway基础使用 总览Nacos安装配置Nacos注册中心服务多级存储模型负载均衡规则环境隔离 配置管理配置拉取配置热更新多服务共享配置 Feign远程调用配置性能优化Fegin使用 统一网关Gateway搭建网关路由断言工厂&…...

使用maven打生产环境可执行包
一、程序为什么要打包 程序打包的主要目的是将项目的源代码、依赖库和其他资源打包成一个可执行的文件或者部署包,方便程序的发布和部署。以下是一些打包程序的重要理由: 方便部署和分发:打包后的程序可以作为一个独立的实体,方便…...

springboot+ssm基于vue.js的客户关系Crm管理系统
系统包含两种角色:管理员、用户,主要功能如下。 ide工具:IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架:ssmspringboot都有 前端:vue.jsElementUI 详细技术:springbootSSMvueMYSQLMAVEN 数据库…...