蓝桥杯速成教程{三}(adc,i2c,uart)

目录

一、adc

原理图​编辑引脚配置

Adc通道使能配置 

实例测试

​编辑效果显示

案例程序

 badc

按键相关函数

测量频率+占空比

main

按键的过程

显示界面的过程 

二、IIC通信-eeprom

原理图AT24C02

引脚配置

不可用状态,用的软件IIC 

官方库移植

At24c02手册 

​编辑真题案例

​编辑实验现象

案例程序

 i2c.c

读的函数

 写的函数

 main

 主函数

 按键的过程、参数显示界面

案例显现展示

三、uart

原理图

官方给的代码的测试现象

 cube配置

参数设置

波特率设置

​编辑中断使能

 案例代码呈现

main

主函数

按键设置及界面显示 

 现象效果展示


一、adc

原理图引脚配置

Adc通道使能配置 

Adc是将一个模拟的值Adc通道使能配置

转化为一个电压的值

ADC2通道使能及模式设置

之后点击生成即可 

实例测试

效果显示

显示在第三行

案例程序

 


 badc

/----------------------------badc.h---------------------------------------------/

#ifndef __BADC_H__
#define __BADC_H__

#include "main.h"
double getADC(ADC_HandleTypeDef *pin);

#endif

/-----------------------------badc.c---------------------------------------------/

#include "badc.h"



//读取adc值的函数

double getADC(ADC_HandleTypeDef *pin)
{
	uint adc;//读出的原始值
	HAL_ADC_Start(pin);//开启adc
	adc = HAL_ADC_GetValue(pin);
	return adc*3.3/4096;// 读取到的电压值,均分一个等分看在3.3所占的比例
}	

/---------------------------------interrupt.h----------------------------------/

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__

#include "main.h"
#include "stdbool.h"
struct keys
{
	uchar judge_sta;
	bool key_sta;
	bool single_flag;//确认被按下他为1
	uint key_time;  //判断按下的时间,时间比较长
	uchar long_flag;
};

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);


#endif

/---------------------------------interrupt.c----------------------------------/

按键相关函数

struct keys key[4] = {0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM4)
	{
		key[0].key_sta  = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		key[1].key_sta  = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		key[2].key_sta  = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		key[3].key_sta  = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
		
		for(int i = 0;i<4;i++)
		{
			switch (key[i].judge_sta)
			{
			
				case 0:
				{
				if(key[i].key_sta == 0) //发现按键被按下
				{		
				key[i].judge_sta=1;
				key[i].key_time=0;//将时间清零
					
				}
				}
				break;
				case 1:
				{
					if(key[i].key_sta ==0)//消抖的过程里面就不能确定他短按键会与长按键冲突
				{
						 key[i].judge_sta=2;
				}
				else key[i].judge_sta=0;
				}
				break;
				case 2:
				{
				if(key[i].key_sta==1)//长按
				{
					key[i].judge_sta=0;				

					if(key[i].key_time<70)
					{
						key[i].single_flag = 1;
					}
				}
				else
				{
					key[i].key_time++;//在他没有松开的打断时间内
					if(key[i].key_time>70) 	key[i].long_flag=1;
				}
				
				}
				break;
				case 3:
				{
				
				}
				break;
			}
		}
	}
}

测量频率+占空比

double  ccrl_val1a  = 0,ccrl_val2a  = 0;
uint ccr1_val1b=0,ccr1_val2b=0;
uint frq1=0,frq2=0;  //频率
float duty1=0,duty2=0;//占空比


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//中段消息来源 选择直接输入的通道
		{
		ccrl_val1a= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //计时值hal库的计时函数  直接
		ccr1_val1b= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //计时值hal库的计时函数  间接
		__HAL_TIM_SetCounter(htim,0);//计时值清零
		frq1=(80000000/80)/ccrl_val1a;//计算频率
		duty1=(ccr1_val1b/ccrl_val1a)*100;
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);//从小打开定时器
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);//从小打开定时器
		}
	}
	
	
	if(htim->Instance==TIM3)
	{
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//中段消息来源 选择直接输入的通道
		{
		ccrl_val2a= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1); //计时值hal库的计时函数  直接
		ccr1_val2b= HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2); //计时值hal库的计时函数  间接
		__HAL_TIM_SetCounter(htim,0);//计时值清零
		frq2=(80000000/80)/ccrl_val2a;//计算频率
		duty2=(ccr1_val2b/ccrl_val2a)*100;
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);//从小打开定时器
		HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);//从小打开定时器
		}
	}
}

main.h

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "badc.h"
/* USER CODE END Includes */

/* USER CODE BEGIN PTD */
void key_proc(void);//按键的过程
void disp_proc(void);//显示界面的过程

extern struct keys key[];
extern uint frq1,frq2;//计算的到的回调值
extern float duty1,duty2;
uchar view=0;

uchar pa6_duty = 10;
uchar pa7_duty = 10;



/* USER CODE END PTD */

main

int main(void)
{

/* USER CODE BEGIN 2 */
	LED_Disp(0x00);//LED初始化
	LCD_Init();//LCD初始化
	
		LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	
	HAL_TIM_Base_Start_IT(&htim4);  //定时器中断
	
	HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开pwm的输出通道
	HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//打开pwm的输通道
																					 //打开定时器
	HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);  //定时器中断   频率测量捕获定时器开启
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);  //定时器中断



  /* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
	
  while (1)
  {
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			key_proc();
			disp_proc();
//		LED_Disp(0x02);
//		HAL_Delay(500);
//		LED_Disp(0x00);
//		HAL_Delay(1000);

  }
  /* USER CODE END 3 */
}

按键的过程

/* USER CODE BEGIN 4 */

void key_proc(void)//按键的过程
{
	if(key[0].single_flag ==1)
	{
		view=!view;
		key[0].single_flag=0;
	}
	
	if(key[1].single_flag ==1)//按键2按下一次加10%
	{
		pa6_duty+=10;
		if(pa6_duty>=100) pa6_duty=10;
		__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置比较
		key[1].single_flag=0;
		
	}
	if(key[2].single_flag ==1)//按键3 按下一次加10%
	{
		pa7_duty+=10;
		if(pa7_duty>=100) pa7_duty=10;
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置比较
		key[2].single_flag=0;
		
	}
}

显示界面的过程 

void disp_proc(void)//显示界面的过程
{
	if(view==0)
	{
		char text[30];
		sprintf(text,"       Data     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     FRQ1=%d     ",frq1);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"     duty1=%.3f  ",duty1);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     FRQ2=%d     ",frq2);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"     duty2=%.3f   ",duty2);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
		//ADC显示  1  测量的是靠左的电位器
		sprintf(text,"     V:=%.2f   ",getADC(&hadc1));//在mx中配置了
		LCD_DisplayStringLine(Line6, (uint8_t *)text);
		
		//2
		sprintf(text,"     V:=%.2f   ",getADC(&hadc2));//在mx中配置了
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
	}
	
	if(view==1)//参数显示界面
	{
		char text[30];
		sprintf(text,"       Para     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     PA6:%d      ",pa6_duty);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     PA7:%d      ",pa7_duty);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
	
//界面清理		
		sprintf(text,"                  ");
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"                  ");
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
	}
}

/* USER CODE END 4 */

二、IIC通信-eeprom

原理图AT24C02

引脚配置

为什么要配置成output模式因为官方会提供一个i2c的库,可以直接用用的是软件IIC

不可用状态,用的软件IIC 

之后直接生成就可 

官方库移植

将这两个文件复制到bsp文件下面

At24c02手册 

1k,2k是容量

一个总线上可以挂很多很多芯片

真题案例

实验现象

问题   ---按键没有用只显示1038

案例程序

#include "i2c - hal.h"官方给的参考程序的头文件有问题所以要改成这样

 I2c.h

#ifndef __I2C_H
#define __I2C_H

#include "main.h"

void I2CStart(void);
void I2CStop(void);
unsigned char I2CWaitAck(void);
void I2CSendAck(void);
void I2CSendNotAck(void);
void I2CSendByte(unsigned char cSendByte);
unsigned char I2CReceiveByte(void);
void I2CInit(void);
void eeprom_write(uchar addr,uchar dat);
uchar eeprom_read(uchar addr);


#endif

 i2c.c

读的函数

//读的函数

uchar eeprom_read(uchar addr)
{
	//正常代码
//	uchar dat;
//	I2CStart();//i2c开启
//	I2CSendByte(0xa0);//联系芯片   
//	I2CWaitAck();
//	I2CSendByte(addr);//传递的参数
//	I2CWaitAck();
//	
//	//将真实的数据读回
//	I2CStart();
//	I2CSendByte(0xa1);
//	I2CWaitAck();//发送完等待
//	dat=I2CReceiveByte();
//	I2CSendNotAck();
//	I2CStop();
//	return dat;//返回结果
	
		uchar dat;
	I2CStart();//i2c开启
	I2CSendByte(0xa0);//联系芯片   
	I2CWaitAck();
	I2CSendByte(addr);//传递的参数
	I2CWaitAck();
	I2CStop();
	
	I2CStart();//i2c开启
	I2CSendByte(0xa1);//联系芯片   
	I2CWaitAck();
	dat=I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	return dat;//返回结果

	
}

 写的函数

void eeprom_write(uchar addr,uchar dat)
{

	
	
	I2CStart();//i2c开启
	I2CSendByte(0xa0);//联系芯片   
	I2CWaitAck();//等待应答
	I2CSendByte(addr);//传递的参数
	I2CWaitAck();
	I2CSendByte(dat);//数据发送给芯片
	I2CWaitAck();
	I2CStop();
}

 main

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "badc.h"
#include "i2c - hal.h"


/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
void key_proc(void);//按键的过程
void disp_proc(void);//显示界面的过程

extern struct keys key[];
extern uint frq1,frq2;//计算的到的回调值
extern float duty1,duty2;
uchar view=0;

uchar pa6_duty = 10;
uchar pa7_duty = 10;



/* USER CODE END PTD */

 主函数

int main(void)
{
/* USER CODE BEGIN 2 */
	LED_Disp(0x00);//LED初始化
	LCD_Init();//LCD初始化
	
		LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	
	HAL_TIM_Base_Start_IT(&htim4);  //定时器中断
	
	HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开pwm的输出通道
	HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//打开pwm的输通道
																					 //打开定时器
	HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);  //定时器中断   频率测量捕获定时器开启
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);  //定时器中断



  /* USER CODE END 2 */

 /* USER CODE BEGIN WHILE */
	
  while (1)
  {

 /* USER CODE BEGIN 3 */
			key_proc();
			disp_proc();
//		LED_Disp(0x02);
//		HAL_Delay(500);
//		LED_Disp(0x00);
//		HAL_Delay(1000);

  }
  /* USER CODE END 3 */
}

 按键的过程、参数显示界面

/* USER CODE BEGIN 4 */

void key_proc(void)//按键的过程
{
	if(key[0].single_flag ==1)
	{
		view=!view;
		key[0].single_flag=0;
	}
	
	if(key[1].single_flag ==1)//按键2按下一次加10%
	{
		pa6_duty+=10;
		if(pa6_duty>=100) pa6_duty=10;
		__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置比较
		key[1].single_flag=0;
		
	}
	if(key[2].single_flag ==1)//按键3 按下一次加10%
	{
		pa7_duty+=10;
		if(pa7_duty>=100) pa7_duty=10;
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置比较
		key[2].single_flag=0;
		
	}
	
	//显示按键频率  eeprom只能存一个8位,所以要将他拆成高八位和低八位
	if(key[3].single_flag ==1)//按键3
	{
		uchar frq_h = frq1 >> 8;
		uchar frq_l = frq1 & 0xff;
		eeprom_write(1,frq_h);//写入高位
		HAL_Delay(10);//太快会发不出去
		eeprom_write(2,frq_l);//写入低8位
		
		key[3].single_flag = 0;
			
	}
}

void disp_proc(void)//显示界面的过程
{
	if(view==0)
	{
		char text[30];
		sprintf(text,"       Data     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     FRQ1=%d     ",frq1);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"     duty1=%.3f  ",duty1);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     FRQ2=%d     ",frq2);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"     duty2=%.3f   ",duty2);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
		//ADC显示  1  测量的是靠左的电位器
		sprintf(text,"     V:=%.2f   ",getADC(&hadc1));//在mx中配置了
		LCD_DisplayStringLine(Line6, (uint8_t *)text);
		
		//2
		sprintf(text,"     V:=%.2f   ",getADC(&hadc2));//在mx中配置了
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
		
		uint eep_temp=(eeprom_read(1)<<8)+eeprom_read(2);//读取数据,高8位放第1位,低8位放2为
		
		sprintf(text,"     FRQ_eep=%d   ",eep_temp);//将存入的数据显示出来
		LCD_DisplayStringLine(Line8, (uint8_t *)text);
	}
	
	if(view==1)//参数显示界面
	{
		char text[30];
		sprintf(text,"       Para     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     PA6:%d      ",pa6_duty);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     PA7:%d      ",pa7_duty);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
	
//界面清理		
		sprintf(text,"                  ");
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"                  ");
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
	}
}

/* USER CODE END 4 */

案例显现展示

三、uart

原理图

 

2022年1月~2月购买的可能会有硬件故障 --

官方给的代码的测试现象

 cube配置

改为异步模式,同步模式其他端口被占用,串口参数设置,如果没有设置lcd的话他会默认PC4和PC5,所以需要手动更改

参数设置

波特率设置

根据题目要求设置

中断使能

之后生成代码即可 

 案例代码呈现

interrupt同上

main

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "badc.h"
#include "i2c - hal.h"
#include "string.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
void key_proc(void);//按键的过程
void disp_proc(void);//显示界面的过程

extern struct keys key[];
extern uint frq1,frq2;//计算的到的回调值
extern float duty1,duty2;
uchar view=0;

uchar pa6_duty = 10;
uchar pa7_duty = 10;



/* USER CODE END PTD */
主函数
int main(void)
{

/* USER CODE BEGIN 2 */
    LED_Disp(0x00);//LED初始化
    LCD_Init();//LCD初始化
    
        LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
    
    HAL_TIM_Base_Start_IT(&htim4);  //定时器中断
    
    HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);//打开pwm的输出通道
    HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);//打开pwm的输通道
                                                                                     //打开定时器
    HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);  //定时器中断   频率测量捕获定时器开启
    HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);  //定时器中断

  /* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
	
  while (1)
  {
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			key_proc();
			disp_proc();
		
		//简单的发送
			char temp[20];
			sprintf(temp,"frq=%d\r\n",frq1);    //打印频率再电脑
			HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);
			HAL_Delay(500);
  }
  /* USER CODE END 3 */
}
按键设置及界面显示 
/* USER CODE BEGIN 4 */

void key_proc(void)//按键的过程
{
	if(key[0].single_flag ==1)
	{
		view=!view;
		key[0].single_flag=0;
	}
	
	if(key[1].single_flag ==1)//按键2按下一次加10%
	{
		pa6_duty+=10;
		if(pa6_duty>=100) pa6_duty=10;
		__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置比较
		key[1].single_flag=0;
		
	}
	if(key[2].single_flag ==1)//按键3 按下一次加10%
	{
		pa7_duty+=10;
		if(pa7_duty>=100) pa7_duty=10;
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);//设置比较
		key[2].single_flag=0;
		
	}
	
	//显示按键频率  eeprom只能存一个8位,所以要将他拆成高八位和低八位
	if(key[3].single_flag ==1)//按键3
	{
		uchar frq_h = frq1 >> 8;
		uchar frq_l = frq1 & 0xff;
		eeprom_write(1,frq_h);//写入高位
		HAL_Delay(10);//太快会发不出去
		eeprom_write(2,frq_l);//写入低8位
		
		key[3].single_flag = 0;
			
	}
}

void disp_proc(void)//显示界面的过程
{
	if(view==0)
	{
		char text[30];
		sprintf(text,"       Data     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     FRQ1=%d     ",frq1);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"     duty1=%.3f  ",duty1);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     FRQ2=%d     ",frq2);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"     duty2=%.3f   ",duty2);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
		//ADC显示  1  测量的是靠左的电位器
		sprintf(text,"     V:=%.2f   ",getADC(&hadc1));//在mx中配置了
		LCD_DisplayStringLine(Line6, (uint8_t *)text);
		
		//2
		sprintf(text,"     V:=%.2f   ",getADC(&hadc2));//在mx中配置了
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
		
        串口相关代码//
		/
        uint eep_temp=(eeprom_read(1)<<8)+eeprom_read(2);//读取数据,高8位放第1位,低8位放2为
		
		sprintf(text,"     FRQ_eep=%d   ",eep_temp);//将存入的数据显示出来
		LCD_DisplayStringLine(Line8, (uint8_t *)text);
	}
	
	if(view==1)//参数显示界面
	{
		char text[30];
		sprintf(text,"       Para     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     PA6:%d      ",pa6_duty);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"     PA7:%d      ",pa7_duty);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
	
//界面清理		
		sprintf(text,"                  ");
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"                  ");
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		
	}
}

/* USER CODE END 4 */

 现象效果展示

串口数据

lcd显示


 

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

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

相关文章

小米汽车加速出海,官网建设引领海外市场布局!

面对国内市场的饱和态势&#xff0c;中国企业出海步伐纷纷加速&#xff0c;小米也是其中的一员。Canalys数据显示&#xff0c;2024年第三季度&#xff0c;小米以13.8%的市场份额占比&#xff0c;实现了连续17个季度位居全球前三的成绩。 据“36 氪汽车”报道&#xff0c;小米汽…

Windows中安装Python3

Windows中安装Python3 1. 下载Python安装包 首先&#xff0c;访问Python的官方网站 Python.org&#xff0c;选择适合你Windows版本的Python安装包。 2. 运行安装包 下载完成.exe文件后&#xff0c;双击运行安装包。在安装过程中&#xff0c;有一些关键的选项需要特别注意&a…

从零搭建SpringBoot3+Vue3前后端分离项目基座,中小项目可用

文章目录 1. 后端项目搭建 1.1 环境准备1.2 数据表准备1.3 SpringBoot3项目创建1.4 MySql环境整合&#xff0c;使用druid连接池1.5 整合mybatis-plus 1.5.1 引入mybatis-plus1.5.2 配置代码生成器1.5.3 配置分页插件 1.6 整合swagger3&#xff08;knife4j&#xff09; 1.6.1 整…

支持最新 mysql9的workbench8.0.39 中文汉化教程来了

之前在 B 站上发布了 mysql8 workbench 汉化教程&#xff0c;一年多来帮助很多初学者解决了不熟悉英文的烦恼。 汉化视频可以访问&#xff1a; 2024最新版mysql8.0.39中文版mysql workbench汉化 中文升级 旧版汉化报错解决_哔哩哔哩_bilibili MySql Workbench汉化_哔哩哔哩_…

JavaWeb期末复习

目录 学习通题目Web技术与应用&#xff08;2024秋&#xff09;第二章 绪论课前测试一.选择题二.填空题 课后巩固 第三章 HTML基础课前测试一.单选题二.填空题 课后巩固一.单选题二.填空题 第四章 CSS课前测试二.单选题三.填空题 4.5 浮动与清理一.单选题 课后巩固二.单选题 第五…

云手机与Temu矩阵:跨境电商运营新引擎

云手机与 Temu 矩阵结合的基础 云手机技术原理 云手机基于先进的 ARM 虚拟化技术&#xff0c;在服务器端运行 APP。通过在服务器上利用容器虚拟化软件技术&#xff0c;能够虚拟出多个独立的手机操作系统实例&#xff0c;每个实例等同于一部单独的手机&#xff0c;可独立运行各…

【每日学点鸿蒙知识】Text填充父控件、Native接收数组、js逻辑不执行问题、UIAbility上下文问题、页面跳转路由栈

1、HarmonyOS 如何使Text组件填充满父组件&#xff1f; build() {Row() {Row() {Text(this.str).constraintSize({ maxWidth: 100%, minHeight: "30vp" }).backgroundColor(Color.Gray).fontSize(24vp)}.key(row1).constraintSize({ maxWidth: 100%}).backgroundCol…

Sqoop的使用

每个人的生活都是一个世界&#xff0c;即使最平凡的人也要为他那个世界的存在而战斗。 ——《平凡的世界》 目录 一、sqoop简介 1.1 导入流程 1.2 导出流程 二、使用sqoop 2.1 sqoop的常用参数 2.2 连接参数列表 2.3 操作hive表参数 2.4 其它参数 三、sqoop应用 - 导入…

基于Java+Springboot+Vue开发的旅游景区管理系统,实习作品

项目简介 该项目是基于JavaSpringbootVue开发的旅游景区管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅…

十二月第五周python

第一个程序&#xff0c;熟悉转换器&#xff0c;把加法计算器变成exe# // 1,制作加法计算器&#xff0c; # 输入两个数字得到相加结果并输出aint(input("输入数字&#xff1a;"))#int()是把输入的内容转换成整数&#xff0c; bint(input("输入数字&#xff1a;&…

【视觉惯性SLAM:十一、ORB-SLAM2:跟踪线程】

跟踪线程是ORB-SLAM2的核心之一&#xff0c;其主要任务是实时跟踪相机的位姿变化和场景的变化&#xff0c;以维持地图的更新和相机轨迹的估计。ORB-SLAM2的跟踪线程通过多种方式&#xff08;参考关键帧跟踪、恒速模型跟踪、重定位跟踪、局部地图跟踪&#xff09;处理跟踪丢失、…

在字节5年被优化,太难了。。。

先简单说下&#xff0c;涵哥是某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。还差几个月也7年了吧&#xff0c;算是在这行的资深划水员。7年的时间也让涵哥从…

阿里云-将旧服务器数据与配置完全迁移至新服务器

文章目录 一&#xff1a;创建镜像二&#xff1a;将创建好的镜像复制到新服务器所在的目标地域&#xff08;如果新服务器与镜像在同一地域就不用进行这一操作&#xff09;三&#xff1a;将镜像配置到新服务器上四&#xff1a;导出安全组&#xff08;如果新服务器与旧服务器使用同…

Spark SQL DML语句

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 Spark本地模式安装_spark3.2.2本地模式安装-CSDN博客 DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09;操作主要用来对…

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子&#xff0c;没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子&#xff0c;我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

运行Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录&#xff0c;双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…

Wordly Wise 3000 国际背单词01 介绍 + 测词汇量

&#x1f4da; Wordly Wise 3000 国际背单词01 介绍 测词汇量 &#x1f31f; 大家好&#xff01;我们正式启动背Wordly Wise 3000单词&#xff0c;旨在利用国际资源和科学的学练方法&#xff0c;帮助大家更得效地坚持学练单词。我们将通过图文和Video等多种形式与大家分享经验…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

3.微服务灰度发布落地实践(组件灰度增强)

文章目录 前言调用链示图dubbo服务之间的的调链cloud 服务之间的调用链 网关servlet容器: 标签续传1.定义插件2.实现灰度增强拦截 线程池: 标签续传1.拦截Runnable或Callable,接口增强实现标签续传;Callable 插件定义Runnable 插件定义拦载Callabl或Runnable构造(可共用)拦载ru…

不修改内核镜像的情况下,使用内核模块实现“及时”的调度时间片超时事件上报

一、背景 之前的博客 不修改内核镜像的情况下&#xff0c;使用内核模块实现高效监控调度时延-CSDN博客 里&#xff0c;我们讲了不修改内核镜像高效监控每次的调度时延的方法。这篇博客里&#xff0c;我们对于调度时间片也做这么一个不修改内核镜像的改进。关于调度时间片过长的…