51单片机模数转换ADC原理与代码一

51单片机模数转换ADC原理与代码一

1.概述

这篇文章是模数转换的入门文章,这篇文章主要介绍模数的概念、原理、核心指标、专业术语,以及一个模数转换的实例代码实现检测电位器的数值变化。

2.ADC介绍

2.1.ADC概念

ADC(Analog-to-Digital Converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。

Analog: 直接翻译过来就是模拟,也就是说是模拟信号,这里我们就要了解一个概念了什么是模拟信号?其实并不难理解,模拟信号就是将电路模拟成信号,电信号有电压、电流等因素等等;
Digital:直接翻译过来就是数字的,也就是数字信号,那我们又要了解一个概念了,什么是数字信号?其实它比模拟信号还要容易理解,将电路的信号模拟成数字信号,通常情况下高电平就表示1,低电平就表示0;
Converter:当我们了解了前面两个概念之后,您或许有一些似懂非懂的意思了,那么这翻译过来就是模拟信号转变成数字信号呗!没错就是这样,我们通过相应的采集装置,采集到的值为电压的大小,此时我们就需要用到我们的模数转换来将它转换成数字信号了。

2.2.ADC指标

ADC有一些核心的性能指标,这些指标为我们选择ADC模块提供了参考,主要的指标如下。

  • 输出位数

    • AD采集共有2n个刻度,也就是说如果一个8位的AD,它最终输出的数值是在0~255之间的值。
  • 分辨率

    • 对输入信号变化的敏感度,用ADC转换器输出位数来表示,例如输出位数位8位,输出量的变化范围是0~255,当参考电压为5V,转换器对输入模拟电压的分辨率计算公式为 5V / 255 = 18.6mV
  • 转换速度

    • 完成一次AC转换所需要花费的时钟周期的倒数,也就是1个周期内可以完成多少次AD转换
  • 参考电压

    • 通过参考电压计算分辨率

2.3.ADC寄存器

ADC寄存器介绍

这里没有介绍ADC内部工作原理,是因为我们侧重点是偏向实操,操作ADC实现模数转换,在真实的场景应用它完成一些工作,而不是研究他的原理,因此这里不介绍过多的理论知识。
了解了ADC概念和指标之后就有了一个初步的认识,再了解ADC寄存器就可以操作ADC了。ADC寄存器的设置因型号不同而有差异,要查看实际型号对应的说明书。任何型号的AD转换器只是寄存器设计有点差异,操作方式都是一样的,因此掌握了一款型号就可以操作其他型号。
这里主要以STC12C2052AD型号的说明书做讲解。

在这里插入图片描述
上图中是ADC转换器内部结构图,下面详细介绍下ADC_CONTR Register 寄存器各个位如何配置。

在这里插入图片描述
ADC_POWER:
是单片机开启ADC 电源控制位;0:关闭ADC 电源;1:打开A/D转换器电源

1.建议进入空闲模式和掉电模式前,将ADC电源关闭,可降低功耗。
2.启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。
3.初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。

SPEED1,SPEED0:
用来控制单片机ADC的转换速度

SPEED1SPEED0ADC时钟周期N个时钟转换1次
001080
01810
10540
11270

ADC_FLAG:
转换标志位:每次当AD转换结束完成后,这个位就会自动置"1",需要手动将这一位重新置"0"。

ADC_START:
转换启动位:每当手动将其置"1"后,AD转换开始,当AD转换结束后这个位就会自动置"0"。

CHS2/CHS1/CHS0:
选择采集信号输入端口

CHS2CHS1CHS0ADC输入通道
000ADC0(P1^0)
001ADC0(P1^1)
010ADC0(P1^2)
011ADC0(P1^3)
100ADC0(P1^4)
101ADC0(P1^5)
110ADC0(P1^6)
111ADC0(P1^7)

P1M0、P1M1
设置单片机P1的IO口状态,P1口如果要作为AD使用需要将它设置为高阻或者开漏模式。

P1M0P1M1I/O 口模式
00准双向口(传统8051 IO口模式,弱上拉),灌电流可达20mA,拉电流为270uA,由于制造误差,实际为270uA~150uA
01推挽输出(强上拉输出,可达20mA,要加限流电阻)
10高阻输入(电流既不能流入也不能流出)
11开漏(Open Drain),内部上拉电阻断开。开漏模式既可读外部状态也可对外输出(高电平或低电平)。如要正确读外部状态或需要对外输出高电平,需外加上拉电阻,否则读不到外部状态,也对外输不出高电平。

中断允许寄存器IE
该寄存器用来控制单片机的各种中断。在此只介绍与ADC相关的寄存位。
在这里插入图片描述
EA: CPU中断开放标志
EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。
EA=1,CPU开放中断,
EA=0,CPU屏蔽所有中断申请。

EADC_SPI : A/D转换中断允许位和SPI中断允许位
EADC_SPI的作用就是用来控制AD转换的开启与停止。
EADC_SPI=1,允许A/D转换中断和SPI中断,
EADC_SPI=0,禁止A/D转换中断和SPI中断。

ADC寄存器配置

上面把ADC寄存器所有的内容都介绍完了,了解了他们的作用可能在代码中还是不会配置,因此这里专门介绍下如何使用寄存器。
在这里插入图片描述
ADC_CONTR Register 寄存器共有8个位是按位寻址,将其转换成对应的十六进制数就可以按位设置。
下面举几个例子介绍使用方法,其他的参数配置方法都相同。

ADC_START设置

含义:转换启动位:每当手动将其置"1"后,AD转换开始,当AD转换结束后这个位就会自动置"0"。
开启转换:ADC_START在寄存器中从右向左数是第四位,对应十六进制就是 0x08,转换为二进制就是 0000 1000 第四位为1表示开启转换

ADC_POWER:

含义:是单片机开启ADC 电源控制位;0:关闭ADC 电源;1:打开A/D转换器电源
开启ADC电源:ADC_POWER在寄存器中从右向左数是第八位,对应十六进制就是 0x80,转换为二进制就是 1000 0000 第八位为1表示开启ADC电源

3.ADC代码

ADC代码比较简单,可以分装到函数中,使用的时候直接调用函数即可。ADC转换代码分装成两个函数

  • ADC初始化函数
    • 设置采集信号输入端口,例如P1.0采集数据。
    • 设置采集速度
    • 启动ADC电源
  • ADC读取输出数据函数
    • ADC转换开始
    • 检测转换是否结束
    • 将转换标志位置0
    • 输出转换数据
初始化ADC函数

main函数中调用adcInit(0,ADC_SPEEDH,0x01,0x00); ADC初始化函数,工作流程如下

  • ADC_CONTR |= (inIOnum & 0x07); 传入0,设置P1.0引脚为数据采集
  • ADC_CONTR = speed; 传入ADC_SPEEDH,设置中高转换速度
  • P1M0 = p1m0; 传入0X01,设置P1.0引脚为高阻状态
  • ADC_CONTR |= ADC_POWER; 开启ADC转换电源
/*定义ADC寄存器*/
#define ADC_POWER   0x80            //ADC 电源打开
#define ADC_FLAG    0x10            //ADC 打开转换标志位
#define ADC_START   0x08            //ADC 开始转换
#define ADC_SPEEDLL 0x00            //420 设置低速转换
#define ADC_SPEEDL  0x20            //280 设置低中速转换
#define ADC_SPEEDH  0x40            //140 设置中高速转换
#define ADC_SPEEDHH 0x60            //70  设置低高速转换/*
函数名:8位A/D转换初始化函数
参  数:
inDate:采集数据端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
speed: 设置转换速度
ioMode:设置IO口模式,P1口如果要作为AD使用需要将它设置为高阻或者开漏模式。
返回值:无
功  能:开启ADC功能并设置ADC的输入端口
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
*/
void adcInit (unsigned char inIOnum, unsigned char speed, unsigned char p1m0, unsigned char p1m1){ADC_CONTR |= (inIOnum & 0x07); //选择A/D当前输入信号的通道,当前选择是P1.0(P1.0~P1.7),选择ADC的8个接口中的一个(0000 0111 清0高5位)ADC_CONTR = speed; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)P1M0 = p1m0;P1M1 = p1m1; // 设置IO口模式,P1口如果要作为AD使用需要将它设置为高阻或者开漏模式。 _nop_();ADC_CONTR |= ADC_POWER;      //启动A/D电源DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
}
获取ADC转换结果
/*
函数名:8位A/D转换函数
参  数:无
返回值:8位的ADC数据
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
*/
unsigned char getADCResult (){ADC_CONTR |= ADC_START;      //启动A/D转换(0000 1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待转换完成,ADC_FLAG为0x10转换完成ADC_CONTR &= ~ADC_FLAG;    //1111 0111 清ADC_FLAG位, 关闭A/D转换, return ADC_DATA;          //返回A/D转换结果(8位)
}
main调用ADC
void main(){// 调用ADC初始化函数adcInit(0,ADC_SPEEDH,0x01,0x00);while(1){// 获取ADC转换结果m = getADCResult ();printChar(5,1,m/100+0x30);//1011 0101printChar(6,1,m/10%10+0x30);//1011 0101printChar(7,1,m%10+0x30);//1011 0101}
}
1602显示屏展示ADC转换效果

在51单片机4线并发IO口控制1602LCD实验上加入上面的ADC代码,通过调整电位器,在1602显示屏上显示转换的数值。

硬件电路
按照下图接线,有两点需要改动

  • P1.0~P1.3 线不用接
  • 电位器1脚接GND,2脚接P1.0,3脚接VCC
    在这里插入图片描述

代码

#include <STC12C2052AD.H>
#include <string.h>
#include <intrins.h>	//51基本运算(包括_nop_空函数)
typedef unsigned char uint8;
// 定义引脚
#define	LCD1602_DB4_DB7	P1		// 定义高4位LCD1602的数据总线
sbit LCD1602_RS = P3 ^ 2;					// 定义LCD1602的RS控制线
sbit LCD1602_RW = P3 ^ 3;					// 定义LCD1602的RW控制线
sbit LCD1602_E  = P3 ^ 4;					// 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;					// 定义LCD1602的测忙线(与LCD1602_DB4_DB7关联)// 定义指令集
/*设置显示模式*/
#define LCD_MODE_PIN8 0x38	// 8位数据线,两行显示
#define LCD_MODE_PIN4 0x28	// 4位数据线,两个显示
#define LCD_SCREEN_CLR 0x01	// 清屏
#define LCD_CURSOR_RET 0x02	// 光标复位
#define LCD_CURSOR_RIGHT 0x06	// 光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04	// 光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移/*光标开关控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f	// 显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0e	// 显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0c	// 显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08	// 显示关,光标关,光标不闪烁/*光标、显示移动*/
#define LCD_CUR_MOVE_LEFT 0x10	// 光标左移
#define LCD_CUR_MOVE_RIGHT 0x14	// 光标右移
#define LCD_DIS_MOVE_LEFT 0x18	// 显示左移
#define LCD_DIS_MOVE_RIGHT 0x1c	// 显示右移/*定义ADC寄存器*/
#define ADC_POWER   0x80            //ADC 电源打开
#define ADC_FLAG    0x10            //ADC 打开转换标志位
#define ADC_START   0x08            //ADC 开始转换
#define ADC_SPEEDLL 0x00            //420 设置低速转换
#define ADC_SPEEDL  0x20            //280 设置低中速转换
#define ADC_SPEEDH  0x40            //140 设置中高速转换
#define ADC_SPEEDHH 0x60            //70  设置低高速转换void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}/**
LCD1602忙碌状态不会接收新指令,因此在发送新指令前先检测是否忙碌。
判断LCD1602_Busy变量的值为低电平则为不忙。
*/
void LCD1602_TestBusy(void){LCD1602_DB4_DB7 = 0xf0;	//高4位IO口设置为1,低4位IO口保持原态LCD1602_RS = 0; // 指令状态LCD1602_RW = 1;	// 读状态LCD1602_E = 1;while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环LCD1602_E = 0;	// 关闭LCD显示器读指令
}/********************************************************************************************
// 写指令程序 //
// 向LCD1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) { LCD1602_TestBusy();LCD1602_RS = 0;LCD1602_RW = 0;//输入的命令高4位赋值给LCD1602_DB4_DB7LCD1602_DB4_DB7 = LCD1602_command;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;//将命令低4位移到高四位供IO口读取LCD1602_DB4_DB7 = LCD1602_command << 4;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCD1602写数据 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){ LCD1602_TestBusy();LCD1602_RS = 1;LCD1602_RW = 0;//写入高4位数据LCD1602_DB4_DB7 = LCD1602_data;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;//将低4位数据移到高4位IO口写入LCD1602_DB4_DB7 = LCD1602_data << 4;DELAY_MS(1);LCD1602_E = 1;LCD1602_E = 0;
}// LCD1602初始化
void LCD1602_Init(void){// 设置4线并行口LCD1602_WriteCMD(LCD_MODE_PIN4);	// 显示模式设置:显示2行,每个字符为5*7个像素LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}/*
输出字符串
x:数据地址
y:输出的行位置,第一行和第二行
str:输入字符串
*/
void printStr(uint8 x, uint8 y, uint8 *str){if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}while(*str != '\0'){LCD1602_WriteData(*str++);}}/*
打印单字符程序 // 
第一行位置 0x00~0x17  第二行位置 0x40~0x57 
向LCM发送一个字符,以十六进制(0x00)表示 
应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0”
*/
void printChar(uint8 x, uint8 y, uint8 c){if(0 == y){LCD1602_WriteCMD(0x80 | x);}else{// 第二行起始位置是0x40LCD1602_WriteCMD(0x80 | (0x40+x));}LCD1602_WriteData(c);
}/*
函数名:8位A/D转换初始化函数
参  数:
inDate:采集数据端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
speed: 设置转换速度
ioMode:设置IO口模式,P1口如果要作为AD使用需要将它设置为高阻或者开漏模式。
返回值:无
功  能:开启ADC功能并设置ADC的输入端口
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
*/
void adcInit (unsigned char inIOnum, unsigned char speed, unsigned char p1m0, unsigned char p1m1){ADC_CONTR |= (inIOnum & 0x07); //选择A/D当前输入信号的通道,当前选择是P1.0(P1.0~P1.7),选择ADC的8个接口中的一个(0000 0111 清0高5位)ADC_CONTR = speed; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)P1M0 = p1m0;P1M1 = p1m1; // 设置IO口模式,P1口如果要作为AD使用需要将它设置为高阻或者开漏模式。 _nop_();ADC_CONTR |= ADC_POWER;      //启动A/D电源DELAY_MS(1);            //使输入电压达到稳定(1ms即可)
}/*
函数名:8位A/D转换函数
调  用:? = Read ();
参  数:无
返回值:8位的ADC数据
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件)
*/
unsigned char getADCResult (){ADC_CONTR |= ADC_START;      //启动A/D转换(0000 1000 令ADCS = 1)_nop_();_nop_();_nop_();_nop_();while (!(ADC_CONTR & ADC_FLAG));//等待转换完成,ADC_FLAG为0x10转换完成ADC_CONTR &= ~ADC_FLAG;    //1111 0111 清ADC_FLAG位, 关闭A/D转换, return ADC_DATA;          //返回A/D转换结果(8位)
}void main(){unsigned char m;unsigned char code str[] = "Hello LCD 1602";unsigned char code str1[] = "ABC";LCD1602_Init();printStr(0,0,str);printStr(0,1,str1);adcInit(0,ADC_SPEEDH,0x01,0x00);while(1){m = getADCResult ();printChar(5,1,m/100+0x30);//1011 0101printChar(6,1,m/10%10+0x30);//1011 0101printChar(7,1,m%10+0x30);//1011 0101}
}

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

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

相关文章

tomcat和nginx自定义404错误页面

nginx 编辑nginx配置文件 vim /www/server/nginx/nginx.conf server{listen 80;error_page 404 /404.html;location /404.html{root /home/liu/html/error-html;} }在家目录下创建一个html/error-html目录&#xff0c;用于存放错误页面 在error-html目录下创建404.html&a…

node.js mongoose index(索引)

目录 简介 索引类型 单索引 复合索引 文本索引 简介 在 Mongoose 中&#xff0c;索引&#xff08;Index&#xff09;是一种用于提高查询性能的数据结构&#xff0c;它可以加速对数据库中文档的检索操作 索引类型 单索引、复合索引、文本索引、多键索引、哈希索引、地理…

ubuntu20 安装缺失的字体

在/usr/share/fonts创建文件夹winfonts sudo mkdir winfonts 下载缺失的字体后&#xff0c;复制命令到对应的文件夹。 刷新字体库 sudo mkfontscale sudo mkfontdir sudo fc-cache

十二、W5100S/W5500+RP2040之MicroPython开发<MQTT旧版OneNET示例>

文章目录 1. 前言2. 平台操作流程3. WIZnet以太网芯片4. 示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证 5. 注意事项6. 相关链接 1. 前言 在这个智能硬件和物联网时代&#xff0c;MicroPython和树莓派PICO正以其独特的优势引领着嵌入式开发…

人工智能_机器学习070_SVM支持向量机_软间隔及优化_硬间隔_衡量间隔软度_引入松弛变量_理解隔离参数---人工智能工作笔记0110

我们继续说,之前说的C是什么意思? 我们在这个软间隔优化中就可以引出C 可以看到之前我们讨论的问题,都是基于样本点的,完全的线性可分的问题,我们称为硬间隔 可以看到这种,一分就可以,分开,简单分割就可以分开的数据,我们称之为硬间隔 但是可以看到上面这种情况,无论怎么分,都…

智能硬件(6)之通用引脚(GPIO)

小编带领大家学习的四大开源硬件和智能模块&#xff0c;他们之间是如何通信的&#xff0c;主控芯片是如何控制智能模块&#xff0c;做某些事情呢&#xff1f;有没有小朋友发起疑问呢&#xff1f; 这里&#xff0c;涉及到了特别重要的知识点&#xff0c;就是通用引脚&#xff0c…

Apache Flink 进阶教程(六):Flink 作业执行深度解析

目录 前言 Flink 四层转化流程 Program 到 StreamGraph 的转化 StreamGraph 到 JobGraph 的转化 为什么要为每个 operator 生成 hash 值&#xff1f; 每个 operator 是怎样生成 hash 值的&#xff1f; JobGraph 到 ExexcutionGraph 以及物理执行计划 Flink Job 执行流程…

华为端口隔离简单使用方法同vlan下控制个别电脑不给互通

必须得用access接口&#xff0c;hybrid口不行 dhcp enable interface Vlanif1 ip address 192.168.1.1 255.255.255.0 dhcp select interface interface MEth0/0/1 interface GigabitEthernet0/0/1 port link-type access port-isolate enable group 1 interface GigabitEther…

【大模型实践】基于文心一言的对话模型设计

文心一言&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;是百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动、回答问题、协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。文心一言从数万亿数据和数千亿知识…

机器学习笔记 - 音频信号处理基础知识

一、音频处理基础 音频处理是指使用各种技术和算法对音频信号进行操作和修改。 它涉及对音频数据应用数字信号处理 (DSP) 方法,以增强、修改或分析声音。音频处理广泛应用于各种应用中,包括音乐制作、电信、语音识别、音频压缩等。 1、信号类型 连续信号:连续信号或连续时间…

构建创新学习体验:企业培训系统技术深度解析

企业培训系统在现代企业中发挥着越来越重要的作用&#xff0c;它不仅仅是传统培训的延伸&#xff0c;更是技术创新的结晶。本文将深入探讨企业培训系统的关键技术特点&#xff0c;并通过一些简单的代码示例&#xff0c;展示如何在实际项目中应用这些技术。 1. 前端技术&#…

开源 AI 新秀崛起:Bittensor 更像是真正的“OpenAI”

强大的人工智能正在飞速发展&#xff0c;而完全由 OpenAI、Midjourney、Google&#xff08;Bard&#xff09;这样的少数公司控制 AI 不免让人感到担忧。在这样的背景下&#xff0c;试图用创新性解决方案处理人工智能中心化问题、权力集中于少数公司的 Bittensor&#xff0c;可谓…

PHP下载安装以及基本配置

目录 引言 官网 下载 配置 1. 鼠标右键“此电脑”>“属性” 2. 打开高级系统设置 3. 打开环境变量 4. 双击系统变量中的path 5. 新建新的path 6. 将刚刚安装的位置加入环境变量 7. 检查是否安装成功 引言 PHP&#xff08;"PHP: Hypertext Preprocessor"…

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来&#xff0c;物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环&#xff0c;PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网&#xff0c;实现工厂设备数据采集”这一主题&#xff0c;探讨PLC物联网…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信&#xff0c;通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内&#xff0c;SMSBoom 可以作为一种有效的测试工具&#xff0c;帮助开发者和系统…

前端微信小程序AES加密解密踩坑

项目场景&#xff1a; 今天蛮沮丧的&#xff0c;在和别人对接的时候aes加解密的时候踩了坑。今天有个同事请假了&#xff0c;所以本来他和别人对接的活&#xff0c;老大给了我&#xff0c;然后我就正式踏上了战战兢兢的对接之路。 1.一开始的时候对面先是问用的啥加密方法。这…

使用Guava轻松创建和管理不可变集合

第1章&#xff1a;引言 大家好&#xff0c;我是小黑。今天&#xff0c;我们来聊聊一个在Java编程里超有用的话题&#xff1a;使用Guava创建和管理不可变集合。首先&#xff0c;咱们得明白&#xff0c;什么是不可变集合。简单来说&#xff0c;不可变集合就是一旦创建就不能被修…

使用OpenCV DNN模块进行人脸检测

内容的一部分来源于贾志刚的《opencv4应用开发、入门、进阶与工程化实践》。这本书我大概看了一下&#xff0c;也就后面几章比较感兴趣&#xff0c;但是内容很少&#xff0c;并没有想像的那种充实。不过学习还是要学习的。 在实际工程项目中&#xff0c;并不是说我们将神经网络…

时间序列分析

常用数据集 2.monash数据集 官网链接 我们的存储库包含30个数据集&#xff0c;包括公开可用的时间序列数据集(不同格式)和由我们管理的数据集。 DatasetDomainNo: of SeriesMin. LengthMax. LengthCompetitionMultivariateDownloadSourceM1Multiple100115150YesNoYearly Quart…

深度剖析Ajax实现方式(原生框架、JQuery、Axios,Fetch)

Ajax学习 简介&#xff1a; ​ Ajax 代表异步 JavaScript 和 XML&#xff08;Asynchronous JavaScript and XML&#xff09;的缩写。它指的是一种在网页开发中使用的技术&#xff0c;通过在后台与服务器进行数据交换&#xff0c;实现页面内容的更新&#xff0c;而无需刷新整个…