51单片机定时器和中断(03)

eg1:数码管如何显示出字符

在这里插入图片描述在这里插入图片描述51单片机40个引脚的功能需要记住**

  • RXD:表示的是串行输入口
  • INT0:外部中断0
  • INT1:外部中断1
  • TO : 外部中断0
  • T1 :外部中断1
  • WR: 外部输入存储器写
  • RD: 外部输出存储器读
  • XTK2/XTL1 单片机晶振的输入端
  • VSS == GND
  • ALE 可以输出六分之一的时钟方波

eg2:数码管的静态显示

在单片机系统中,常用的显示器有以下几种:数码管的显示通常是由锁存器来进行控制的

  1. LCD(液晶显示器):LCD是一种常见的显示器类型,它使用液晶技术来显示图像和字符。LCD显示器可以以字符、图形或者图像的形式显示信息,通常具有较低的功耗和较高的分辨率。LCD显示器通常需要使用驱动芯片来控制显示内容。
  2. LED(发光二极管显示器):LED显示器使用发光二极管来显示字符、数字或者图像。它具有高亮度、低功耗和长寿命等优点。LED显示器可以分为七段LED和点阵LED两种类型,七段LED可以显示数字和部分字母,而点阵LED可以显示更复杂的图像和字符。
  3. OLED(有机发光二极管显示器):OLED是一种高对比度、高亮度、快速响应和广视角的显示技术。OLED显示器由许多有机发光材料组成,可以直接发射光线。OLED显示器具有较低的功耗和较薄的结构,适用于小型设备和便携式设备。
  4. VFD(真空荧光显示器):VFD显示器使用一种发光的热电子器件来显示字符和数字。它具有高亮度、广视角和长寿命等特点。VFD显示器通常用于需要高可见性和抗干扰能力的应用,如家电、汽车仪表盘等。
#include <REGX52.H>
#include <INTRINS.H>
//控制断点
sbit dula = P2^6;
sbit wela = P2^7;
//控制数码管的每一个位置的数字
sbit mun1 = P0^0;
sbit mun2 = P0^1;
sbit mun3 = P0^2;
sbit mun4 = P0^3;
/*共阳数码管码表0xc0,//00xf9,//10xa4,//20xb0,//30x99,//40x92,//50x82,//60xf8,//70x80,//80x90,//90x88,//A0x83,//B0xc6,//C0xa1,//D0x86,//E0x8e, //F0x8c, //P0xc1,//U0x91,//Y0x7c,//L0x00,//全亮0xff  //熄灭数码管码表0x3F,  //"0"0x06,  //"1"0x5B,  //"2"0x4F,  //"3"0x66,  //"4"0x6D,  //"5"0x7D,  //"6"0x07,  //"7"0x7F,  //"8"0x6F,  //"9"0x77,  //"A"0x7C,  //"B"0x39,  //"C"0x5E,  //"D"0x79,  //"E"0x71,  //"F"0x76,  //"H"0x38,  //"L"0x37,  //"n"0x3E,  //"u"0x73,  //"P"0x5C,  //"o"0x40,  //"-"0x00  //熄灭*/void main(){//位锁存器开启 wela  = 1;// 给p0口送数0011 1111---> 1111 1100 == fcP0 = 0x00;// 锁存器关闭wela = 0;// 断选锁存器dula = 1;P0 = 0x06;dula = 0;while(1);}

在这里插入图片描述数码管静态显示
在这里插入图片描述

#include <REGX52.H>
#include <INTRINS.H>
//控制断点
sbit dula = P2^6;
sbit wela = P2^7;
// 宏定义
#define uint unsigned int;
#define uchar unsigned char;
uint i,ret;uchar num;
// 创建一个数组,编写code的目的就是将数据存放在程序存储器中,不写code会放在随机存储器当中
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E};
// 延时函数
void Delay1000ms(void)	//@11.0592MHz
{unsigned char data i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{do{while (--k);} while (--j);
} while (--i);
}void main(){// 操作所有的数码管让数码管亮起wela = 1;P0 = 0xc0;wela = 0;while(1){ret = sizeof(table)/sizeof(table[0]);for(num = 0;num <= ret; num ++){// 操作单个数码管让它分别显示数据dula = 1;P0 = table[num];dula = 0;Delay1000ms(); 		}}
}

在这里插入图片描述eg3:中断概念

  • CPU在处理某一事件A时,突然发生了另一件事B请求CPU去迅速处理(中断发生)
  • CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务)
  • 待CPU将事件B处理完毕后,在回到原来的事件A被中断的地方继续处理事件A(中断返回),这一过程被称为中断。

80C51是一种经典的单片机系列,其中断系统结构如下:

  1. 中断源:80C51中断系统包含多种中断源,例如外部中断、定时器/计数器中断、串行通信中断等。这些中断源可以触发中断请求,引起中断处理。
  2. 中断向量表:80C51中断系统采用中断向量表来管理不同中断源的中断处理程序。中断向量表是一组存储中断处理程序地址的内存地址。每个中断源都有一个唯一的中断向量,当中断请求产生时,CPU会根据中断源的优先级选择相应的中断向量,跳转到对应的中断处理程序。
  3. 中断优先级和屏蔽:80C51中断系统支持多级中断优先级。不同中断源可以设置不同的优先级,高优先级的中断会优先处理。此外,中断系统还提供了可屏蔽中断的功能。通过设置中断屏蔽位,可以屏蔽或允许特定中断源的中断请求。
  4. 中断处理程序:中断处理程序是实际执行中断服务的代码。每个中断源都有一个对应的中断处理程序,当中断请求发生时,CPU会跳转到对应的中断处理程序开始执行。中断处理程序通常需要保存和恢复现场,处理中断事件,并在完成后返回到主程序。
  5. 中断返回:中断处理程序执行完成后,需要通过中断返回指令(如RET)返回到主程序继续执行。中断返回指令会恢复保存的现场,包括程序计数器等寄存器的值,并从栈中弹出返回地址。

80C51的中断系统结构提供了一种有效的处理异步事件的机制。通过合理配置中断源的优先级和中断处理程序的设计,可以实现对实时性要求较高的应用的响应和处理。

在这里插入图片描述中断技术在计算机系统中具有以下优点:**

  1. 实时性:中断技术可以及时响应外部事件或者内部事件的发生,使得系统可以快速地对事件做出处理。这对于需要实时响应的应用非常重要,例如实时控制系统、数据采集系统等。
  2. 节约CPU资源:中断技术可以实现异步事件的处理,使得CPU可以在处理一个事件时,同时处理其他任务或者等待其他事件的发生。这样可以充分利用CPU资源,提高系统整体的效率。
  3. 灵活性:中断技术可以对不同类型的事件进行分类和处理,通过设置不同的中断源和中断处理程序,可以灵活地适应不同的应用需求。
  4. 可靠性:中断技术可以保证系统对事件的响应和处理不受主程序的影响,即使主程序出现问题或者阻塞,中断仍然可以正常工作,保证系统的可靠性。
  5. 外设扩展性:中断技术可以方便地与外部设备进行连接和交互。通过与外部设备的中断触发机制配合,可以实现对外部设备的高效管理和控制。
    在这里插入图片描述中断请求标志
    在这里插入图片描述在这里插入图片描述80c51单片机的中断优先级原则
  • CPU同时收到几个中断时,首先响应优先级别最高的中断请求
  • 正在进行的中断过程不能被新的同级或者是低优先级的中断请求中断
  • 正在请求 的低优先级中断服务,能被高优先级中断请求所中断
#include <REGX52.H>
#include <INTRINS.H>
//控制断点
sbit dula = P2^6;
sbit wela = P2^7;
sbit L1= P1^0;
// 宏定义
#define uint unsigned int;
#define uchar unsigned char;
uint i,ret;uchar num;
// 创建一个数组,编写code的目的就是将数据存放在程序存储器中,不写code会放在随机存储器当中
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E};
// 延时函数
void Delay1000ms(void)	//@11.0592MHz
{unsigned char data i, j, k;_nop_();_nop_();i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);}// 中断服务程序,编写中断函数时无返回值函数名,interrupt 加上中断序号
void exter0() interrupt  0{L1 = 0;
}void main(){// 开总中断EA = 1;// 开外部中断0EX0 = 1; // 跳变触发中断的方式 TCON =0X01;IT0 = 1;// 操作所有的数码管让数码管亮起wela = 1;P0 = 0xc0;wela = 0;while(1){ret = sizeof(table)/sizeof(table[0]);for(num = 0;num <= ret; num ++){// 操作单个数码管让它分别显示数据L1 = 1;dula = 1;P0 = table[num];dula = 0;Delay1000ms(); }}}

eg4:单片机定时的应用**

80C51微控制器中的定时器和计数器是其内部的重要功能模块,用于计时、计数和生成定时中断等操作。以下是关于80C51定时器和计数器的基本介绍:

  1. 定时器和计数器功能:80C51微控制器中的定时器和计数器是16位的功能模块,可以用于计时和计数操作。定时器可以按照设定的时间间隔自动计时,而计数器可以按照外部触发信号进行计数。
  2. 定时器的工作方式:80C51的定时器可以以不同的方式工作,包括定时模式、计数模式和PWM输出模式等。在定时模式下,定时器可以自动地根据设定的定时器初值和工作模式进行计时,并在计时结束时触发定时中断。
  3. 计数器的工作方式:80C51的计数器可以通过外部的触发信号进行计数操作。当触发信号发生边沿或状态变化时,计数器会自动地对计数值进行增加或者减少,并在计数达到设定值时触发中断。
  4. 定时器/计数器的控制寄存器:80C51微控制器中的定时器和计数器具有一些控制和设置寄存器,用于配置和管理定时器/计数器的工作模式、计时间隔、计数模式等参数。通过对这些寄存器的设置,可以实现不同的定时和计数功能。
  5. 定时中断:80C51的定时器和计数器模块可以生成定时中断信号。当定时器计时或计数达到设定值时,会触发中断请求,通过中断向量来处理相应的中断服务程序。

定时器和计数器的工作原理如下:

  1. 定时器的工作原理:
    • 定时器内部有一个基准时钟源,可以是外部晶振或者内部时钟源。这个时钟源会提供一个固定的时间间隔,例如每个时钟脉冲。
    • 定时器内部有一个计数寄存器,用于存储定时器的计数值。这个计数值会随着时钟源的脉冲到来而递增。
    • 定时器还有一个设定值寄存器,用于设置定时器的初值。当定时器的计数值达到设定值时,触发定时中断,并重新加载设定值,从而实现循环定时的功能。
    • 在定时器工作期间,可以根据设定的工作模式,进行不同的操作,例如自动重新加载、停止计数、触发输出等。
  2. 计数器的工作原理:
    • 计数器内部也有一个基准时钟源,可以是外部晶振或者内部时钟源。这个时钟源会提供一个固定的时钟脉冲或者触发信号。
    • 计数器内部有一个计数寄存器,用于存储计数器的计数值。这个计数值会随着时钟源的脉冲或者触发信号的到来而递增或者递减。
    • 计数器还有一个设定值寄存器,用于设置计数器的初值。当计数器的计数值达到设定值时,触发中断请求,并重新加载设定值,从而实现循环计数的功能。
    • 在计数器工作期间,可以根据设定的工作模式,进行不同的操作,例如触发中断、输出触发信号等。

代码演示
在这里插入图片描述

#include <REGX52.H>
#include <INTRINS.H>#define uint unsigned int
#define uchar unsigned char
sbit dula  = P2^6;
sbit wela  = P2^7;	uchar temp,aa,numwe,numdu,lenght1,lenght2;
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E};
uchar code tablewe[] = {0xfe,0xfd,0xf7,0xef,0xdf};// 编写中断函数using 后面跟机,表示的是使用第几组的工作寄存器
void timer0() interrupt 1{TH0 = (65536-50000)/256;// 高8位TL0 = (65536-50000)/256; // 低8位aa++;}void main(){numdu = 0;numwe = 0;aa = 0;// 选择寄存器的工作方式TMOD = 0x01;// 计算初值以2秒的时间变化TH0 = (65536-50000)/2556;// 高8位TL0 = (65536-50000)%256; // 低8位// 中断方式,开启中断EA = 1EA = 1;// 开启定时器中断ET0 = 1;	//TR0 = 1 启动定时器TR0 = 1;// 计算数组长度lenght1 =  sizeof(table)/sizeof(table[0]);lenght2 =  sizeof(tablewe)/sizeof(tablewe[0]);
while(1){if(aa == 4){aa = 0;numdu++;if(numdu == 10){numdu = 1;}dula = 1;P0= table[numdu];dula = 0;wela = 1;P0 = tablewe[numwe];wela = 0;numwe++;if(numwe == 6){numwe = 0;}}}
}

动态显示灯管

数码管的动态显示原理如下:

  1. 数码管的基本结构:
    • 数码管由多个发光二极管(LED)组成,通常有7个或14个。
    • 每个发光二极管都有一个独立的引脚用于控制,称为段选引脚。
    • 数码管还有一个共阳或共阴的引脚,用于控制整个数码管的亮灭。
  2. 动态显示原理:
    • 在动态显示中,每次只有一个数码管被点亮,而其他数码管则处于熄灭状态。
    • 控制器通过快速切换每个数码管的段选引脚,使得人眼感知到所有数码管都在同时显示。
    • 控制器在非常短的时间内依次控制每个数码管,每个数码管被点亮的时间很短,通常只有几毫秒。
    • 控制器通过迅速切换数码管的段选引脚,可以使得数码管的亮度保持较为均匀,因为人眼对于光的持续时间较短的光亮感知能力较弱。
  3. 显示数据的存储与转换:
    • 要在数码管上显示具体的数字或字符,需要将对应的显示数据转换为段选引脚的控制信号。
    • 通常使用存储器、寄存器或者逻辑门电路来实现数据的存储和转换。
    • 控制器将需要显示的数据存储在内部存储器或寄存器中,并根据需要将对应的控制信号输出到数码管的段选引脚,以控制每个发光二极管的亮灭。

通过快速切换数码管的段选引脚,控制器可以实现数码管的动态显示。通过控制显示数据的存储和转换,可以在数码管上显示各种数字、字符和符号。

#include <REGX52.H>
#include <INTRINS.H>#define uint unsigned int
#define uchar unsigned char
sbit dula  = P2^6;
sbit wela  = P2^7;	uchar temp,aa,numwe,numdu,lenght1,lenght2;
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x38,0x37,0x3E};
uchar code tablewe[] = {0xfe,0xfd,0xf7,0xef,0xdf};// 编写中断函数using 后面跟机,表示的是使用第几组的工作寄存器
void timer0() interrupt 1{TH0 = (65536-50000)/256;// 高8位TL0 = (65536-50000)/256; // 低8位aa++;}void main(){numdu = 0;numwe = 0;aa = 0;// 选择寄存器的工作方式TMOD = 0x01;// 计算初值以2秒的时间变化TH0 = (65536-50000)/2556;// 高8位TL0 = (65536-50000)%256; // 低8位// 中断方式,开启中断EA = 1EA = 1;// 开启定时器中断ET0 = 1;	//TR0 = 1 启动定时器TR0 = 1;// 计算数组长度lenght1 =  sizeof(table)/sizeof(table[0]);lenght2 =  sizeof(tablewe)/sizeof(tablewe[0]);
while(1){if(aa == 4){aa = 0;numdu++;if(numdu == 10){numdu = 1;}dula = 1;P0= table[numdu];dula = 0;wela = 1;P0 = tablewe[numwe];wela = 0;numwe++;if(numwe == 6){numwe = 0;}}}
}  

在这里插入图片描述数码管动态显示

#include <REGX52.H>
#include <INTRINS.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula  = P2^6;
sbit wela  = P2^7;	uchar temp,aa,numwe,numdu,lenght1,lenght2,shi,ge;
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//延迟5000ms
void Delay5000ms(void)	//@11.0592MHz
{unsigned char data i, j, k;_nop_();_nop_();i = 211;j = 30;k = 11;do{do{while (--k);} while (--j);} while (--i);}void main(){temp = 12;numdu = 0;while(1){shi = temp/10;ge = temp%10;dula = 1;P0 = table[shi];dula = 0;wela = 1;P0 = 0xfe;wela = 0;Delay5000ms();dula = 1;P0 = table[ge];dula = 0;wela = 1;P0 = 0xfd;wela = 0;Delay5000ms();}}

以上代码的显示结果为三个数轮流在不同位数显示

一下代码的结果为三个数同时显示在数码管上

#include <REGX52.H>
#include <INTRINS.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula  = P2^6;
sbit wela  = P2^7;	uchar temp,aa,numwe,numdu,bai,shi,ge;
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//延迟5000ms
void delay(uint z){uint x,y;for(x = z; x > 0; x --){for(y = 110; y > 0; y--){}}}void main(){temp = 152;numdu = 0;while(1){bai = temp/100;shi = temp%100/10;ge = temp%10;dula = 1;P0 = table[bai];dula = 0;wela = 1;P0 = 0xfe;wela = 0;delay(5);dula = 1;P0 = table[shi];dula = 0;wela = 1;P0 = 0xfd;wela = 0;delay(5);dula = 1;P0 = table[ge];dula = 0;wela = 1;P0 = 0xfb;wela = 0;delay(5);}}

在这里插入图片描述
编写子程序灵活调用

#include <REGX52.H>
#include <INTRINS.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula  = P2^6;
sbit wela  = P2^7;	uchar temp,aa,numwe,numdu,bai,shi,ge;
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//延迟5000ms
void delay(uint z){uint x,y;for(x = z; x > 0; x --){for(y = 110; y > 0; y--){}}}void display(uchar bai,uchar shi,uchar ge)
{dula = 1;P0 = table[bai];dula = 0;wela = 1;P0 = 0xfe;wela = 0;delay(5);dula = 1;P0 = table[shi];dula = 0;wela = 1;P0 = 0xfd;wela = 0;delay(5);dula = 1;P0 = table[ge];dula = 0;wela = 1;P0 = 0xfb;wela = 0;delay(5);}void main(){temp = 152;numdu = 0;bai = temp/100;shi = temp%100/10;ge = temp%10;while(1){display(bai,shi,ge); }}

定时器中断三位数准备增加

#include <REGX52.H>
#include <INTRINS.H>
#define uint unsigned int
#define uchar unsigned char
sbit dula  = P2^6;
sbit wela  = P2^7;	uchar temp,aa,bai,shi,ge;
uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};// 初始化函数
void init(){wela = 0;dula = 0;	temp = 0;// 初始化定时器TMOD = 0x01;// 定时器模式设置定时器初始值TH0 = (65536-50000)/256;TL0 = (65536-50000)%256;//开始中断EA = 1;ET0 = 1;TR0 = 1; }//延迟5000ms
void delay(uint z){uint x,y;for(x = z; x > 0; x --){for(y = 110; y > 0; y--){}}}// 编写中断函数using 后面跟机,表示的是使用第几组的工作寄存器
void timer0() interrupt 1{TH0 = (65536-50000)/256;// 高8位TL0 = (65536-50000)/256; // 低8位aa++;}void display(uchar bai,uchar shi,uchar ge)
{dula = 1;P0 = table[bai]; // 送百位数dula = 0;  // 消隐P0 = 0xff;wela = 1;P0 = 0xfe; // 位选通百位数wela = 0;delay(5);dula = 1;P0 = table[shi];dula = 0;P0 = 0xff;wela = 1;P0 = 0xfd;wela = 0;delay(5);dula = 1;P0 = table[ge];dula = 0;P0 = 0xff;wela = 1;P0 = 0xfb;wela = 0;delay(5);}void main(){// 调用初始化函数init();while(1){if(aa == 20){aa = 0;temp ++;if(temp == 100){temp = 0;}else{bai = temp /100;shi = temp %100/10;ge = temp%10;}}display(bai,shi,ge); }}

实现的效果为从后往前数字自增1
在这里插入图片描述
eg:51单片机较为重要的部分为,中断系统,定时器和串口需要重点掌握,important

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

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

相关文章

1.3 矩阵

一、向量与矩阵 下面是三个向量 u \boldsymbol u u、 v \boldsymbol v v、 w \boldsymbol w w&#xff1a; u [ 1 − 1 0 ] v [ 0 1 − 1 ] w [ 0 0 1 ] \boldsymbol u\begin{bmatrix}\,\,\,\,1\\-1\\\,\,\,\,0\end{bmatrix}\kern 10pt\boldsymbol v\begin{bmatrix}\,\,\,…

你还不会DeBug?太low了吧

编程时调试是不可缺少的&#xff0c;Unity中用于调试的方法均在Debug类中。 浅试一下 新建一个物体和脚本&#xff0c;并把脚本挂载到物体上&#xff01; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DeBugTest : MonoBeh…

【Qt控件之QTabWidget】介绍及使用

描述 QTabWidget类提供了一个带有选项卡的小部件堆栈。 选项卡小部件提供了一个选项卡栏&#xff08;参见QTabBar&#xff09;和一个“页面区域”&#xff0c;用于显示与每个选项卡相关联的页面。默认情况下&#xff0c;选项卡栏显示在页面区域的上方&#xff0c;但可以使用…

【斗破年番】再遭群嘲,美杜莎怀孕之事被魔改,三方联手除萧潇?

【侵权联系删除】【文/郑尔巴金】 斗破苍穹年番第67集已经更新了。和很多人一样&#xff0c;小郑也去看了&#xff0c;只是小郑万万没有想到&#xff0c;我满怀期待的去看这一集&#xff0c;这一集却能魔改成这样。魔改成什么样了呢&#xff1f;下面来分析下吧&#xff01; 一&…

CSS 效果 圆形里一个文字居中

效果实现源码&#xff1a; 宽度&#xff0c;高度必须确认&#xff0c;且相等 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.circlew {width: 45px;height: 45p…

2023年淘宝双十一预售红包入口介绍

2023年淘宝双十一预售红包入口介绍 近两年&#xff0c;淘宝双十一推出了预售玩法会场。在会场中&#xff0c;大家可以做预售任务&#xff0c;领取现金红包&#xff0c;让购物变得更省。那么&#xff0c;2023年淘宝双十一预售红包入口在哪里?下面小编就给大家介绍下&#xff0c…

ssm+vue的软考系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的软考系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff…

ModuleNotFoundError: No module named ‘torch‘

目录 情况1,真的没有安装pytorch情况2(安装了与CUDA不对应的pytorch版本导致无法识别出torch) 情况1,真的没有安装pytorch 虚拟环境里面真的是没有torch,这种情况就easy job了,点击此链接直接安装与CUDA对应的pytorch版本,CTRLF直接搜索对应CUDA版本即可查找到对应的命令.按图…

23 种设计模式详解(C#案例)

&#x1f680;设计模式简介 设计模式&#xff08;Design pattern&#xff09;代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时…

Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!

* 20231020 写这篇博文断断续续花了好几天&#xff0c;为了说明不同shell在执行同一脚本文件时的差别&#xff0c;我分别在csdn提供线上Linux环境 &#xff08;使用的shell是zsh&#xff09;和自己的电脑上&#xff08;使用的shell是bash&#xff09;做测试。功夫不负有心人&am…

Vue虚拟节点和渲染函数

1.虚拟节点 虚拟节点&#xff08;dom&#xff09;本质上就是一个普通的JS对象&#xff0c;用于描述视图的界面结构 2.渲染函数render()&#xff1a;接收一个 createElement()函数创建的VNode Vue.component("board", {render: function(createElement) {return cr…

【Bug】8086汇编学习

文章目录 随笔Bug1、masm编译报错&#xff1a;Illegal use of register2、debug中使用段前缀3、[idata]在编译器中的处理4、push立即数报错5、报错&#xff1a;improper operand type6、程序莫名跳转到未知位置 (doing)7、DOSBox失去响应8、程序运行显示乱码9、程序运行导致DOS…

黑豹程序员-架构师学习路线图-百科:Java的第二春Spring框架

文章目录 1、 Spring的发展历史2、为什么Spring能霸屏&#xff1f;2.1、容器的设计2.2、通过四个策略2.3、三种方式 3、学习编程设计的典范 1、 Spring的发展历史 正当SUN公司的EJB在全球开始热炒时&#xff0c;正当程序员纷纷转型EJB开发时&#xff0c;正当程序员为跑通EJB程…

Node.js--》简易资金管理系统后台项目实战(后端)

今天开始使用 node vue3 ts搭建一个简易资金管理系统的前后端分离项目&#xff0c;因为前后端分离所以会分两个专栏分别讲解前端与后端的实现&#xff0c;后端项目文章讲解可参考&#xff1a;前端链接&#xff0c;我会在前后端的两类专栏的最后一篇文章中会将项目代码开源到我…

vulnhub靶机Funbox11

下载地址&#xff1a;Funbox: Scriptkiddie ~ VulnHub 主机发现 arp-scan -l 目标192.168.21.164 端口扫描 nmap --min-rate 1000 -p- 192.168.21.164 端口好多处理一下吧 nmap --min-rate 1000 -p- 192.168.21.164 |grep open |awk -F / {print $1} |tr \n , 端口服务版本…

冰蝎默认加密的流量解密

破解冰蝎的默认加密 流量包分析 上传的冰蝎流量包 POST /web-zh/DVWA/vulnerabilities/upload/ HTTP/1.1 Host: 192.168.197.111 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0 Accept: text/html,application/xhtmlxml,a…

文件读取结束的判定

大家好啊&#xff0c;我们今天来补充文件操作的读取结束的判定。 被错误使用的feof 牢记&#xff1a;在文件读取过程中&#xff0c;不能用feof函数的返回值直接用来判断文件的是否结束而是应用于当文件读取结束的时候&#xff0c;判断是读取失败结束&#xff0c;还是遇到文件尾…

ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?

本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件&#xff0c;拖到ArcGIS后却出现“未知的空间参考&#xff1a;添加的数据源缺少空间参考信息 不能投影”的提示&#xff0c;如下图所示&#xff1a; 这种情况就…

图详解第六篇:多源最短路径--Floyd-Warshall算法(完结篇)

文章目录 多源最短路径--Floyd-Warshall算法1. 算法思想2. dist数组和pPath数组的变化3. 代码实现4. 测试观察5. 源码 前面的两篇文章我们学习了两个求解单源最短路径的算法——Dijkstra算法和Bellman-Ford算法 这两个算法都是用来求解图的单源最短路径的算法&#xff0c;区别在…

Rclone连接Onedrive

一、Rclone介绍 Rclone是一款的命令行工具&#xff0c;支持在不同对象存储、网盘间同步、上传、下载数据。 我们这里连接的onedrive&#xff0c;其他网盘请查看官方文档。 注意&#xff1a; 需要先在Windows下配置好了&#xff0c;然后再将rclone配置文件复制到Linux的rclone配…