【蓝桥杯嵌入式】 第六届国赛

news2024/11/19 7:40:17

目录

题目

配置

注意事项

代码 - 默写大师

EEPROM读写函数

LED驱动函数

ADC采集

上电初始化

LCD

按键

PWM互补输出

全部代码

hardware.c

hardware.h

control.c

control.h

main.c 


题目

配置

注意事项

复制LCD的工程,先配置资源 --- 勾选完选项一定要再看一眼,可能选择错误

ADC:配置ADC2_IN15,对应PB15引脚

EEROM,配置PB6和PB7

按键 输入模式PB0、PB1、PB2、PA0

LED 一定要使能PD2

PWM互补输出,用TIM15

TIM6 - 10ms基准定时器


代码 - 默写大师

先默写几个函数

EEPROM读写函数

随机地址读函数 - 参考手册的时序

uint8_t EEPROM_ReadByte(uint8_t address)
{
	uint8_t data;
	I2CStart();
	I2CSendByte(0xA0);		// address + write
	I2CWaitAck();
	I2CSendByte(address);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0xA1);		// address + read
	I2CWaitAck();
	data = I2CReceiveByte();
	I2CSendNotAck();
	I2CStop();
	return data;
}

void EEPROM_WriteByte(uint8_t address, uint8_t data)
{
    I2CStart();
    I2CSendByte(0xA0);
    I2CWaitAck();
    I2CSendByte(address);
    I2CWaitAck();
    
    I2CSendByte(data);
    I2CWaitAck();
    I2CStop();
}

定义几个结构体

//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);

//-----------------------
struct Tick{
    uint32_t lcd;
    uint32_t key;
    uint32_t adc;
    uint32_t pwm;
};
extern struct Tick tick;

struct Flag{
    bool PWM_Mode;
    uint8_t LCD_View;
};
extern struct Flag flag;

struct Param{
    double ADC;
    
    uint16_t PWM_Frq;       //频率
    uint8_t  PWM_Duty_PA9;
    uint8_t  PWM_Duty_PA14;
};
extern struct Param param;
//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;
struct Keys key;

LED驱动函数

void LED_Disp(uint8_t state)
{
    HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ff
    HAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

ADC采集

double Get_ADC(ADC_HandleTypeDef *hadc)
{
    uint32_t adc;
    HAL_ADC_Start(hadc);
    adc = HAL_ADC_GetValue(hadc);
    return adc*3.3/4040;    //这里应该是adc*3.3/4096
}
double Get_ADC(ADC_HandleTypeDef *hadc)
{
    uint32_t adc;
    HAL_ADC_Start(hadc);
    adc = Hal_ADC_GetValue(hadc);
    return adc*3.3/4040;
}

返回值应该是adc*3.3/4096,但是这里我改成了return adc*3.3/4040; 补偿电压采集的数据,范围是0~3.30V

void ADC_Proc(void)
{
    if (uwTick - tick.adc < 250)
        return;
    tick.adc = uwTick;
    param.ADC = Get_ADC(&hadc2);
}

上电初始化

void power_init(void)
{
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);

    LED_Disp(0x00); //0ff
    I2CInit();
    
    if (EEPROM_ReadByte(0x55) != 0x11)  //第一次上电
    {
        param.PWM_Frq = 1000;   //初始化参数
        EEPROM_WriteByte(0x55, 0x11);
        HAL_Delay(10);
        EEPROM_WriteByte(0x01, 1);
        HAL_Delay(10);
    }
    else
    {
        param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;
    }
}

LCD

封装LCD显示函数,使用可变参数列表

#include "stdio.h"
#include "string.h"
#include "stdarg.h"

void LCD_Printf(uint8_t linex, char *format, ...)
{
    char lcd_show_text[30];
    memset(lcd_show_text, '\0', sizeof(lcd_show_text));
    va_list arg;
    va_start(arg, format);
    vsprintf(lcd_show_text, format, arg);
    LCD_DisplayStringLine(linex, (uint8_t *)lcd_show_text);
    va_end(arg);
}

LCD界面 

void LCD_Disp(void)
{
    if (uwTick - tick.lcd < 200)
        return;
    tick.lcd = uwTick;
    
    if (flag.LCD_View == 0)
    {
        LCD_Printf(Line0, "      Para");
        LCD_Printf(Line2, "  ADC_V:%.2fV ", param.ADC);
        LCD_Printf(Line4, "  State:%s  ", (flag.PWM_Mode) ? "start" : "stop" );   //三目运算符
        LCD_Printf(Line6, "  Siginal:PA9: %2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);
        LCD_Printf(Line7, "          PB14:%2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);
        LCD_Printf(Line8, "          %dKHz   ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   1");        
    }
    else if (flag.LCD_View == 1)
    {
        LCD_Printf(Line1, "      Setting");
        LCD_Printf(Line5, "  Signal_Frq:%dKHz  ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   2");
    }
}

按键

按键扫描

void Key_Read(void)
{
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
        key.value = 1;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
        key.value = 2;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
        key.value = 3;
    else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
        key.value = 4;
    else
        key.value = 0;
    key.down = key.value & (key.value ^ key.old);
    key.up  = ~key.value & (key.value ^ key.old);
    key.old = key.value;
}

按键处理函数

void Key_Proc(void)
{
    if (uwTick - tick.key < 10) //10ms
        return;
    tick.key = uwTick;
    Key_Read();
    if (key.down == 1)  //“B1”按键设定为“启动/停止”按键
    {
        flag.PWM_Mode = !flag.PWM_Mode;
    }
    
    if (key.down == 2)
    {
        //先判断是否存入E2PROM
        if (flag.LCD_View == 1)
        {
            //eeprom
            EEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分
            HAL_Delay(10);
        }
        
        // 再刷新界面
        flag.LCD_View ++;
        if (flag.LCD_View == 2) flag.LCD_View = 0;
        LCD_Clear(Black);        
    }
    
    if (key.down == 3)
    {
        if (flag.LCD_View == 1)
        {
            param.PWM_Frq += 1000;
            if (param.PWM_Frq > 10000)  param.PWM_Frq = 1000;
        }
    }    
}

PWM互补输出

PWM配置的定时器,给的80-1预分频,那计数值就是80M/80 = 1M

频率设置:TIMx->ARR = 1e6/频率

占空比设置:TIMx->CCRx = (1e6/频率)*占空比

我代码里的占空比只保留整数部分,所以我的CCR赋值时候最后除以100。

void PWM_Proc(void)
{
    if (uwTick - tick.pwm < 100)
        return;
    tick.pwm = uwTick;
    
    //计算占空比
    param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);
    param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;
    
    TIM15->ARR = 1e6 / param.PWM_Frq;   //计算频率
    if (flag.PWM_Mode == 0) //stop
    {   //关闭PWM输出
        LED_Disp(0);
        HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
    }
    else
    {
        LED_Disp(0x01);
        TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;
        HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
    }
}

互补PWM的函数

//PWM开启
HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
//PWM关闭
HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);

全部代码

hardware.c

#include "hardware.h"

struct Keys key;

void LED_Disp(uint8_t state)
{
    HAL_GPIO_WritePin(GPIOC, 0xFF00, GPIO_PIN_SET); //0ff
    HAL_GPIO_WritePin(GPIOC, state << 8, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

void Key_Read(void)
{
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
        key.value = 1;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
        key.value = 2;
    else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
        key.value = 3;
    else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
        key.value = 4;
    else
        key.value = 0;
    key.down = key.value & (key.value ^ key.old);
    key.up  = ~key.value & (key.value ^ key.old);
    key.old = key.value;
}

double Get_ADC(ADC_HandleTypeDef *hadc)
{
    uint32_t adc;
    HAL_ADC_Start(hadc);
    adc = HAL_ADC_GetValue(hadc);
    return adc*3.3/4040;
}

hardware.h

#ifndef __HARDWARE_H
#define __HARDWARE_H

#include "stm32g4xx_hal.h"

void LED_Disp(uint8_t state);
void Key_Read(void);
double Get_ADC(ADC_HandleTypeDef *hadc);


struct Keys{
    uint8_t value;
    uint8_t old;
    uint8_t down;
    uint8_t up;
};
extern struct Keys key;

#endif

control.c

#include "control.h"

//定义变量
struct Tick tick;
struct Flag flag;
struct Param param;

void power_init(void)
{
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);

    LED_Disp(0x00); //0ff
    I2CInit();
    
    if (EEPROM_ReadByte(0x55) != 0x11)  //第一次上电
    {
        param.PWM_Frq = 1000;   //初始化参数
        EEPROM_WriteByte(0x55, 0x11);
        HAL_Delay(10);
        EEPROM_WriteByte(0x01, 1);
        HAL_Delay(10);
    }
    else
    {
        param.PWM_Frq = EEPROM_ReadByte(0x01)*1000;
    }
}

void LCD_Disp(void)
{
    if (uwTick - tick.lcd < 200)
        return;
    tick.lcd = uwTick;
    
    if (flag.LCD_View == 0)
    {
        LCD_Printf(Line0, "      Para");
        LCD_Printf(Line2, "  ADC_V:%.2fV ", param.ADC);
        LCD_Printf(Line4, "  State:%s  ", (flag.PWM_Mode) ? "start" : "stop" );   //三目运算符
        LCD_Printf(Line6, "  Siginal:PA9: %2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA9) : 0);
        LCD_Printf(Line7, "          PB14:%2d%%  ", (flag.PWM_Mode) ? (param.PWM_Duty_PA14) :0);
        LCD_Printf(Line8, "          %dKHz   ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   1");        
    }
    else if (flag.LCD_View == 1)
    {
        LCD_Printf(Line1, "      Setting");
        LCD_Printf(Line5, "  Signal_Frq:%dKHz  ", param.PWM_Frq/1000);
        LCD_Printf(Line9, "                   2");
    }
}

void Key_Proc(void)
{
    if (uwTick - tick.key < 10) //10ms
        return;
    tick.key = uwTick;
    Key_Read();
    if (key.down == 1)  //“B1”按键设定为“启动/停止”按键
    {
        flag.PWM_Mode = !flag.PWM_Mode;
    }
    
    if (key.down == 2)
    {
        //先判断是否存入E2PROM
        if (flag.LCD_View == 1)
        {
            //eeprom
            EEPROM_WriteByte(0x01, param.PWM_Frq/1000); //存整数部分
            HAL_Delay(10);
        }
        
        // 再刷新界面
        flag.LCD_View ++;
        if (flag.LCD_View == 2) flag.LCD_View = 0;
        LCD_Clear(Black);        
    }
    
    if (key.down == 3)
    {
        if (flag.LCD_View == 1)
        {
            param.PWM_Frq += 1000;
            if (param.PWM_Frq > 10000)  param.PWM_Frq = 1000;
        }
    }    
}

void ADC_Proc(void)
{
    if (uwTick - tick.adc < 250)
        return;
    tick.adc = uwTick;
    param.ADC = Get_ADC(&hadc2);
}

void PWM_Proc(void)
{
    if (uwTick - tick.pwm < 100)
        return;
    tick.pwm = uwTick;
    
    //计算占空比
    param.PWM_Duty_PA9 = (uint8_t)(param.ADC*100.0/3.3);
    param.PWM_Duty_PA14 = 100-param.PWM_Duty_PA9;
    
    TIM15->ARR = 1e6 / param.PWM_Frq;   //计算频率
    if (flag.PWM_Mode == 0) //stop
    {   //关闭PWM输出
        LED_Disp(0);
        HAL_TIM_PWM_Stop(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Stop(&htim15, TIM_CHANNEL_1);
    }
    else
    {
        LED_Disp(0x01);
        TIM15 -> CCR1 = (TIM15->ARR + 1) * param.PWM_Duty_PA9 / 100;
        HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Start(&htim15, TIM_CHANNEL_1);
    }
}

control.h

#ifndef __CONTROL_H
#define __CONTROL_H

#include "stm32g4xx_hal.h"
#include "string.h"
#include "stdio.h"
#include "stdbool.h"

#include "hardware.h"
#include "i2c_hal.h"
#include "tim.h"
#include "adc.h"
#include "lcd.h"

//-----------------------
void power_init(void);
void LCD_Disp(void);
void Key_Proc(void);
void ADC_Proc(void);
void PWM_Proc(void);

//-----------------------
struct Tick{
    uint32_t lcd;
    uint32_t key;
    uint32_t adc;
    uint32_t pwm;
    
};
extern struct Tick tick;

struct Flag{
    bool PWM_Mode;
    uint8_t LCD_View;
    
};
extern struct Flag flag;

struct Param{
    double ADC;
    
    uint16_t PWM_Frq;       //频率
    uint8_t  PWM_Duty_PA9;
    uint8_t  PWM_Duty_PA14;
    
};
extern struct Param param;
//-----------------------

#endif

main.c 

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

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "control.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  MX_ADC2_Init();
  MX_TIM15_Init();
  /* USER CODE BEGIN 2 */

    LCD_Init();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    
    power_init();

    while (1)
    {
        Key_Proc();
        LCD_Disp();
        ADC_Proc();
        PWM_Proc();
        
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    }
  /* USER CODE END 3 */
}

完结,第六届国赛比较简单,只有PWM互补输出是没有写过的

后续会更新其他届的赛题,同步源码到我的Gitee~

波形展示:具体见B站演示视频

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

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

相关文章

ARM-V9 RME(Realm Management Extension)系统架构之系统能力的执行隔离

安全之安全(security)博客目录导读 目录 一、执行隔离 1、安全状态 2、安全模型 本博客探讨 RME 所需的系统能力&#xff0c;以保证 Arm CCA 对于 Realms 的安全性和隔离特性。 一、执行隔离 1、安全状态 RME 系统支持以下安全状态&#xff1a; 非安全 (Non-secure)安全…

台灯护眼是真的吗?警惕这六大问题!

在当今社会&#xff0c;随着电子设备的普及和长时间的用眼&#xff0c;大多数人面临着严重的视觉疲劳问题。长时间盯着屏幕或学习&#xff0c;眼睛需要不断调节焦距&#xff0c;导致眼睛肌肉疲劳&#xff0c;进而引发视力下降。这种现象在年轻一代甚至青少年中尤为普遍&#xf…

Sourcetree安装教程及使用

1 Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端&#xff0c;它由Atlassian开发&#xff0c;提供了跨平台的支持&#xff0c;可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码&#xff0c;不需要在命令行中输入复杂的Git命令&#x…

10W QPS高并发,如何防止重复下单?

小北说在前面 10wqps高并发&#xff0c;如何防止重复提交/支付订单&#xff1f; 10wqps高并发&#xff0c;如何防止重复下单&#xff1f; 10wqps高并发&#xff0c;如何防止重复支付&#xff1f; 10wqps高并发&#xff0c;如何解决重复操作问题&#xff1f; 最近有小伙伴在面试…

Go开发Prometheus客户端实战步骤

1、项目背景 在当前的IT运维环境中&#xff0c;我们的业务系统日益复杂&#xff0c;特别是针对特定的业务逻辑和定制化需求&#xff0c;传统的通用监控工具往往难以覆盖所有的监控场景。例如&#xff0c;考虑到一个复杂的电商平台&#xff0c;除了基础的服务器性能、网络状况等…

JavaScript-内存分配

内存空间 内存分为栈和堆 栈&#xff1a;由操作系统自动释放存放的变量值和函数值等。简单数据类型存放在栈中 栈会由低到高先入后出 堆&#xff1a;存储引用类型 &#xff08;对象&#xff09; 对象会先将数据存放在堆里面&#xff0c;堆的地址放在栈里面

HTB-SherlocksDFIR

Sherlocks 中关于 DFIR 的一些内容&#xff0c;按照时间线整理&#xff0c;尚未完成&#xff0c;持续更新​ Brutus 和上一次做的 Recollection 机器一样&#xff0c;主要学习一下相关的知识&#xff0c;练习一下。按照机器描述&#xff0c;在学习完成后将熟悉 auth.log 和 wtm…

自建视频托管平台:MediaCMS

目录 1 MediaCMS简介1.1 介绍1.2 特性1.3 应用场景 2 安装配置2.1 安装1、安装2、汉化 2.2 一些常见配置 3 简单使用3.1 上传3.2 下载3.3 添加标题或者字幕3.4 通过Tag/Category实现视频/文件分类添加 Tag给任一资源分类 1 MediaCMS简介 1.1 介绍 MediaCMS是一个现代的&#…

2.10 mysql设置远程访问权限

2.10 mysql设置远程访问权限 目录1. 管理员运行mysql命令窗口2. 使用 root 用户重新登录 MySQL3. 修改用户权限4. 修改mysql安装目录下的my.ini 目录 说明&#xff1a; Mysql8.0 设置远程访问权限 一、Mysql8.0 设置远程访问权限 1. 管理员运行mysql命令窗口 2. 使用 root 用…

Java break细节(标签)

Java break细节(标签)continue也可以使用标签 break是用来跳出循环的。 当有多重循环时&#xff0c;可以配合标签来使用&#xff0c;决定跳出那一重循环。 尽量不要使用标签 1、不代标签时&#xff0c;默认跳出 break 所在的那重循环&#xff1a; 可见在 i 3 时&#xff0…

前端调用exe程序配置

前置条件 访问端安装好需要调用的exe程序 1、新建reg文件 先新建一个txt文件&#xff0c;重命名为xx.reg 点击是&#xff0c;确认更改 2、编写注册表内容 右键点击文件&#xff0c;用记事本打开&#xff0c;输入以下内容 将下面的${exeName}修改为自定义的程序名&#x…

react使用react-quill富文本编辑器自定义上传图片,添加handlers后编辑器不显示问题

Quill介绍 Quill 是一款 API 驱动、功能强大的现代富文本编辑器。它具有易于拓展、各平台表现一致性等优点。Quill 官方 1.0 版本于 2016 年 9 月发布&#xff0c;目前在 Github 上有41.8k Star。 官网地址&#xff1a;Quill - Your powerful rich text editor github仓库地…

剪画小程序:视频伪原创怎么制作?视频伪原创的几种制作方法分享!

什么是视频伪原创&#xff1f; 视频伪原创是指对已有的视频内容进行一定程度的修改和处理&#xff0c;使其在形式或部分细节上与原始视频有所不同&#xff0c;但保留了核心内容或主题。 视频伪原创包括以下一些常见操作&#xff1a; 剪辑重组&#xff1a;对原始视频进行剪辑…

整合SSM框架笔记

整合SSM框架笔记 Spring5 Spring MVC MyBatis Druid MySQL Thymeleaf 感谢尚硅谷课程&#xff1a;B站课程 前言 单Spring框架时&#xff0c;是Java工程。 Spring与Spring MVC可以共用一个配置文件&#xff0c;也可以不共用一个&#xff0c;推荐不共用一个。 Spring与Sp…

map优化多个if

原代码如下&#xff0c;多个按钮的点击操作&#xff0c;其中val是操作的按钮的标志 const operationConst {INSTALLAPP: installApp,STOPAPP: stopApp,HOME: home,CLEAR: clear...... } function moreOperation(val, list) {selectedList list && list.length 0 ?…

Pandas格式化DataFrame的浮点数列

在呈现数据的同时&#xff0c;以所需的格式显示数据也是一个重要而关键的部分。有时&#xff0c;值太大了&#xff0c;我们只想显示其中所需的部分&#xff0c;或者我们可以说以某种所需的格式。 让我们看看在Pandas中格式化DataFrame的数值列的不同方法。 例1&#xff1a;将…

数字化业务流程升级再造,解困基本半导体的CRM应用5年之痒

在新能源汽车、工业互联、5G通信、消费电子等需求的强力拉动下&#xff0c;以碳化硅为代表的第三代半导体产业迎来爆发式增长。 深圳基本半导体有限公司&#xff08;以下简称“基本半导体”&#xff09;是中国第三代半导体创新企业&#xff0c;专业从事碳化硅功率器件的研发与…

探索标准差与方差的奥秘

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、标准差与方差的基础理解 代码案例 二、标准差与方差的计算方法 方差的计算 标准差的…

Selenium 自动化测试工具(1) (Selenium 工作原理,常用API的使用)

文章目录 什么是自动化测试什么是测试工具&#xff1a;Selenium 工作原理(重要)Selenium API定位元素CSS 选择器xpath 定位元素 通过Java代码实现自动化1. 定位元素2. 关闭浏览器3. 获取元素文本4. 鼠标点击与键盘输入5. 清空内容6.打印信息 什么是自动化测试 关于自动化&…

11.3G全国矢量地名路网SHP地图

我们在《2015年中国电子地图数据》一文中&#xff0c;分享了一份26.8G的全矢量地名路网地图。 这里再分享一份11.3G的全国矢量地名路网地图&#xff0c;这份数据虽然比2015版更小&#xff0c;但它比那一版更新。 值得一提的是这份数据的图层更丰富&#xff0c;比2015版多32个…