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

news2025/1/23 6:02:00

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
	}
}

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

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

相关文章

计算机的工作原理(上)

1. 计算机发展史 计算的需求在人类的历史中是广泛存在的&#xff0c;发展大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。&#xff08;以下是计算机的发展历程&#xff09; 1、公元前2500 年前&#xff0c;算盘已经出现了&#xff1b;除此之外&#xff0c…

使用教程之【SkyWant.[2304]】路由器操作系统,破解移动【Netkeeper】校园网【小白篇】

许多高校目前饱受Netkeeper认证的痛苦&#xff0c;普通路由器无法使用&#xff0c; 教你利用SkyWant的Netkeeper认证软件来使你的SkyWant路由器顺利认证上网&#xff0c;全宿舍又可以合作共赢了&#xff01; 步骤一&#xff1a;正确连接网线&#xff0c;插电开机 正确连接网…

字符设备驱动开发-注册-设备文件创建

一、字符设备驱动 linux系统中一切皆文件 1、应用层&#xff1a; APP1 APP2 ... fd open("led驱动的文件"&#xff0c;O_RDWR); read(fd); write(); close(); 2、内核层&#xff1a; 对灯写一个驱动 led_driver.c driver_open(); driver_read(); driver_write(…

2023/12/21作业

思维导图 代码 .text .global _start _start: 灯1 gpio时钟使能 [4]->1 0x5000A28 LDR R0,0x50000A28 指定寄存器地址 LDR R1,[R0]将寄存器取出放到R1 ORR R1,R1,#(0x1<<4)将第四位设置为1 STR R1,[R0]读取R0寄存器到R1 PE…

Echarts饼图tooltip渐变色,内部legend百分比保留整数方法

业务场景&#xff1a;1、tooltip的背景需要渐变色&#xff0c;写 html 标签&#xff0c; 2、饼图内部的百分比需要保留整数 &#xff0c;使用formatter&#xff0c; export function genChartPieOption(pieData) {const res {replaceMerge: [series,], // 解决刷新之后y轴丢失…

Prometheus-JVM

一. JVM监控 通过 jmx_exporter 启动端口来实现JVM的监控 Github Kubernetes Deployment Java 服务&#xff0c;修改 wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.19.0/jmx_prometheus_javaagent-0.19.0.jar# 编写配置文件&#xff0…

推箱子小游戏

--print("开发流程步骤&#xff1a;I、绘制推箱子地图并初始化 ----- 几*几大小的地图 \n\n II、根据宏定义和推箱子地图上的数字来选择不同的图形\n\n III、获取玩家坐标 -----------重点\n\n …

【SSM】SSM整合

SSM 整合 文章目录 SSM 整合1. 核心问题明确1.1 第一问&#xff1a;SSM整合需要几个IoC容器&#xff1f;1.2 第二问&#xff1a;每个IoC容器对应哪些类型组件&#xff1f;1.3 第三问&#xff1a;IoC容器之间关系和调用方向&#xff1f;1.4 第四问&#xff1a;具体多少配置类以及…

随机问卷调查数据的处理(uniapp)

需求&#xff1a;问卷调查 1.返回的数据中包含单选、多选、多项文本框、单文本框、图片上传 2.需要对必填的选项进行校验 3.非必填的多项文本框内容 如果不填写 不提交 表单数据格式 res{"code": 0,"msg": null,"data": [{"executeDay&…

CSS overflow-anchor

overflow-anchor 为了认识这个属性, 我们需要先看一种常见的现象. 即在网页加载中, 图片常常比文字加载更慢, 这样图片加载完成后可能会将文字向下顶. 比如下图演示 <div class"overflow"><img id"bg" src"" height"150" al…

前端页面资源放入oss 对象存储问题

1.需求 当我们做的是微信公众号的时候 需要微信重定向登录 在此时 我们需要在微信后台配置重定向域名 但是微信后台只能配置三个 如果有很多H5 公众号重定向登录的需求 我们该怎么做呢 2.解决 肯定我们需要配置 首页的 一般前端打包项目 都是由index.html 当然 我们实现 都是…

Linux:sudo给予账户特定的权限

我们某些用户权限比较低&#xff0c;如果我们他们的权限提高&#xff0c;或者假如搞权限的组&#xff0c;那么会大大减少安全性&#xff0c;我们可以使用sudo对他们开放指定的命令 我这里有 a1—3 3个用户&#xff0c;现在我切换到a1执行一下重启的命令 发现我们这个用户并无…

DSC2803X,DSP Pin2Pin with Ti Parts

一&#xff0c;产品特性 高能效 32 位处理器(H28x 内核)  主频 120MHz&#xff08;周期 8.33ns&#xff09;  哈佛(Harvard) 总线架构  硬件乘法/除法单元  4/6 通道高速 DMA  快速中断响应和处理  统一存储器编程模型  高效代码&#xff08;使用 C/C和汇编语言&…

docker容器内 获取宿主机ip

可以使用命令 --add-host jargatewayip:192.168.0.47 \ 需要注意,这里不能是 127.0.0.1 ,所以要找到服务器局域网的ip 命令示例 docker run -it \-p 80:80 \-p 443:443 \--name nginx \--network app --hostname nginx \-e TZAsia/Shanghai \--add-host jargatewayip:192.16…

基于JAVA的厦门旅游电子商务预订系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

16、Qt线程(一):继承QThread,重写run

一、说明 Qt提供了3个类4种方式创建线程&#xff1a; 1、QThread ①继承QThread类&#xff0c;重写run()函数 ②继承QObject类&#xff0c;使用moveToThread()函数 2、使用QtConCurrent并发模块的run()函数 3、继承QRunnable类 二、功能说明 1、通过继承QThread&#xff0c;重…

FATFS文件系统

文件系统是为了存储和管理数据&#xff0c;而在存储设备上建立的一种组织结构。 Windows常用的文件系统&#xff1a; 1、FAT12 2、FAT16 3、FAT32 4、exFAT 5、NTFS FAT&#xff1a;File Alloction Table 文件分配表 在小型的嵌入式存储设备大多…

大模型托管平台Replicate,获2.9元B轮融资

大模型开源平台Replicate在官网宣布&#xff0c;获得4000万美元&#xff08;近2.9亿元&#xff09;B轮融资。本次由a16z领投&#xff0c;英伟达、Y Combinator等跟投。 Replicate的开源平台提供了超过25,000个模型&#xff0c;涵盖文本、图片、视频、音频、3D模型等领域。典型…

60.乐理基础-打拍子-V字打拍法

前置内容&#xff1a; 文字版 https://note.youdao.com/s/6FSSvGBf &#xff08;顺序参考&#xff1a;下方的视频版里面目录顺序&#xff09; 视频版 【四川音乐学院作曲硕士】教你零基础自学乐理保姆级教学-学习视频教程-腾讯课堂 文字版还有下图红框中三个专栏里的内容&a…

freemarkEngine文件ftl的可视化编辑

在做导出word文件功能时&#xff0c;需要准备ftl模板&#xff0c;设置一些通配符&#xff0c;之后通过相关编码&#xff0c;即可以实现业务数据渲染后导出word的功能。但是ftl文件一般我们看不太懂&#xff0c;所以可视化创建和修改就非常合适。 1、安装office2016版本&#x…