51单片机--AD/DA
AD/DA介绍
AD和DA是模拟信号和数字信号之间的转换过程。
AD,全称为模拟到数字(Analog-to-Digital),指的是将模拟信号转换为数字信号的过程。在AD转换中,模拟信号经过采样、量化和编码等步骤,被转换为离散的数字信号。这样可以更方便地处理和传输信号,在数字系统中进行数字信号的处理和分析。
DA,全称为数字到模拟(Digital-to-Analog),指的是将数字信号转换为模拟信号的过程。在DA转换中,数字信号经过解码和重构处理,被转换为连续的模拟信号。这样可以将数字信号转换为模拟信号,使其能够被模拟系统接收和处理。
AD和DA转换常见于各种电子设备和系统中,例如音频设备、通信系统、传感器等。AD转换可以将实际物理量(如声音、温度、光强)转换为数字形式进行处理,而DA转换则可以将数字信号转换为模拟形式输出到外部设备或环境中。
AD和DA转换的准确性和性能对于系统的精度和稳定性至关重要,因此在设计和选择AD和DA转换器时需要考虑多个因素,如分辨率、采样率、信噪比、线性度等。

硬件电路模型

AD转换电路:
- 采样电路:根据采样信号,对要转换的模拟量进行抽样,通常使用开关电容电路或采样保持电路实现。
- 模拟信号输入电路:将要转换的模拟信号经过滤波、放大等处理后输入到采样电路。
该电路通常包括输入缓冲器、低通滤波器和增益放大器等。- A/D转换器(ADC):采样电路输出的模拟信号通过ADC芯片进行转换。ADC芯片可能采用逐次逼近法、积分法或其他转换方法。
- 数字信号输出:转换后的数字信号通过总线或其他方式传输给单片机。
DA转换电路:
- 数字信号输入:单片机通过总线或其他方式将要转换的数字信号输入到DA转换电路。
- D/A转换器(DAC):数字信号经过DAC芯片进行转换,DAC芯片可能采用R-2R网络、串行接口或其他转换方法。
- 模拟信号输出电路:转换后的模拟信号经过滤波、放大等处理后输出到外部设备或环境.
举个例子,麦克风接收声音:通过声音的大小、音调、音色等因素转换为高低不同的电压,转换后的电压值就是数字信号;然后用扩音器放出声音:单片机或者芯片通过总线将存储在寄存器上的数字信号传入到DAC中;DAC将数字信号转换为对应的声音,最后进行输出。
AD原理

这是单片机上的ADC模块原理图;
与单片机芯片连接的引脚:
DIN:串行数据输入;
CS;片选信号;这是一种控制信号,用于选择要与主设备进行通信的从属设备。
DLCK:串行时钟;
DOUT:串行数据输出;
与外部电阻连接的引脚:
AIN0:连接着分压电阻;
AIN1:连接着热敏电阻;
AIN2:连接着光敏电阻;

下面是AD转换器的内部结构:逐次逼近型AD转换器

它使用二分搜索的方法逼近输入的模拟信号,并将其转换为数字输出;
逐次逼近型AD转换器通常由以下几个主要组成部分构成:
-
比较器(Comparator):用于比较输入模拟信号和DAC输出的数字量,产生一个比较结果。
-
数字-模拟转换器(Digital-to-Analog Converter,DAC):将数字量转换为模拟信号输出。在逐次逼近型AD转换器中,DAC通常是一个逐位逼近型DAC,可以根据比较结果生成合适的模拟电压输出。
-
控制逻辑(Control Logic):用于控制转换过程,包括初始化、逐位逼近、对比和停止等步骤。控制逻辑会根据比较结果调整DAC的输出,直到得到一个与输入模拟信号尽可能接近的数字输出。
-
计数器(Counter):用于计数和记录逼近过程中的比特位。逐次逼近型AD转换器从高位(MSB)开始逼近,通过逐步调整DAC输出的比特位。计数器会在每一次逼近过程中更新。
DA原理

与单片机相连的引脚:P21;通过放大器将数字信号转换为模拟信号到DA1(LED灯上);
T型电阻网络DA转换器:

T型电阻网络DAC通常由一个或多个可变电阻和固定比例的电阻组成。其中,可变电阻用于控制输出模拟信号的大小,而固定比例的电阻则用于分割参考电压以确定输出模拟信号的范围。
在T型电阻网络DAC中,输入的数字信号首先被编码为N位二进制数。每个二进制位对应一个电阻。根据输入二进制数中1的个数,相应的开关会连接或断开对应的电阻。通过这样的连接和断开过程,可变电阻的总阻值可以被调整,从而实现不同模拟输出电压的生成。当电阻网络的总阻值变化时,输出模拟电压也会相应地变化。
需要注意的是,T型电阻网络DAC的精度受限于电阻的精度和线性度。此外,由于电阻切换过程中可能引入的开关跳变,可能产生瞬态误差(glitch),导致输出信号的非理想性。

PWM型DA转换器:

PWM型DA转换器(Pulse Width Modulation)是一种常见的数字模拟转换器,通过调节脉冲的宽度来实现模拟输出信号的调节。
PWM型DA转换器基于脉冲信号,其输出信号的模拟值由脉冲的占空比决定。PWM型DA转换器通常包含一个计数器和一个比较器。计数器用于生成一个周期性的计数序列,比较器用于将计数值与给定的参考值进行比较产生脉冲信号。
工作原理如下:通过改变计数器的计数范围,以及在每个计数值处进行比较的阈值,可以控制脉冲信号的占空比。占空比表示脉冲高电平的时间与周期的比例,反映了输出模拟信号的幅度。
在PWM型DA转换器中,**输入的数字信号首先被编码为N位二进制数。这个二进制数通常对应了脉冲信号的占空比调节值。**因此,输入数字信号越大,对应的脉冲信号的高电平时间也越长,从而模拟输出信号的幅度也会相应增加。

运算放大器
运算放大器(Operational Amplifier,简称运放或OP-AMP)是一种具有很高放大倍数的电路单元。它常用于模拟电路中,可以将输入信号进行放大、加、减、微分、积分等数学运算,并输出相应的结果。
运放通常由集成电路或分立元件组成,在现代电子行业广泛应用。它的工作原理是利用多级放大电路实现非常高的增益,同时通过外部反馈网络来控制其响应和特性。运放具有差分输入和单端输出的特点,其中两个输入端分别为非反相输入端和反相输入端,输出端则与输入端之间存在一个差分增益。

运放电路

1.运算放大器的正相输入端和反向输入端分别连接到待比较的两个电压源。
2.运算放大器的输出端与反馈电阻组成反馈网络,将输出信号通过反馈电阻返回到运放的正相输入端。
3.参考电压源为基准,通常连接到运放的正相输入端。
当运放的非反相输入端(+)所对应的电压高于反相输入端(-)时,运算放大器的输出会趋向于最大正饱和电压。相反地,当非反相输入端(+)的电压低于反相输入端(-)时,输出会趋向于最大负饱和电压。

反向放大器的原理如下:
- 输入信号通过输入电阻连接到运放的反相输入端(-)。
- 反馈电阻将运放的输出信号反馈到反相输入端(-)。
- 运放的非反相输入端(+)通常连接到地或参考电压源。
根据反馈原理,在稳定工作状态下,反向放大器的负反馈将使输入电流接近于零。根据欧姆定律,输入电流通过输入电阻产生的电压与输出电压成比例。
根据虚短和虚断点理想条件,可以得出反向放大器的放大倍数为:
放大倍数(Av) = -(Rf / Rin)
其中,Rf为反馈电阻,Rin为输入电阻。
由于反向放大器的特性,输出信号与输入信号之间存在180度的相位差,且放大倍数为负值。当输入信号为正时,输出信号为负;当输入信号为负时,输出信号为正。
反向放大器常用于信号放大、滤波、调节增益等应用。通过调整反馈电阻和输入电阻的比例,可以实现不同的放大倍数,并控制输出信号的幅度。

同向放大器是一种电子设备,常用于放大电信号。它的工作原理基于放大器中的晶体管或其他增益元件。
同向放大器的主要原理是将输入信号通过增益元件进行放大,并输出放大后的信号。增益元件通常是一个晶体管,例如双极性晶体管(BJT)或场效应晶体管(FET)。
在同向放大器中,输入信号被传送到晶体管的基极(对于BJT)或栅极(对于FET)。晶体管被偏置,以确保它在其工作区域内正常工作。当输入信号施加在晶体管上时,它会引起晶体管中的电流和电压的变化。
晶体管中的电流和电压变化会导致输出信号的放大。通过调整晶体管的工作点,可以控制输出信号的幅度和偏置。同向放大器通常采用反馈网络来提高线性度和稳定性。

电压跟随器(Voltage Follower)是一种放大器电路,它具有高输入阻抗、低输出阻抗和1倍的电压增益。它的主要功能是将输入电压信号复制到输出端,同时提供更低的输出阻抗。
电压跟随器的原理很简单:输入信号被连接到放大器的非反馈输入端,而输出信号则从放大器的输出端获取。由于没有反馈网络,所以该电路没有电压增益,信号只是通过放大器进行缓冲传递。这使得输出信号与输入信号具有相同的幅度,但输出阻抗远低于输入阻抗。
XPT2046

简介:XPT2046 是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。
XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 6V。
XPT2046 片内集成有一个温度传感器。 在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。
XPT2046 采用微小的封装形式:TSSOP-16,QFN-16 和 VFBGA-48。 工作温度范围为-40℃~+85℃。与 ADS7846、TSC2046、AK4182A 完全兼容。
在我们单片机上,已经内置了XPT2046控制器,我们只需要根据它的时序结构,就可以实现模数转换;
XPT2046时序
XPT2046 数据接口是串行接口,其典型工作时序如图 12 所示,图中展示的信号来自带有基本串行接口的单片机或数据信号处理器。(SPI通信)

片选信号CS保持低电平;对于DLCK,上升沿表示输入,下降沿表示输出;然后进行数据输入到DIN,最后将信号进行读出DOUT;
代码:
#include <REGX52.H>
#include<INTRINS.H>//引脚定义
sbit XPT2046_DIN=P3^4;
sbit XPT2046_CS=P3^5;
sbit XPT2046_DLCK=P3^6;
sbit XPT2046_DOUT=P3^7;//读出信号unsigned int XPT2046_ReadAD(unsigned char Command)
{unsigned char i;unsigned int Data=0;XPT2046_DLCK=0;//串行时钟置于低电平XPT2046_CS=0;//片选信号置于低电平for(i=0;i<8;i++){XPT2046_DIN=Command&(0x80>>i);//信号输入XPT2046_DLCK=1;//上升沿输入XPT2046_DLCK=0;}//这是一个12位的AD转换器,可输出12位的分辨率for(i=0;i<16;i++){XPT2046_DLCK=1;XPT2046_DLCK=0;//下降沿输出//需要通过不断的上升下降表示接受不同的数据位if(XPT2046_DOUT)Data|=0x8000>>i;}XPT2046_CS=1;//片选置于高电平return Data>>8;//返回8位的数字信号
}

这是从高位开始输入的;位7选择1;位6-4表示通道的选择,需要参考对应表;位3我们选择8位的转换分辨率的;位2选择单端输入方式;位1与位0选择低电平即可,不用用到总处于供电状态;
单端模式简单,在采样过程完成后,转换过程中可以关闭驱动开关,降低功耗。但这种模式的缺点是精度
直接受参考电压源的精度限制,同时由于内部驱动开关的导通电阻存在,导通电阻与触摸屏电阻的分压作用,也会带来测量误差
差分模式的优点是: +REF 和-REF 的输入分别直接接到 YP、 YN 上,可消除由于驱动开关的导通电阻引入的坐标测量误差。缺点是:无论是采样还是转换过程中,驱动开关都需要接通,相对单端模式而言,功耗增加了。
那么我们就有这样的信号模板
0xxx 1100

我们根据原理图,选出对应的输出配置:
#define XPT2046_VBAT 0xAC
#define XPT2046_AUX 0xEC
#define XPT2046_XP 0x9C
#define XPT2046_YP 0xDC
AD模数转换代码:
将分压电阻,热敏电阻,光敏电阻转换为对应的数字信号并显示于屏幕上;
XPT2046.h:
#ifndef __XPT2046_H__
#define __XPT2046_H__//输入端口地址的宏定义
#define XPT2046_VBAT 0xAC
#define XPT2046_AUX 0xEC
#define XPT2046_XP 0x9C
#define XPT2046_YP 0xDCunsigned int XPT2046_ReadAD(unsigned char Command);#endif
XPT2046.c
#include <REGX52.H>
#include<INTRINS.H>//引脚定义
sbit XPT2046_DIN=P3^4;
sbit XPT2046_CS=P3^5;
sbit XPT2046_DLCK=P3^6;
sbit XPT2046_DOUT=P3^7;//读出信号unsigned int XPT2046_ReadAD(unsigned char Command)
{unsigned char i;unsigned int Data=0;XPT2046_DLCK=0;XPT2046_CS=0;for(i=0;i<8;i++){XPT2046_DIN=Command&(0x80>>i);XPT2046_DLCK=1;XPT2046_DLCK=0;}for(i=0;i<16;i++){XPT2046_DLCK=1;XPT2046_DLCK=0;if(XPT2046_DOUT)Data|=0x8000>>i;}XPT2046_CS=1;return Data>>8;
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delayms(unsigned int x);#endif
Delay.c
void Delayms(unsigned int x) //@11.0592MHz
{unsigned char i, j;while(x--){i = 2;j = 199;do{while (--j);} while (--i);}
}
LCD1602.c
#include <REGX52.H>//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0//函数定义:
/*** @brief LCD1602延时函数,12MHz调用可延时1ms* @param 无* @retval 无*/
void LCD_Delay()
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}/*** @brief LCD1602写命令* @param Command 要写入的命令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)
{LCD_RS=0;LCD_RW=0;LCD_DataPort=Command;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief LCD1602写数据* @param Data 要写入的数据* @retval 无*/
void LCD_WriteData(unsigned char Data)
{LCD_RS=1;LCD_RW=0;LCD_DataPort=Data;LCD_EN=1;LCD_Delay();LCD_EN=0;LCD_Delay();
}/*** @brief LCD1602设置光标位置* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @retval 无*/
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{if(Line==1){LCD_WriteCommand(0x80|(Column-1));}else if(Line==2){LCD_WriteCommand(0x80|(Column-1+0x40));}
}/*** @brief LCD1602初始化函数* @param 无* @retval 无*/
void LCD_Init()
{LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//光标复位,清屏
}/*** @brief 在LCD1602指定位置上显示一个字符* @param Line 行位置,范围:1~2* @param Column 列位置,范围:1~16* @param Char 要显示的字符* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);
}/*** @brief 在LCD1602指定位置开始显示所给字符串* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param String 要显示的字符串* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=0;String[i]!='\0';i++){LCD_WriteData(String[i]);}
}/*** @brief 返回值=X的Y次方*/
int LCD_Pow(int X,int Y)
{unsigned char i;int Result=1;for(i=0;i<Y;i++){Result*=X;}return Result;
}/*** @brief 在LCD1602指定位置开始显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~65535* @param Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief 在LCD1602指定位置开始以有符号十进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:-32768~32767* @param Length 要显示数字的长度,范围:1~5* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{unsigned char i;unsigned int Number1;LCD_SetCursor(Line,Column);if(Number>=0){LCD_WriteData('+');Number1=Number;}else{LCD_WriteData('-');Number1=-Number;}for(i=Length;i>0;i--){LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');}
}/*** @brief 在LCD1602指定位置开始以十六进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~0xFFFF* @param Length 要显示数字的长度,范围:1~4* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i,SingleNumber;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){SingleNumber=Number/LCD_Pow(16,i-1)%16;if(SingleNumber<10){LCD_WriteData(SingleNumber+'0');}else{LCD_WriteData(SingleNumber-10+'A');}}
}/*** @brief 在LCD1602指定位置开始以二进制显示所给数字* @param Line 起始行位置,范围:1~2* @param Column 起始列位置,范围:1~16* @param Number 要显示的数字,范围:0~1111 1111 1111 1111* @param Length 要显示数字的长度,范围:1~16* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Length;i>0;i--){LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');}
}
LCD1602.h
#ifndef __LCD1602_H__
#define __LCD1602_H__//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);#endif
main.c
#include <REGX52.H>
#include"Delay.h"
#include"LCD1602.h"
#include"XPT2046.h"unsigned int ADValue;void main()
{LCD_Init();LCD_ShowString(1,1,"ADJ NTC GR");while(1){ADValue=XPT2046_ReadAD(XPT2046_XP); //读取AIN0,可调电阻LCD_ShowNum(2,1,ADValue,3);ADValue=XPT2046_ReadAD(XPT2046_YP); //读取AIN1,热敏电阻LCD_ShowNum(2,6,ADValue,3);ADValue=XPT2046_ReadAD(XPT2046_VBAT); //读取AIN2,光敏电阻LCD_ShowNum(2,11,ADValue,3);Delayms(100);//延迟100ms,会根据实况不断刷新数据}
}
AD的实例代码
产生PWM的方法

在这里,我们利用软件程序进行实现PWM,就是利用计数器和某一个值进行比较,根据比较结果输出一个对应的高低电平;像图中的,只要比较值大于计数器的值,那么就输出0,比较值大于等于计数器的值,那么就输出1;
DA信号输出的呼吸灯代码
Timer0.c
#include <REGX52.H>/*** @brief 定时器0初始化* @param 无* @reval 无*/
void Timer0Init(void) //100us @11.0592MHz
{TMOD &= 0xF0; //设置定时器模式TMOD |=0x01;TL0 = 0xA4; //设置定时初值TH0 = 0xFF; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时ET0=1; //允许T0中断EA=1; //CPU开放总中断PT0=0; //定时器0中断优先级
}
Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0Init();#endif
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif
Delay.c
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
main.c
#include <REGX52.H>
#include"Delay.h"
#include"Timer0.h"sbit DA=P2^1;unsigned char Counter,Compare;//计数值和比较值
unsigned char i;void main()
{Timer0Init();while(1){for(i=0;i<100;i++)//利用循环不断增加{Compare=i;Delay(10);//延长周期,不然LED闪烁过快}for(i=100;i>0;i--){Compare=i;Delay(10);}}
}//通过100us中断一次,将计数值与比较值比较,赋上对应的值
void Timer0_Routine() interrupt 1
{TL0 = 0xA4; TH0 = 0xFF; Counter++;Counter%=100;if(Counter<Compare){DA=1;}else{DA=0;}}

相关文章:
51单片机--AD/DA
AD/DA介绍 AD和DA是模拟信号和数字信号之间的转换过程。 AD,全称为模拟到数字(Analog-to-Digital),指的是将模拟信号转换为数字信号的过程。在AD转换中,模拟信号经过采样、量化和编码等步骤,被转换为离散的…...
网络安全-防御需知
目录 网络安全-防御 1.网络安全常识及术语 资产 漏洞 0day 1day 后门 exploit APT 2.什么会出现网络安全问题? 网络环境的开放性 协议栈自身的脆弱性 操作系统自身的漏洞 人为原因 客观原因 硬件原因 缓冲区溢出攻击 缓冲区溢出攻击原理 其他攻击…...
C#百万数据处理
C#百万数据处理 在我们经验的不断增长中不可避免的会遇到一些数据量很大操作也复杂的业务 这种情况我们如何取优化如何去处理呢?一般都要根据业务逻辑和背景去进行合理的改进。 文章目录 C#百万数据处理前言一、项目业务需求和开发背景项目开发背景数据量计算业务需…...
windows端口占用
1.查看当前端口被哪个进程占用了(进入到CMD中) netstat -ano|findstr "8990"输出结果为: TCP 127.0.0.1:8990 0.0.0.0:0 LISTENING 2700 我们发现8990端口被2700进程占用了 2.基于进程号找进程名称 tasklist|findstr "2700&qu…...
如何理解Diffusion
Diffusion算法可以有多个角度进行理解,不同的理解方式只是对目标函数进行了不同的解释。其主体思想是不变的,可以归纳为: 训练时通过图片逐步添加噪声,变为一个纯噪声。然后学习每一步的噪声。推理时给定一个随机噪声图片&#x…...
自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):使用少量示例和响应流式传输]
分类目录:《自然语言处理从入门到应用》总目录 使用少量示例 本部分的内容介绍了如何在聊天模型(Chat Models)中使用少量示例。关于如何最好地进行少量示例提示尚未形成明确的共识。因此,我们尚未固定任何关于此的抽象概念&#…...
Java在线OJ项目(三)、前后端交互API模块
Java在线OJ项目(三)、前后端交互API模块 1. 客户端向服务器请求所有题目 或者 单个题目前端获取所有题目获取一个题目 后端 2. 后端读取前端提交的代码,进行编译运行,返回结果前端提交代码后端处理 1. 客户端向服务器请求所有题目…...
项目——负载均衡在线OJ
目录 项目介绍开发环境所用技术项目宏观结构编写思路1. 编写compile_server1.1 编译模块编写1.2 运行功能1.3compile_runner 编译与运行1.4 编写compile_server.cpp调用compile_run模块,形成网络服务 2. 编写基于MVC的oj_server2.1 oj_server.cpp的编写2.2 oj_model…...
idea连接远程服务器上传war包文件
idea连接远程服务器&上传war包 文章目录 idea连接远程服务器&上传war包1. 连接服务器2.上传war包 1. 连接服务器 选择Tools -> Start SSH Session 添加配置 连接成功 2.上传war包 Tools -> Deployment -> Browse Remote Host 点击右侧标签,点击&…...
使用PyGWalker可视化分析表格型数据
大家好,可以想象一下在Jupyter Notebook中拥有大量数据,想要对其进行分析和可视化。PyGWalker就像一个神奇的工具,能让这项工作变得超级简单。它能获取用户的数据,并将其转化为一种特殊的表格,可以与之交互,…...
Visual C++中的虚函数和纯虚函数(以外观设计模式为例)
我是荔园微风,作为一名在IT界整整25年的老兵,今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候,就用JAVA实现同样的代码,然后再用对比的方法把C学会。 直接说虚函数…...
电子元器件选型与实战应用—01 电阻选型
大家好, 我是记得诚。 这是《电子元器件选型与实战应用》专栏的第一篇文章,今天的主角是电阻,在每一个电子产品中,都少不了电阻的身影,其重要性不言而喻。 文章目录 1. 入门知识1.1 基础1.2 常用品牌1.3 电阻的种类2. 贴片电阻标识2.1 三位数标注法2.2 四位数标注法2.3 小…...
javascript 模板引擎
使用场景 在实际开发中,一般都是使用动态请求数据来更新页面,服务器端通常返回json格式的数据,正常操作是我们手动的去拼装HTML,但麻烦且容易出错,因此出现了一些用模版生成HTML的的框架叫js模板引擎如:jq…...
【数据结构】带头+双向+循环链表(DList)(增、删、查、改)详解
一、带头双向循环链表的定义和结构 1、定义 带头双向循环链表,有一个数据域和两个指针域。一个是前驱指针,指向其前一个节点;一个是后继指针,指向其后一个节点。 // 定义双向链表的节点 typedef struct ListNode {LTDataType dat…...
接口自动化测试平台
下载了大神的EasyTest项目demo修改了下<https://testerhome.com/topics/12648 原地址>。也有看另一位大神的HttpRunnerManager<https://github.com/HttpRunner/HttpRunnerManager 原地址>,由于水平有限,感觉有点复杂~~~ 【整整200集】超超超…...
【物联网】微信小程序接入阿里云物联网平台
微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例,之前没有的点进去申请 2.点击产品,创建产品 3.产品名称自定义,按项目选择类型,节点类型选择之恋设备,联网方式W…...
PKG内容查看工具:Suspicious Package for Mac安装教程
Suspicious Package Mac版是一款Mac平台上的查看 PKG 程序包内信息的应用,Suspicious Package Mac版支持查看全部包内全部文件,比如需要运行的脚本,开发者,来源等等。 suspicious package mac使用简单,只需在选择pkg安…...
第16节:R语言医学分析实例:肺切除手术的Apriori关联规则分析
关联规则 肺切除手术的Apriori关联规则分析。 分析的目的是确定患有肺癌并需要接受肺切除术的患者的共病症状。 了解哪些症状是共病的可以帮助改善患者护理和药物处方。 分析类型是关联规则学习,通过探索变量之间的关联或频繁项集,尝试在大型数据集中找到见解和隐藏关系(H…...
ChatGPT+MidJourney 3分钟生成你的动画故事
chatgpt是真的火了,chatgpt产生了一个划时代的意义——自chatgpt起,AI是真的要落地了。 chatgpt能做的事情太多了,多到最初开发模型的程序员自己,也没法说得清楚chatgpt都能做啥,似乎只要你能想得到,它都有…...
在CSDN学Golang云原生(Kubernetes Pod调度)
一,NodeSelector定向调度 在 Kubernetes 中,可以使用 NodeSelector 字段来指定 Pod 调度到哪些节点上运行。NodeSelector 是一个键值对的 map,其中键是节点的标签名,值是标签值。具体步骤如下: 在节点上添加标签 首…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...
