蓝桥杯速成教程{三}(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);//开启adcadc = 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;//确认被按下他为1uint 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);//2sprintf(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);//2sprintf(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);//2sprintf(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显示


 

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

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

相关文章

Semantic Segmentation Editor标注工具

https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor https://docs.meteor.com/about/install.html https://v2-docs.meteor.com/install.html 安装指定版本的meteor curl https://install.meteor.com/\?release\2.12 | sh ubuntu18 安…

攻防世界web新手第四题easyphp

<?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) && 8b184b substr(md5($b),-6,6)){$key1 1;}else{die("Emmm...再想想&quo…

vxe-table 实现跨行按钮同时控制两行的编辑状态

vxe-table 写可编辑表格用起来很爽吧&#xff01;有没有遇到下面这种要用一个跨行按钮&#xff0c;控制两行编辑框是否可编辑的情况。是不是官网的方法不好实现了&#xff1f;那么这个应该怎么实现呢。最近刚好碰到这个问题。说下个人的实现思路。 其实也简单&#xff0c;既然官…

ES 磁盘使用率检查及处理方法

文章目录 1. 检查原因2. 检查方法3. 处理方法3.1 清理数据3.2 再次检查磁盘使用率 1. 检查原因 磁盘使用率在 85%以下&#xff0c;ES 可正常运行&#xff0c;达到 85%及以上会影响 PEIM 数据存储。 在 ES 磁盘分配分片控制策略中&#xff0c;为了保护数据节点的安全&#xff0…

论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 王志豪&#xff0c;厦门大学博士生 刘诗雨&#xff0c;厦门大学硕士生 内容简介 新数据的不断涌现使版本更新成为大型语言模型&#xff08;LLMs&#xff…

【Linux 系统负载详情解析】

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

欲海航舟:探寻天性驱动下的欲望演变与人生驾驭

欲海航舟&#xff1a;探寻天性驱动下的欲望演变与人生驾驭。 欲望之源起&#xff0c;本乎天性。 鸿蒙初辟&#xff0c;生灵乍现&#xff0c;欲望即随人之性灵而生&#xff0c;如花木之根柢&#xff0c;虽隐匿于地下&#xff0c;却为生长之根基。 人之初诞&#xff0c;懵懂无…

WebRTC 环境搭建

主题 本文主要描述webrtc开发过程中所需的环境搭建 环境&#xff1a; 运行环境&#xff1a;ubuntu20.04 Node.js环境搭建 安装编译 Node.js 所需的依赖包: sudo apt-get updatesudo apt-get install -y build-essential libssl-dev下载 Node.js 源码: curl -sL https://…

QT-------认识QT

QT简介 QT是一个跨平台的C图形用户界面应用程序框架&#xff0c;由挪威Trolltech公司于1991年开发并发布。它为开发者提供了一套丰富的类库和工具&#xff0c;用于创建各种类型的应用程序&#xff0c;包括桌面应用、移动应用、嵌入式系统应用等。QT具有高度的可定制性和可扩展…

SpringBoot配置文件、热部署、YAML语法、配置文件值注入

SpringBoot的配置文件 文章目录 SpringBoot的配置文件1.SpringBoot的热部署2.配置文件2.1配置文件的作用2.2YAML配置文件&#xff1a;2.3YAML 与 JSON 和 XML 的对比 3.YAML语法3.1键值对3.2值的写法3.3对象、Map&#xff08;属性和值&#xff09;&#xff08;键值对&#xff0…

基于BiTCN双向时间卷积网络实现电力负荷多元时序预测(PyTorch版)

Bidirectional Temporal Convolutional Network \begin{aligned} &\text{\Large \color{#CDA59E}Bidirectional Temporal Convolutional Network}\\ \end{aligned} ​Bidirectional Temporal Convolutional Network​ Bidirectional Temporal Convolutional Network (BiTC…

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下&#xff1a;2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff…

低成本Type - C单口便携屏的全方位解析

在科技迅猛发展的当下&#xff0c;便携式电子产品在日常生活中的地位愈发重要。Type - C单口便携显示器作为新兴显示设备脱颖而出。本文将简述其特点、应用场景、技术原理与发展趋势。 一、特点 Type - C单口便携显示器最大的优势是便携性。它以Type - C接口进行数据传输与供电…

TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化

相关阅读 TestMAX/DFT Compilerhttps://blog.csdn.net/weixin_45791458/category_12865937.html?spm1001.2014.3001.5482 时序单元的状态 未映射的时序单元(Unmapped Sequential Cell) 在Design Compiler读取了一个RTL设计后&#xff0c;Design Compiler内置的HDL Compiler工…

「瑞仕云曜璟庭」多轨交通+成熟配套 杨浦滨江宜居之高地

1. 均价不足11w 内环内真正高性价比 作为顶级城市资源的集中地&#xff0c;内环向来是购房者争相角逐的重中之重。 但是&#xff0c;内环很小&#xff0c;价格很高。 目前内环的二手房最高挂牌价已经达到约31.95万/㎡&#xff0c;最高成交价已经达到约33.79万/㎡&#xff…

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展&#xff0c;环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…

游戏开发线性空间下PS工作流程

前言 使用基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui 在游戏引擎中的渲染结果与 PS 中的不一致&#xff1a; PS&#xff08;颜色空间默认是sRGB伽马空间&#xff09;&#xff1a…

JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介

1. 基本概念 1.1、前言 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化&#xff01; 动态 web 淘宝&#xff0c;几乎是所有的网站&#xff1b;提供给所有人看的数据始终会发生变化&#xf…

在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档

软件下载地址: https://sourceforge.net/projects/pdfsam/files/ 需要注意事项&#xff0c;系统需要java环境&#xff0c;确认系统有java环境&#xff0c;根据软件版本需求安装对应的java运行环境。 下载pdfsam-4.3.4-linux.tar.gz安装包&#xff0c;解压&#xff0c;将runt…

windows下Redis的使用

Redis简介&#xff1a; Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 API。 Redis通常被称为数据结构服务器&#xff0c;因为值&#xff08;value&#xff…