指纹考勤系统
目录
1.课题研究目的和内容
1.1 课题研究目的
1.2 课题研究内容
2.系统总体方案设计及功能模块介绍
2.1总体方案设计
2.2 ATK-301模块介绍
2.3 TFTLCD显示功能模块介绍
2.4 蜂鸣器报警功能模块介绍
2.5 时钟模块介绍
3.系统硬件设计与实现
3.1 系统硬件电路图
3.2 STM32F103ZET6
3.3 ATK-301指纹识别模块
3.4 TFTLCD显示模块设计与实现
3.5蜂鸣器报警模块设计与实现
3.6时钟模块设计与实现
4.系统软件设计与实现
4.1主程序设计与实现
4.2 指纹识别模块子程序
4.3 TFTLCD显示子程序
4.4 蜂鸣器报警子程序
5.系统测试
5.1系统软件测试
5.2系统硬件测试
6.总结与展望
1.课题研究目的和内容
1.1 课题研究目的
指纹识别作为识别技术有着悠久的历史,这种技术通过分析指纹的全局特征和局部特征,从指纹中抽取的特征值可以非常的详尽以便可靠地通过指纹来确认一个人的身份。随着时代飞速发展,指纹识别也越来越普及,此实验就是运用ATK-LB301指纹识别模块进行录指纹、删除指纹、设置波特率及对比等级,以及对电阻屏(led屏)字库函数运用等功能。该系统成本低,拓展性强,能够适用于各类场景。
1.2 课题研究内容
学习各种传感器及设备的一般技术和特殊技术的学习,总体方案的选型设计,STM32单片机及外围设备的软硬件系统的技术开发,还有系统的调试和总体运行原理,软件以流程图的方式表示。LCD显示模块与语音模块相互配合,显示考勤信息。
1,删指纹——与模块握手通过之后,屏幕将虚拟一个键盘,按‘删指纹’进入删除界面。在此界面可以按照提示输出一个数值按‘Enter’删除单个指纹,也可按‘清空指纹’清空指纹库。如果是误操作也可以按‘返回’主界面。
2,录指纹——按‘录指纹’进入此项。录指纹流程:按第一次手指-->按第二次手指-->自动生成模板-->输入存储ID-->存储指纹成功。其中两次按指纹操作,如果超过10次无手指按下则退回主界面。模块感应到手指按下0.3S(最少停留0.3S)后,蜂鸣器会“滴”一声!
3,刷指纹--与模块握手成功之后,主函数中不断查询验证指纹,有自动验证指纹和分布验证方式,可以 改变USE_AUTO_IDETIFY宏定义值来选择。验证通过模块亮绿色灯,不通过亮红色灯。
2.系统总体方案设计及功能模块介绍
2.1总体方案设计
在本设计中首先使用杜邦线将模块连接到开发板,触摸校准界面,随后进入指纹测试主界面,按下录指纹,系统会提示按指纹,后续一共需要录入四次再按一次指纹 ,录入第四次指纹成功之后系统会提 示。 当第四次指纹也录入成功, 系统就会生成指纹模板, 接着就会提示 “ 请输 入存储 I D , 按 Enter 保存 ” 。 最后显示录入指纹成功。
录入指纹和验证指纹流程图

2.2 ATK-301模块介绍
ATK-301 电容 指纹识别模块 简介 ATK-301 电容 指纹识别模块(以下简称 LB301 模块)是 ALIENTEK 推出的一款高性 能的电容半导体指纹识别模块。 LB301 采用了瑞典 FPC 公司按压式电容指纹传感器,该传 感器具有功耗低、稳定、图像一致性效果好、耐静电等级高的特点
2.3 TFTLCD显示功能模块介绍
本次设计使用的4.3寸TFTLCD。分辨率为800*480,16 位真彩显示,自带触摸屏,可以用来作为控制输入。LCD 接口连接在 STM32F103ZET6 的 FSMC 总线上面,可以显著提高 LCD 的刷屏速度。
2.4 蜂鸣器报警功能模块介绍
本设计采用电磁式有源蜂鸣器,电磁式有源蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,是电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
2.5 时钟模块介绍
本设计中使用的实时时钟作为本系统中重要部分,必须在保证系统断电时能够正常工作,同时具备一定的时间准确性。DS1302是一款微小电流充电时钟芯片,内含有一个实时时钟/日历和31字节静态 RA M ,通过 SPl 接口与单片机进行连接[3]。芯片内置时间日历存储器,用于保存时间信息,包括年、月、日等基础信息。在供电模式选择使用双电源供电。当主电源比备用电源高0.2V时,主电源供电;否则,备用电源供电。选择3V纽扣电池作为备用电源。
3.系统硬件设计与实现
3.1 系统硬件实物图

图3-1-1 系统硬件实物图
3.2 STM32F103ZET6
STM32系列产品基于ARM Cortex-M0,M0+,M3,M4和M7内核,具有高性能、低成本、低功耗等特点,适用于各种嵌入式应用开发。
本次设计采用STM32F103ZET6开发板,共有54个可供用户使用的引脚,以及一个34引脚的LCD屏幕插槽。属于中低端的32位ARM微控制器,基于高性能内核Cortex-M3,频率约为1.25DMips/MHz。拥有1μs的双12位ADC,4M/s的UART,18MHz的I/O翻转速度,18M/s的SPI。同时保持低功耗的特点。该芯片集成了UART,USB,定时器,ADC,CAN,I2C,SPI等多项功能。是一款非常常用的微型控制器。STM32系列产品成本比51单片机要高出不少,但其性能及可供使用引脚也较之提高不少,相信随着成本的不断降低,市场上将会有更多基于STM32的诸如医疗用品、电力电子系统应用、编程控制器、电机驱动、警报系统等产品。原理图如下图所示。

图3-2-1 STM32F103ZET6原理图
3.3 ATK-301指纹识别模块
ATK-301 电容指纹识别模块(以下简称 LB301 模块)是 ALIENTEK 推出的一款高性 能的电容半导体指纹识别模块。 LB301 采用了瑞典 FPC 公司按压式电容指纹传感器,该传 感器具有功耗低、稳定、图像一致性效果好、耐静电等级高的特点。模块搭配 GigaDevice (兆易创新)生产的指纹控制专用芯片,针对指纹传感器做出了大量的图像优化、速度优化、 算法优化, 使模块具有识别速度快,通过率高的等特点。相对传统光学指纹模块,本模块具 有识别速度更快、体积更小、功耗更低等特点。 模块配备了串口通讯接口,用户无需研究复杂的图像处理及指纹识别算法, 只需通过简 单的串口通讯按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门 禁系统、指纹锁等场合。

图3-3-1 ATK301模块原理图
3.4 TFTLCD显示模块设计与实现
TFTLCD引脚如图,图中的CS:TFTLCD片选信号,WR:向TFTLCD 写入数据,RD:从TFTLCD读取数据、D[15:0]:16位双向数据线,RST:硬复位TFT LCD,RS:命令/数据标志(0,读写命令;1,读写数据)。

图3-4-1 TFTLCD引脚图
3.5蜂鸣器报警模块设计与实现
蜂鸣器与STM32连接原理图如图,图中Q1是用来扩流,R38则是一个下拉电阻,避免MCU复位的时候,蜂鸣器可能发声的。BEEP信号直接连接在MCU的PB8上面,PB8可以做PWM 输出。蜂鸣器的驱动信号连接在 STM32 的 PB8 上。
在系统检测到实际距离小于安全距离时,会输出一个低电平,使蜂鸣器报警。本次设计中蜂鸣器在硬件上是直接连接好了的,不需要经过任何设置,直接编写代码就可以了。

图3-5-1蜂鸣器与STM32连接原理图
3.6时钟模块设计与实现
时钟不是日常显示时间的时钟,是指数字系统里的时钟电路。
几乎所有的数字系统在处理信号都是按节拍一步一步地进行的,系统各部分也是按节拍做的,要使电路的各部分统一节拍就需要一个“时钟信号”,产生这个时钟信号的电路就是时钟电路。
时钟电路的核心是个比较稳定的振荡器(一般都用晶体振荡器),振荡器产生的是正弦波,频率不一定是电路工作的时钟频率,所以要把这正弦波进行分频,处理,形成时钟脉冲,然后分配到需要的地方。让系统里各部分工作时使用。
任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。时钟电路一般由晶体振荡器、晶震控制芯片和电容组成。

图3-6-1时钟模块原理图
4.系统软件设计与实现
4.1主程序设计与实现
当系统接入电源并打开开发板开关后,主程序将会自动完成系统的初始化工作,主要包括头文件及一些变量定义的初始化。随后启动TFTLCD显示模块和指纹识别模块。首先录入指纹,正确录入后,蜂鸣器会“滴”一声!将自动生成模板和数据ID交给STM32进行处理,将处理好的数据发送给TFTLCD进行显示,将已存储的指纹与正在识别的指纹进行比对,通过模块亮绿色灯,不通过亮红色灯。系统主程序流程图如图4-1-1所示。

图4-1-1 主程序流程图
int main(void)
{ u8 ensure;u8 key_num;char *str; u16 count = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); uart_init(115200); usart2_init(usart2_baund);BEEP_Init(); KEY_Init(); LCD_Init(); W25QXX_Init(); tp_dev.init(); usmart_dev.init(72); my_mem_init(SRAMIN); exfuns_init(); f_mount(fs[1],"1:",1); POINT_COLOR=RED;while(font_init()) { LCD_ShowString(60,50,240,16,16,"Font Error!");delay_ms(200); LCD_Fill(60,50,240,66,WHITE);delay_ms(200); }if(!(tp_dev.touchtype&0x80)) {Show_Str_Mid(0,30,”是否进行触摸屏校准”,16,240);POINT_COLOR=BLUE;Show_Str_Mid(0,60,”是:KEY2 否:KEY0“,16,240); while(1){key_num=KEY_Scan(0);if(key_num==KEY0_PRES)break;if(key_num==KEY2_PRES){LCD_Clear(WHITE);TP_Adjust(); TP_Save_Adjdata();break; }}}
4.2 指纹识别模块子程序
首先对超声波传感器的IO端口进行配置,配置PE4为输出模式,让该引脚实现输出高低电平功能,用于触发超声波的传播。配置PE2为输入模式,让该引脚实现识别高低电平功能,用于检测超声波信号的传输时间。将中断模式设置为定时器中断,使用的是定时器为定时器3。根据超声波传感器时序图3-2-1-2可得,触发超声波信号与检测回响信号之间有一定的时间间隔,为避免发射的超声波信号对接受的回响信号产生影响,因此将测量周期设置为100ms。超声波测距模块流程图如图4-2-1所示。

图4-2-1超声波测距模块子程序流程图
LCD_Clear(WHITE);POINT_COLOR=RED;Show_Str_Mid(0,0,”指纹考勤系统”,16,240); Show_Str_Mid(0,20,”又是元气满满的一天”,16,240); POINT_COLOR=BLUE;Show_Str_Mid(0,40,"信号接收中...",16,240); while(PS_GetImage() == 0xff){delay_ms(400);LCD_Fill(0,40,240,80,WHITE);Show_Str_Mid(0,40,"掉线了!!!",16,240);delay_ms(800);LCD_Fill(0,40,240,80,WHITE);Show_Str_Mid(0,40,"勿扰,信号接收中",16,240); }LCD_Fill(30,40,240,100,WHITE);Show_Str_Mid(0,40,"加载完成,可以签到了!!!",16,240);str=mymalloc(SRAMIN,30);sprintf(str,"波特率 :%d 地址:%x",usart2_baund,LB301Addr);Show_Str(0,60,240,16,(u8*)str,16,0);ensure=PS_ValidTempleteNum(&ValidN); if(ensure!=0x00)ShowErrMessage(ensure);ensure=PS_ReadSysPara(&LB301Para); if(ensure==0x00){mymemset(str,0,50);sprintf(str,”:%d :%d”,LB301Para.PS_max-ValidN,LB301Para.PS_level);Show_Str(0,80,240,16,(u8*)str,16,0);}elseShowErrMessage(ensure); myfree(SRAMIN,str);LB301_load_keyboard(0,170,(u8**)kbd_menu);while(1){key_num=LB301_get_keynum(0,170); if(key_num){if(key_num==1)Del_FR(); if(key_num==3)Add_FR(); }if(++count > 10) {count = 0;press_FR(); }delay_ms(1); }
}
4.3 TFTLCD显示子程序
本设计显示模块为TFT屏幕,主要用于显示摄像头拍摄画面及超声波传感器测距距离。为保证TFT液晶屏幕正常工作,我们需要对TFT屏幕进行初始化。
由于从ILI9341中读取的数据格式为GBR而我们写入的格式为RGB,因此需要进行数据格式转换,转换的方法为将数据向左位移8位,使得格式可以对其。
本次设计需要显示摄像头拍摄图像,扫描方向为从左下角到右上角,若想要显示中英文则为从左上角到右下角,若想要显示BMP图像为右上角到左下角或从右下角到左上角。
由于需要在TFT屏幕上方显示超声波测距结果,因此我们需要在指定区域上显示字符,具体方法为先设置字符显示起始坐标,然后设置需要显示的字符,需要显示的字体大小。摄像头模块在运行时的具体流程为先读取OV7670摄像头数据,并在屏幕中显示,然后读取超声波测距数据,流程图如图4-3-1所示。

图4-3-1 TFTLCD显示子程序流程图
void LB301_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{u16 i;POINT_COLOR=RED;kbd_tbl=kbtbl;LCD_Fill(x,y,x+240,y+150,WHITE);LCD_DrawRectangle(x,y,x+240,y+150); LCD_DrawRectangle(x+80,y,x+160,y+150); LCD_DrawRectangle(x,y+30,x+240,y+60);LCD_DrawRectangle(x,y+90,x+240,y+120);POINT_COLOR=BLUE;for(i=0;i<15;i++){Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);}
}
void LB301_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
{ u16 i=keyx/3,j=keyx%3;if(keyx>16)return;if(sta &&keyx!=1) LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);else if(keyx!=1)LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);if(keyx!=1)¯Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);
}
u8 LB301_get_keynum(u16 x,u16 y)
{u16 i,j;static u8 key_x=0;u8 key=0;tp_dev.scan(0); if(tp_dev.sta&TP_PRES_DOWN){ for(i=0;i<5;i++){for(j=0;j<3;j++){if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*30+30)&&tp_dev.y[0]>(y+i*30)){ key=i*3+j+1; break; }}if(key){ if(key_x==key)key=0;else {LB301_key_staset(x,y,key_x-1,0);key_x=key;LB301_key_staset(x,y,key_x-1,1);}break;}} }else if(key_x) {LB301_key_staset(x,y,key_x-1,0);key_x=0;} return key;
}
u16 GET_NUM(void)
{u8 key_num=0;u16 num=0;while(1){key_num=LB301_get_keynum(0,170); if(key_num){if(key_num==1)return 0xFFFF;if(key_num==3)return 0xFF00;if(key_num>3&&key_num<13&&num<99)num =num*10+key_num-3; if(key_num==13)num =num/10; if(key_num==14&&num<99)num =num*10;if(key_num==15)return num; }LCD_ShowNum(80+15,170+7,num,6,16);}
}
void ShowErrMessage(u8 ensure)
{LCD_Fill(0,120,lcddev.width,160,WHITE);Show_Str_Mid(0,120,(u8*)EnsureMessage(ensure),16,240);
}
4.4 蜂鸣器报警子程序
蜂鸣器报警,当存储指纹成功时,蜂鸣器将会发出声音警报,其中两次按指纹操作,如果超过10次无手指按下则蜂鸣器关闭,退回主界面。
主要代码如下所示:
void press_FR(void)
{SearchResult seach;u8 ensure;char *str;
#if (USE_AUTO_IDETIFY == 1) ensure=PS_AutoIdentify(&seach);if(ensure==0x00){BEEP=1;LCD_Fill(0,100,lcddev.width,160,WHITE);Show_Str_Mid(0,100,"签到成功",16,240);str=mymalloc(SRAMIN,2000);sprintf(str,"确有此人%d",seach.pageID,seach.mathscore);Show_Str_Mid(0,140,(u8*)str,16,240);myfree(SRAMIN,str);delay_ms(500);BEEP=0;//关闭蜂鸣器LCD_Fill(0,100,lcddev.width,160,WHITE);}else if(ensure != 0xff){BEEP=1;//打开蜂鸣器ShowErrMessage(ensure);delay_ms(500);BEEP=0;//关闭蜂鸣器LCD_Fill(0,100,lcddev.width,160,WHITE);}
#else ensure=PS_GetImage();if(ensure==0x00){ BEEP=1; delay_ms(100);ensure=PS_GenChar(CharBuffer1);if(ensure==0x00) { BEEP=0; ensure=PS_Search(CharBuffer1,0,299,&seach);if(ensure==0x00){ LCD_Fill(0,100,lcddev.width,160,WHITE);Show_Str_Mid(0,100,"删除指纹",16,240); str=mymalloc(SRAMIN,2000);sprintf(str,":%d",seach.pageID,seach.mathscore);Show_Str_Mid(0,140,(u8*)str,16,240);myfree(SRAMIN,str);}else ShowErrMessage(ensure); }elseShowErrMessage(ensure);delay_ms(500);BEEP=0;LCD_Fill(0,100,lcddev.width,160,WHITE);}
#endif
}
5.系统测试
5.1系统软件测试
倒车雷达系统是利用C语言程序,使用Keil作为开发工具。使用Keil软件完成该系统的软件设计,通过新建源文件、建立工程文件、编译和连接,最后生成所需单片机烧录的HEX文件。
本次设计主要用到Keil uvision4进行程序代码编写、编译、调试并生成.HEX文件,通过USB接口将所生成的.HEX文件烧写到开发板上进行测试。主函数调试运行成功并生成 .hex文件如图5-1-1所示。

图5-1-1 主函数运行结果图
5.2系统硬件测试
本次设计中选择STM32F1战舰V3开发板作为本次设计的硬件测试。
代码编译运行通过后,开始对设计进行测试。在STM32F1战舰V3开发板中将所有电路、电子元件准确连接。
实物各种元器件的参考值及数量如表5-2-1所示。
| 元件 | 数量 |
| STM32FI战舰V3开发板 | 1个 |
| 4.3寸FTFLCD显示器 | 1个 |
| ATK-LB301指纹识别模块 | 1个 |
| 导线 | 6根 |
表5-2-1 元器件清单
将各个元器件连接到开发板以后,给开发板供电,开始硬件测试,实物设计正常执行,并得到预期结果。如图5-2-1所示。

图5-2-1 实物图
6.总结与展望
这次的课程设计,用时两个星期,这两个星期不敢说自己有多大的进步,获得了多少知识,但起码是了解了stm32与传感器连接的部分过程。通过这次课程设计发现这其中需要的很多知识我们没有接触过,去图书馆查资料的时候发现我们前边所学到的仅仅是皮毛,还有很多需要我们掌握的东西我们根本不知道。同时也发现有很多已经学过的东西我们没有理解到位,不能灵活运用于实际,不能很好的用来解决问题,这就需要我们不断的大量的实践,通过不断的自学,不断地发现问题,思考问题,进而解决问题。在这个过程中我们将深刻理解所学知识,同时也可以学到不少很实用的东西。
从各种文档的阅读到开始的挑选题目、硬件结构设计、软件结构设计、程序烧写。亲身体验了一回系统的设计开发过程。很多东西书上写的很清楚,貌似看着也很简单,思路非常清晰。但真正需要自己想办法去设计一个的时候才发现其中的难度。经常做到后面突然就发现自己一开始的设计有问题,然后又回去翻工,在各种反复中不断完善自己的想法。
这次课程设计有个比较大的遗憾就是还没有实现云平台的一个上传,但在下学期有学习到云平台,目前已经初步掌握云平台的上传,但代码编写还存在问题,相信在下个学期的学习中可以将课设进行一个延申,实现数据上传云端。
相关文章:
指纹考勤系统
目录 1.课题研究目的和内容 1.1 课题研究目的 1.2 课题研究内容 2.系统总体方案设计及功能模块介绍 2.1总体方案设计 2.2 ATK-301模块介绍 2.3 TFTLCD显示功能模块介绍 2.4 蜂鸣器报警功能模块介绍 2.5 时钟模块介绍 3.系统硬件设计与实现 3.1 系统硬件电…...
怎么找抖音视频素材?下载抖音的素材视频网站分享给你
在这个视觉印象至关重要的时代,选用高质量的视频素材对于制作抖音视频来说是关键。如果你正在寻找适合的视频素材来丰富你的抖音创作,以下这份详细的视频素材网站指南将帮助你迈出第一步。 蛙学府网 蛙学府网提供了丰富多样的视频素材,包括动…...
【pytorch】大模型训练张量并行
Large Scale Transformer model training with Tensor Parallel (TP) 张量并行如何工作 原始 Tensor Parallel (TP) 模型并行技术于Megatron-LM论文中被提出,是一种用于培育大规模Transformer模型的高效模型并行技术。我们在本练习指南中介绍的序列并行 (SP) 实际…...
Flutter 中的 CupertinoSliverNavigationBar 小部件:全面指南
Flutter 中的 CupertinoSliverNavigationBar 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,CupertinoSliverNavigation…...
【数据库系统概论】程序题
“学生管理数据库”包含以下三个表,即学生表Student、课程表Course和选课表SC,结构如下: Student(Sno,Sname,Ssex,Sage,Sdept)Course (Cno,Cname&…...
群体优化算法---蝙蝠优化算法分类Iris数据集
介绍 蝙蝠算法(Bat Algorithm, BA)是一种基于蝙蝠回声定位行为的优化算法。要将蝙蝠算法应用于分类问题,可以通过将蝙蝠算法用于优化分类器的参数,图像分割等 本文示例 我们使用一个经典的分类数据集,如Iris数据集&…...
【C++】类和对象1.0
本鼠浅浅介绍一些C类和对象的知识,希望能得到读者老爷们的垂阅! 目录 1.面向过程和面向对象 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1.类的访问限定符 4.2.封装 5.C中struct和class的区别 6.类域 7.类的实例化 8.类对象模型 8.1.类…...
Linux下gcc编译32位程序报错
gcc使用-m32选项,编译32位程序时,报错:/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory gcc编译32位程序时,报错:/usr/include/stdio.h:27:10: fatal error: bits/li…...
godot.bk
1.搜索godot国内镜像,直接安装,mono是csharp版本 2.直接解压,50m,无需安装,直接运行 3.godot里分为场景,节点 主场景用control场景,下面挂textureact放背景图片,右键实例化子场景把…...
【C++修行之道】类和对象(三)拷贝构造函数
目录 一、 概念 二、特征 正确的拷贝构造函数写法: 拷贝函数的另一种写法 三、若未显式定义,编译器会生成默认的拷贝构造函数。 四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,还需要自己显式实现吗? 深拷…...
校园外卖系统的技术架构与实现方案
随着校园生活的日益现代化,外卖需求在高校学生群体中迅速增长。为了满足这一需求,校园外卖系统应运而生。本文将详细探讨校园外卖系统的技术架构及其实现方案,帮助读者了解这一系统的核心技术与实现路径。 一、系统概述 校园外卖系统主要包…...
AI的制作思维导图
AI(人工智能)的实现通常涉及以下几个步骤: 1.问题定义:首先确定你想要解决的问题是什么,这将决定你需要设计什么样的系统。 2.数据收集:根据你的需求,收集相关的数据集来训练你的AI模型。数据的…...
Amazon云计算AWS(四)
目录 八、其他Amazon云计算服务(一)快速应用部署Elastic Beanstalk和服务模板CloudFormation(二)DNS服务Router 53(三)虚拟私有云VPC(四)简单通知服务和简单邮件服务(五&…...
数据库(21)——数值函数
数值函数 函数功能CEIL(x)向上取整FLOOR(x)向下取整MOD(x,y)返回x/y的余数RAND()返回0~1内的随机数ROUND(x,y) 求参数x的四舍五入的值,保留y位小数 演示 select ceil(66.4); select floor(8.9); select mod(3,10); select rand(); select round…...
【PB案例学习笔记】-15怎样限制应用程序运行次数?
写在前面 这是PB案例学习笔记系列文章的第15篇,该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gite…...
Spring为什么不支持static字段注入
Spring不支持直接依赖注入到静态变量中。在Spring框架中,依赖注入是一个核心概念,它允许开发者将对象间的依赖关系定义转移到容器中,由容器负责管理这些依赖关系。然而,当涉及到静态变量时,情况就变得复杂了。 首先从…...
AI数据分析:用Kimi根据Excel表格数据绘制多条折线图
工作任务:将Excel文件中的学生姓名和他们的语文、数学、英语成绩绘制成三条折线图,以便于比较不同科目的成绩分布情况。 在kimi中输入提示词: 你是一个Python编程专家,要完成一个Python脚本编写的任务,具体步骤如下&a…...
高级 Go 程序设计:使用 net/http/httputil 包构建高效网络服务
高级 Go 程序设计:使用 net/http/httputil 包构建高效网络服务 介绍ReverseProxy 的使用基本概念实现步骤高级配置实际案例 DumpRequest 的使用功能说明代码示例应用场景NewSingleHostReverseProxy 的特性功能概述 详细教程 注意事项使用 NewChunkedWriter 实现高效…...
Android11 AudioTrack 创建过程
Android 系统播放声音,需要创建AudioTrack来和AudioFlinger通信,其创建过程如下 根据传入的声音属性得到output通过得到的output,找到播放线程AudioFlinger在播放线程内,创建Track,和AudioTrack对应。后续通过它们进…...
数学建模 —— 层次分析法(2)
目录 一、层次分析法(AHP) 二、构造比较判断矩阵 2.1 两两比较法 三、单准则下的排序及一致检验 3.1 单准则下的排序 3.2 一致性检验 四、层次总排序 4.1 层次总排序的步骤 4.2 总排序一致性检验 一、层次分析法(AHP) 方…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
