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 0101
		printChar(6,1,m/10%10+0x30);//1011 0101
		printChar(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_DB7
	LCD1602_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{
		// 第二行起始位置是0x40
		LCD1602_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{
		// 第二行起始位置是0x40
		LCD1602_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 0101
		printChar(6,1,m/10%10+0x30);//1011 0101
		printChar(7,1,m%10+0x30);//1011 0101
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TrustZone之安全启动与引导失败处理

一、引导和信任链 引导是任何TrustZone系统的关键部分。只有在引导流程中之前运行的所有软件组件都是可信的情况下,才能信任某个软件组件。这通常被称为信任链。下图显示了一个简化的信任链: 在我们的示例中,首先运行的代码是boot ROM。我们必须隐式信任boot ROM,因…

「完美世界」石昊调戏清漪,告白欲以身相许,渡劫神莲淬炼肉身

Hello,小伙伴们&#xff0c;我是拾荒君。 《完美世界》第142集已经更新。石昊在齐道临赠予的令牌庇护下&#xff0c;成功潜入仙池&#xff0c;借助着他的重瞳&#xff0c;他发现那神秘的渡劫神莲正位于这仙池之中。然而&#xff0c;渡劫神莲的位置上空雷云翻滚&#xff0c;宛如…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器 2. Listener是JavaEE的规范&#xff0c;就是接口 3.监听器的作用是&#xff0c;监听某…

uniapp纯CSS实现圆形进度条组件

uniapp纯CSS实现圆形进度条组件。圆形进度条组件组合做一个步骤进度组件是非常常见。 纯 CSS 实现圆形进度条组件有以下几个好处&#xff1a; 轻量级&#xff1a;由于纯 CSS 实现&#xff0c;无需额外的 JavaScript 或图像资源&#xff0c;所以组件的文件大小相对较小&#xf…

HTML5文档

目录 HTML5文档结构1.HTML5页面结构2.HTML5新增结构元素 HTML5新增页面元素1.hgroup标记2.figure标记与figcaption标记3.mark标记与time标记4.details标记与summary标记5.progress标记与meter标记6.input标记与datalist标记 HTML5文档结构 HTML5文档结构同样是由头部和主体两部…

Postman报:400 Bad Request

● 使用Postman发送Post请求报400&#xff0c;入参为JSON&#xff1b; 二、分析 1、Postman请求并没有请求到后台Api&#xff08;由于语法错误&#xff0c;服务器无法理解请求&#xff09;&#xff1b; 2、入参出错范围&#xff1a;cookie、header、body、form-data、x-www-f…

3.[BUU]warmup_csaw_20161

1.checksec 检查文件类型 ELF-64-little &#xff0c;无其他限权&#xff0c;直接用ida检查代码。 2.IDA进行反编译&#xff0c;进行代码审计 查看各个名称的内容&#xff1a; 了解基本攻击思路&#xff1a; 攻击思路&#xff1a;gets输入垃圾数据覆盖v5内容&#xff0c;再将s…

FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取-完整代码

FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取 本章节记录Xilinx ZYNQ PS端实现SD卡txt文件的数据读取。 踩坑记录&#xff0c;本章节主要内容参考原子哥 板子&#xff1a;xilinx zynq 7010 文章目录 FPGA-Xilinx ZYNQ PS端实现SD卡文件数据读取一、开发板引脚配置二、PS端导入F…

嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑

一、目的/概述 二、资料来源 三、逻辑和包含关系 四、Arm GNU Toolchain最常用的命令 嵌入式科普(5)ARM GNU Toolchain相关概念和逻辑 一、目的/概述 对比高集成度的IDE(MDK、IAR等)&#xff0c;Linux开发需要自己写Makefile等多种脚本。eclipse、Visual Studio等需要了解预处…

高德地图逆地理编码踩坑日志

本人是一枚Java小白&#xff0c;公司项目中用到根据经纬度反查该地址中文信息的场景&#xff0c;因为一开始调用的经纬度是能反查出区域编码的&#xff0c;以为towncode都是String返回结果&#xff0c;如下图&#xff1a; 没想到当没有名字任何一个城市区域的时候&#xff0c;…

在Linux安装卸载文件

目录 一、Linux系统应用程序 1.典型的应用程序的目录结构 2、常见的软件包封装类型 二、RPM软件包管理 1、RPM是什么&#xff1f; 2、rpm一般命名格式 3、RPM安装包从何而来&#xff1f;如何挂载&#xff1f; 4、挂载的注意事项: 5、目的&#xff1a;提供安装包 6、查…

MyBatis——MyBatis的延迟加载

MyBatis的延迟加载&#xff08;一对多查询案例&#xff09; 1.什么是延迟加载&#xff1f; 开启延迟加载后&#xff0c;在真正使用数据的时候才发起级联查询&#xff0c;不用的时候不查询。 2.pojo User类&#xff1a; package com.wt.pojo;import java.io.Serializable; …

【华为鸿蒙系统学习】- HarmonyOS4.0之App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

SpringBoot+vue实现评论区分页效果

当评论区含大量数据时&#xff0c;一次性查询速度很慢&#xff0c;所以使用分页&#xff0c;实现分页效果。 前端&#xff1a; <h3>评论</h3><div><div style"font-size:14px;padding:10px;" v-for"r in form.remark"><!-- …

【Matlab in VSCode】在VSCode中编辑MATLAB文件

【Matlab in VSCode】在VSCode中编辑MATLAB文件 1.安装插件 插件&#xff1a;在vscode拓展商店下载 MATLABMatlab in VSCode 其他&#xff1a;Windows环境MATLAB2019bpython3.7.9 2.插件配置 MATLAB插件下载后不用配置。 Matlab in VSCode需要进行相应的配置。 Windows…

Ubuntu 常用命令之 ping 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 ping命令是一种网络诊断工具&#xff0c;用于测试主机之间网络的连通性。它发送ICMP Echo Request消息到指定的网络主机&#xff0c;并等待接收ICMP Echo Reply。通过这种方式&#xff0c;我们可以知道两台主机之间的网络是否畅通…

elementUI CDN引入本地文件报错,刷新页面报错

报错原因&#xff1a;vue.config.js的externals 配置中有外部cdn引入配置&#xff0c;而当前场景我的element是直接下载放在本地的&#xff0c;这时就需要将配置注释或者删除 webpack 中的 externals 配置项用于指定在打包时需要排除掉的模块&#xff0c;这些模块会被视为外部依…

bugku-misc-这是一张单纯的图片

附件&#xff1a;图片 1、查看属性 2、010 whex打开看看 可以看到html编码&#xff0c;将文件后缀&#xff0c;改成html&#xff0c;打开 即可

蓝牙物联网与嵌入式开发如何结合?

蓝牙物联网与嵌入式开发可以紧密结合&#xff0c;以实现更高效、更智能的物联网应用。以下是一些结合的方式&#xff1a; 嵌入式开发为蓝牙设备提供硬件基础设施和控制逻辑&#xff1a;嵌入式系统可以利用微处理器和各种外设组成的系统&#xff0c;为蓝牙设备提供硬件基础设施和…

FastGPT+ChatGLM3-6b搭建知识库

前言&#xff1a;我用fastgpt直接连接chatglm3&#xff0c;没有使用oneai&#xff0c;不是很复杂&#xff0c;只需要对chatglm3项目代码做少量修改就能支持使用embeddings&#xff0c;向量模型用的m3e&#xff0c;效果还可以 我的配置&#xff1a; 处理器&#xff1a;i5-13500 …