GD32F470_ADS1115 超小型 16位 模数转换器 ADC 4通道模块移植

2.9 ADS1115多路模数转换器
ADS1115 器件是兼容 IIC 的 16 位高精度低功耗模数转换器 (ADC),采用超小型无引线 X2QFN-10 封装和 VSSOP-10 封装。ADS111x 器件采用了低漂移电压基准和振荡器。ADS1114 和 ADS1115 还采用可编程增益放大器(PGA)和数字比较器。这些特性加以较宽的工作电源电压范围使得 ADS1115 非常适合功率与空间受限的传感器测量。
ADS111x 可在数据速率高达每秒 860 个样本 (SPS) 的情况下执行转换。PGA 可提供从 ±256mV 到±6.144V 的输入范围,从而实现精准的大小信号测量。ADS1115 具有 一个输入多路复用器 (MUX),可实现两次差动输入测量或四次单端输入测量。在ADS1115 中可使用数字比较器进行欠压和过压检测。 ADS1115既可在连续转换模式下工作,也可在单冲模式下工作。在单冲模式下,这些器件可在一次转换后自动断电;因此显著降低了空闲期间的功耗。
2.9.1 模块来源
采购链接:
ADS1115 超小型 16位 模数转换器 ADC 4通道
资料下载:
链接:https://pan.baidu.com/s/1yVZy_tSp5LXCBbZAZPPX4w?pwd=cd63
提取码:cd63

2.9.2 规格参数
工作电压:2.0-5.5V
工作电流:150uA
采集精度:16位
采集通道:4通道
控制方式:IIC
管脚数量:10 Pin(2.54mm间距排针)
工作电流:150uA
采集精度:16位
采集通道:4通道
控制方式:IIC
管脚数量:10 Pin(2.54mm间距排针)

2.9.3 移植过程
我们的目标是在梁山派GD32F470上能够实现4路ADC采集电压功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
2.9.3.1 查看资料
ADS1115是采用的IIC通信,所以首先要了解IIC的地址与时序,再确定根据寄存器的设置。
(1)器件地址
器件地址的设置见下表。
在这里插入图片描述
说明:当模块上的ADDR引脚接入GND时,其器件地址为1001000,最后一位数据是读写位。

BIT 7BIT 6BIT 6BIT 4BIT 3BIT 2BIT 1BIT 0
1001000R/W

当模块上的ADDR引脚接入VDD时,其器件地址为1001001,最后一位数据是读写位。

BIT 7BIT 6BIT 6BIT 4BIT 3BIT 2BIT 1BIT 0
1001001R/W

本文以接入GND为地址。即后续的地址为0X90。
(2)时序
下图是读时序,步骤是:
IIC起始信号-> 发送器件地址+0(写) -> 等待模块应答 -> 应答后发送寄存器地址 -> 等待模块应答 -> 重新发送起始信号 -> 发送器件地址+1(读) -> 等待模块应答 -> 应答后读取高8位数据 -> 读取完毕主机发送应答信号 -> 读取低8位数据 -> 读取完毕主机发送应答信号 -> 发送IIC停止信号。

在这里插入图片描述
下图是写时序,步骤是:
IIC起始信号-> 发送器件地址+0(写) -> 等待模块应答 -> 应答后发送寄存器地址 -> 等待模块应答 -> 应答后写入高8位数据 -> 等待模块应答 -> 写入低8位数据 -> 等待模块应答 -> 发送IIC停止信号。
在这里插入图片描述
(3)寄存器说明
ADS1115有四个寄存器,可通过IIC接口使用地址指针进入。

  • 地址0X00为转换寄存器,它包含最后一次转换的结果。

  • 地址0X01为配置寄存器,用于更改ADS1115的工作模式和查询设备状态。

  • 另外两个寄存器,Lo_thresh和Hi_thresh,设置用于比较器函数的阈值,我们用不到。
    在这里插入图片描述
    配置寄存器说明
    配置寄存器有16位,用于控制工作模式、输入选择、数据速率、满量程范围和比较器模式。
    在这里插入图片描述
    第15位:OS,读操作时可以知道当前设备的工作状态;写操作时可以设置单次转换。本文配置为1(必须为断电模式下,当对OS写1时,设备会进入上电模式并完成一次数据转换,然后会自动将OS置0)
    第14-12位:MUX为输入多路复用器,对输入模式进行选择,如下图有八种输入模式,分别是四种差分与四种单端输入,本文配置为A0单端输入(0x04)。(单端输入就是测量的数据有两个引脚,一个输出一个地。将测量的输出接入A0引脚,测量的地与ADS1115共地)
    在这里插入图片描述
    第11-9位:PGA为可编程增益放大器,设置FSR(满刻度的范围),本文配置为±4.096V(0x01)后面电压计算公式与这个有关。
    在这里插入图片描述

    第8位:MODE选择持续转换模式与单次转换模式(单次转换模式需要OS位触发),本文配置为连续转换模式(0x00)在这里插入图片描述

    第7-5位:DR配置data rate数据传输速率,本文配置为128SPS(0x04)
    在这里插入图片描述
    第4-2位:对比较器的配置,我们不使用,默认为0即可(0x00)
    第1-0位:本位配置为关闭比较器并将ALERT/RDY引脚设置为高阻抗模式(0x03)

在这里插入图片描述
最终得到的配置结果为1100_0010_1000_0011(0xC283)。
当前配置的是A0的引脚,我们后续获取数据也是从A0引脚读取。
转换寄存器说明
16位转换寄存器以二进制的补码格式保存最后一次转换的结果。需要注意的是,在上电之后,转换寄存器被清除为0,并保持为0,直到第一次转换完成。

在这里插入图片描述
(4)实现代码说明
读取到的ADC值如何换算为电压?
以PGA设置为4.96V为例。
电压 = 采集到的ADC值 * 分辨率
分辨率 = 测量电压范围 / (2^AD位数-1) = 4.096 / 2的15次方 = 0.000125V
分辨率也可以在数据手册中查看,见右图。其中125uV = 0.125mV = 0.000125V。
在这里插入图片描述

/******************************************************************
 * 函 数 名 称:WriteADS1115
 * 函 数 说 明:向ADS1115的add地址写入dat数据
 * 函 数 形 参: add写入寄存器地址 
 *             dat_H写入的高8位数据  
 *             dat_L写入的低8位数据
 * 函 数 返 回:0写入成功 
 *             1写入器件地址无应答  
 *             2写入寄存器地址无应答 
 * 作       者:LC
 * 备       注:器件地址=0X90   
******************************************************************/
uint8_t WriteADS1115(uint8_t add,uint8_t dat_H,
                    uint8_t dat_L)
{
  IIC_Start();//起始信号
  IIC_Write(0x90);//器件地址     
  if( IIC_Wait_Ack() == 1 )
      return 1; 
  IIC_Write(add);//寄存器地址   
  if( IIC_Wait_Ack() == 1 )
      return 2;
  IIC_Write(dat_H);//写入高8位     
  IIC_Wait_Ack();//等待应答
  IIC_Write(dat_L);//写入低8位
  IIC_Wait_Ack();//等待应答
  IIC_Stop();//停止信号  
  return (0);
}
/******************************************************************
 * 函 数 名 称:ReadADS1115
 * 函 数 说 明:读取ADS1115的数据
 * 函 数 形 参:add读取的寄存器地址
 * 函 数 返 回:-1-读取失败  其他-读取成功
 * 作       者:LC
 * 备       注:无
******************************************************************/
float ReadADS1115(unsigned char add)
{
  int i =0;
  unsigned char dat[2]={0};
  unsigned int num = 0;
  float ret=0;
  IIC_Start();//起始信号
  IIC_Write(0x90);//器件地址+写
  if( IIC_Wait_Ack() == 1 ) 
      return -1;
  IIC_Write(add);//寄存器地址
  if( IIC_Wait_Ack() == 1 ) 
      return -1;  
  do{
    //超时判断
    i++;
    if( i > 20 ) return -1;  
    delay_1ms(1);
    IIC_Start();//重新发送起始信号
    IIC_Write(0x91);//器件地址+读
  }while(IIC_Wait_Ack() == 1);
    
  dat[0]=IIC_Read();//读高8位数据 
  IIC_Send_Ack(0);//应答
  dat[1]=IIC_Read();//读低8位数据 
  IIC_Send_Ack(1);//非应答  
  IIC_Stop();//发送停止信号
  //数据整合
  num =  ((dat[0]<<8) | (dat[1])); 
  //分辨率计算:测量电压范围/(2^AD位数-1)
  //    分辨率= 4.096/2^15=0.000125
  //      电压= 采集到的ADC值 * 分辨率
  if(num>32768)
      ret=(65535-num)*0.000125;
  else
      ret=num*0.000125;
   
  return ret;
}

2.9.3.2 引脚选择

ADS1115立创·梁山派
VDD5V
GNDGND
SCLPB8
SDAPB9
A0接入要测量的电压

在这里插入图片描述
2.9.3.3 移植至工程
移植步骤中的导入.c和.h文件与之前相同,只是将.c和.h文件更改为bsp_ads1115.c与bsp_ads1115.h。见2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件bsp_ads1115.c中,编写如下代码。

/********************************************************************************
  * 文 件 名: bsp_ads1115.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年04月06日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/

#include "bsp_ads1115.h"
#include "systick.h"
#include "stdio.h"

/******************************************************************
 * 函 数 名 称:ADS1115_GPIO_Init
 * 函 数 说 明:对IIC引脚初始化
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC 
 * 备       注:1100_0010_1000_0011  WriteADS1115(0x01,0xc2,0x83);
******************************************************************/
void ADS1115_GPIO_Init(void)
{                                
        //打开SDA与SCL的引脚时钟
        rcu_periph_clock_enable(RCU_SCL);
        rcu_periph_clock_enable(RCU_SDA);

        //设置SCL引脚模式为上拉输出
        gpio_mode_set(PORT_SCL, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SCL);
        //设置引脚为开漏模式,翻转速度2MHz
        gpio_output_options_set(PORT_SCL, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO_SCL);        
        //设置引脚输出高电平SCL等待信号
        gpio_bit_write(PORT_SCL, GPIO_SCL, SET);
        
        //设置SDA引脚
        gpio_mode_set(PORT_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SDA);
        gpio_output_options_set(PORT_SDA, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ, GPIO_SDA);        
        gpio_bit_write(PORT_SDA, GPIO_SDA, SET);
        //写入配置参数            
        WriteADS1115(0x01,0xC2,0x83);
}

/******************************************************************
 * 函 数 名 称:IIC_Start
 * 函 数 说 明:IIC起始信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Start(void)
{
        SDA_OUT();
                   
        SDA(1);
        delay_1us(5);
        SCL(1); 
        delay_1us(5);
        
        SDA(0);
        delay_1us(5);
        SCL(0);
        delay_1us(5);
                       
}
/******************************************************************
 * 函 数 名 称:IIC_Stop
 * 函 数 说 明:IIC停止信号
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Stop(void)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        
        SCL(1);
        delay_1us(5);
        SDA(1);
        delay_1us(5);
        
}
/******************************************************************
 * 函 数 名 称:IIC_Send_Ack
 * 函 数 说 明:主机发送应答
 * 函 数 形 参:0应答  1非应答
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Send_Ack(unsigned char ack)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        delay_1us(5);
        if(!ack) SDA(0);
        else     SDA(1);
        SCL(1);
        delay_1us(5);
        SCL(0);
        SDA(1);
}
/******************************************************************
 * 函 数 名 称:IIC_Wait_Ack
 * 函 数 说 明:等待从机应答
 * 函 数 形 参:无
 * 函 数 返 回:1=无应答   0=有应答
 * 作       者:LC
 * 备       注:无
******************************************************************/

unsigned char IIC_Wait_Ack(void)
{
        
        char ack = 0;
        unsigned char ack_flag = 10;
        SDA_IN();
        SDA(1);
        delay_1us(5);
        SCL(1);
        delay_1us(5);
        while( (GETSDA()==1) && ( ack_flag ) )
        {
                ack_flag--;
                delay_1us(5);
        }
        
        if( ack_flag <= 0 )
        {
                IIC_Stop();
                return 1;
        }
        else
        {
                SCL(0);
                SDA_OUT();
        }
        return ack;
}
/******************************************************************
 * 函 数 名 称:IIC_Write
 * 函 数 说 明:IIC写一个字节
 * 函 数 形 参:dat写入的数据
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:无
******************************************************************/
void IIC_Write(unsigned char dat)
{
        int i = 0;
        SDA_OUT();
        SCL(0);//拉低时钟开始数据传输
        
        for( i = 0; i < 8; i++ )
        {
                SDA( (dat & 0x80) >> 7 );
                __nop();
                __nop();
                __nop();
                dat<<=1;
                delay_1us(6); 
                SCL(1);
                delay_1us(4);
                SCL(0);
                delay_1us(4);
                
        }        
}

/******************************************************************
 * 函 数 名 称:IIC_Read
 * 函 数 说 明:IIC读1个字节
 * 函 数 形 参:无
 * 函 数 返 回:读出的1个字节数据
 * 作       者:LC
 * 备       注:无
******************************************************************/
unsigned char IIC_Read(void)
{
        unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
        SCL(0);
        delay_1us(5);
        SCL(1);
        delay_1us(5);
        receive<<=1;
        if( GETSDA() )
        {        
            receive|=1;   
        }
        delay_1us(5); 
    }                
  return receive;
}

/******************************************************************
 * 函 数 名 称:WriteADS1115
 * 函 数 说 明:向ADS1115的add地址写入dat数据
 * 函 数 形 参:add写入寄存器地址 dat_H写入的高8位数据  dat_L写入的低8位数据
 * 函 数 返 回:0写入成功 1写入器件地址无应答  2写入寄存器地址无应答 
 *              3写入高8位数据无应答  4写入低8位数据无应答
 * 作       者:LC
 * 备       注:器件地址=0X90   
******************************************************************/
uint8_t WriteADS1115(uint8_t add,uint8_t dat_H,uint8_t dat_L)
{
  IIC_Start();
  IIC_Write(0x90);     
  if( IIC_Wait_Ack() == 1 )
  {      
      printf("error 1\r\n");
       return 1; 
  }
  IIC_Write(add);   
  if( IIC_Wait_Ack() == 1 ) 
  {
      printf("error 2\r\n");
      return 2;     
  }
  IIC_Write(dat_H);     
  IIC_Wait_Ack();
  IIC_Write(dat_L);     
  IIC_Wait_Ack();
  IIC_Stop();  
  return (0);
}



/******************************************************************
 * 函 数 名 称:ReadADS1115
 * 函 数 说 明:读取ADS1115的数据
 * 函 数 形 参:add读取的寄存器地址
 * 函 数 返 回:-1-读取失败  其他-读取成功
 * 作       者:LC
 * 备       注:无
******************************************************************/
float ReadADS1115(unsigned char add)
{
  int i =0;
  unsigned char dat[2]={0};
  unsigned int num = 0;
  float ret=0;
  IIC_Start();//起始信号
  IIC_Write(0x90);//器件地址+写
  if( IIC_Wait_Ack() == 1 ) 
      return -1;
  IIC_Write(add);//寄存器地址
  if( IIC_Wait_Ack() == 1 ) 
      return -1;  
  do{
    //超时判断
    i++;
    if( i > 20 ) return -1;  
    delay_1ms(1);
    IIC_Start();//重新发送起始信号
    IIC_Write(0x91);//器件地址+读
  }while(IIC_Wait_Ack() == 1);
    
  dat[0]=IIC_Read();//读高8位数据 
  IIC_Send_Ack(0);//应答
  dat[1]=IIC_Read();//读低8位数据 
  IIC_Send_Ack(1);//非应答  
  IIC_Stop();//发送停止信号
  //数据整合
  num =  ((dat[0]<<8) | (dat[1])); 

        //数值计算取决于PGA配置
    //2的15次方=32768
    //设置的最大量程4.096
//        if(num>32768)
//                ret=((float)(65535-num)/32768.0)*4.096;
//        else
//                ret=((float)num/32768.0)*4.096;

  //分辨率计算:测量电压范围/(2^AD位数-1)
  //    分辨率= 4.096/2^15=0.000125
  //      电压= 采集到的ADC值 * 分辨率
  if(num>32768)
      ret=(65535-num)*0.000125;
  else
      ret=num*0.000125;
   
  return ret;
}


在文件bsp_ads1115.h中,编写如下代码。

#ifndef _BSP_ADS1115_H_
#define _BSP_ADS1115_H_
 
#include "gd32f4xx.h"


#define RCU_SCL  RCU_GPIOB
#define PORT_SCL GPIOB
#define GPIO_SCL GPIO_PIN_8

#define RCU_SDA  RCU_GPIOB
#define PORT_SDA GPIOB
#define GPIO_SDA GPIO_PIN_9


#define SDA_IN()  {gpio_mode_set(PORT_SDA, GPIO_MODE_INPUT,  GPIO_PUPD_PULLUP, GPIO_SDA);}        //SDA输入模式
#define SDA_OUT() {gpio_mode_set(PORT_SDA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_SDA);}  //SDA输出模式

#define SCL(BIT)  gpio_bit_write( PORT_SCL, GPIO_SCL, BIT?SET:RESET)
#define SDA(BIT)  gpio_bit_write( PORT_SDA, GPIO_SDA, BIT?SET:RESET)
#define GETSDA()  gpio_input_bit_get( PORT_SDA, GPIO_SDA)


void ADS1115_GPIO_Init(void);
unsigned char WriteADS1115(unsigned char add,unsigned char dat_H,unsigned char dat_L);
float ReadADS1115(unsigned char add);
#endif


2.9.4 移植验证
在自己工程中的main主函数中,编写如下。

/********************************************************************************
  * 文 件 名: main.c
  * 版 本 号: 初版
  * 修改作者: LC
  * 修改日期: 2023年04月06日
  * 功能介绍:          
  ******************************************************************************
  * 注意事项:
*********************************************************************************/

#include "gd32f4xx.h"
#include "systick.h"
#include "bsp_usart.h"
#include "bsp_ads1115.h"
#include "stdio.h"

int main(void)
{
        nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);  // 优先级分组
        systick_config();                //滴答定时器初始化 1ms
        usart_gpio_config(115200);
        ADS1115_GPIO_Init();
    
        printf("demo start\r\n");
        while(1) 
        {
            //当前设置最大量程为4.096V
            printf("A0 = %.4f\r\n", ReadADS1115(0x00) );//读取A0的值
            delay_1ms(1000);
        }
}

移植现象:将A0接入GND、3.3V和5V。

在这里插入图片描述
移植成功示例,见文件2.9.4-1 。

文件2.9.4-1

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

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

相关文章

Python云计算技术库之libcloud使用详解

概要 随着云计算技术的发展,越来越多的应用和服务迁移到了云端。然而,不同云服务商的API和接口千差万别,给开发者带来了不小的挑战。Python的libcloud库应运而生,它提供了一个统一的接口,让开发者可以轻松地管理不同云服务商的资源。本文将深入探讨libcloud库的特性、安装…

HCIA-RS基础-STP原理与配置

目录 STP&#xff08;生成树协议&#xff09;原理与配置1. 生成树的产生原因2. 生成树协议的基本原理3. 生成树协议的简单配置4. STP 存在的问题 总结 STP&#xff08;生成树协议&#xff09;原理与配置 1. 生成树的产生原因 在计算机网络中&#xff0c;生成树&#xff08;Sp…

Burp内置浏览器报错提示网页证书无效的解决方式

在Proxy——代理设置中——翻到底&#xff0c;勾选忽略浏览器的Burp错误信息 然后刷新你的网页&#xff0c;就可以按常规操作&#xff0c;点击“继续访问”&#xff0c;打开网页了

Python数据分析和机器学习库之imbalanced-learn使用详解

概要 在实际的数据分析和机器学习任务中,经常会遇到数据不平衡的情况,即不同类别的样本数量差异较大,这会导致模型训练和预测的不准确性。Python的imbalanced-learn库提供了一系列处理不平衡数据的方法和工具,帮助开发者更好地应对这一问题。本文将深入探讨imbalanced-lea…

蓝桥杯算法题:区间移位

题目描述 数轴上有n个闭区间&#xff1a;D1,...,Dn。 其中区间Di用一对整数[ai, bi]来描述&#xff0c;满足ai < bi。 已知这些区间的长度之和至少有10000。 所以&#xff0c;通过适当的移动这些区间&#xff0c;你总可以使得他们的“并”覆盖[0, 10000]——也就是说[0, 100…

zdpcss_transparent_animation_login:使用纯HTML+CSS+JS开发支持设置主题和带动画的科技风登录界面

废话不多说&#xff0c;先上图&#xff0c;有图有真相&#xff1a; 在左下角有一排颜色&#xff0c;点击可以设置主题色&#xff1a; 比如&#xff0c;我这里点击了橙色&#xff0c;登录界面就变成了如下样子&#xff1a; 另外&#xff0c;在输入账号和密码的时候&#x…

集合系列(十七) -List集合移除元素相关的操作介绍

一、问题由来 在实际开发的时候&#xff0c;我们经常会碰到这么一个困难&#xff1a;一个集合容器里面有很多重复的对象&#xff0c;里面的对象没有主键&#xff0c;但是根据业务的需求&#xff0c;实际上我们需要根据条件筛选出没有重复的对象。 比较暴力的方法&#xff0c;…

【Visual Studio】将项目下的文件夹所有文件随编译自动复制输出到运行目录

要将项目根目录下的文件夹内容输出到运行目录&#xff0c;去处理其中的子文件夹和文件&#xff0c;逐个手动设置文件属性或进行复制显然不是一个可行的方法&#xff0c;因为这既繁琐又低效&#xff0c;那有没有更加高效的方式呢 文章目录 选择文件夹修改配置文件输出文件夹 这里…

亚远景科技-ASPICE评估输入

评估输入应在评估的数据收集阶段之前确定&#xff0c;并得到评估发起人的批准。 评估输入的任何更改都应征得发起人或发起人授权人的同意&#xff0c;并记录在评估记录中。 评估输入至少应明确以下内容&#xff1a; 原文链接&#xff1a;ASPICE评估-ASPICE评估输入-亚远景

Linux集群(一)Nginx搭建

目录 一、Nginx介绍 1.什么是Nginx 2.Nginx的特点 二、Nginx配置 1.jdk的安装 1.1检查jdk版本 1.2上传并安装jdk 2.安装Tomcat 3.下载Nginx 3.1安装依赖包 ​编辑 3.2安装Nginx 3.3运行 三、Nginx中的常用命令​编辑 一、Nginx介绍 1.什么是Nginx Nginx&#xff08;…

网易RAG问答知识库开源了,Star 6K!!

网易RAG问答知识库开源了&#xff0c;Star 6K&#xff01;&#xff01; RAG 问答知识库 QAnything 开源了QAnything 架构设计剖析整个架构的工作流程主要包含三个环节为什么需要两阶段检索&#xff1f;使用的基座大模型相关技术组件 QAnything 本地部署一键部署安装&#xff0c…

实操:flatpicker-时间选择工具

官网 flatpicker是一个轻量级且功能强大的日期时间选择器。精益、用户体验驱动和可扩展&#xff0c;但它不依赖于任何库。用户界面很少&#xff0c;但主题很多。丰富、公开的API和事件系统使其适用于任何环境。 https://flatpickr.js.org/ 依赖 <link rel"stylesheet…

Coursera上Learning Linux for LFCA Certification专项课程01:Linux Fundamentals 学习笔记

Linux Fundamentals Course Certificate 本文是 Linux Fundamentals 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Linux FundamentalsWeek 01: Linux Operating SystemLearning Objectives Specialization OverviewHistory of LinuxQuiz: Hist…

51单片机学习笔记12 SPI接口 使用1302时钟

51单片机学习笔记12 SPI接口 使用1302时钟 一、DS1302简介1. 功能特性2. 涓流充电3. 接口介绍时钟数据和控制线&#xff1a;电源线&#xff1a;备用电池连接&#xff1a; 二、寄存器介绍1. 控制寄存器2. 时间寄存器3. 日历/时钟寄存器 三、BCD码介绍四、DS1302时序1. 读时序2. …

基于SpringBoot的“数码论坛系统设计与实现”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数码论坛系统设计与实现”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面图 数码板…

线段树练习

1.单点修改区间查询 P3374 【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m&#xff0c;分别表示该数列数字的个数和操作的总个…

x86汇编写矩阵乘法问题(实现一个3×3矩阵乘法的汇编代码)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

c++的学习之路:10、string(2)

本章主要说一下模拟实现string类的部分功能&#xff0c;文章末附上所有代码。 目录 一、构造函数与析构函数 二、拷贝构造 三、c_str 四、【】和迭代器的遍历与访问 五、size 六、判断 七、reserve 八、push_back 九、resize 十、append 十一、 十二、insert 十…

单例(Singleton)设计模式

2.1 设计模式概述 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱。"套路" 经典的设计模式共有23种。每个…

linux基础篇:linux挂载本地yum源——centos7.9为例

linux挂载本地yum源——centos7.9为例 一、Linux本地yum源介绍 Linux本地YUM源是一个本地存储的软件包仓库&#xff0c;它允许用户在不连接互联网的情况下安装、更新和管理软件包。本地YUM源可以提高软件包安装速度&#xff0c;降低网络带宽消耗&#xff0c;并提高软件包管理…