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

基于51单片机和TM1638模块的小游戏《打地鼠》

目录

  • 系列文章目录
  • 前言
  • 一、效果展示
  • 二、原理分析
  • 三、各模块代码
    • 1、TM1638模块
    • 2、定时器0
    • 3、定时器1
  • 四、主函数
  • 总结

系列文章目录


前言

有两个版本,普中开发板版本和最小系统板版本,两个版本差别在于晶振频率不一样,其他的都相同。

本文代码对应的是普中开发板版本。

【单片机】STC89C52RC
【频率】12T@11.0592MHz

效果查看/操作演示:B站搜索“甘腾胜”或“gantengsheng”查看。
源代码下载:B站对应视频的简介有工程文件下载链接。

一、效果展示

在这里插入图片描述

二、原理分析

1、TM1638模块

该模块可以控制8个LED、8个数码管的显示,并且可以检测8个按键,并且与单片机用三根线进行通信,只占用单片机的3个IO口,极大节省了单片机IO口的使用。

该模块内部有数码管自动扫描电路,只需要把显示内容对应的数据写入TM1638芯片的寄存器内,芯片就会自动扫描显示,LED的显示也是写数据到寄存器就行了。TM1638也会自动扫描检测按键,并且把检测结果保存到寄存器内,单片机从寄存器中读出数据后,再将数据进行处理就可以知道哪个按键按下了。

2、短按、长按、松手

跟普通的独立按键、矩阵按键的检测差不多,利用定时器,隔20ms检测一次按键,并跟上一次的检测结果对比,可以判断出是短按、长按还是松手。这样可以实现更加多的功能。例如,本案例中老夫就是通过长按S8开始游戏或者重新开始游戏。

3、地鼠的显示与更换

用LED表示地鼠,按下对应的按键表示打地鼠,打完后再在剩余7个LED中随机选一个作为地鼠。

这是真随机,不是假随机,按键按下的时刻影响随机结果。

4、倒计时和分数的显示

最左边的两个数码管显示倒计时的时间,30s(代码中可修改)。

最右边的三个数码管显示得分,每打一次袋鼠,分数增加一。

5、开始游戏和重新开始游戏

通过长按S8开始游戏或者重新开始游戏。

6、注意事项

定时器中断函数中需要检测按键,即跟TM1638通信,读取TM1638寄存器中的数据,如果定时器中断时主函数中正在和TM1638通信,写数据到TM1638的寄存器的话,则会被打断,时序受到影响,显示不正常。所以主函数中在和TM1638通信时需要暂停检测按键的定时器0,为了使倒计时不受影响,需要用到定时器1,并且要设置定时器1的优先级比定时器0的高。

三、各模块代码

1、TM1638模块

h文件

#ifndef	__TM1638_H__
#define	__TM1638_H__void TM1638_WriteByte(unsigned char	Byte);
unsigned char TM1638_ReadByte(void);
void TM1638_WriteCommand(unsigned char Command);
void TM1638_SendData(unsigned char Address,unsigned char Data);
void TM1638_OneLED(unsigned char Location,unsigned char State);
void TM1638_EightLED(unsigned char Data);
void TM1638_Nixie(unsigned char Location,unsigned char Number);
unsigned char TM1638_Key(void);
void TM1638_Init(void);
unsigned char Key(void);
void Key_Tick(void);#endif

c文件

#include <REGX52.H>/*TM1638模块引脚定义*/
sbit TM1638_DIO=P2^0;
sbit TM1638_CLK=P2^1;
sbit TM1638_STB=P2^2;unsigned char KeyNumber;/*共阴数码管段码表*/
unsigned char code Nixie_SegCode[]={
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,	//0~7
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,	//8~F
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,	//0~7(带小数点)
0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1,	//8~F(带小数点)
0x40,0x00,	//“-”,无显示
};/*** 函    数:TM1638写入一个字节* 参    数:Byte 要写入的字节* 返 回 值:无*/
void TM1638_WriteByte(unsigned char	Byte)
{unsigned char i;for(i=0;i<8;i++){TM1638_CLK=0;TM1638_DIO=Byte&(0x01<<i);TM1638_CLK=1;}
}/*** 函    数:TM1638读取一个字节* 参    数:Byte 要读取的字节* 返 回 值:无*/
unsigned char TM1638_ReadByte(void)
{unsigned char i;unsigned char Byte=0;TM1638_DIO=1;	//设置为输入for(i=0;i<8;i++){TM1638_CLK=0;if(TM1638_DIO){Byte|=(0x01<<i);}TM1638_CLK=1;}return Byte;
}/*** 函    数:TM1638写命令* 参    数:Command 要写入的命令* 返 回 值:无*/
void TM1638_WriteCommand(unsigned char Command)
{TM1638_STB=0;	//STB为低后的第一个字节为命令TM1638_WriteByte(Command);TM1638_STB=1;
}/*** 函    数:TM1638指定地址写入数据* 参    数:Address 写入数据的地址* 参    数:Data 要写入的数据* 返 回 值:无*/
void TM1638_SendData(unsigned char Address,unsigned char Data)
{TM1638_WriteCommand(0x44);TM1638_STB=0;TM1638_WriteByte(0xC0|Address);TM1638_WriteByte(Data);TM1638_STB=1;
}/*** 函    数:TM1638控制一个LED的显示* 参    数:Location 要控制LED状态的位置,范围:1~8,1在左,8在右* 参    数:State 状态,范围:0~1,0为灭,1为亮* 返 回 值:无*/
void TM1638_OneLED(unsigned char Location,unsigned char State)
{if(State){TM1638_SendData(2*(Location-1)+1,1);}else{TM1638_SendData(2*(Location-1)+1,0);}
}/*** 函    数:TM1638控制八个LED的显示* 参    数:Data LED显示对应的数据,高位在左,1为亮,0为灭* 返 回 值:无* 说    明:例如,Data=0xA5(1010 0101)时,八个LED的状态为:亮灭亮灭 灭亮灭亮*/
void TM1638_EightLED(unsigned char Data)
{unsigned char i;for(i=0;i<8;i++){if(Data&(0x80>>i)){TM1638_SendData(2*i+1,1);}else{TM1638_SendData(2*i+1,0);}}
}/*** 函    数:TM1638驱动数码管显示数字* 参    数:Location 要显示的数码管的位置,范围:1~8* 参    数:Number 数码管要显示的数字* 返 回 值:无*/
void TM1638_Nixie(unsigned char Location,unsigned char Number)
{TM1638_WriteCommand(0x44);TM1638_STB=0;TM1638_WriteByte(0xC0|(2*(Location-1)));TM1638_WriteByte(Nixie_SegCode[Number]);TM1638_STB=1;
}/*** 函    数:TM1638读取键码* 参    数:无* 返 回 值:键码值,范围:0~8,无按键按下则返回0*/
unsigned char TM1638_Key(void)
{unsigned char i;unsigned char KeyTemp[4];	//存储读取键扫数据的四个字节unsigned char Temp=0;	//要返回的键码值,要设置初值为零,否则松开后,读取键码值不为零unsigned char KeyValue=0;	//保存四个字节合成为一个字节后的数据,要设置初值为零,否则读取的键码值出错TM1638_STB=0;TM1638_WriteByte(0x42);	//发送读键扫数据的命令for(i=0;i<4;i++){KeyTemp[i]=TM1638_ReadByte();}TM1638_STB=1;for(i=0;i<4;i++){KeyValue|=(KeyTemp[i]<<i);}for(i=0;i<8;i++){if(KeyValue==(0x01<<i))	//判断合成的字节第几位为1(第几位为1就是第几个按键按下){Temp=i+1;break;}}return Temp;
}/*** 函    数:TM1638初始化* 参    数:无* 返 回 值:无*/
void TM1638_Init(void)
{unsigned char i;TM1638_WriteCommand(0x8B);	//亮度设置,8级亮度可调,范围:0x88~0x8FTM1638_WriteCommand(0x40);	//采用地址自动加1TM1638_STB=0;TM1638_WriteByte(0xC0);    //设置起始地址for(i=0;i<16;i++){TM1638_WriteByte(0x00);}	//传送16个字节的数据TM1638_STB=1;
}/*** 函    数:获取独立按键键码* 参    数:无* 返 回 值:按下按键的键码,范围:0~25,0表示无按键按下* 说    明:主程序中获取键码值之后键码值清零,在下一次定时器扫描按键之前再次获取键码值,一定会返回0* 说    明:第八个按键(S8)按下超过0.7s时返回25*/
unsigned char Key(void)
{unsigned char Temp=0;Temp=KeyNumber;KeyNumber=0;return Temp;
}/*** 函    数:在中断中调用* 参    数:无* 返 回 值:无*/
void Key_Tick(void)
{static unsigned char NowState,LastState;static unsigned int KeyCount;LastState=NowState;	//保存上一次的按键状态NowState=0;	//如果没有按键按下,则NowState为0//获取当前按键状态NowState=TM1638_Key();//如果上个时间点按键未按下,这个时间点按键按下,则是按下瞬间if(LastState==0){switch(NowState){case 1:KeyNumber=1;break;case 2:KeyNumber=2;break;case 3:KeyNumber=3;break;case 4:KeyNumber=4;break;case 5:KeyNumber=5;break;case 6:KeyNumber=6;break;case 7:KeyNumber=7;break;case 8:KeyNumber=8;break;default:break;}}//如果上个时间点按键按下,这个时间点按键按下,则是一直按住按键if(LastState && NowState){KeyCount++;if(LastState==1 && NowState==1){KeyNumber= 9;}if(LastState==2 && NowState==2){KeyNumber=10;}if(LastState==3 && NowState==3){KeyNumber=11;}if(LastState==4 && NowState==4){KeyNumber=12;}if(LastState==5 && NowState==5){KeyNumber=13;}if(LastState==6 && NowState==6){KeyNumber=14;}if(LastState==7 && NowState==7){KeyNumber=15;}if(LastState==8 && NowState==8){KeyNumber=16;}//长按按键超过0.7s(定时器中断函数中每隔20ms检测一次按键)if(KeyCount>=35){if(LastState==8 && NowState==8){KeyNumber=25;}}}else{KeyCount=0;}//如果上个时间点按键按下,这个时间点按键未按下,则是松手瞬间if(NowState==0){switch(LastState){case 1:KeyNumber=17;break;case 2:KeyNumber=18;break;case 3:KeyNumber=19;break;case 4:KeyNumber=20;break;case 5:KeyNumber=21;break;case 6:KeyNumber=22;break;case 7:KeyNumber=23;break;case 8:KeyNumber=24;break;default:break;}}}

2、定时器0

h文件

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init(void);#endif

c文件

#include <REGX52.H>/*** 函    数:定时器0初始化* 参    数:无* 返 回 值:无*/
void Timer0_Init(void)
{	
//	AUXR&=0x7F;	//定时器时钟12T模式(STC89C52RC是12T单片机,无需设置)TMOD&=0xF0;	//设置定时器模式(高四位不变,低四位清零)TMOD|=0x01;	//设置定时器模式(通过低四位设为16位不自动重装)TL0=0x00;	//设置定时初值,定时10ms,12T@11.0592MHzTH0=0xDC;	//设置定时初值,定时10ms,12T@11.0592MHzTF0=0;	//清除TF0标志TR0=1;	//定时器0开始计时ET0=1;	//打开定时器0中断允许EA=1;	//打开总中断PT0=0;	//当PT0=0时,定时器0为低优先级,当PT0=1时,定时器0为高优先级
}/*定时器中断函数模板
void Timer0_Routine() interrupt 1	//定时器0中断函数
{static unsigned int T0Count;	//定义静态变量TL0=0x00;	//设置定时初值,定时10ms,12T@11.0592MHzTH0=0xDC;	//设置定时初值,定时10ms,12T@11.0592MHzT0Count++;if(T0Count>=1000){T0Count=0;}
}
*/

3、定时器1

h文件

#ifndef __TIMER1_H__
#define __TIMER1_H__void Timer1_Init(void);#endif

c文件

#include <REGX52.H>/*** 函    数:定时器1初始化* 参    数:无* 返 回 值:无*/
void Timer1_Init(void)
{
//	AUXR&=0xBF;	//定时器时钟12T模式(STC89C52RC是12T单片机,无需设置)TMOD&=0x0F;	//设置定时器模式(低四位不变,高四位清零)TMOD|=0x10;	//设置定时器模式(通过高四位设为16位不自动重装的模式)TL1=0x00;	//设置定时初始值,50ms,12T@11.0592MHzTH1=0x4C;	//设置定时初始值,50ms,12T@11.0592MHzTF1=0;	//清除TF1标志TR1=1;	//定时器1开始计时ET1=1;	//打开定时器1中断允许EA=1;	//打开总中断PT1=1;	//当PT1=0时,定时器1为低优先级,当PT1=1时,定时器1为高优先级
}/*定时器中断函数模板
void Timer1_Routine() interrupt 3	//定时器1中断函数
{static unsigned int T1Count;	//定义静态变量TL1=0x00;	//设置定时初始值,50ms,12T@11.0592MHzTH1=0x4C;	//设置定时初始值,50ms,12T@11.0592MHzT1Count++;if(T1Count>=1000){T1Count=0;}
}
*/

四、主函数

main.c

/*by甘腾胜@20250329
【效果查看/操作演示】B站搜索“甘腾胜”或“gantengsheng”查看
【单片机】STC89C52RC
【频率】12T@11.0592MHz
【外设】TM1638模块
【接线】TM1638模块:DIO接P20,CLK接P21,STB接P22
【简单的原理分析】https://blog.csdn.net/gantengsheng/article/details/143581157
【注意】
TM1638的工作电流较大,如果电脑的USB供电不足导致模块不能正常显示的话,
需要给TM1638模块独立供电,独立电源需要跟单片机的电源共地(负极接在一起)
【操作说明】
(1)长按S8开始游戏或重新开始游戏
(2)LED代表地鼠,按对应的按键则LED熄灭,再从另外七个LED中随机选一个亮
*/#include <REGX52.H>
#include <STDLIB.H>	//包含随机函数的声明
#include "TM1638.h"
#include "Timer0.h"
#include "Timer1.h"unsigned char KeyNum;	//存储获得的键码值
unsigned char Mole;	//用LED灯表示地鼠,8个LED只亮一个
unsigned char Mode;	//游戏模式,0:未开始或游戏结束,1:正在游戏
char GameTime;	//游戏时间
unsigned char Score;	//游戏得分
unsigned char T1Count;	//定时器1计数变量
unsigned char OnceFlag;	//特定前提下只执行一次的标志,1:执行,0:不执行
unsigned char HitFlag;	//“地鼠”被打到的标志,1:被打到,0:没被打到/*** 函    数:主函数(有且仅有一个)* 参    数:无* 返 回 值:无* 说    明:主函数是程序执行的起点,负责执行整个程序的主要逻辑‌*/
void main()
{P2_5=0;	//防止开发板上的蜂鸣器发出声音TM1638_Init();	//TM1638初始化Timer0_Init();  //定时器0初始化Timer1_Init();  //定时器1初始化while(1){KeyNum=Key();	//获取键码值if(KeyNum)	//如果有按键按下{srand(TL1);	//以定时器1的低八位数据作为随机数的种子,用来产生真随机的数据if(KeyNum==25)	//如果长按S8超过0.7s{Mode=0;	//游戏开始或重新开始OnceFlag=1;	//切换为其他模式前只执行一次的标志置1}if(KeyNum==24)	//如果松开S8{Mode=1;	//开始游戏}if(KeyNum==Mole || KeyNum==Mole+8)	//如果按下(短按或长按)LED(地鼠)对应的按键{HitFlag=1;}}if(Mode==0)	//游戏未开始或游戏结束{if(OnceFlag){OnceFlag=0;	//切换为其他模式前只执行一次的标志清零/*游戏初始化*/Mole=rand()%8+1;	//游戏开始前给Mole取一个随机数GameTime=30;	//初始化游戏时间Score=0;	//游戏得分清零T1Count=0;	//定时器1的计数变量清零}//暂时关闭定时器0中断允许//防止显示LED和数码管时进中断破坏时序(定时器0中断函数中按键检测也用到TM1638的时序)ET0=0;TM1638_EightLED(0x00);	//LED灯无显示TM1638_Nixie(1,GameTime/10);	//游戏时间十位TM1638_Nixie(2,GameTime%10);	//游戏时间个位TM1638_Nixie(6,Score/100%10);	//分数百位TM1638_Nixie(7,Score/10%10);	//分数十位TM1638_Nixie(8,Score%10);		//分数个位ET0=1;	//打开定时器0中断允许}else if(Mode==1)	//游戏开始{if(HitFlag){HitFlag=0;Score++;while(KeyNum==Mole || KeyNum==Mole+8)	//随机产生一个跟上次不一样的“地鼠”{Mole=rand()%8+1;}}if(GameTime)	//防止游戏结束后松开S8按键LED闪烁{ET0=0;TM1638_EightLED(0x80>>(Mole-1));	//显示LED(地鼠)TM1638_Nixie(1,GameTime/10);	//游戏时间十位TM1638_Nixie(2,GameTime%10);	//游戏时间个位TM1638_Nixie(6,Score/100%10);	//分数百位TM1638_Nixie(7,Score/10%10);	//分数十位TM1638_Nixie(8,Score%10);		//分数个位ET0=1;}}if(GameTime==0)	//如果倒计时结束{Mode=0;	//游戏结束}}
}/*** 函    数:定时器0中断函数* 参    数:无* 返 回 值:无*/
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;	//定义静态变量TL0=0x00;	//设置定时初值,定时10ms,12T@11.0592MHzTH0=0xDC;	//设置定时初值,定时10ms,12T@11.0592MHzT0Count++;if(T0Count>=2){T0Count=0;Key_Tick();}
}/*** 函    数:定时器1中断函数* 参    数:无* 返 回 值:无*/
void Timer1_Routine() interrupt 3
{TL1=0x00;	//设置定时初始值,50ms,12T@11.0592MHzTH1=0x4C;	//设置定时初始值,50ms,12T@11.0592MHzT1Count++;if(T1Count>=20){T1Count=0;GameTime--;if(GameTime<0)GameTime=0;}
}

总结

本来是有点怀疑能不能只用TM1638这个模块做出来,后来才发现是定时器中断程序中,按键的检测打乱了主函数中LED和数码管显示的时序。

出现问题要多思考,找出原因,并想办法解决。

相关文章:

基于51单片机和TM1638模块的小游戏《打地鼠》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、TM1638模块2、定时器03、定时器1 四、主函数总结 系列文章目录 前言 有两个版本&#xff0c;普中开发板版本和最小系统板版本&#xff0c;两个版本差别在于晶振频率不一样&#xff0c;其他的都相同。 本文代码…...

机器学习之数据预处理(一):缺失值处理和异常值识别的几种常用方法

始终致力于将复杂知识通俗化的不断追求中&#xff0c;不足之处欢迎批评指正。 1、噪声处理 噪声是一个测量变量中的随机错误或偏差&#xff0c;是观测值和真实值之间的误差&#xff0c;包括错误值或偏离期望的孤立点值。对于噪声的处理&#xff0c;通常可以采用数据平滑技术来…...

25/4/6 算法笔记<仿真O2DES>基础知识学习

此文章就来整理一下我学习到的O2DES仿真框架的一些核心知识 核心概念&#xff1a; 模拟器&#xff08;Simulator&#xff09;&#xff1a;模拟器是O2DES框架的核心组件&#xff0c;用来管理模拟时钟&#xff0c;事件调度和执行。可以通过Simulator类创建模拟环境&#…...

Three.js 系列专题 3:光照与阴影

内容概述 光照是 3D 场景真实感的关键。Three.js 提供了多种光源类型,每种光源有不同的效果和用途。本专题还将介绍如何启用和优化阴影效果,提升场景的深度感。 学习目标 理解不同光源类型及其应用场景。掌握在 Three.js 中添加光源并启用阴影。学会调整阴影效果以平衡真实…...

接口自动化学习五:mock工具使用

Moco简介&#xff1a; Mock是一个简单搭建模拟服务器的框架&#xff0c;可以用来模拟http、https、socket等协议。 原理&#xff1a; Mock会根据一些配置&#xff0c;启动一个真正的HTTP服务&#xff08;会监听本地的某个端口&#xff09;,当发起的请求满足某个条件时&#xf…...

Java学习——day22(Java反射基础入门)

文章目录 1.反射的定义2. 认识反射的关键API2.1 Class2.2 Field2.3 Method2.4 Constructor 3. 示例代码讲解与分析4. 编写反射示例代码的步骤4.1 定义测试类4.2 编写主程序&#xff0c;使用反射获取信息4.3 通过反射创建对象并调用方法 5. 总结6.今日生词 Java反射笔记 1.反射的…...

字符串、列表、元组、字典

字符串 双引号或者单引号中的数据&#xff0c;就是字符串 字符串输入 之前在学习input的时候&#xff0c;通过它能够完成从键盘获取数据&#xff0c;然后保存到指定的变量中&#xff1b; 注意&#xff1a;input获取的数据&#xff0c;都以字符串的方式进行保存&#xff0c;即…...

数据分析-Excel-学习笔记

Day1 复现报表聚合函数&#xff1a;日期联动快速定位区域SUMIF函数SUMIFS函数环比、同比计算IFERROR函数混合引用单元格格式总结汇报 拿到一个Excel表格&#xff0c;首先要看这个表格个构成&#xff08;包含了哪些数据&#xff09;&#xff0c;几行几列&#xff0c;每一列的名称…...

Nginx 常见面试题

一、nginx常见错误及处理方法 1.1 404 bad request 一般原因&#xff1a;请求的Header过大 解决办法&#xff1a; 配置nginx.conf 相关设置1. client_header_buffer_size 16k; 2. large_client_header_buffers 4 64k;1.2 413 Request Entity Too Large 一般原因&#xff1…...

Spring 中的 @Autowired 和 @Resource

&#x1f9e9; 一、Autowired 和 Resource 的基本作用 注解来源作用AutowiredSpring 提供&#xff08;org.springframework.beans.factory.annotation.Autowired&#xff09;按类型 自动注入ResourceJDK 提供&#xff08;javax.annotation.Resource&#xff09;默认按名称 注入…...

IAGCN:登上《Nature》的深度学习可解释性情感分析模型突破

IAGCN&#xff1a;登上《Nature》的深度学习可解释性情感分析模型突破 一、技术突破背景 社交媒体时代&#xff0c;用户生成内容的情感分析需求激增。传统方面级情感分析模型在复杂语境下存在特征交互捕捉不足、情感极性判定偏差等问题。微软亚洲研究院联合清华大学提出的交互…...

Go 学习笔记 · 进阶篇 · 第一天:接口与多态

&#x1f436;Go接口与多态&#xff1a;继承没了&#xff0c;但自由炸裂&#xff01; 最近翻 Go 的代码&#xff0c;突然看到这么一段&#xff1a; type Animal interface {Speak() string }我一愣&#xff0c;咦&#xff1f;这不就是 Java 里常见的“接口”吗&#xff1f; …...

模运算:数字世界中的时空扭曲法则——从密码学到量子计算的跨维演绎

一、模宇宙基本定理&#xff1a;重构数字时空的底层逻辑 1.1 同余关系的时空折叠效应 在模运算创造的离散时空中&#xff0c;数字呈现出环状拓扑结构。当我们在模7空间观察时&#xff0c;12与5通过时空折叠达成量子纠缠&#xff1a;12 ≡ 5 (mod 7)。这种性质使得RSA加密算法…...

0303hooks-react-仿低代码平台项目

文章目录 1. 副作用2.其他内置hooks2.1 useEffect2.2 useRef2.3useMemo2.4 useCallback 3.自定义hooks4. 第三方hooks5. hooks使用原则6. hooks闭包陷阱7. 总结结语 1. 副作用 当组件渲染完成时&#xff0c;加载一个Ajax网络请求当某个state更新时&#xff0c;加载一个Ajax网络…...

Batch Normalization:深度学习训练的加速引擎

引言 在深度学习的发展历程中&#xff0c;训练深度神经网络一直是一项极具挑战性的任务。随着网络层数的增加&#xff0c;梯度消失、梯度爆炸以及训练过程中的内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;问题愈发严重&#xff0c;极大地影响了模型的收敛…...

nacos的地址应该配置在项目的哪个文件中

在 Spring Boot 和 Spring Cloud 的上下文中&#xff0c;​Nacos 的地址既可以配置在 bootstrap.yml 中&#xff0c;也可以配置在 application.yml 中&#xff0c;但具体取决于使用场景和需求。以下是两者的区别和最佳实践&#xff1a; ​1. bootstrap.yml vs application.yml …...

【数据集】 PBMC(Peripheral Blood Mononuclear Cells)数据集

&#x1f9ec; 一、PBMC 数据集简介 内容描述名称Peripheral Blood Mononuclear Cells&#xff08;外周血单个核细胞&#xff09;细胞类型包括 B 细胞、T 细胞、NK 细胞、单核细胞等技术平台通常由 10x Genomics 提供&#xff08;例如 3k、4k、6k、10k 版本&#xff09;数据类…...

3. go-zero中如何使用redis

问题 go-zero项目相关文档中redis是这样配置的&#xff1a; Name: account.rpc ListenOn: 0.0.0.0:8080 Etcd:Hosts:- 127.0.0.1:2379Key: account.rpcMysql:Host: xxxx:3306User: rootPass: xxxData: mall-userCharset: utf8mb4Cache: - Host: 192.168.145.10:6379Type: nod…...

Redis基础知识

Redis基础知识 一、Redis简介 1.1 什么是Redis&#xff1f; Redis是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作&#xff1a; 数据库缓存消息中间件分布式锁 1.2 Redis特点 高性能&#xff1a;基于内存操作支持多种数据结构支持数据持久化支持主从复制支…...

每日c/c++题 备战蓝桥杯(求解三个数的最大公约数与最小公倍数)

求解三个数的最大公约数与最小公倍数&#xff08;C/C实现&#xff09; 引言 在数学计算和编程问题中&#xff0c;求多个数的**最大公约数&#xff08;GCD&#xff09;和最小公倍数&#xff08;LCM&#xff09;**是常见需求。本文将探讨如何高效求解三个数的GCD和LCM&#xff…...

解决Win11耳机没有声音的问题

方法一&#xff1a;更新驱动程序&#xff08;有效&#xff09; 进入 “设置”&#xff08;快捷键&#xff1a;WinX&#xff09;&#xff0c;点击 “Windows 更新” → “高级选项” 点击 “可选更新” &#xff0c;然后点击 “驱动程序更新” 【注】&#xff1a;更新后可能会出…...

滤波电容的正负极线宽需要一致吗?

今天看到一个项目的滤波电容的正端采用铺铜处理增大过流能力&#xff0c;但是负极却仅仅打了两个地过孔&#xff0c;不仅产生疑问&#xff0c;这样做是否合理&#xff0c;滤波电容的正负极线宽需要一致吗&#xff1f; 搜寻资料的时候看到这样一个类似的问题&#xff1a; 这些人…...

使用 `pandas` 库来读取 Excel 文件,并实现六种算法的遍历计算

以下是一个满足你需求的 Python 程序示例。在这个示例中&#xff0c;我们假设已经有了处理数据的函数&#xff0c;并且生成的 Excel 文件中包含了观测数据和推算数据。我们将使用 pandas 库来读取 Excel 文件&#xff0c;并实现六种算法的遍历计算。 import pandas as pd# 模拟…...

【Linux】文件描述符访问Open、Read、Write

每个运行的程序被称为进程&#xff08;process&#xff09;&#xff0c;它有一些与之关联的文件描述符。我们可以通过这些文件描述符来访问打开的文件或者设备。 一、文件描述符 什么是文件描述符&#xff1f; 概念&#xff1a;文件描述符&#xff08;File Descriptor&#x…...

在 VS2022 中修复 Linux CMake 项目构建失败:从 Ninja 迁移到 Makefile

问题背景​​ 在使用 ​​Visual Studio 2022​​ 开发跨平台 C 项目时&#xff0c;许多开发者会选择通过 ​​WSL (Windows Subsystem for Linux)​​ 直接在本地调试 Linux 环境下的程序。然而&#xff0c;近期在配置一个 CMake 项目时&#xff0c;遇到了以下报错&#xff1…...

ctf-show-mics2

下载文件用zip解压&#xff0c;将文件修改为flp文件 新建虚拟机&#xff0c;把文件添加到软盘 再次打开虚拟机会显示flag flag&#xff1a;flag{ctfshow}...

STM32_USB

概述 本文是使用HAL库的USB驱动 因为官方cubeMX生成的hal库做组合设备时过于繁琐 所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备 有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存 插件安装 下载地址 https://github.com/alambe94/I-CUBE-USBD-Com…...

Java 基础-32-枚举-枚举的应用场景

在Java编程中&#xff0c;枚举&#xff08;Enum&#xff09;提供了一种强大的方式来定义一组固定的常量。它们不仅限于简单的用途&#xff0c;还可以包含构造函数、方法和字段等高级功能&#xff0c;使其适用于多种不同的应用场景。本文将探讨几种常见的使用枚举的场景&#xf…...

新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates

只需单击几下即可创建引人注目的视觉效果&#xff01;您需要做的就是将您的文本或图像放入智能对象中并应用作。 包中包含&#xff1a; 15 个静态 Photoshop 模板&#xff08;PS 2019 及更高版本&#xff09; 01-05 垂直布局 &#xff08;22504000&#xff09;06-10 水平布局…...

学透Spring Boot — 017. 魔术师—Http消息转换器

本文是我的专栏《学透Spring Boot》的第17篇文章&#xff0c;了解更多请移步我的专栏&#xff1a; 学透 Spring Boot_postnull咖啡的博客-CSDN博客 目录 HTTP请求和响应 需求—新的Media Type 实现—新的Media Type 定义转换器 注册转换器 编写Controller 测试新的medi…...

stable diffusion 量化加速点

文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…...

Xorg内存管理机制深度解析

Xorg内存管理机制深度解析 一、客户端资源生命周期管理 Xorg 采用 客户端绑定型资源管理 机制,所有资源(窗口、像素图、字体等)的生命周期与客户端连接状态强关联。 资源 ID 分配机制: • 每个资源由 32位标识符 表示,格式:0xBBCCDDEE ◦ BB:客户端 ID(ClientIndex)…...

第五期:深入理解 Spring Web MVC [特殊字符]( 前后端交互的综合性练习)

✨ 前言&#xff1a;从理解到实战&#xff0c;彻底掌握 Spring MVC 前后端交互 当我们学习了 Spring MVC 中的各种注解、参数绑定、请求方式、编码处理以及 Cookie/Session 操作之后&#xff0c;下一步就是 —— 动手实践&#xff01; 理论再多&#xff0c;不如亲自敲一次代码…...

ansible可视化自动化平台-semaphore

1、简介 Semaphore UI 是一个开源的CI/CD工具&#xff0c;专注于简化和自动化软件交付流程&#xff0c;可轻松管理和运行 Ansible playbook&#xff0c;提供了一个直观的 Web 用户界面&#xff08;UI&#xff09;&#xff0c;帮助DevOps团队轻松管理任务、部署和流水线。 官网…...

手撕LLM(二):从源码出发,探索LoRA加载、推理全流程

接上回接着说&#xff0c;前面我们通过分析源码&#xff0c;了解了大模型推理的详细流程&#xff0c;包括提示词从输入&#xff0c;到对话模版包装&#xff0c;到tokenID转换&#xff0c;到Embedding词向量转换&#xff1b;通过大模型推理&#xff0c;再将大模型输出进行最后一…...

数据库连接JDBC

概述 ✅概念 JDBC(JavaDataBaseConnectivityjava数据库连接)是⼀种⽤于执⾏SQL语句的JavaAPI&#xff0c;可以为多种关系型数据库提供 统⼀访问&#xff0c;它是由⼀组⽤Java语⾔编写的类和接⼝组成的。 本质 其实就是java官⽅提供的⼀套规范(接⼝)。⽤于帮助开发⼈员快速实现…...

VectorBT:使用PyTorch+Transformer训练和回测股票模型 进阶五

VectorBT&#xff1a;使用PyTorchTransformer训练和回测股票模型 进阶五 本方案基于PyTorch框架与Transformer模型&#xff0c;结合VectorBT回测引擎构建多股票量化交易系统&#xff0c;采用滑动窗口技术构建时序特征&#xff0c;通过自注意力机制捕捉市场规律预测收益率&#…...

DP Alt Mode​​ 与 ​​USB​​ 的关系

DP Alt Mode​​ 与 ​​USB​​ 的关系 1. 物理接口的统一&#xff1a;USB-C 是“万能插座” [USB-C接口物理结构] |-----------------------------------------------| | USB 3.0数据引脚 | DP Alt Mode视频引脚 | 电源引脚 | |-------------------------------------…...

C#“与AI的奇妙结合”

原文&#xff1a;C# 使用通义灵码 - AI 助力 Visual Studio 开发_w3cschool &#xff08;注意&#xff1a;本文章中并不存在任何广告&#xff0c;也不存在任何盈利内容&#xff09; C# 使用通义灵码 C# 作为一种功能强大且灵活多变的编程语言&#xff0c;被广泛应用于各个领…...

企业ITR流程设计与执行详细介绍【附全文阅读】

该方案聚焦企业 ITR 流程,适用于企业的服务管理人员、流程优化负责人、技术支持团队以及中高层管理者等。 ITR 流程的重要性:企业服务面临客户不满、管理者焦虑、服务人员无奈等挑战,缺乏完善的 ITR 流程会影响品牌形象、客户满意度和产品竞争力。ITR 流程能够保障客户满意,…...

Ubuntu 无密码热点(Soft AP)完整配置方案

适用于 Jetson、嵌入式 Linux、RDK 平台。目标&#xff1a;配置一个无密码热点&#xff08;Soft AP&#xff09;&#xff0c;供手机等设备直接连接。实现开机自动启动热点&#xff0c;也支持后续一键切换回 WiFi 客户端模式。 平台&#xff1a;Yahboom RDK X3&#xff08;Jetso…...

【力扣hot100题】(063)搜索二维矩阵

看到这题我就想到之前被我当作这题做的【力扣hot100题】&#xff08;020&#xff09;搜索二维矩阵Ⅱ 其实是完全不一样的两题&#xff0c;个人觉得这道题更简单也更考验基础&#xff0c;那道题思路更难想到但代码更好写。 两个二分查找结束&#xff0c;要注意的是第一个二分查…...

瑞萨RA4M2使用心得-KEIL5的第一次编译

目录 前言 环境&#xff1a; 开发板&#xff1a;RA-Eco-RA4M2-100PIN-V1.0 IDE&#xff1a;keil5.35 一、软件的下载 编辑瑞萨的芯片&#xff0c;除了keil5 外还需要一个软件&#xff1a;RASC 路径&#xff1a;Releases renesas/fsp (github.com) 向下找到&#xff1a; …...

玄机-apache日志分析

靶场任务 1、提交当天访问次数最多的IP&#xff0c;即黑客IP&#xff1a; 查看apache日志 apache访问日志的位置是&#xff1a;/var/log/apache2/access.log.1 匹配正则算法 首先先cat看看 发现地址都在第一行&#xff0c;直接匹配计算输出 cat access.log.1 |grep -Eo &…...

[C++]洛谷B2119 删除单词后缀

题目与解析 题干题目描述输入格式输出格式样例样例输入样例输出 答案解析食用提示AC代码AC代码详细解析头文件部分主程序8~12行代码 12行以后的代码 题干 题目描述 给定一个单词&#xff0c;如果该单词以 er、ly 或者 ing 后缀结尾&#xff0c;则删除该后缀&#xff08;题目保…...

Ubuntu远程连接Mysql数据库(图文详解)

Ubuntu远程连接Mysql数据库 1、版本2、检查有没有Mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.3 查看Mysql运行状态 3、卸载Mysql4、安装4.1 更新4.2 开始安装4.3 安装完后查看状态 5、登录5.1、使用5.2、查看数据库权限5.3 更新权限5.4 再次查看数据库权限5.5 添加新用…...

回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测

回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测 目录 回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【JCR一区级】Matlab实现NRBO-Transformer-GRU多变量回归预测&#xff0c;牛顿-拉夫逊算法优…...

leetcode122-买卖股票的最佳时机II

leetcode 122 思路 方法一的核心思想是简单的贪心策略。我们每天都看当前价格和下一个价格的差值。如果下一个价格高于当前价格&#xff08;即diff > 0&#xff09;&#xff0c;那么就认为当天可以买入并在第二天卖出&#xff0c;赚取利润。因此&#xff0c;方法一把所有…...

from PIL import Image 安装失败

正确安装 Pillow (PIL) # 通过 Conda 安装 conda install pillow -c conda-forge# 或通过 Pip 安装 pip install pillow验证安装 在 Python 中测试是否成功&#xff1a; from PIL import Image print(Image.__version__) # 应输出类似 "9.5.0" 的版本号常见问题说…...

DPFunc蛋白质功能预测模型复现报告

模型简介 模型的具体介绍见蛋白质功能预测论文阅读记录2025&#xff08;DPFunc、ProtCLIP&#xff09;_protein functions-CSDN博客 复现流程 仓库&#xff1a;CSUBioGroup/DPFunc 时间&#xff1a;2025.4.5 环境配置 python 3.9.21 & CUDA 11.6 Pytorch: 1.12.0 DG…...