当前位置: 首页 > news >正文

第十六届蓝桥杯单片机组4T模拟赛二

难点:
PCF8591同时测量两条通道数据
避免重复触发
采集触发时的时间数据存放
未采集的数据显示
清空数据

本题建议了解怎么去触发采集,怎么显示最近三次触发采集的时间即可。由于4T模拟赛的尿性有很多评测点是题目中没有要求的,另外测评的时候PCF8591使用连续读取两次丢弃第一次会判错,交换两条通道的值有些也是错的,在转换前加上200ms的延迟经评测是对的…

如果你系统的学习过C语言和数据结构与算法,解决本题还是很轻松的。

附件:第十六届蓝桥杯单片机组4T模拟赛二

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

一、基础知识

  • PCF8591:如果你在读取通道 1 后立即读取通道 3,会导致以下问题:
    1.电压参数未稳定:PCF8591 在切换通道后,需要一定的时间来稳定电压参数。
    如果立即读取下一个通道,可能会导致读取的值不准确。
    2.通道切换延迟:PCF8591 的通道切换需要时间,具体取决于芯片的采样速率和硬件设计。如果没有足够的延迟,读取的值可能仍然是上一个通道的值。
    解决方法已经在另一篇文章给出了:PCF8591一次读取多条通道导致测量值不准确的原因及解决方法
  • 通过PCF8591采集的电压数据不稳定:可以使用以下方法:
    1.均值滤波:对多次采样结果取平均值
    2.中值滤波:对多次采样结果取中值
    3.滑动平均滤波:维护一个滑动窗口,计算窗口内数据的平均值
    4.卡尔曼滤波:适用于动态系统的高级滤波算法
    本篇文章使用的是均值滤波,其他几种在单片机中有点大炮打蚊子的感觉,在以后的嵌入式系列再作介绍。
  • string.h中的两个常用函数
    1.memset
    memset 用于将一段内存区域的内容设置为指定的值
    (1)函数原型:void* memset(void* ptr, int value, size_t num);
    (2)参数:
    ptr:指向要设置的内存区域的指针
    value:要设置的值(以 int 形式传递,但实际按unsigned char处理
    num:要设置的字节数
    (3)功能:
    ptr指向的内存区域的前num个字节设置为value
    2.memcpy
    memcpy 用于将一段内存区域的内容复制到另一段内存区域。
    (1)函数原型:void* memcpy(void* dest, const void* src, size_t num);
    (2)参数:
    dest:指向目标内存区域的指针
    src:指向源内存区域的指针
    num:要复制的字节数
    (3)功能:
    src指向的内存区域的前 num个字节复制到dest指向的内存区域

二、板子现象演示

1.时间界面

上电显示时间界面,从23时59分50秒开始计时,同时LED1点亮,其余指示灯熄灭。
在这里插入图片描述

2.数据界面

按下S4切换成数据页面,数码管显示RB2和RD1的值,指示灯L2点亮。
在这里插入图片描述

3.历史查询界面

按下S4切换历史查询界面,未触发数据采集时显示-,指示灯L3点亮,该页面按下S5切换历史查询子界面。
在这里插入图片描述

4.触发采集

任意界面光敏电阻电压<RB2电压时触发采集(持续处于该状态时不触发),由于手机拍照遮光触发三次。

触发采集时亮的灯是L8,下面这张图是错误的,后面的Led模块已经修改好了。
在这里插入图片描述

5.触发三次采集后的历史查询页面

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

6.清空记录时间

在这里插入图片描述

三、数码管模块

1.添加P R C -的段码

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, //空
0xbf, //-
0x8c, //P
0xc1, //U
0x88, //A
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;
}

2.时间页面

在这里插入图片描述

  • 添加DS1302底层代码
#include <STC15F2K60S2.H>
#include <intrins.h>sbit SCK = P1^7;
sbit RST = P1^3;
sbit SDA = P2^3;void Write_Ds1302(unsigned  char temp) 
{unsigned char i;for (i=0;i<8;i++)     	{ SCK = 0;SDA = temp&0x01;temp>>=1; SCK=1;}
}   void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{RST=0;	_nop_();SCK=0;	_nop_();RST=1; 	_nop_();  Write_Ds1302(address);	Write_Ds1302(dat);		RST=0; 
}unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0;	_nop_();SCK=0;	_nop_();RST=1;	_nop_();Write_Ds1302(address);for (i=0;i<8;i++) 	{		SCK=0;temp>>=1;	if(SDA)temp|=0x80;	SCK=1;} RST=0;	_nop_();SCK=0;	_nop_();SCK=1;	_nop_();SDA=0;	_nop_();SDA=1;	_nop_();return (temp);			
}code unsigned char DS1302_Arr[4] = {0x84,0x82,0x80,0x8E};void SetRtc(unsigned char *ucRtc)
{unsigned char i;Write_Ds1302_Byte(DS1302_Arr[3],0x00);for(i = 0; i < 3; i++)Write_Ds1302_Byte(DS1302_Arr[i],ucRtc[i]);Write_Ds1302_Byte(DS1302_Arr[3],0x80);
}void GetRtc(unsigned char *ucRtc)
{unsigned char i;for(i = 0; i < 3; i++)ucRtc[i] = Read_Ds1302_Byte(DS1302_Arr[i]+1);
}
  • main.c函数中的DS1302数据处理函数
pdata u8 ucRtc[3] = {0x23,0x59,0x50};void DS1302Proc()
{GetRtc(ucRtc);
}void main()
{SystemInit();Timer0_Init();SetRtc(ucRtc);//设定时间while(1){DS1302Proc();}
}
  • 数码管显示
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;idata u8 SegPos;//数码管扫描位
idata u8 SegMode;//数码管显示页面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 ucRtc[3] = {0x23,0x59,0x50};//时钟void SegProc()
{unsigned char i;switch(SegMode){case 0:SegBuf[2] = SegBuf[5] = 11;//-for(i = 0; i < 3; i++){SegBuf[3*i] = ucRtc[i] / 16;SegBuf[3*i+1] = ucRtc[i] % 16;}break;}
}		

3.数据页面

在这里插入图片描述

  • iic底层
#include <STC15F2K60S2.H>
#include <intrins.h>#define DELAY_TIME	5sbit scl = P2^0;
sbit sda = P2^1;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 Ad(unsigned char add)
{unsigned char temp;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2C_Delay(200);I2CStart();I2CSendByte(0x91);I2CWaitAck();temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return temp;
}
  • main.c中的AD数据处理函数ADProc()
idata u16 RD1_100x, RB2_100x;//RD1、RB2放大100倍void ADProc()
{RD1_100x = Ad(0x03) / 51.0 * 100;RB2_100x = Ad(0x01) / 51.0 * 100;
}
  • 数码管显示
void SegProc()
{unsigned char i;if(!record){switch(SegMode){case 0://...break;case 1:SegBuf[0] = 12;//PSegBuf[1] = RD1_100x / 100;SegBuf[2] = RD1_100x / 10 % 10;SegBuf[3] = RD1_100x % 10;SegBuf[4] = 13;//USegBuf[5] = RB2_100x / 100;SegBuf[6] = RB2_100x / 10 % 10;SegBuf[7] = RB2_100x % 10;SegPoint[1] = SegPoint[5] = 1;break;}}
}		

4.历史查询界面

在这里插入图片描述
由于历史查询界面中记录的是最近三次的触发时间,这边为了方便
使用二维数组pdata u8 rtc_record[3][3];来记录三组时间
定义idata u8 rtc_record_x;为二维数组的行索引
由于时钟的小时不可能为24,所以二维数组的初值赋值为0x24,在数码管就可以通过判断二维数组的rtc_record[rtc_record_x][0]是否为0x24进行判断是否为空。

idata u8 rtc_record_x;
pdata u8 rtc_record[3][3] = {0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24};void SegProc()
{unsigned char i;if(!record){switch(SegMode){case 0://...break;case 1://...break;case 2:SegBuf[0] = 14;SegBuf[1] = rtc_record_x + 1;SegPoint[1] = SegPoint[5] = 0;//如果该组数据未采集,则除了前两位其余显示-if(rtc_record[rtc_record_x][0] == 0x24){SegBuf[2] = 11;SegBuf[3] = 11;SegBuf[4] = 11;SegBuf[5] = 11;SegBuf[6] = 11;SegBuf[7] = 11;}//该组数据已采集,正常显示elsefor(i = 0; i < 3; i++){SegBuf[2*i+2] = rtc_record[rtc_record_x][i] / 16;SegBuf[2*i+3] = rtc_record[rtc_record_x][i] % 16;}break;}}

5.触发采集

/*变量定义*/
idata u8 rtc_record_x;//二维数组行索引
pdata u8 rtc_record[3][3] = {0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24};//二维数组存放记录的时间idata bit record;//触发标志位
idata bit has_record;//重复触发检测位

在这里插入图片描述
在实现该功能,应采取从大到小的方法来实现

  • 当采集到光敏电压值 < RB2 电压值时,触发 1 次
void ADProc()
{RD1_100x = Ad(0x01) / 51.0 * 100;RB2_100x = Ad(0x03) / 51.0 * 100;//光敏电压:RD1                                                                                                                                                                                                                                                                                                       if((RD1_100x < RB2_100x) && (RD1_100x_old >= RB2_100x_old) && !RecordFlag){RecordFlag = 1;MainMode = 1;}RD1_100x_old = RD1_100x;RB2_100x_old = RB2_100x;
}
  • 触发后,立即切换到“触发界面”,显示本次触发时间, 3s 内不可重复触发。 3 秒后返回“原状态”
idata u16 Time_3s;void ADProc()
{RD1_100x = Ad(0x01) / 51.0 * 100;RB2_100x = Ad(0x03) / 51.0 * 100;//光敏电压:RD1                                                                                                                                                                                                                                                                                                       if((RD1_100x < RB2_100x) && (RD1_100x_old >= RB2_100x_old) && !RecordFlag){RecordFlag = 1;MainMode = 1;GetRtc(rtc_record[0]);}RD1_100x_old = RD1_100x;RB2_100x_old = RB2_100x;
}void Timer0_Isr(void) interrupt 1
{//systick++;if(++SegPos == 8) SegPos = 0;SegDisp(SegPos,SegBuf[SegPos],SegPoint[SegPos]);if(RecordFlag ){if(++Time_3s == 3000){Time_3s = 0;RecordFlag = 0;}}
}
  • 接下来实现以下功能

触发后, “历史查询界面”,记录本次触发时间。越早记录的数据,索引值越大,最近一次触发时间索引值
为 1。历史查询界面可记录最近 3 次的触发时间。

(1)数据移动

for (i = 2; i > 0; i--)memcpy(rtc_record[i], rtc_record[i - 1], 3);

将rtc_record[1] 的数据复制到 rtc_record[2]
将rtc_record[0] 的数据复制到 rtc_record[1]
每次移动的数据长度为 3 个字节(时、分、秒)

(2)获取新数据
GetRtc(rtc_record[0]);
调用 GetRtc() 函数,将新数据存储到 rtc_record[0] 中。
(3)代码

void ADProc()
{u8 i;RD1_100x = Ad(0x03) * 100 / 51.0;RB2_100x = Ad(0x01) * 100 / 51.0;if((RD1_100x < RB2_100x) && (RD1_100x_old >= RB2_100x_old) && !RecordFlag){RecordFlag = 1;MainMode = 1;for(i = 2; i > 0; i--)memcpy(rtc_record[i],rtc_record[i-1],3);GetRtc(rtc_record[0]);}RD1_100x_old = RD1_100x;RB2_100x_old = RB2_100x;
}

6.数码管完整代码

void SegProc()
{unsigned char i;if(!record)//没有处于记录页面{switch(SegMode){case 0:SegBuf[2] = SegBuf[5] = 11;for(i = 0; i < 3; i++){SegBuf[3*i] = ucRtc[i] / 16;SegBuf[3*i+1] = ucRtc[i] % 16;}break;case 1:SegBuf[0] = 12;SegBuf[1] = RD1_100x / 100;SegBuf[2] = RD1_100x / 10 % 10;SegBuf[3] = RD1_100x % 10;SegBuf[4] = 13;SegBuf[5] = RB2_100x / 100;SegBuf[6] = RB2_100x / 10 % 10;SegBuf[7] = RB2_100x % 10;SegPoint[1] = SegPoint[5] = 1;break;case 2:SegBuf[0] = 14;SegBuf[1] = rtc_record_x + 1;SegPoint[1] = SegPoint[5] = 0;if(rtc_record[rtc_record_x][0] == 0x24){SegBuf[2] = 11;SegBuf[3] = 11;SegBuf[4] = 11;SegBuf[5] = 11;SegBuf[6] = 11;SegBuf[7] = 11;}elsefor(i = 0; i < 3; i++){SegBuf[2*i+2] = rtc_record[rtc_record_x][i] / 16;SegBuf[2*i+3] = rtc_record[rtc_record_x][i] % 16;}break;}}else//处于记录页面{SegBuf[0] = 15;SegBuf[1] = 15;SegPoint[1] = SegPoint[5] = 0;for(i = 0; i < 3; i++){SegBuf[2*i+2] = rtc_record[0][i] / 16;SegBuf[2*i+3] = rtc_record[0][i] % 16;}}
}

四、按键模块

1.底层代码

#include <STC15F2K60S2.H>unsigned char KeyDisp()
{unsigned char temp = 0;P44 = 0;P42 = 1;P35 = 1;P34 = 1;if(P32 == 0)temp = 5;if(P33 == 0)temp = 4;P44 = 1;P42 = 0;P35 = 1;P34 = 1;if(P33 == 0)temp = 8;return temp;
}

2.功能处理

在这里插入图片描述

idata u8 rtc_record_x;//二维数组行索引
pdata u8 rtc_record[3][3] = {0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24};//二维数组存放记录的时间void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4://页面流转if(++SegMode == 3) SegMode = 0;//每次进入历史查询页面时,索引值默认为1if(!SegMode) rtc_record_x = 0;break;case 5://历史查询页面子页面控制if(SegMode == 2)if(++rtc_record_x == 3)rtc_record_x = 0;break;case 8://清空记录的数据if(SegMode == 2){//memset:将`rtc_record`指向的内存区域的前`9`个字节设置为`0x24`//在数码管中判断数据为空时比较数据是0x24memset(rtc_record,0x24,9);}break;}
}

五、Led模块

在这里插入图片描述
看到这种指定页面指定指示灯亮的依旧使用互斥点亮

pdata u8 ucLed[8] = {0,0,0,0,0,0,0,0};void LedProc()
{unsigned char i;for(i = 0; i < 3; i++)ucLed[i] = (SegMode == i);ucLed[7] = RecordFlag;LedDisp(ucLed);
}

六、完整代码(各模块退出处理请自行添加)

#include <STC15F2K60S2.H>
#include <string.h>
#include "Init.h"
#include "Key.h"
#include "Seg.h"
#include "Led.h"
#include "iic.h"
#include "ds1302.h"typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long int u32;/*按键*/
idata u8 KeyVal,KeyDown,KeyUp,KeyOld;
/*数码管*/
idata u8 SegPos;
pdata u8 SegBuf[8] = {10,10,10,10,10,10,10,10};
pdata u8 SegPoint[8] = {0,0,0,0,0,0,0,0};
idata bit MainMode;                 //主页面 0-三大页面 1-触发页面
idata u8 SegMode;                   //0-时间页面 1-数据页面 2-历史查询
/*Led*/
pdata u8 ucLed[8] = {0,0,0,0,0,0,0,0};
/*时间变量*/
pdata u8 Rtc[3] = {0x23,0x59,0x50};
/*数据采集*/
idata bit RecordFlag;                //数据触发采集标志位
idata u16 Time_3s;                   //数据触发采集后计时3秒
idata u16 RD1_100x;									 //光敏电阻的电压值放大100倍
idata u16 RD1_100x_old = 1; 				 //光敏电阻的旧值
idata u16 RB2_100x;									 //变压器的电压值放大100倍	
idata u16 RB2_100x_old;              //变压器值的旧值
pdata u8 rtc_record[3][3] = {
{0x24,0x24,0x24},
{0x24,0x24,0x24},
{0x24,0x24,0x24}
};//触发采集时的时间
idata u8 rtc_record_index;
void KeyProc()
{if(MainMode)return;KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:if(++SegMode == 3)SegMode = 0;if(SegMode == 2)rtc_record_index = 0;break;case 5:if(SegMode == 2)if(++rtc_record_index == 3)rtc_record_index = 0;break;case 8:if(SegMode == 2)memset(rtc_record,0x24,9);break;}
}void SegProc()
{u8 i;if(!MainMode){switch(SegMode){case 0:SegBuf[2] = SegBuf[5] = 11;for(i = 0; i < 3; i++){SegBuf[3*i] = Rtc[i] / 16;SegBuf[3*i+1] = Rtc[i] % 16;}break;case 1:SegBuf[0] = 12;SegBuf[1] = RD1_100x / 100;SegBuf[2] = RD1_100x / 10 % 10;SegBuf[3] = RD1_100x % 10;SegBuf[4] = 13;SegBuf[5] = RB2_100x / 100;SegBuf[6] = RB2_100x / 10 % 10;SegBuf[7] = RB2_100x % 10;SegPoint[1] = SegPoint[5] = 1;break;case 2:SegBuf[0] = 14;SegBuf[1] = rtc_record_index + 1;SegPoint[1] = SegPoint[5] = 0;if(rtc_record[rtc_record_index][0] == 0x24){SegBuf[2] = 11;SegBuf[3] = 11;SegBuf[4] = 11;SegBuf[5] = 11;SegBuf[6] = 11;SegBuf[7] = 11;}else{for(i = 0; i < 3; i++){SegBuf[2*i+2] = rtc_record[rtc_record_index][i] / 16;SegBuf[2*i+3] = rtc_record[rtc_record_index][i] % 16;}}break;}}else{SegBuf[0] = SegBuf[1] = 15;//Cfor(i = 0; i < 3; i++){SegBuf[2*i+2] = rtc_record[0][i] / 16;SegBuf[2*i+3] = rtc_record[0][i] % 16;}SegPoint[1] = SegPoint[5] = 0;}
}void LedProc()
{u8 i;if(!RecordFlag)for(i = 0; i < 3; i++)ucLed[i] = (i == SegMode);else{ucLed[0] = 0;ucLed[1] = 0;ucLed[2] = 0;}ucLed[7] = RecordFlag;LedDisp(ucLed);
}void RtcProc()
{GetRtc(Rtc);
}void ADProc()
{u8 i;RD1_100x = Ad(0x03) * 100 / 51.0;RB2_100x = Ad(0x01) * 100 / 51.0;if((RD1_100x < RB2_100x) && (RD1_100x_old >= RB2_100x_old) && !RecordFlag){RecordFlag = 1;MainMode = 1;for(i = 2; i > 0; i--)memcpy(rtc_record[i],rtc_record[i-1],3);GetRtc(rtc_record[0]);}RD1_100x_old = RD1_100x;RB2_100x_old = RB2_100x;
}void Timer0_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;			//定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TL0 = 0x18;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时ET0 = 1;				//使能定时器0中断EA = 1;
}void Timer0_Isr(void) interrupt 1
{if(++SegPos == 8) SegPos = 0;SegDisp(SegPos,SegBuf[SegPos],SegPoint[SegPos]);if(MainMode){if(++Time_3s == 3000){RecordFlag = 0;MainMode = 0;}}elseTime_3s = 0;
}void main()
{SystemInit();SetRtc(Rtc);Timer0_Init();while(1){}
}

相关文章:

第十六届蓝桥杯单片机组4T模拟赛二

难点&#xff1a; PCF8591同时测量两条通道数据 避免重复触发 采集触发时的时间数据存放 未采集的数据显示 清空数据 本题建议了解怎么去触发采集&#xff0c;怎么显示最近三次触发采集的时间即可。由于4T模拟赛的尿性有很多评测点是题目中没有要求的&#xff0c;另外测评的时候…...

《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》

在数字化浪潮汹涌澎湃的当下&#xff0c;人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋&#xff0c;其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目&#xff0c;开启了智能生态的新篇章。 华为MindSpore&#xff1a;AI框架的创新先锋…...

kotlin中的list set map整理

在 Kotlin 中&#xff0c;List、Set 和 Map 是三种核心集合类型&#xff0c;它们分别适用于不同的场景&#xff0c;具有独特的特性和操作方式。以下是它们的详细对比与使用指南&#xff1a; 1. List&#xff08;列表&#xff09; 核心特性 • 有序&#xff1a;元素按插入顺序…...

条款43:学习处理模板化基类内的名称

前提认知&#xff1a;模板类继承模板类&#xff0c;是需要建立在假设的前提下的&#xff0c;如果没有这个”假设“&#xff0c;编译将会失败 1.书上举例 2.完整代码举例 #include <iostream>class MsgInfo { };class BaseCompany { public:BaseCompany(){}~BaseCompan…...

五种方案实现双链路可靠数据传输

本文介绍五种双链路数据传输方案,目标是利用设备的多个传输通道,(如双有线网口,网口+wifi, 网口+5G等场景 , 网口+ 自组网, 自组网 + 5G等),将数据复制后分流、分路同时传输,以期提高数据传输可靠性,满足高可靠性传输的应用场景需求。部分方案给出了实际验证结果 。 …...

提升AI性能的秘密武器:量化、蒸馏与剪枝全面解析

通过高效的模型压缩技术推进 NLP 在快速发展的自然语言处理 (NLP) 领域,模型的大小和复杂性显著增加,从而显著提高了性能。然而,这些庞大模型的部署和维护也带来了挑战,特别是在计算成本、功耗和资源受限用户的可访问性方面。本博客深入探讨了量化、剪枝和蒸馏等尖端模型压…...

React Native 如何使用 Expo 快速开发?

React Native是当下热门的跨平台移动开发框架&#xff0c;而Expo则是它的重要开发工具之一。Expo提供了一套完整的开发环境&#xff0c;使开发者无需安装Android Studio或Xcode也能快速运行React Native项目。它包含了众多内置API&#xff0c;如相机、地理位置、推送通知等&…...

C++Primer 拷贝控制示例

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Qt 读取数据库

在 Qt 中读取数据库文件通常涉及以下步骤。这里以 SQLite 为例&#xff08;Qt 内置支持&#xff09;&#xff0c;其他数据库&#xff08;如 MySQL、PostgreSQL&#xff09;需要对应驱动&#xff1a; 1. 添加 SQL 模块依赖 在项目文件 .pro 中添加&#xff1a; QT sql2. 基本…...

DeepSeek在学术研究方向初期工作提示词分享

目录 论文选题 研读文献 拟定提纲 大家好这里是AIWritePaper官方账号&#xff01;更多内容&#x1f449;AIWritePaper~在如今这个学术圈的“快车道”上&#xff0c;时间就像是一场永不停歇的赛跑&#xff0c;而论文质量则是那颗我们拼命追逐的“金苹果”。最近一款名为DeepS…...

CentOS下安装ElasticSearch(日志分析)

准备目录 搞一个自己喜欢的目录 mkdir /usr/local/app 切换到该目录 cd /usr/local/app 下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz 选择其他版本 点击进入官网...

科技云报到:AI Agent打了个响指,商业齿轮加速转动

科技云报到原创。 3月16日&#xff0c;百度旗下文心大模型4.5和文心大模型X1正式发布。目前&#xff0c;两款模型已在文心一言官网上线&#xff0c;免费向用户开放。 同时&#xff0c;文心大模型4.5已上线百度智能云千帆大模型平台&#xff0c;企业用户和开发者登录即可调用AP…...

布谷直播系统源码开发实战:从架构设计到性能优化

作为山东布谷科技的一名技术研发人员&#xff0c;我参与了多个直播系统平台从0到1的开发和搭建&#xff0c;也见证了直播行业从萌芽到爆发的全过程。今天&#xff0c;我想从研发角度&#xff0c;分享一些直播系统软件开发的经验和心得&#xff0c;希望能对大家有所帮助。 一、 …...

pytorch小记(十):pytorch中torch.tril 和 torch.triu 详解

pytorch小记&#xff08;十&#xff09;&#xff1a;pytorch中torch.tril 和 torch.triu 详解 PyTorch torch.tril 和 torch.triu 详解1. torch.tril&#xff08;计算下三角矩阵&#xff09;&#x1f4cc; 作用&#x1f50d; 语法&#x1f539; 参数&#x1f4cc; 示例&#x1…...

C语言每日一练——day_11

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第十一天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中…...

HCIA-PPP实验

一、LCP链路控制协议 1、链路建立阶段&#xff1a;通过交互LCP报文协商参数&#xff0c;包含了MRU、认证类型、魔术字等。 2、链路维护阶段&#xff1a; 3、链路终止 二、NCP网络控制协议&#xff1a;交互PPP IPCP报文,检测地址、学习路由、下发地址 1、通过IPCP协议的请求消…...

C++学习之云盘项目nginx

1.复习 2.知识点概述 1. 一些基本概念 1.1 Nginx 初步认识 1.2 正向 / 反向代理 1.3 域名和 IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx 的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 课外知识导读 1. URL 和 URI 2. DNS 解析过程 1. 一些基…...

7-字符串

1-ASCII 0-9 对应 48-57 A-Z 对应 65-90 a-z 对应 97-122 2-字符数组 字符变量存储单个字符 字符数组存储多个字符 字符串就是字符数组加上结束符 ’ \0 ’ #include <iostream> using namespace std; int main(){//是字符数组&#xff0c;不是字符串char a1[]{C,,};…...

vue学习八

十七 组件通信方式 1 props 父传子 //父组件 <script setup>//book来源省略import Subview1 from ./Subview1.vue;function updatebook(updatetimes){book.value.updatetimes updatetimes} </script> <template><Subview1 :book"book" :upd…...

Vue 渲染 LaTeX 公式 Markdown 库

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…...

基于大模型的喉癌全程预测与治疗方案优化研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与数据来源 二、大模型在喉癌预测中的应用原理 2.1 大模型概述 2.2 预测喉癌的技术原理 2.3 相关技术对比 三、术前预测与方案制定 3.1 术前风险预测 3.1.1 淋巴结转移预测 3.1.2 其他风险因素预…...

SpringBoot第三站:配置嵌入式服务器使用外置的Servlet容器

目录 1. 配置嵌入式服务器 1.1 如何定制和修改Servlet容器的相关配置 1.server.port8080 2. server.context-path/tx 3. server.tomcat.uri-encodingUTF-8 1.2 注册Servlet三大组件【Servlet&#xff0c;Filter&#xff0c;Listener】 1. servlet 2. filter 3. 监听器…...

通向AGI的未来之路!首篇2D/视频/3D/4D统一生成框架全景综述(港科大中山等)

文章链接&#xff1a; https://arxiv.org/pdf/2503.04641 摘要 理解并复现现实世界是人工通用智能&#xff08;AGI&#xff09;研究中的一个关键挑战。为实现这一目标&#xff0c;许多现有方法&#xff08;例如世界模型&#xff09;旨在捕捉支配物理世界的基本原理&#xff0…...

什么是MCP(Model Context Protocol)?对话、意图识别、服务调用和上下文管理

什么是MCP&#xff1f; MCP&#xff08;Model Context Protocol&#xff09; 是一种专为人工智能模型设计的通信协议&#xff0c;旨在解决复杂 AI 系统中多个模型或组件之间的协同、状态管理和资源优化问题。它尤其适用于大型语言模型&#xff08;LLM&#xff09;、多模态系统及…...

第二十七篇 数据仓库与维度建模指南:从理论到实战的进阶之路

声明&#xff1a;文章内容仅供参考&#xff0c;需仔细甄别。文中技术名称属相关方商标&#xff0c;仅作技术描述&#xff1b;代码示例为交流学习用途&#xff0c;部分参考开源文档&#xff08;Apache 2.0/GPLv3&#xff09;&#xff1b;案例数据已脱敏&#xff0c;技术推荐保持…...

定时任务引起的死锁

定时任务引起的死锁 前言&#xff1a;Java面试题 死锁的场景有哪些&#xff1f;你们是怎么解决的&#xff1f; 锁有哪些特性&#xff1f; 问题现象 1&#xff0c;文件上传报当前功能正在使用&#xff0c;请稍后再试 2&#xff0c;其他账号登录系统&#xff0c;登录不上去&a…...

NewStar CTF web wp

文章目录 week1headach3会赢吗智械危机谢谢皮蛋PangBai 过家家&#xff08;1&#xff09; week3include meblindsql1臭皮的计算机臭皮踩踩背这照片是你吗 week4Pangbai过家家四blindsql2chocolateezcmsssezpollute隐藏的密码 weeek5pangbai过家家(5)redissqlshell臭皮吹泡泡臭皮…...

Docker运行postgreSQL,由于异常启动或者退出后,提示could not locate a valid checkpoint record

pg_resetwal 是 PostgreSQL 的“急救工具”&#xff0c;用于在极端情况下修复因 WAL 或控制文件损坏导致的启动问题。 但需注意&#xff1a; 风险极高&#xff0c;可能导致数据不一致。必须立即转储并恢复&#xff0c;避免直接在修复后的数据库中执行写操作。仅在备份后使用&…...

Leetcode 刷题笔记1 图论part01

图论的基础知识&#xff1a; 图的种类&#xff1a; 有向图&#xff08;边有方向&#xff09; 、 无向图&#xff08;边无方向&#xff09;、加权有向图&#xff08;边有方向和权值&#xff09; 度&#xff1a; 无向图中几条边连接该节点&#xff0c;该节点就有几度&#xff1…...

文件管理系统

前言&#xff1a;之前我们讨论的是被打开文件的管理&#xff0c;那么未被打开的文件是如何管理的呢&#xff1f; 1.认识磁盘设备 1.1磁盘的物理结构 磁盘是由盘片&#xff08;盘面&#xff0c;扇区&#xff0c;磁道&#xff0c;柱面&#xff09;&#xff0c;磁头&#xff0c…...

荣耀手机卸载应用商店、快应用中心等系统自带的

1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…...

结合基于标签置信度的特征选择方法用于部分多标签学习-简介版

假设 部分多标签学习&#xff08;PML&#xff09;假设&#xff1a;假设样本的标签集合中存在伪正标签&#xff0c;即某些标签可能是错误的。目标是从候选标签集中识别出真实标签。特征与标签的关系假设&#xff1a;假设不同的标签对应的特征子空间可能是不同的&#xff0c;而不…...

【小白向】Word|Word怎么给公式标号、调整公式字体和花括号对齐

【小白向】Word&#xff5c;Word怎么给公式标号、调整公式字体和花括号对齐 我的版本&#xff1a;Word 2021 如需快速查看关键步骤&#xff0c;请直接阅读标红部分。 如果遇到无法调整的情况&#xff0c;可以直接下载我的示例文档进行参考&#xff1a;花括号和其他的示例公式.…...

基于香橙派 KunpengPro学习CANN(2)——Ascend Extension for PyTorch 配置与安装

将 PyTorch 网络迁移到昇腾平台并执行训练或推理&#xff0c;直接使用昇腾提供的构图接口构图。Ascend Extension for PyTorch插件用于适配PyTorch框架&#xff0c;可以使用昇腾AI处理器的算力。 1 pip 安装 # 下载PyTorch安装包 wget https://download.pytorch.org/whl/cpu/…...

【备赛】遇到的小问题-1

问题描述-1 想实现的功能是&#xff0c;通过ADC实时测量某引脚的电压及其占空比。 可以通过旋转电位器&#xff0c;更改其电压。 首先我定义了这几个变量 uint32_t adc_value;//HAL库函数里面得出的采样值(实时更新) uint32_t percentage6;//占空比&#xff0c;随着adc_val…...

Browser Use的安装和使用

文章目录 一、介绍二、安装教程1、使用Conda创建虚拟环境2、激活环境3、安装browser use4、安装Playwright5、克隆git仓库6、安装项目的依赖 三、使用教程1、启动WebUI2、案例13、案例2 一、介绍 背景 Browser Use&#xff1a;用AI控制你的浏览器&#xff0c;你可以使用它帮你…...

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下&#xff0c;如何让视频分享更便捷、高效&#xff0c;成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势&#xff0c;为视频分享领域带来了革命性变革。…...

Spring Boot 静态访问配置属性的解决方案

前言 在Spring Boot开发中&#xff0c;静态访问配置信息是一个常见需求&#xff0c;尤其是在工具类、常量类或非Bean类中直接获取配置值。 问题背景 假设我们的应用需要从application.yml中读取配置项app.logotype&#xff0c;并在工具类、静态方法或非Bean类中直接访问该值。…...

NLP高频面试题(四)——BN和LN的区别与联系,为什么attention要用LN

在深度学习模型中&#xff0c;Normalization是一种极为重要的技巧&#xff0c;Batch Normalization&#xff08;BN&#xff09;和Layer Normalization&#xff08;LN&#xff09;是其中最为常用的两种方法。然而&#xff0c;二者在实际应用中有着明显的区别与联系&#xff0c;尤…...

深度学习定义与分类【详细易懂 初学者友好~】

深度学习&#xff08;Deep Learning&#xff09;是机器学习的一个子领域&#xff0c;它基于人工神经网络&#xff08;Artificial Neural Networks&#xff0c;ANN&#xff09;的理论和架构&#xff0c;通过构建多层&#xff08;即“深度”&#xff09;的神经网络结构来学习数据…...

二、小白学JAVA-认识数据类型【变量】

1、实际案例类比 初中以上数学&#xff0c;就知道有有理数、正数、负数、0、小数、大写的数字、语文。 2、数据类型介绍 public class Main {public static void main(String[] args) {// 数据类型byte i_byte 12; // 标识数据范围小&#xff0c;但是节省内存>网络传输…...

UNI-APP uts插件 支持ANDROID 监听手机状态

插件地址 https://ext.dcloud.net.cn/plugin?id22646 模块 import {startPhoneListener,stopPhoneListener,checkIsAutoRecord,toCallAutoRecorderPage,navigateToCallRecordingSettings,jumpToPermissionPage,makePhoneCall,allRecorderFilesAction,registerSmsReceiver,} f…...

AI入门7:python三种API方式调用本地Ollama+DeepSeek

回顾 书接上篇&#xff1a;各种方式搭建了本地知识库&#xff1a; AI入门&#xff1a;AI模型管家婆ollama的安装和使用-CSDN博客 AI入门2&#xff1a;本地AI部署&#xff0c;用ollama部署deepseek&#xff08;私有化部署&#xff09;-CSDN博客 AI入门3&#xff1a;给本地d…...

SQL SERVER日常运维巡检系列—结构设计

前言   做好日常巡检是数据库管理和维护的重要步骤&#xff0c;而且需要对每次巡检日期、结果进行登记&#xff0c;同时可能需要出一份巡检报告。   本系列旨在解决一些常见的困扰&#xff1a; 不知道巡检哪些东西 不知道怎么样便捷体检 机器太多体检麻烦 生成报告…...

前端剪贴板操作:从传统方法到现代方案

一、传统复制实现原理 这个copy函数展示了经典的剪贴板操作方案&#xff1a; function copy(color) {const input document.createElement("input");input.value color;document.body.appendChild(input);input.select();document.execCommand("copy")…...

E1-数组的平衡点2(前缀和)

题目描述 给定一个长度为 n 的数组 nums&#xff0c;若其中存在某个位置 index&#xff0c;使得 [0, index - 1] 范围的元素之积 等于 [index 1, n - 1] 范围的元素之积&#xff0c;则称 index 位置是数组 nums 的平衡点。 请你找出数组 nums 的平衡点位置&#xff0c;若存在…...

【Maven-plugin】有多少官方插件?

之前疏理了容器底层原理&#xff0c;现在回归主题,在阅读 next-public时发现 parent 将从多基础插件集成到 parent 仓库中单独维护&#xff0c;数量众多&#xff0c;故在此将所有插件分类整理。以达观其全貌&#xff0c;心中有数。 以下是 Apache Maven 官方维护的核心插件列表…...

10-BST(二叉树)-建立二叉搜索树,并进行前中后遍历

题目 来源 3540. 二叉搜索树 - AcWing题库 思路 建立二叉搜索树&#xff08;注意传参时用到了引用&#xff0c;可以直接对root进行修改&#xff09;&#xff0c;同时进行递归遍历&#xff1b;遍历可以分前中后三种写&#xff0c;也可以用标志来代替合在一起。其余详见代码。…...

企业培训APP如何迈向AI时代?智能化在线教育系统源码开发解析

2025年&#xff0c;AI驱动的企业培训系统将成为主流&#xff0c;企业可以借助智能化在线教育系统源码构建高效的培训体系&#xff0c;提高员工学习效率&#xff0c;优化培训成本。本文将详细解析AI如何赋能企业培训&#xff0c;并探讨智能化在线教育系统源码的关键技术与开发实…...

CXSMILES介绍

Chemaxon 扩展 SMILES/SMARTS 用于在 SMILES 字符串后存储分子的特殊特征。任何信息都可以存储在 SMILES 字符串后,只要它们由空格或制表符字符分隔,因为 SMILES 解析器会忽略这些信息,或者将它们作为注释使用。扩展特征以以下格式存储: SMILES_String |<feature1>,…...