学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集
文章目录
- 1.模数转换器(ADC)是什么?
- 手册说明:
- 2.STC32G单片机ADC使用原理
- 19.1.1 ADC控制寄存器(ADC_CONTR)
- 19.1.2 ADC配置寄存器(ADCCFG)
- 19.1.4ADC时序控制寄存器(ADCTIM)
- 19.3 ADC相关计算公式
- 3.编写最简单的ADC采集代码(查询&中断)
- P10的引脚去获取一个ADC代码
- 中断方式ADC的实现
- 3.编写最简单的ADC采集代码
- 总结
- 课后练习:
1.模数转换器(ADC)是什么?
参考资料:adc模数转换器的作用。
模数转换器即A/D转换器,或简称ADC(Analog-to-digital converter),通常是指一个将模拟信号转变为数字信号的电子元件。
模拟信号 -> 电压
数字信号 -> 0和1组成的二进制数
那我们思考下我们单片机是怎么把模拟信号转化为数字信号的呢?
原理演示视频:见B站《逐次逼近型ADC转换过程的动画演示》。
简单的总结一下ADC到底是一个什么样的原理?
如果没有超,就写1,如果超了就写0.
分别测量一下两组板子的高度,从大到小一级一级的给它比较上去
结束以后是221.
如果增加比较的位数,精度更高:
当然这个位数也不是能一直无限制的高下去,毕竟环境噪声也会对他有所千扰(精度太高吹回气就有误差了)。
一般的话12位到16位绰绰有余。这就是ADC的一个转化的一个过程,一位一位的逐次转化。
手册说明:
ADC模数转换、传统DAC实现
STC32G系列单片机内部集成了一个12位高速AD转换器。ADC的时钟频率为系统频率。分频再经过用户设置的分频系数进行再次分频(ADC的时钟频率范围为SYSclk/2/1~SYSclk/2/16)。
ADC转换结果的数据格式有两种:左对齐和右对齐。可方便用户程序进行读取和引用。
注意:ADC 的第15通道是专门测量内部 1.19V参考信号源的通道,参考信号源值出厂时校准为1.19V,由于制造误差以及测量误差,导致实际的内部参考信号源相比1.19V,大约有土1%的误差。如果用户需要知道每一颗芯片的准确内部参考信号源值,可外接精准参考信号源,然后利用ADC的第15通道进行测量标定。ADC_VRef+脚外接参考电源时,可利用ADC的第15通道可以反推ADC_VRef+脚外接参考电源的电压;如将ADC_VREF+短接到MCU-VCC,就可以反推 MCU-VCC的电压。
如果芯片有ADC 的外部参考电源管脚ADC_VRef+,则一定不能浮空,必须接外部参考电源或者直接连到VCC。
假设单片机的基准电压为2.96V,以5V为例,比较结果如下:
注意:使用ADC功能时有Vref引脚的单片机千万千万千万不能悬空,必须接外部参考电压源或者VCC!!!
2.STC32G单片机ADC使用原理
19.1.1 ADC控制寄存器(ADC_CONTR)
只有15个引脚,可以使用单片机的ADC,不是所有引脚都能使用ADC功能,只有指定的这个ADC的通道(1.19V参考),这15个才能进行ADC的一个转化。
ADC_EPWMT:使能PWM实时触发ADC功能。详情请参考16位高级PWM定时器章节,本节暂时略过,不详细探讨。
如ADC_CHS3:0写0000,就可以使用P1.0。
19.1.2 ADC配置寄存器(ADCCFG)
时钟建议选一个慢一点的时钟,设置的时间可以看{FADC=SYSclk/2/(SPEED+1)},不继续深入。实际上ADC大部分使用的情况都和时间没有太大影响。
时钟选择手册中的默认值就可以。
19.1.4ADC时序控制寄存器(ADCTIM)
一般建议均使用默认值。(注意:SMPDUTY一定不能设置小于01010B),即从参数图上看,建议往下不要再往上走。
12位ADC的转换时间固定为12个ADC工作时钟。
一个完整的ADC转换时间为:Tsetup+Tduty+ Thold+Tconvert、如下图所示:
19.3 ADC相关计算公式
19.3.1 ADC速度计算公式本次不涉及。
19.4.1 一般精度ADC参考线路图
19.4.2高精度ADC参考线路图
两者的主要区别在于VREF的处理,高精度的ADC有独立的基准2.5V电压源。
不建议使用串口电路,易受供电电压波动影响。
建议使用:ISP下载典型应用线路图中的USB接线电路,比串口更方便,更实用。
3.编写最简单的ADC采集代码(查询&中断)
官方查询方式例程为:
P1M0= 0x00;P1M1 = 0x01; //将IO口P1.0设置为高阻状态。
可以在STC-ISP中找到相应设置,选择接口和拟设置的端口模式,自动生成代码,可以直接复制。
三个主要的寄存器配置:
ADCTIM= 0x3f; //设置ADC内部时序 0x3f=0011 1111
ADCCFG= 0x0f; //设置ADC时钟为系统时钟/2/16/16
ADC_POWER = 1; //使能ADC模块
编写代码之前,需要看一下原理图(实验箱9.6_2022-12-05-SCH)上,我们的芯片ADC使用哪个引脚:
P10的引脚去获取一个ADC代码
以上节的12.IO中断为模板,复制并修改为13.ADC模拟电压采集.
\HARDWARE文件夹下新建ADC子目录,并新建adc.c和adc.h,把ADCH添加进我们的路径里。添加.h文件模板,在.c和主文件内引用。
我们把它我们的ADC也先初始化一下,添加函数声明及定义。
adc.h为:
#ifndef __ADC_H
#define __ADC_H#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"//------------------------引脚定义------------------------////------------------------变量声明------------------------////------------------------函数声明-----------------------//
void ADC_Init(void); //ADC初始化
u16 ADC_Read(u8 no ); //ADC读取指定通道的adc电压
#endif
adc.c为:
#include "adc.h"
#include "intrins.h"//========================================================================
// 函数名称:ADC_Init
// 函数功能:ADC初始化
// 入口参数:无
// 函数返回:无
// 当前版本: VER1.0
// 修改日期: 2023
// 当前作者:
// 其他备注:
//========================================================================
void ADC_Init(void) //ADC初始化
{P1M0 = 0x00; //设置P1.0引脚为高阻输入,参考点亮LED章节P1M1 = 0x01;ADCTIM= 0x3f; //设置ADC内部时序 0x3f=0011 1111ADCCFG= 0x2f; //设置ADC为数据右对齐。时钟为系统时钟/2/16/16 0x2f=0010 1111ADC_POWER = 1; //使能ADC模块
}//========================================================================
// 函数名称:ADC_Read
// 函数功能:读取指定通道的adc电压
// 入口参数: @no:通道0-15
// 函数返回:当前的12位adc数值
// 当前版本: VER1.0
// 修改日期: 2023
// 当前作者:
// 其他备注:
//========================================================================u16 ADC_Read(u8 no) //读取指定通道的adc电压
{u16 adcval; //adc数值保存变量ADC_CONTR &= 0xf0; //清空通道,要保持它的低4位为0ADC_CONTR |= no; //选择通道ADC_START = 1; //开启ADC通道_nop_();_nop_(); //空操作指令,比delay远远短while(!ADC_FLAG); //等待转换结束。ADC_FLAG:ADC转换结束标志位。当ADC完成一次转换后,硬件会自动将此位置1,并向CPU提出中断请求。ADC_FLAG = 0; //此标志位必须软件清零。adcval = (ADC_RES << 8) + ADC_RESL; //计算adc的数值,我们这边给它右对齐一下(最高4位恒定是0)return adcval;
}
在主函数里面,去循环的读取那个adc的数值。新建u16变量,保存adc的数值:u16 ADC_VAL; //ADC的数值
demo.c:
#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h" //调用头文件
#include "beep.h"
#include "tim0.h"
#include "exit.h"
#include "adc.h"#define MAIN_Fosc 24000000UL //定义主时钟char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";bit TIM_10MS_Flag; //10ms标志位void sys_init(); //函数声明
void delay_ms(u16 ms);void Timer0_Isr(void);u16 Time_CountDown = 0; //全局变量,文件里所有地方都可以调用 大于255定义u16void main() //程序开始运行的入口
{u16 ADC_VAL; //ADC的数值sys_init(); //USB功能+IO口初始化usb_init(); //usb库初始化Timer0_Init(); //定时器0初始化ADC_Init();EA = 1; //CPU开放中断,打开总中断。while(1) //死循环{delay_ms(2); //让USB稳定下来
// if( DeviceState != DEVSTATE_CONFIGURED ) //
// continue;if( bUsbOutReady ){usb_OUT_done();}if(TIM_10MS_Flag == 1) //将需要延时的代码部分放入{TIM_10MS_Flag = 0; //TIM_10MS_Flag 变量清空置位}ADC_VAL = ADC_Read(0); //保存ADC的数值,使用P10,即取0printf("当前ADC数\XFD值:%d\r\n",(int)ADC_VAL); //打印ADC的数值,直接打印会出乱码,数后面需要加\XFD}
}void sys_init() //函数定义
{WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快EAXFR = 1; //扩展寄存器(XFR)访问使能CKCON = 0; //提高访问XRAM速度P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口P3M0 = 0x00;P3M1 = 0x00;P3M0 &= ~0x03;P3M1 |= 0x03;//设置USB使用的时钟源IRC48MCR = 0x80; //使能内部48M高速IRCwhile (!(IRC48MCR & 0x01)); //等待时钟稳定USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。USBCON = 0x90;
}void delay_ms(u16 ms) //unsigned int
{u16 i;do{i = MAIN_Fosc/6000;while(--i);}while(--ms);
}void Timer0_Isr(void) interrupt 1 //1ms进来执行一次,无需其他延时,重复赋值
{static timecount = 0;SEG_LED_Show(); //数码管刷新timecount++; //1ms+1if(timecount>=10) //如果这个变量大于等于10,说明10ms到达{timecount = 0;TIM_10MS_Flag = 1; //10ms到了}
}
编译下载,串口持续打印0,1。
根据原理图,可以按下按键改变adc的值。按下按键,得到的打印结果与原理图一致。
这里使用的源为高精度基准电压2.5V,默认焊接R79,如图:
也可以用万用表的电压档,测量ADC的实际基准电压,红正,黑接地。
表上显示2.498伏非常的稳定,这个就是基准电压源。
再测一下ADC的数值,测量R27的电阻边上,测量得到读数与原理图可以对照。
也可以用计算器来换算一下,看看电压是否正确:
可以根据这个反推出一个(引脚上的)电源电压。
增加函数:u16 ADC_CAL_Voltage(u16 num)
u16 ADC_CAL_Voltage(u16 num)
{return num*2.5*1000/4096;
}
将读取和打印代码移入延时代码段内,实现10ms检测打印1次:
if(TIM_10MS_Flag == 1) //将需要延时的代码部分放入{TIM_10MS_Flag = 0; //TIM_10MS_Flag 变量清空置位ADC_VAL = ADC_Read(0); //保存ADC的数值,使用P10,即取0printf("当前ADC数\xfd值:%d\t%d\r\n",(int)ADC_VAL,ADC_CAL_Voltage(ADC_VAL)); //打印ADC的数值,直接打印会出乱码,数后面需要加\XFD}}
编译,下载。不点击按钮时,显示0,按下按钮,显示256,156mv。
中断方式ADC的实现
只是多了一个EADC的这个操作:EADC=1;
我们如果需要在中断里面一直循环,那我们就一直开启。增加void ADC_Init(void)和void ADC_Isr() interrupt 5:
void ADC_Init(void) //ADC初始化
{P1M0 = 0x00; //设置P1.0引脚为高阻输入,参考点亮LED章节P1M1 = 0x01;ADCTIM= 0x3f; //设置ADC内部时序 0x3f=0011 1111ADCCFG= 0x2f; //设置ADC为数据右对齐。时钟为系统时钟/2/16/16 0x2f=0010 1111ADC_POWER = 1; //使能ADC模块EADC = 1; //开启中断模式
}void ADC_Isr() interrupt 5
{ADC_FLAG = 0; //此标志位必须软件清零,清空读取标志位adc_val = = (ADC_RES << 8) + ADC_RESL; //读取adc的数值,我们这边给它右对齐一下(最高4位恒定是0)ADC_START = 1; //开启ADC通道}
3.编写最简单的ADC采集代码
这里有一个问题,ADC_Init查询模式和中断模式都进行了定义且同名,编译会出现错误。需要采用条件编译来规避。
HARDWARE\ADC\adc.c(75): error C53: redefinition of 'ADC_Init': function already defined
引入if预编译模板:
#define ADC_CHECK 0 //查询
#define ADC_Isr 1 //中断#define ADC_Func ADC_CHECK#if ADC_Func == ADC_CHECK
//adc查询的相关定义
#elif ADC_Func == ADC_Isr
//adc中断的相关定义
#else#endif
将模板插入adc.h,并修改:
#ifndef __ADC_H
#define __ADC_H#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"#define ADC_CHECK 0 //查询
#define ADC_Isr 1 //中断#define ADC_Func ADC_CHECK //最终选择#if ADC_Func == ADC_CHECK//adc查询的相关定义
#elif ADC_Func == ADC_Isr//adc中断的相关定义
#else#endif//------------------------引脚定义------------------------////------------------------变量声明------------------------//extern u16 adc_val; //中断获取到的ADC数值
//------------------------函数声明-----------------------//
void ADC_Init(void); //ADC初始化
u16 ADC_Read(u8 no ); //ADC读取指定通道的adc电压
u16 ADC_CAL_Voltage(u16 num);#endif
adc的这个数值非常重要,比如说报警的时候,假设我们检测外部有没有着火。
当这个adc的数值非常大(假设火越大,传感器出来的电压也越大),表示外面已经着火的时候,这个时候就要立马执行灭火,要不然的话,火势一起来就已经灭不掉火了
。
编译,下载。运行时,按下按钮没有反应。
排查:先跳转到初始化,发现ADC_Init跳转到了查询代码段,实际上要用的是中断的初始化,然后我们才可以进入。
需要把头文件中的查询换成中断:#define ADC_Func ADC_Isr //编译选择
修改后的代码如下:
adc.c:
#include "adc.h"
#include "intrins.h"u16 adc_val; //获取到的ADC数值#if ADC_Func == ADC_CHECK//adc查询的相关定义//========================================================================// 函数名称:ADC_Init// 函数功能:ADC初始化// 入口参数:无// 函数返回:无// 当前版本: VER1.0// 修改日期: 2023// 当前作者:// 其他备注://========================================================================void ADC_Init(void) //ADC初始化{P1M0 = 0x00; //设置P1.0引脚为高阻输入,参考点亮LED章节P1M1 = 0x01;ADCTIM= 0x3f; //设置ADC内部时序 0x3f=0011 1111ADCCFG= 0x2f; //设置ADC为数据右对齐。时钟为系统时钟/2/16/16 0x2f=0010 1111ADC_POWER = 1; //使能ADC模块}//========================================================================// 函数名称:ADC_Read// 函数功能:读取指定通道的adc电压// 入口参数: @no:通道0-15// 函数返回:当前的12位adc数值// 当前版本: VER1.0// 修改日期: 2023// 当前作者:// 其他备注://========================================================================u16 ADC_Read(u8 no) //读取指定通道的adc电压{u16 adcval; //adc数值保存变量ADC_CONTR &= 0xf0; //清空通道,要保持它的低4位为0ADC_CONTR |= no; //选择通道ADC_START = 1; //开启ADC通道_nop_();_nop_(); //空操作指令,比delay远远短while(!ADC_FLAG); //等待转换结束。ADC_FLAG:ADC转换结束标志位。当ADC完成一次转换后,硬件会自动将此位置1,并向CPU提出中断请求。ADC_FLAG = 0; //此标志位必须软件清零。adcval = (ADC_RES << 8) + ADC_RESL; //计算adc的数值,我们这边给它右对齐一下(最高4位恒定是0)return adcval;}#elif ADC_Func == ADC_Isr//adc中断的相关定义//========================================================================// 函数名称:ADC_Init// 函数功能:中断的ADC初始化// 入口参数:无// 函数返回:无// 当前版本: VER1.0// 修改日期: 2023// 当前作者:// 其他备注://========================================================================void ADC_Init(void) //ADC初始化{P1M0 = 0x00; //设置P1.0引脚为高阻输入,参考点亮LED章节P1M1 = 0x01;ADCTIM= 0x3f; //设置ADC内部时序 0x3f=0011 1111ADCCFG= 0x2f; //设置ADC为数据右对齐。时钟为系统时钟/2/16/16 0x2f=0010 1111ADC_POWER = 1; //使能ADC模块EADC = 1; //打开中断ADC_START = 1; //开启ADC通道}//========================================================================// 函数名称:ADC_iSR// 函数功能:// 入口参数: @// 函数返回:// 当前版本: VER1.0// 修改日期: 2023// 当前作者:// 其他备注://========================================================================void ADC_iSR()interrupt 5 //这里不能使用ADC_Isr(),会与预定义“#define ADC_Isr 1 //中断 ”混淆{ADC_FLAG = 0; //此标志位必须软件清零,清空读取标志位adc_val = (ADC_RES << 8) + ADC_RESL; //读取adc的数值,我们这边给它右对齐一下(最高4位恒定是0)ADC_START = 1; //开启ADC通道}#else#endif//========================================================================
// 函数名称:ADC_CAL_Voltage
// 函数功能:将ADC数值换算成电源电压
// 入口参数: @num:ADC的数值,取值范围0-4095
// 函数返回:电源电压 单位mv
// 当前版本: VER1.0
// 修改日期: 2023
// 当前作者:
// 其他备注:
//========================================================================
u16 ADC_CAL_Voltage(u16 num)
{return num*2.5*1000/4096;
}
adc.h:
#ifndef __ADC_H
#define __ADC_H#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"#define ADC_CHECK 0 //查询
#define ADC_Isr 1 //中断#define ADC_Func ADC_Isr //编译选择//------------------------引脚定义------------------------////------------------------变量声明------------------------//extern u16 adc_val; //中断获取到的ADC数值
//------------------------函数声明-----------------------//
void ADC_Init(void); //ADC初始化
u16 ADC_Read(u8 no); //ADC读取指定通道的adc电压
u16 ADC_CAL_Voltage(u16 num);#endif
demo.c:
#include "COMM/stc.h" //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h" //调用头文件
#include "beep.h"
#include "tim0.h"
#include "exit.h"
#include "adc.h"#define MAIN_Fosc 24000000UL //定义主时钟char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";bit TIM_10MS_Flag; //10ms标志位void sys_init(); //函数声明
void delay_ms(u16 ms);void Timer0_Isr(void);u16 Time_CountDown = 0; //全局变量,文件里所有地方都可以调用 大于255定义u16void main() //程序开始运行的入口
{//u16 ADC_VAL; //ADC的数值sys_init(); //USB功能+IO口初始化usb_init(); //usb库初始化Timer0_Init(); //定时器0初始化ADC_Init();EA = 1; //CPU开放中断,打开总中断。while(1) //死循环{delay_ms(2); //让USB稳定下来
// if( DeviceState != DEVSTATE_CONFIGURED ) //
// continue;if( bUsbOutReady ){usb_OUT_done();}if(TIM_10MS_Flag == 1) //将需要延时的代码部分放入{TIM_10MS_Flag = 0; //TIM_10MS_Flag 变量清空置位//ADC_VAL = ADC_Read(0); //保存ADC的数值,使用P10,即取0printf("当前ADC数\xfd值:%d\t%dmv\r\n",(int)adc_val,ADC_CAL_Voltage(adc_val)); //打印ADC的数值,直接打印会出乱码,数后面需要加\XFD,单位mv}}
}void sys_init() //函数定义
{WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快EAXFR = 1; //扩展寄存器(XFR)访问使能CKCON = 0; //提高访问XRAM速度P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口P2M1 = 0x00; P2M0 = 0x00; //设置为准双向口P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口P4M1 = 0x00; P4M0 = 0x00; //设置为准双向口P5M1 = 0x00; P5M0 = 0x00; //设置为准双向口P6M1 = 0x00; P6M0 = 0x00; //设置为准双向口P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口P3M0 = 0x00;P3M1 = 0x00;P3M0 &= ~0x03;P3M1 |= 0x03;//设置USB使用的时钟源IRC48MCR = 0x80; //使能内部48M高速IRCwhile (!(IRC48MCR & 0x01)); //等待时钟稳定USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。USBCON = 0x90;
}void delay_ms(u16 ms) //unsigned int
{u16 i;do{i = MAIN_Fosc/6000;while(--i);}while(--ms);
}void Timer0_Isr(void) interrupt 1 //1ms进来执行一次,无需其他延时,重复赋值
{static timecount = 0;SEG_LED_Show(); //数码管刷新timecount++; //1ms+1if(timecount>=10) //如果这个变量大于等于10,说明10ms到达{timecount = 0;TIM_10MS_Flag = 1; //10ms到了}
}
总结
1.了解ADC的位数、引脚、基准电压、等关键名词。
2.学会ADC的原理,学会用法和电源的换算公式。
课后练习:
简易电压表:
1.用前4位数码管显示ADC的数值
2.用后四位数码管显示最终电压。
3.电压大于2.2V,蜂鸣长响,表示快要到达上限
相关文章:
学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集
文章目录 1.模数转换器(ADC)是什么?手册说明: 2.STC32G单片机ADC使用原理19.1.1 ADC控制寄存器(ADC_CONTR)19.1.2 ADC配置寄存器(ADCCFG)19.1.4ADC时序控制寄存器(ADCTIM)19.3 ADC相…...
OpenCV实现“蓝线挑战“特效
原理 算法原理可以分为三个流程: 1、将视频(图像)从(顶->底)或(左->右)逐行(列)扫描图像。 2、将扫描完成的行(列)像素重新生成定格图像…...
容器管理工具 Docker生态架构及部署
目录 一、Docker生态架构 1.1 Docker Containers Are Everywhere 1.2 生态架构 1.2.1 Docker Host 1.2.2 Docker daemon 1.2.3 Registry 1.2.4 Docker client 1.2.5 Image 1.2.6 Container 1.2.7 Docker Dashboard 1.3 Docker版本 二、Docker部署 2.1 使用YUM源部署…...
js判断数据类型的方法
简单数据类型用:typeof, // 可以直接typeof空格接数据的方式,也可以typeof(数据)的方式使用 console.log(typeof ""); //string(检验字符串没问题) console.log(typeof 1); //number(检验数字没问题) console.log(typ…...
达梦数据库随系统开机自动启动脚本
写一个脚本,实现在服务器开机后自动启动达梦数据库的功能。 1. 在/etc/init.d/目录下,编写脚本,并将脚本命名为startdm.sh。脚本内容实现如下: #!/bin/bash #chkconfig:2345 80 90 #decription:启动达梦# 切换到 dmdba 用户 su …...
Python开发利器之VS Code
Python官方提供了一个Python集成开发环境(IDE): IDLE (Integrated Development and Learning Environment)。 它提供了一个图形用户界面,可以让开发者编写、调试和执行Python程序。IDLE包含Python解释器、代码编辑器、调试器和文件…...
【Axure视频教程】输入框控制滑动评分条
今天教大家在Axure里如何制作输入框控制滑动评分条的原型模板,可以通过鼠标左右拖动滑块,也可以点击条形让滑块移动到指定位置,标签和输入框里会返回具体的分值,分值由滑块所在的位置动态计算而成;也可以在输入框里输入…...
【学习笔记】[AGC064C] Erase and Divide Game
有点难😅,看到比自己低一级的选手场切这道题就更绷不住了😇 考虑 从低到高位 建立 trie \text{trie} trie 树,但是因为是对反串建立的,所以编号连续的点在 trie \text{trie} trie 树上的位置是分散的😅 …...
算法通关村-----数组中元素出现次数问题
数组中出现次数超过一半的数字 问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。详见剑指offer39 问题分析 最直接的方式就是使用hashMap,遍历给定数组,…...
Qt-键盘消息的传递-键盘消息的获取-C++
文章目录 1.概述2.焦点3.强制获取键盘消息4.键盘常用组合方法5.总结 1.概述 QKeyEvent 类用来描述一个键盘事件。当键盘按键被按下或者被释放时,键盘事件便会被发送给拥有键盘输人焦点的部件。 QKeyEvent 的 key() 函数可以获取具体的按键,对于 Qt 中给…...
数据结构与算法(五)--链表概念以及向链表添加元素
一、前言 今天我们学习另一种非常重要的线性数据结构–链表,之前我们已经学习了三种线性数据结构,分别是动态数组,栈和队列。其中队列我们额外学习了队列的另一种实现方式–循环队列。其实我们自己实现过前三个数据结构就知道,它…...
计算机视觉与深度学习-图像分割-视觉识别任务02-目标检测-【北邮鲁鹏】
目录标题 参考目标检测定义深度学习对目标检测的作用单目标检测多任务框架多任务损失预训练模型姿态估计 多目标检测问题滑动窗口(Sliding Window)滑动窗口缺点 AdaBoost(Adaptive Boosting)参考 区域建议 selective search 思想慢…...
Flink——Flink检查点(checkpoint)、保存点(savepoint)的区别与联系
Flink checkpoint Checkpoint是Flink实现容错机制最核心的功能,能够根据配置周期性地基于Stream中各个Operator的状态来生成Snapshot,从而将这些状态数据定期持久化存储下来,从而将这些状态数据定期持久化存储下来,当Flink程序一…...
[篇五章五]-如何禁用 Windows Defender-我的创作纪念日
################################################## 目录 禁用掉烦人的 Windows Defender 在本地组策略编辑器中禁用 Windows Defende 关闭 Microsoft Defender 防病毒 禁止 Defender 开机自动运行 重新激活 Windows Defender #######################################…...
什么情况下使用微服务?
单体架构图参考网络: 1. 什么是单体应用 单体应用就是将应用程序的所有功能都打包成一个独立的单元,最终以一个WAR包或JAR包存在,没有外部的任何依赖,里面包含DAO、Service、UI等所有的逻辑。 优点: 1&…...
【Linux】Ubuntu美化主题【教程】
【Linux】Ubuntu美化主题【教程】 文章目录 【Linux】Ubuntu美化主题【教程】1. 安装优化工具Tweak2.下载自己喜欢的主题3. 下载自己喜欢的iconReference 1. 安装优化工具Tweak 首先安装优化工具Tweak sudo apt-get install gnome-tweak-tool安装完毕后在菜单中打开Tweak 然后…...
spring-boot2.x,使用EnableWebMvc注解导致的自定义HttpMessageConverters不可用
在json对象转换方面,springboot默认使用的是MappingJackson2HttpMessageConverter。常规需求,在工程中使用阿里的FastJson作为json对象的转换器。 FastJson SerializerFeatures WriteNullListAsEmpty :List字段如果为null,输出为[],而非nu…...
2023-09-20 Android CheckBox 让文字显示在选择框的左边
一、CheckBox 让文字在选择框的左边 ,在布局文件里面添加下面一行就可以。 android:layoutDirection"rtl" 即可实现 android:paddingStart"10dp" 设置框文间的间距 二、使用的是left to right <attr name"layoutDirection">&…...
目标检测YOLO实战应用案例100讲-基于改进YOLOv5的口罩人脸检测
目录 前言 国内外研究现状 目标检测研究发展 国内外口罩人脸检测研究现状...
CentOS7 yum安装报错:“Could not resolve host: mirrorlist.centos.org; Unknown error“
虚拟机通过yum安装东西的时候弹出这个错误: 1、查看安装在本机的网卡 网卡ens33处于disconnected的状态 nmcli d2、输入命令: nmtui3、选择网卡,然后点击edit 4、移动到Automatically connect按空格键选择,然后移动到OK键按空格…...
关于token续签
通常我们会对token设置一个有效期,于是,就有了token续签的问题。由于token并没有续时机制,如果不能及时的替换掉过期的token,可能会拦截用户正常的请求,用户只能重新登录,如果提交的信息量很大,…...
淘宝分布式文件存储系统( 二 ) -TFS
淘宝分布式文件存储系统( 二 ) ->>TFS 目录 : 大文件存储结构哈希链表的结构文件映射原理及对应的API文件映射头文件的定义 大文件存储结构 : 采用块(block)文件的形式对数据进行存储 , 分成索引块,主块 , 扩展块 。所有的小文件都是存放到主块中的 ,扩展块…...
Java中synchronized:特性、使用、锁机制与策略简析
目录 synchronized的特性互斥性可见性可重入性 synchronized的使用方法synchronized的锁机制常见锁策略乐观锁与悲观锁重量级锁与轻量级锁公平锁与非公平锁可重入锁与不可重入锁自旋锁读写锁 synchronized的特性 互斥性 synchronized确保同一时间只有一个线程可以进入同步块或…...
记一次clickhouse手动更改分片数异常
背景:clickhouse中之前是1分片1副本,随着数据量增多,想将分片数增多,于是驻场人员手动添加了分片数的节点信息 <clickhouse><!-- 集群配置 --><clickhouse_remote_servers><feihuang_ck_cluster><sha…...
深度学习论文: ISTDU-Net:Infrared Small-Target Detection U-Net及其PyTorch实现
深度学习论文: ISTDU-Net:Infrared Small-Target Detection U-Net及其PyTorch实现 ISTDU-Net:Infrared Small-Target Detection U-Net PDF: https://doi.org/10.1109/LGRS.2022.3141584 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTo…...
图像识别-YOLO V8安装部署-window-CPU-Pycharm
前言 安装过程中发现,YOLO V8一直在更新,现在是2023-9-20的版本,已经和1月份刚发布的不一样了。 eg: 目录已经变了,旧版预测:在ultralytics/yolo/v8/下detect 新版:ultralytics/models/yolo/detect/predict.py 1.安…...
js禁用F1至F12、禁止缩放、取消选中并且取消右键操作、打印、拖拽、鼠标点击弹出自定义信息、禁用开发者工具js
禁用js //禁止缩放 //luwenjie hualun window.addEventListener(mousewheel, function (event) {if (event.ctrlKey true || event.metaKey) {event.preventDefault();} }, {passive: false});//firefox window.addEventListener(DOMMouseScroll, function (event) {if (even…...
Zabbix5.0_介绍_组成架构_以及和prometheus的对比_大数据环境下的监控_网络_软件_设备监控_Zabbix工作笔记
z 这里Zabbix可以实现采集 存储 展示 报警 但是 zabbix自带的,展示 和报警 没那么好看,我们可以用 grafana进行展示,然后我们用一个叫睿象云的来做告警展示, 会更丰富一点. 可以看到 看一下zabbix的介绍. 对zabbix的介绍,这个zabbix比较适合对服务器进行监控 这个是zabbix的…...
百度SEO优化TDK介绍(分析下降原因并总结百度优化SEO策略)
TDK是SEO优化中很重要的部分,包括标题(Title)、描述(Description)和关键词(Keyword),为百度提供网页内容信息。其中标题是最重要的,应尽量突出关键词,同时描述…...
搭建自动化 Web 页面性能检测系统 —— 设计篇
页面性能对于用户体验、用户留存有着重要影响,当页面加载时间过长时,往往会伴随着一部分用户的流失,也会带来一些用户差评。性能的优劣往往是同类产品中胜出的影响因素,也是一个网站口碑的重要评判标准。 一、名称解释 前端监控…...
建设与管理局网站/sem竞价代运营
1.常用事件 onload:当页面中的所有的标签,文档,图片等资源加载完毕后会触发onload事件 onclick:鼠标单击事件 ondblclick:鼠标双击事件 onmousedown:鼠标按下事件 …...
网站建设公司怎么选/外贸网站搭建推广
【当当、京东、天猫、亚马逊、新华书店等均有销售】目 录第一部分:线程并发基础第1章 概念部分 11.1 CPU核心数、线程数 (主流cpu。线程数的大体情况说一下) 11.2 CPU时间片轮转机制 21.3 什么是进程和什么是线程 41.4 进程和线程的比較 51.5 什么是并…...
wordpress 热门头条/百度seo公司报价
除了自定义调色板之外,您还可以创建Flowable Designer的扩展,以便执行验证并将信息从图中保存到Eclipse工作区中的自定义资源中。这里有内置的扩展点,本节介绍如何使用它们。 ExportMarshaller函数最近被重新引入。我们仍在研究验证功能。下面…...
环境没有tomcat怎么演示自己做的网站/优秀的软文广告案例
Beautiful Soup 4.2.0 简介:Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. 今天偶然发现了,官方还有:中文文档 目录 Beautiful Soup 4.2.0 快速入门…...
对网站主要功能界面进行赏析/网站推广关键词工具
(1)计算器的定义为:接受用户输入指令不数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或储存成有用的信息;(2)计算机的五大单元包括:输入单元、 输出单元、CPU内…...
网站积分规则设计/网络推广工作是做什么的
“一种难以名状的感情涌上我的心头” 这是小说中经常用到的语言,这也是我们经常遇到的情况:许多事情明明知道,却不知道如何用语言正确的表达出来。 “说起来滔滔不绝,却不能将其写出来” 这也是一个常见的情况,许多人的…...