第十五届蓝桥杯单片机组4T模拟赛三(第二套)

本套试题在4T平台中的名字为第15届蓝桥杯单片机组模拟考试三,不知道哪套是4T的模拟赛,所以两套都敲一遍练练手感。

为了代码呈现美观,本文章前面的各个模块在main函数中的处理函数均未添加退出处理,在最后给出的完整代码中体现。

附件:第15届蓝桥杯单片机组模拟考试三
在这里插入图片描述

一、准备工作

1.阅读系统框架

由系统框架图得知,等会创建工程时需要编写的底层模块有:

  • 初始化模块(Init.h,Init.c)
  • 指示灯模块(Led.h,Led.c)
  • 数码管模块(Seg.h,Seg.c)
  • 温度传感器模块(ds18b20.h,ds18b20.c)
  • 按键模块(key.h,key.c)
    这些底层函数在作者的专栏《蓝桥杯单片机模板搭建系列》中都详细地讲解了怎么去实现,如果读者有不懂的可以点击下面的链接。
    蓝桥杯单片机模板搭建系列

2.阅读题目了解题意

  • 按键只使用了S4、S5和S8,并且没有错误按键次数的判断,所以写按键时可以只写S4、S5和S8的。
  • 数码管显示字母用到PC的段码,在数码管底层函数记得添加。
  • 页面显示只有两个页面,所以为了更简单地实现页面流转,可以定义bit型变量SegMode控制页面流转(为0时对应信号界面,为1时对应温度界面)
  • 由于涉及NE555,所以需要使用定时器0去计数,定时器1去计时,同时屏蔽掉按键模块中对P34的赋值

二、数码管模块

1.Seg.h

#ifndef __Seg_H__
#define __Seg_H__void SegDisp(unsigned char wela, unsigned char dula, unsigned char point);#endif

2.Seg.c

#include <STC15F2K60S2.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
0xff, //空
0x8c, //P
0xc6, //C
};void SegDisp(unsigned char wela, unsigned char dula, unsigned char point)
{P0 = 0xff;P2 = P2 & 0x1f | 0xe0;P2 &= 0x1f;P0 = (0x01 << wela);P2 = P2 & 0x1f | 0xc0;P2 &= 0x1f;P0 = Seg_Table[dula];if(point)P0 &= 0x7f;P2 = P2 & 0x1f | 0xe0;P2 &= 0x1f;
}

3.NE555

NE555在底层搭建系列也已经讲过了,这边直接给出代码

void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;			//定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x05;			//设置定时器模式TL0 = 0;				//设置定时初始值TH0 = 0;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时
}void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定时器时钟12T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0x18;				//设置定时初始值TH1 = 0xFC;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时ET1 = 1;				//使能定时器1中断EA = 1;
}void Timer1_Isr(void) interrupt 3
{//systick++;调度器使用if(++SegPos == 8)SegPos = 0;SegDisp(SegPos,SegBuf[SegPos],SegPoint[SegPos]);if(++Time_1s == 1000){Time_1s = 0;f = (TH0 << 8) | TL0;TH0 = TL0 = 0;}
}

4.main.c中的数码管处理函数SegProc

在这里插入图片描述

信号界面

用bit型变量SegMode来控制页面流转,当SegMode等于0时,对应显示界面为NE555频率测量,NE555的上限值大概在31000多,所以第一位和第二位数码管直接熄灭即可(最左边的数码管为第零位数码管),显示界面还需要进行高位为0熄灭的判断,这个也是很简单的,代码如下:

void SegProc()
{unsigned char i;if(!SegMode){SegBuf[0] = 11;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = f / 10000 % 10;SegBuf[4] = f / 1000 % 10;SegBuf[5] = f / 100 % 10;SegBuf[6] = f / 10 % 10;SegPoint[6] = 0;SegBuf[7] = f % 10;//高位熄灭处理i = 3;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}
}

温度界面

ds18b20底层代码
#ifndef __ds18b20_H__
#define __ds18b20_H__float TemRead();#endif
#include <STC15F2K60S2.H>sbit DQ = P1^4;void Delay_OneWire(unsigned int t)  
{unsigned char i;while(t--){for(i=0;i<12;i++);}
}//
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}	    Delay_OneWire(5);}return dat;
}//
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}float TemRead()
{idata unsigned char tem_low, tem_hig;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);tem_low = Read_DS18B20();tem_hig = Read_DS18B20();return ((tem_hig << 8) | tem_low) / 16.0;
}

SegMode为1时,对应温度读取界面,由于作者个人习惯不喜欢使用float型变量,所以在这边使用的是unsigned int型变量Tem_10x(将温度放大10倍),这边也是给出两种写法。
写法一:定义float型变量

//取余变量声明、函数声明、头文件引用均省略
idata float Tem;void SegProc()
{if(!SegMode){//省略}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = (unsigned char)Tem / 10;SegBuf[6] = (unsigned char)Tem % 10;SegPoint[6] = 1;SegBuf[7] = (unsigned char)(Tem * 10) % 10;}
}void TemProc()
{Tem = TemRead();
}

写法二:定义unsigned int型变量

idata unsigned int Tem;void SegProc()
{if(!SegMode){//省略}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}
}void TemProc()
{Tem_10x = TemRead() * 10;
}

采集频率

  • 在信号页面按下S5为频率数据采集,此时数码管显示周期。
  • 周期 = 1 频率 \frac{1}{频率} 频率1 * 10 6 ^6 6(1s=10 6 u s ^6us 6us
    定义bit型变量FreMode控制信号页面的数据显示
  • FreMode为0时,显示频率,为1时,显示周期。
  • 如果频率值为1时,周期为100 0000us,所以高位熄灭的判断要从数码管第一位开始判断。
void SegProc()
{unsigned char i;if(!SegMode){SegBuf[0] = 11;if(!FreMode){//频率显示页面}else{T = 1000000 / f;SegBuf[1] = T / 1000000 % 10;SegBuf[2] = T / 100000 % 10;SegBuf[3] = T / 10000 % 10;SegBuf[4] = T / 1000 % 10;SegBuf[5] = T / 100 % 10;SegBuf[6] = T / 10 % 10;SegPoint[6] = 0;SegBuf[7] = T % 10;//高位数据为0熄灭判断i = 1;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}}
}

温度取整

  • 温度界面按下S5时将温度保留整数后在数码管中显示,这个时候应在数码管的低二位(最右边两个数码管)显示温度数据。
  • 同样的,定义bit型变量TemMode来控制温度显示页面的数据显示。
else//温度页面{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;/*if(!TemMode){SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}*/else//温度整数显示{SegBuf[5] = 10;SegBuf[6] = Tem_10x / 100;SegBuf[7] = Tem_10x / 10 % 10;SegPoint[6] = 0;}}

5.数码管模块完整代码

void SegProc()
{unsigned char i;if(!SegMode){SegBuf[0] = 11;if(!FreMode){SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = f / 10000 % 10;SegBuf[4] = f / 1000 % 10;SegBuf[5] = f / 100 % 10;SegBuf[6] = f / 10 % 10;SegPoint[6] = 0;SegBuf[7] = f % 10;i = 3;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}else{T = 1000000 / f;SegBuf[1] = T / 1000000 % 10;SegBuf[2] = T / 100000 % 10;SegBuf[3] = T / 10000 % 10;SegBuf[4] = T / 1000 % 10;SegBuf[5] = T / 100 % 10;SegBuf[6] = T / 10 % 10;SegPoint[6] = 0;SegBuf[7] = T % 10;i = 1;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;if(!TemMode){SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}else{SegBuf[5] = 10;SegBuf[6] = Tem_10x / 100;SegBuf[7] = Tem_10x / 10 % 10;SegPoint[6] = 0;}}
}

三、按键模块

1.按键底层代码

#ifndef __Key_H__
#define __Key_H__unsigned char KeyDisp();#endif
#include <STC15F2K60S2.H>unsigned char KeyDisp()
{unsigned char temp = 0x00;P44 = 0;P42 = 1;P35 = 1;if(P32 == 0) temp = 5;if(P33 == 0) temp = 4;P44 = 1;P42 = 0;P35 = 1;if(P32 == 0) temp = 9;return temp;
}

2.按键实现

在这里插入图片描述
按键模块特别简单,直接给出代码
这边注意的是,SegMode、FreMode、TemMode在前文中都已经定义成bit型变量,bit型变量是嵌入式系统设计中特有的变量,它的取值只有0和1,所以在按键S4、S5的变量取反可以使用下面两种方法实现:

SegMode = !SegMode;
SegMode ^= 1;

3.按键模块完整代码:

void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyDown = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:SegMode ^= 1;break;case 5:if(!SegMode){/*在下文的Led模块实现if(!FreMode)CountFlag = 1;*/FreMode ^= 1;}elseTemMode ^= 1;break;case 9:SegMode = 0;FreMode = 0;TemMode = 0;break;}
}

四、Led模块

1.Led底层代码

#ifndef __Led_H__
#define __Led_H__void LedDisp(unsigned char *ucLed);#endif
#include <STC15F2K60S2.H>void LedDisp(unsigned char *ucLed)
{unsigned char i, temp = 0x00;static unsigned char temp_old = 0xff;for(i = 0; i < 8; i++)temp |= (ucLed[i] << i);if(temp != temp_old){P0 = ~temp;P2 = P2 & 0x1f | 0x80;P2 &= 0x1f;temp_old = temp;}
}

在这里插入图片描述

2.L1、L2

L1、L2的点亮逻辑很简单
读者可以使用下面的代码也可以使用if-else语句或者三目运算符。

void LedProc()
{ucLed[0] = !SegMode;ucLed[1] = SegMode;
}

3.L3

  • L3的点亮逻辑是在信号页面激活采集功能后,L3点亮1s后熄灭,这边要注意的是,L3点亮是当采集功能激活后点亮的,而且1s后就要熄灭,没有进行其他操作时不能重复点亮。
  • 定时点亮、定时熄灭逻辑:定义时间变量以及指示灯标志位,时间变量在定时器内计时,当时间变量达到指定时间时,时间变量复位,指示灯标志位开启/关闭。
  • 本题实现方法有很多,下面给出我能想到的最简单的方法,如果读者有更简单的方法,欢迎评论区讨论。
/*有关于L3的变量定义*/
idata unsigned int Time_1s_Led;/*
*CountFlag两个作用:
*1.CountFlag置1时,Time_1s_Led开始计时
*CountFlag置0时,Time_1s_Led复位
*2.ucLed[2] = CountFlag,即L3是否点亮决定于CountFlag
*/
idata bit CountFlag;//CountFlag激活地
void KeyProc()
{switch(KeyDown){case 5:if(!SegMode){if(!FreMode)CountFlag = 1;//只有跳转到采集界面才激活CountFlagFreMode ^= 1;}}
}//Led
void LedProc()
{ucLed[2] = CountFlag;
}//定时器1中断服务函数
void Timer1_Isr(void) interrupt 3
{//其它省略if(CountFlag)//开灯计时{if(++Time_1s_Led == 1000){Time_1s_Led = 0;//复位CountFlag = 0;//关灯}}
}

4.L4

  • L4的点亮逻辑是实时温度超过40°时L4以100ms为间隔闪烁
  • 指示灯闪烁的逻辑很简单,定义一个计时变量和一个Led点亮标志位,定时器中断中计时变量达到特定时间时,将Led点亮标志位取反,让ucLed[2] = Led点亮标志位,这样就可以实现指示灯闪烁
idata unsigned char Time_100ms;idata bit LedFlah;//当实时温度>40°时,标志位置1
idata bit LedFlash;//L4使能标志位void TemProc()
{Tem_10x = TemRead() * 10;LedFlag = (Tem_10x > 300);
}void LedProc()
{ucLed[7] = LedFlash;
}void Timer1_Isr(void) interrupt 3
{if(LedFlag){if(++Time_100ms == 100){Time_100ms = 0;LedFlash ^= 1;}}else{Time_100ms = 0;LedFlash = 0;}
}

五、完整代码

完整代码的思路是没有问题的,已经通过4T评测了,完整代码是根据以上代码片段拼凑起来的,如果读者用以下代码搭建的工程不能完整实现工程或者报错,请及时联系我。

#include <STC15F2K60S2.H>
#include "Init.h"
#include "Key.h"
#include "Seg.h"
#include "Led.h"
#include "ds18b20.h"typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;idata u8 Key_Slow; //按键减速变量 10ms 
idata u8 Seg_Slow; //数码管减速变量 500ms
idata u8 SegPos;
idata u8 KeyVal, KeyDown, KeyUp, KeyOld;
idata u8 Time_100ms;pdata u8 SegBuf[8] = {10,10,10,10,10,10,10,10};
pdata u8 SegPoint[8] = {0,0,0,0,0,0,0,0};
pdata u8 ucLed[8] = {0,0,0,0,0,0,0,0};idata u16 Time_1s, f;
idata u16 Tem_10x;
idata u16 T;
idata u16 Time_1s_Led;idata bit SegMode;
idata bit FreMode;
idata bit TemMode;
idata bit CountFlag;
idata bit LedFlag;
idata bit LedFlash;void KeyProc()
{if(Key_Slow) return;Key_Slow = 1; //按键减速KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyDown = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:SegMode ^= 1;break;case 5:if(!SegMode){if(!FreMode)CountFlag = 1;FreMode ^= 1;}elseTemMode ^= 1;break;case 9:SegMode = 0;FreMode = 0;TemMode = 0;break;}
}void SegProc()
{unsigned char i;if(Seg_Slow) return;Seg_Slow = 1; //数码管减速Tem_10x = TemRead() * 10;LedFlag = (Tem_10x > 300);if(!SegMode){SegBuf[0] = 11;if(!FreMode){SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = f / 10000 % 10;SegBuf[4] = f / 1000 % 10;SegBuf[5] = f / 100 % 10;SegBuf[6] = f / 10 % 10;SegPoint[6] = 0;SegBuf[7] = f % 10;i = 3;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}else{T = 1000000 / f;SegBuf[1] = T / 1000000 % 10;SegBuf[2] = T / 100000 % 10;SegBuf[3] = T / 10000 % 10;SegBuf[4] = T / 1000 % 10;SegBuf[5] = T / 100 % 10;SegBuf[6] = T / 10 % 10;SegPoint[6] = 0;SegBuf[7] = T % 10;i = 1;while(SegBuf[i] == 0){SegBuf[i] = 10;if(++i == 7)break;}}}else{SegBuf[0] = 12;SegBuf[1] = 10;SegBuf[2] = 10;SegBuf[3] = 10;SegBuf[4] = 10;if(!TemMode){SegBuf[5] = Tem_10x / 100;SegBuf[6] = Tem_10x / 10 % 10;SegPoint[6] = 1;SegBuf[7] = Tem_10x % 10;}else{SegBuf[5] = 10;SegBuf[6] = Tem_10x / 100;SegBuf[7] = Tem_10x / 10 % 10;SegPoint[6] = 0;}}
}void LedProc()
{ucLed[0] = !SegMode;ucLed[1] = SegMode;ucLed[2] = CountFlag;ucLed[7] = LedFlash;LedDisp(ucLed);
}void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;			//定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x05;			//设置定时器模式TL0 = 0;				//设置定时初始值TH0 = 0;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时
}void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定时器时钟12T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0x18;				//设置定时初始值TH1 = 0xFC;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时ET1 = 1;				//使能定时器1中断EA = 1;
}void Timer1_Isr(void) interrupt 3
{if(++Key_Slow == 10) Key_Slow = 0; //按键延迟if(++Seg_Slow == 200) Seg_Slow = 0; //数码管延迟if(++SegPos == 8) SegPos = 0;SegDisp(SegPos,SegBuf[SegPos],SegPoint[SegPos]);if(++Time_1s == 1000){Time_1s = 0;f = (TH0 << 8) | TL0;TH0 = TL0 = 0;}if(CountFlag){if(++Time_1s_Led == 1000){Time_1s_Led = 0;CountFlag = 0;}}if(LedFlag){if(++Time_100ms == 100){Time_100ms = 0;LedFlash ^= 1;}}else{Time_100ms = 0;LedFlash = 0;}
}void main()
{SystemInit();Timer0_Init();Timer1_Init();while(1){KeyProc();SegProc();LedProc();}
}

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

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

相关文章

CT技术变迁史——CT是如何诞生的?

第一代CT(平移-旋转) X线球管为固定阳极,发射X线为直线笔形束,一个探测器,采用直线和旋转扫描相结合,即直线扫描后,旋转1次,再行直线扫描,旋转180完成一层面扫描,扫描时间3~6分钟。矩阵象素256256或320320。仅用于颅脑检查。 第二代CT (平移-旋转) 与第一代无质…

Virtual Box虚拟机安装苹果Monterey和big sur版本实践

虚拟机安装苹果实践&#xff0c;在Windows10系统&#xff0c;安装Virtual Box7.1.6&#xff0c;安装虚拟苹果Monterey版本Monterey (macOS 12) 。碰到的主要问题是安装光盘不像Windows那么容易拿到&#xff0c;而且根据网上很多文章制作的光盘&#xff0c;在viritualBox里都无法…

dify基础之prompts

摘要&#xff1a;在大型语言模型&#xff08;LLM&#xff09;应用中&#xff0c;Prompt&#xff08;提示词&#xff09;是连接用户意图与模型输出的核心工具。本文从概念、组成、设计原则到实践案例&#xff0c;系统讲解如何通过Prompt解锁LLM的潜能&#xff0c;提升生成内容的…

【学写LibreCAD】0 仿写LibreCAD简介

一、LibreCAD 核心模块&#xff1a; 核心模块&#xff08;Core&#xff09; 功能&#xff1a;处理 CAD 的核心逻辑&#xff0c;如几何计算、图形对象管理、坐标系转换等。关键组件&#xff1a; 图形对象&#xff1a;如直线、圆、圆弧、多段线等。数学工具&#xff1a;向量、矩…

HTML元素,标签到底指的哪块部分?单双标签何时使用?

1. 标签&#xff08;Tag&#xff09; vs 元素&#xff08;Element&#xff09; 标签&#xff08;Tag&#xff09; 标签是 HTML 中用于定义元素的符号&#xff0c;用尖括号 < > 包裹。例如 <img> 是标签。元素&#xff08;Element&#xff09; 元素是由 标签 内容…

Android APK组成编译打包流程详解

Android APK&#xff08;Android Package&#xff09;是 Android 应用的安装包文件&#xff0c;其组成和打包流程涉及多个步骤和文件结构。以下是详细的说明&#xff1a; 一、APK 的组成 APK 是一个 ZIP 格式的压缩包&#xff0c;包含应用运行所需的所有文件。解压后主要包含以…

Token相关设计

文章目录 1. 双Token 机制概述1.1 访问令牌&#xff08;Access Token&#xff09;1.2 刷新令牌&#xff08;Refresh Token&#xff09; 2. 双Token 认证流程3. Spring Boot 具体实现3.1 生成 Token&#xff08;使用 JWT&#xff09;3.2 解析 Token3.3 登录接口&#xff08;返回…

HTTP 请求时传递多部分表单数据

HTTP 请求时传递多部分表单数据&#xff08;multipart/form-data&#xff09; --data-raw $------demo11111\r\nContent-Disposition: form-data; name"Filedata"; filename"截屏2025-02-27 15.45.46.png"\r\nContent-Type: image/png\r\n\r\n\r\n------d…

Java基础关键_013_日期处理

目 录 一、传统 API 1.System.currentTimeMillis() &#xff08;1&#xff09;说明 &#xff08;2&#xff09;实例 2.构造方法 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;无参构造 &#xff08;3&#xff09;有参构造 3.日期格式化 &#xff08;1&am…

51单片机中reg52.h与regx52.h在进行位操作时的不同

reg52.h中不能使用例如 P2_0;这样的定义 而只能使用 P2^0;这样的定义 但是都不可以对位进行直接赋值操作&#xff1b; 而 regx52.h中可以使用 P2_0和P2^0&#xff1b;但是只有使用下划线的才可以对位进行赋值操作 例如P2_0 1; 但不可以是P2^0 1; 在 C 语言中&#xff0c;…

基于Rook的Ceph云原生存储部署与实践指南(上)

#作者&#xff1a;任少近 文章目录 1 Ceph环境准备2 rook部署ceph群集2.1 Rook 帮助地址2.2 安装ceph2.3 获取csi镜像2.4 Master参加到osd2.5 设置默认存储 3 Rook部署云原生RBD块存储3.1 部署storageclass资源3.2 部署WordPress使用RBD3.3 WordPress访问 4 Rook部署云原生RGW…

FastExcel与Reactor响应式编程深度集成技术解析

一、技术融合背景与核心价值 在2025年企业级应用开发中&#xff0c;大规模异步Excel处理与响应式系统架构的结合已成为技术刚需。FastExcel与Reactor的整合方案&#xff0c;通过以下技术协同实现突破性性能&#xff1a; 内存效率革命&#xff1a;FastExcel的流式字节操作与Re…

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…

Spring Data JPA 中的分页实现:从 BasePage 到 Pageable

文章目录 Spring Data JPA 中的分页实现&#xff1a;从 BasePage 到 Pageable背景&#xff1a;为什么需要分页&#xff1f;认识 BasePage 类深入 toPageable() 方法1. 处理页码和页面大小2. 处理排序方向3. 处理排序字段4. 生成 Pageable 对象 实战&#xff1a;如何使用 BasePa…

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 仓库发布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…

python量化交易——金融数据管理最佳实践——qteasy创建本地数据源

文章目录 qteasy金融历史数据管理总体介绍本地数据源——DataSource对象默认数据源查看数据表查看数据源的整体信息最重要的数据表其他的数据表 从数据表中获取数据向数据表中添加数据删除数据表 —— 请尽量小心&#xff0c;删除后无法恢复&#xff01;&#xff01;总结 qteas…

Android中使用Robolectric测试点击事件(不需要手机)

文章目录 一、前言二、简单示例三、参考文档 一、前言 Robolectric 是一个由 Google 维护的开源 Android 测试框架&#xff0c;它允许你以 Android 运行时环境运行单元测试。 Robolectric 提供了一个模拟 Android 运行时环境&#xff0c;允许你测试你的代码是否正确地使用 And…

Spring Boot 接口 JSON 序列化优化:忽略 Null 值的九种解决方案详解

一、针对特定接口null的处理&#xff1a; 方法一&#xff1a;使用 JsonInclude 注解 1.1 类级别&#xff1a;在接口返回的 ‌DTO 类或字段‌ 上添加 JsonInclude 注解&#xff0c;强制忽略 null 值&#xff1a; 类级别&#xff1a;所有字段为 null 时不返回 JsonInclude(Js…

ds回答-开源llm应用开发平台

以下是几个著名的开源 LLM 应用开发平台&#xff0c;涵盖不同场景和技术特点&#xff1a; 1. Dify 特点&#xff1a;低代码 / 无代码开发、支持 RAG 检索、Agent 智能体、模型管理、LLMOps 全流程优化。核心功能&#xff1a;可视化工作流编排、数百种模型兼容&#xff08;如 GP…

LDR6020 PD3.1 协议芯片在特定设备中的应用

在电子设备互联互通的时代&#xff0c;芯片技术成为提升设备性能与功能的关键驱动力。LDR6020 PD3.1 协议芯片以其出色的性能&#xff0c;在 TYPE-C 台式显示器 / 便携显示器、一拖二快充线以及手机电脑转接器等设备中展现出独特价值&#xff0c;为用户带来更便捷、高效的使用体…