php wap网站源码/免费企业黄页查询官网

php wap网站源码,免费企业黄页查询官网,网站建设工作领导小组,access做网站服务器前言 第十二届省赛涉及知识点:NE555频率数据读取,NE555频率转换周期,PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少,题目不难,基本上准备充分的都能完整的实现每一个功能,并…

前言
第十二届省赛涉及知识点:NE555频率数据读取,NE555频率转换周期,PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。

本试题涉及模块较少,题目不难,基本上准备充分的都能完整的实现每一个功能,并且板子上都能实现,一个恶心的地方就是通过PCF8591只采集一条通道的电压值是没有问题的,但是同时采集两条通道的时候,会出现问题,在另一篇文章已经给出了解决方法:
PCF8591一次测量多个通道导致数值不准确解决方法

附件:蓝桥杯单片机组第十二届省赛第二批次
在这里插入图片描述

一、阅读题目,了解性能需求

可以得出以下信息:

  • 板子上需要将P34与SIGNAL通过跳线帽短接读取NE555产生的频率。
    NE555部分已经详细地讲过如何实现了,可以点击下方传送门查阅:
    传送门:NE555模块

在这里插入图片描述

  • 数码管显示的频率、周期和电压值都是实际值,题目中说到的采集频率和电压只有在LED灯有用。

二、底层函数搭建

1.初始化

Init.h

#ifndef __Init_H__
#define __Init_H__void Init();#endif

Init.c

#include <STC15F2K60S2.H>
void Init()
{P0 = 0xff;P2 = P2 & 0x1f | 0x80;P2 &= 0x1f;P0 = 0x00;P2 = P2 & 0x1f | 0xa0;P2 &= 0x1f;
}

2.NE555和独立按键

由于NE555是通过P34引脚测量的,所以需要修改独立按键的底层代码。(屏蔽P34)
Key.h

#include <STC15F2K60S2.H>
#ifndef __Key_H__
#define __Key_H__unsigned char KeyDisp();#endif

Key.c

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

定时器部分

void Timer0_Init(void)		//0毫秒@12.000MHz
{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;}
}

2.数码管部分

数码管底层代码引入
Seg.h

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

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, //空
0xbf, //-
0x8e, //F
0xc1, //U
0xc8 //n
};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.Led部分

Led.h

#ifndef __Led_H__
#define __Led_H__void LedDisp(unsigned char *ucLed);#endif

Led.c

#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;}
}

4.PCF8591部分

注:本篇文章中解决多通道读取采用的是连续读取两次电压值,舍弃第一个电压值的方法。
pcf8591.h

#ifndef __pcf8591_H__
#define __pcf8591_H__unsigned char AD_Read(unsigned char add);#endif

pcf8591.c

#include <STC15F2K60S2.H>
#include <intrins.h>/*	#   I2C代码片段说明1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。
*/
#define DELAY_TIME	5
sbit 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_Read(unsigned char add) 
{unsigned char temp;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp = I2CReceiveByte(); I2CSendAck(1);I2CStop();// 再次读取I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return temp;
}

5.main.c

#include <STC15F2K60S2.H>
#include "Init.h"
#include "LED.h"
#include "Key.h"
#include "Seg.h"
#include "pcf8591.h"/* 变量声明区 */
unsigned char Key_Slow; //按键减速变量 10ms 
unsigned char Key_Val, Key_Down, Key_Up, Key_Old; //按键检测四件套
unsigned int Seg_Slow; //数码管减速变量 500ms
unsigned char Seg_Buf[] = {10,10,10,10,10,10,10,10,10,10};//数码管缓存数组
unsigned char Seg_Pos;//数码管缓存数组专用索引
unsigned char Seg_Point[8] = {0,0,0,0,0,0,0,0};//数码管小数点使能数组
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//LED显示数据存放数组
unsigned int Time_1s, f;/* 按键处理函数 */
void Key_Proc()
{if(Key_Slow) return;Key_Slow = 1; //按键减速Key_Val = Key();Key_Down = Key_Val & ~Key_Old;	 Key_Up = ~Key_Val & Key_Old;Key_Old = Key_Val;}/* 信息处理函数 */
void Seg_Proc()
{if(Seg_Slow) return;Seg_Slow = 1; //数码管减速}/* 其他显示函数 */
void Led_Proc()
{}/* 定时器0只用于计数 */
void Timer0_Init(void)		//1毫秒@12.000MHz
{TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x05;TL0 = 0;				//设置定时初始值TH0 = 0;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时
}/* 定时器1用于计时 */
void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定时器时钟12T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0x18;				//设置定时初始值TH1 = 0xFC;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时ET1 = 1;EA = 1;
}/* 定时器1中断服务函数 */
void Timer1_Server() interrupt 3
{/* NE555 */if(++Time_1s == 1000){Time_1s = 0;f = (TH0 << 8) | TL0;TH0 = TL0 = 0;}
}void main()
{Init();Timer0_Init();Timer1_Init();while(1){Key_Proc(); Seg_Proc();Led_Proc();}
}

三、数码管部分

在这里插入图片描述
老样子,定义SegMode变量来控制三个页面,SegMode值为0时为频率显示页面,为1时为周期设置界面,为2时为电压显示界面

在数码管Seg.c底层函数的段码表已经包含F、N、U和-的段码表了

1.频率显示页面

NE555测量频率的上限值是五位数,题目要求七位显示频率数据,要求高位为0熄灭,可以直接默认前两位数码管熄灭,再对后五个数码管进行高位熄灭,高位熄灭的实现逻辑如下:

unsigned char i = 0;
while(SegBuf[i] == 0)//循环条件:SegBuf[i]不为0时退出
{SegBuf[i] = 10;if(++i == 7)break;
}

数码管实现如下:

void SegProc()
{unsigned char i;switch(SegMode){case 0:SegPoint[5] = 0;SegBuf[0] = 12;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;SegBuf[7] = f % 10;i = 3;while(!SegBuf[i]){SegBuf[i] = 10;if(++i == 7)break;}break;}
}

2.周期显示页面

从题目可以得到,显示的周期是频率的倒数,也就是T= 1 f \frac{1}{f} f1,单位为us,而1s = 100 0000us,所以转换周期时要省上10 6 ^6 6。代码实现如下:

case 1:T = 1000000 / f;SegBuf[0] = 14;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;SegBuf[7] = T % 10;i = 1;while(!SegBuf[i]){SegBuf[i] = 10;if(++i == 7)break;}
break;

3.电压显示页面

电压读取

这边给出两种方法
方法一:定义float型变量

idata float RD1_100x, RB2_100x;
idata bit ChannelMode;void ADCProc()
{RD1_100x = AD_Read(0x01) / 51.0; RB2_100x = AD_Read(0x03) / 51.0; 
}void SegProc()
{case 2:SegBuf[0] = 13;SegBuf[1] = 11;SegBuf[2] = !ChannelMode ? 1 : 3;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = !ChannelMode ? RD1_100x % 10 : RB2_100x % 10;SegPoint[5] = 1;SegBuf[6] = !ChannelMode ? RD1_100x * 10 % 10: RB2_100x * 10 % 10;SegBuf[7] = !ChannelMode ? RD1_100x * 100 % 10 : RB2_100x * 100 % 10;break;
}

方法二:定义unsigned int型变量接受读取的电压值放大100倍后的值

idata u16 RD1_100x, RB2_100x;
void ADCProc()
{RD1_100x = AD_Read(0x01) * 100 / 51; RB2_100x = AD_Read(0x03) * 100 / 51; 
}
void SegProc()
{case 2:SegBuf[0] = 13;SegBuf[1] = 11;SegBuf[2] = !ChannelMode ? 1 : 3;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = !ChannelMode ? RD1_100x / 100 : RB2_100x / 100;SegPoint[5] = 1;SegBuf[6] = !ChannelMode ? RD1_100x / 10 % 10 : RB2_100x / 10 % 10;SegBuf[7] = !ChannelMode ? RD1_100x % 10 : RB2_100x % 10;break;
}

4.数码管完整代码:

void SegProc()
{unsigned char i;if(Seg_Slow) return;Seg_Slow = 1; //数码管减速switch(SegMode){case 0:SegPoint[5] = 0;SegBuf[0] = 12;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;SegBuf[7] = f % 10;i = 3;while(!SegBuf[i]){SegBuf[i] = 10;if(++i == 7)break;}break;case 1:T = 1000000 / f;SegBuf[0] = 14;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;SegBuf[7] = T % 10;i = 1;while(!SegBuf[i]){SegBuf[i] = 10;if(++i == 7)break;}break;case 2:SegBuf[0] = 13;SegBuf[1] = 11;SegBuf[2] = !ChannelMode ? 1 : 3;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = !ChannelMode ? RD1_100x / 100 : RB2_100x / 100;SegPoint[5] = 1;SegBuf[6] = !ChannelMode ? RD1_100x / 10 % 10 : RB2_100x / 10 % 10;SegBuf[7] = !ChannelMode ? RD1_100x % 10 : RB2_100x % 10;break;}
}

四、按键部分

在这里插入图片描述
S4和S5的实现很简单,直接给出代码
S6的功能是任意界面下按下S6后,保存电位器的电压数据到电位器缓存变量中。

idata u16 RD1_100x, RB2_100x;
idata u16 RB2_100x_keep, f_keep;void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;switch(KeyDown){case 4:if(++SegMode == 3){SegMode = 0;ChannelMode = 0;}break;case 5:ChannelMode ^= 1;break;case 6:RB2_100x_keep = RB2_100x;break;}
}

S7的功能是短按保存频率,长按打开/关闭Led
这个也是很常考的点了,也很简单
先定义一个Time_1000ms的unsigned int型变量放入定时器1中定时,当超过1000ms时置为1000(防止长按太久数据溢出),然后在设置一个按下S7的变量idata bit型变量CountFlag,当S7按下,CountFlag置1,定时器开始计时,松开S7,CountFlag置为0,计数值清零

注意:NE555和长按S7都是以定时1s为判断,因此定义变量时不要重复定义!

void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;if(KeyDown == 7)CountFlag = 1;if(KeyUp == 7){CountFlag = 0;if(Time_1000ms >= 1001){LedFlag = !LedFlag;}elsef_keep = f;}
}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;}if(CountFlag){if(++Time_1000ms >= 1001)Time_1000ms = 1001;}elseTime_1000ms = 0;
}

按键完整代码

void KeyProc()
{KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;if(KeyDown == 7)CountFlag = 1;if(KeyUp == 7){CountFlag = 0;if(Time_1000ms >= 1001){LedFlag = !LedFlag;}elsef_keep = f;}switch(KeyDown){case 4:if(++SegMode == 3){SegMode = 0;ChannelMode = 0;}break;case 5:ChannelMode ^= 1;break;case 6:RB2_100x_keep = RB2_100x;break;}
}

五、Led部分

在这里插入图片描述
Led的实现完全没有难度
直接给出代码

void LedProc()
{if(LedFlag == 0){ucLed[0] = (RB2_100x > RB2_100x_keep);ucLed[1] = (f > f_keep);ucLed[2] = (SegMode == 0);ucLed[3] = (SegMode == 1);ucLed[4] = (SegMode == 2);}else{ucLed[0] = 0;ucLed[1] = 0;ucLed[2] = 0;ucLed[3] = 0;ucLed[4] = 0;}LedDisp(ucLed);
}

六、完整代码

#include <STC15F2K60S2.H>
#include "Init.h"
#include "LED.h"
#include "Key.h"
#include "Seg.h"
#include "pcf8591.h"/* 变量声明区 */
typedef unsigned char u8;
typedef unsigned int u16;idata u8 KeyVal, KeyDown, KeyUp, KeyOld;
idata u8 SegPos;
idata u8 SegMode;idata u16 f, Time_1s;
idata u16 T;
idata u16 RD1_100x, RB2_100x;
idata u16 RB2_100x_keep, f_keep;
idata u16 Time_1000ms;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 bit ChannelMode;
idata bit CountFlag;
idata bit LedFlag;/* 按键处理函数 */
void Key_Proc()
{if(Key_Slow) return;Key_Slow = 1; //按键减速KeyVal = KeyDisp();KeyDown = KeyVal & ~KeyOld;KeyUp = ~KeyVal & KeyOld;KeyOld = KeyVal;if(KeyDown == 7)CountFlag = 1;if(KeyUp == 7){CountFlag = 0;if(Time_1000ms >= 1001){LedFlag = !LedFlag;}elsef_keep = f;}switch(KeyDown){case 4:if(++SegMode == 3){SegMode = 0;ChannelMode = 0;}break;case 5:ChannelMode ^= 1;break;case 6:RB2_100x_keep = RB2_100x;break;}
}/* 信息处理函数 */
void Seg_Proc()
{unsigned char i;if(Seg_Slow) return;Seg_Slow = 1; //数码管减速switch(SegMode){case 0:SegPoint[5] = 0;SegBuf[0] = 12;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;SegBuf[7] = f % 10;i = 3;while(!SegBuf[i]){SegBuf[i] = 10;if(++i == 7)break;}break;case 1:T = 1000000 / f;SegBuf[0] = 14;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;SegBuf[7] = T % 10;i = 1;while(!SegBuf[i]){SegBuf[i] = 10;if(++i == 7)break;}break;case 2:SegBuf[0] = 13;SegBuf[1] = 11;SegBuf[2] = !ChannelMode ? 1 : 3;SegBuf[3] = 10;SegBuf[4] = 10;SegBuf[5] = !ChannelMode ? RD1_100x / 100 : RB2_100x / 100;SegPoint[5] = 1;SegBuf[6] = !ChannelMode ? RD1_100x / 10 % 10 : RB2_100x / 10 % 10;SegBuf[7] = !ChannelMode ? RD1_100x % 10 : RB2_100x % 10;break;}
}/* 其他显示函数 */
void Led_Proc()
{if(LedFlag == 0){ucLed[0] = (RB2_100x > RB2_100x_keep);ucLed[1] = (f > f_keep);ucLed[2] = (SegMode == 0);ucLed[3] = (SegMode == 1);ucLed[4] = (SegMode == 2);}else{ucLed[0] = 0;ucLed[1] = 0;ucLed[2] = 0;ucLed[3] = 0;ucLed[4] = 0;}LedDisp(ucLed);
}/* 定时器0只用于计数 */
void Timer0_Init(void)		//1毫秒@12.000MHz
{TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x05;TL0 = 0;				//设置定时初始值TH0 = 0;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时
}/* 定时器1用于计时 */
void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定时器时钟12T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0x18;				//设置定时初始值TH1 = 0xFC;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时ET1 = 1;EA = 1;
}/* 定时器1中断服务函数 */
void Timer1_Server() interrupt 3
{/* NE555 */if(++Time_1s == 1000){Time_1s = 0;f = (TH0 << 8) | TL0;TH0 = TL0 = 0;}if(CountFlag){if(++Time_1000ms >= 1001)Time_1000ms = 1001;}elseTime_1000ms = 0;
}void main()
{Init();Timer0_Init();Timer1_Init();while(1){Key_Proc(); Seg_Proc();Led_Proc();}
}

本篇文章中的代码已经通过4T测试
在这里插入图片描述

其余模块代码请自行添加到工程中即可运行,本篇文章仅提供一种实现思路,如有模块代码无法实现或者与题目要求相违,请移步评论区指出或私信我,看到会及时回复。
每周会更新两篇模拟赛、省赛或国赛的文章,敬请期待。

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

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

相关文章

opencv:距离变换 cv2.distanceTransform

函数 cv2.distanceTransform() 用于计算图像中每一个非零点像素与其最近的零点像素之间的距离&#xff08;Distance Transform&#xff0c; DT算法&#xff09;,输出的是保存每一个非零点与最近零点的距离信息&#xff1b;图像上越亮的点&#xff0c;代表了离零点的距离越远。 …

基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

数字IC后端培训教程| 芯片后端实战项目中base layer drc violation解析

今天分享一个咱们社区IC后端训练营学员遇到的一个经典DRC案例。这个DRC Violation的名字为PP.S.9(这里的PP就是Plus P)。这一层是属于管子的base layer。更多关于base layer的介绍&#xff0c;可以查看下面这份教程。 https://alidocs.dingtalk.com/api/doc/transit?spaceId5…

2025年校园网络招聘会汇总

1、卫生健康行业2025届毕业生春季校园网络招聘会 企业数量职位数量岗位数量10020002000 访问地址&#xff1a; https://www.weirenjob.com/zph/zph_wsjkxy2025jbyscjxywlzph/ 2、山东地区面向2025届高校毕业生网络招聘活动 企业数量职位数量岗位数量909271052434 访问地址&a…

Windows 10 GPU STACK 0.5.1 安装

Windows 10 GPU STACK 0.5.1 安装 1 GPUStack 安装1.Python安装&#xff08;3.10/11/12&#xff09;2.GPUStack 下载3.生成密码4.访问5.设置模型下载目录6.禁用开机自启并重启服务7.安装模型8.查看安装的进度 2.试验场聊天测试1.对话模式 3.API Key 测试 1 GPUStack 安装 1.Py…

中国工业互联网研究院:人工智能大模型年度发展趋势报告

当前&#xff0c;以大模型为代表的人工智能正快速演进&#xff0c;激发全球科技之变、产业之变、时代之变&#xff0c;人工智能发展迎来新高潮。随着大模型推理、多模态生成、智能体等创新技术的发展&#xff0c;大模型赋能千行百业将进一步提速。中国工业互联网研究院全方位剖…

【cv】vs2022配置opencv

release下配置包含目录和库目录 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含链接器输入的依附依赖项 opencv_world490.lib release编译文件夹下需手动复制opencv_world49…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

内外网隔离文件传输解决方案|系统与钉钉集成+等保合规,安全提升70%

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 1. **安全性风险**&#xff1a;内外网直连可能导致病毒传播、数据泄露。 2. **操作繁琐**&#xff1a;传统方式需频繁切…

多线程篇学习面试

多线程 1.乐观锁、CAS思想 java乐观锁机制&#xff1a; ​ 乐观锁体现的是悲观锁的反面。它是一种积极的思想&#xff0c;它总是认为数据是不会被修改的&#xff0c;所以是不会对数据上锁的。但是乐观锁在更新的时候会去判断数据是否被更新过。乐观锁的实现方案一般有两种&a…

将产品照片(form.productPhotos)转为 JSON 字符串发送给后端

文章目录 1. 前端 form.productPhotos 的当前处理a. 组件绑定b. 当前发送逻辑 2. 如何将 form.productPhotos 转为 JSON 字符串发送给后端a. 修改前端 save() 方法b. 确保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代码&#xff0c;我将分析如何将产品照片&a…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候&#xff0c;用户会使用多个编辑器打开同一个文件&#xff0c;如果在A编辑器修改保存&#xff0c;但是B编辑器没有重新打开&#xff0c;直接在B编辑器修改再保存&#xff0c;则可能造成在A编辑器中修改的内容丢失&#xff0c;因此&#x…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

机器学习---KNN算法核心原理和思路分析

文章目录 1.算法介绍2.过拟合和欠拟合3.几种不同的距离4.特征的归一化处理 特此声明&#xff1a;该内容是学习耿直哥的相关机器学习理论&#xff0c;也是文章里面的部分图片素材的来源 1.算法介绍 KNN全称叫做K Nearset Neighbor,翻译之后就是K个最近的邻居&#xff1b; 其实…

书生大模型实战营14-MindSearch深度解析实践

文章目录 L2——进阶岛MindSearch深度解析实践1 MindSearch 简介2 开发环境配置2.1. 打开codespace主页&#xff0c;选择Blank模板进行创建2.2. 创建conda环境隔离并安装依赖 3. 获取硅基流动API KEY4. 启动MindSearch4.1. 启动后端4.2. 启动前端 5. 部署到自己的 HuggingFace …

uniapp实现app的pdf预览

实现效果 文件准备 static下添加该pdf文件&#xff08;下载地址&#xff1a;https://gitee.com/shallow-winds/resource_package/tree/master/%E6%96%B9%E6%B3%95%E4%B8%80/html&#xff09; 使用web-view进行展示&#xff1a; 在这里插入代码片 <web-view :src"u…

STM32-温湿度上传OneNET项目

一、项目需求 使用 ESP8266 连接 OneNET 云平台&#xff0c;并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11&#xff08;原理驱动&#xff09; | 良许嵌入式 3.1 正常工作验证 #​ 上电后&#xff…