当前位置: 首页 > news >正文

51单片机——DS18B20温度传感器

        由于DS18B20数字温度传感器是单总线接口,所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信,将检测的环境温度读取出来

1、DS18B20模块电路

        传感器接口的单总线管脚接至单片机P3.7IO口上 

2、DS18B20介绍

2.1 DS18B20外观实物图 

        管脚1为GND,管脚2为数据DQ,管脚3为VDD 

2.2 DS18B20内部结构图

2.2.1 64位光刻ROM

        64位光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。

        64位光刻 ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后 8位是前面56位的循环冗余校验码。

        光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的

2.2.2 高速缓存存储器 

        DS18B20温度传感器的内部存储器包括一个高速的暂存器RAM和一个非易失性的可电擦除的 EEPROM,后者存放高温度和低温度触发器TH、TL和配置寄存器 

2.2.2.1 配置寄存器

        配置寄存器是配置不同的位数来确定温度和数字的转化,配置寄存器结构如下图所示:

 

(1)低五位一直都是“1

(2)TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在 DS18B20出厂时该位被设置为0,用户不需要去改动

(3)R1R0用来设置DS18B20的精度(分辨率),精度可设置为9,10,11或12位,对应的分辨率温度是 0.5℃,0.25℃,0.125℃和0.0625℃。R0和R1配置如下图所示:

在初始状态下默认的精度是12位,即R0=1、R1=1

2.2.2.2 高速暂存存储器

        (1)高速暂存存储器由9个字节组成,其分配如下图所示:

        当温度转换命令(44H)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节

        (2)存储的两个字节,高字节的前5位是符号位S,单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如下:

 

如果测得的温度大于0,这5位为“0”,只要将测到的数值乘以0.0625(默认精度是12位)即可得到实际温度

如果温度小于0,这5位为“1”, 测到的数值需要取反加1再乘以0.0625即可得到实际温度。

温度与数据对应关系如下图所示:

 

2.3 DS18B20时序

DS18B20时序包括如下几种:初始化时序、写(0和1)时序、 读(0和1)时序

DS18B20发送所有的命令和数据都是字节的低位在前

2.3.1 初始化时序

        主机输出低电平,保持低电平至少480us(该时间范围:480-960us),以产生复位脉冲。接着主机释放总线,外部的上拉电阻将单总线拉高,延时15-60us,并进入接收模式

        接着DS18B20拉低总线60-240us,以产生低电平应答脉冲,若为低电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要480us

//初始化时序图13的左半段:复位脉冲时序
void ds18b20_reset(){
    DS18B20_PORT=0;  //拉低DQ线(单总线)     主机输出低电平
    delay_10us(75);  //750us(480us-960us)        保持低电平至少480us
    DS18B20_PORT=1;  //拉高DQ线                       主机释放总线,外部的上拉电阻将单总线拉高
    delay_10us(2);  //20us(15us-60us)                     延时15-60us
}

//初始化时序图13的右半段:检测DS18B20是否存在,返回值0存在;返回值1不存在
u8 ds18b20_check(){
    u8 time_temp=0;
    while(DS18B20_PORT&&time_temp<20){  //DS18B20_PORT:1
        time_temp++;
        delay_10us(1);  //10us,要循环20次,相当于200us(60-240us)
    }
    if(time_temp>=20){
        return 1;  //超时了,仍没有等到低电平
    }else{
        time_temp=0;
    }
    //如果等到了低电平,DS18B20_PORT变为0
    while((!DS18B20_PORT)&&time_temp<20){  //DS18B20_PORT:0
        time_temp++;
        delay_10us(1);
    }
    if(time_temp>=20){
        return 1;  //超时了,仍没有等到高电平
    }
    return 0;
}

2.3.2 写时序

        写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线

        写1时序:主机输出低电平,延时2us,然后释放总线,延时60us

        写0时序:主机输出低电平,延时60us,然后释放总线,延时2us

//写时序:写一个字节到ds18b20中,提前准备好数据
void ds18b20_write_byte(u8 dat){  
    u8 i=0;
    u8 temp=0;
    //从低位向高位写 eg:1001 0011
    for(i=0;i<8;i++){
        temp=dat&0x01;  //拿到dat中低位的数据
        dat>>=1;
        if(temp){
            //写1时序
            DS18B20_PORT=0;                                     主机输出低电平
            _nop_();  //1us                                              延时2us
            _nop_();
            DS18B20_PORT=1;                                     释放总线
            delay_10us(10);  //100us(60-120us)            延时60us
        }else{
            //写0时序
            DS18B20_PORT=0;                                     主机输出低电平
            delay_10us(6);                                              延时60us
            DS18B20_PORT=1;                                     释放总线
            _nop_();  //1us                                              延时2us
            _nop_();
        }
    }
}  

2.3.3 读时序 

 

        所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态

        典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us

 //读一位
u8 ds18b20_read_bit(){
    u8 dat=0;  //存的是某一位(0或1)
    //主机输出低电平
    DS18B20_PORT=0;
    //延时2us
    _nop_();  //1us
    _nop_();
    DS18B20_PORT=1;     主机转入输入模式
    //延时2us,时间不能过长,必须在15us内读到数据  延时12us
    _nop_();  //1us
    _nop_();
    if(DS18B20_PORT){      读取单总线当前的电平
        dat=1;
    }else{
        dat=0;
    }
    delay_10us(5);     延时50us
    return dat;
}
//读一个字节
u8 ds18b20_read_byte(){
    u8 i=0;
    u8 dat=0;
    u8 temp=0;
    for(i=0;i<8;i++){
        temp=ds18b20_read_bit();  //i=0时,temp=1;i=1时,temp=1
        dat>>=1;  //i=0时,dat=000 0000;i=1时,dat=0100 0000
        dat|=temp<<7;  //i=0时,dat=1000 0000;i=1时,dat=1100 0000
    }
    return dat;
}

2.3.4 DS18B20的典型温度读取过程

复位→发SKIPROM命令(0XCC)→发开始转换命令(0X44)→延时→复位→发送SKIPROM命令(0XCC)→发读存储器命令(0XBE)→连续读出两个字节数据(即温度)→结束

 /*
DS18B20 的典型温度读取过程为:
复位→发SKIPROM命令(0XCC)→发开始转换命令(0X44)
→延时→
复位→发送SKIPROM命令(0XCC)→发读存储器命令(0XBE)→连续读出两个字节数据(即温度)→结束。
*/
//开始温度转换
void ds18b20_start(){
    ds18b20_init();  //初始化:复位和检查
    ds18b20_write_byte(0xcc);  //发SKIPROM命令(0XCC)
    ds18b20_write_byte(0x44);  //发开始转换命令(0X44)
}
//从ds18b20得到温度值
double ds18b20_read_temperture(){
    double temp;
    u8 dath=0;
    u8 datl=0;
    u16 value=0;
    ds18b20_start();
    ds18b20_init();  //初始化:复位和检查
    ds18b20_write_byte(0xcc);  //发送SKIPROM命令(0XCC)
    ds18b20_write_byte(0xbe);  //发读存储器命令(0XBE)
    //连续读出两个字节数据(即温度)
    datl=ds18b20_read_byte();  //低8位
    dath=ds18b20_read_byte();  //高8位
    //高8位和低8位连接起来,拼成16位
    value=(dath<<8)+datl;  
    //判断是正温度还是负温度
    if((value&0xf800)==0xf800){  //负温度
        value=(~value)+1;
        temp=value*(-0.0625);
    }else{  //正温度
        temp=value*0.0625;
    }
    return temp;

3、实验

要实现的功能是:插上DS18B20温度传感器,数码管显示检测的温度值 

如果不知道怎么进行多文件编程,51单片机——I2C-EEPROM-CSDN博客中有

3.1 Public文件

3.1.1 public.h

//头文件中放置函数的声明、全局变量的定义
#ifndef _public_H
#define _public_H
#include "reg52.h"
//全局变量
typedef unsigned int u16;
typedef unsigned char u8;
//两个延迟函数声明
void delay_10us(u16 us);
void delay_ms(u16 ms);
#endif

3.1.2 public.c

#include "public.h"
void delay_10us(u16 us){
    while(us--);
}
void delay_ms(u16 ms){
    u16 i=0,j=0;
    for(i=0;i<ms;i++){
        for(j=0;j<110;j++);
    }
}

3.2 动态数码管 

3.2.1 smg.h

#ifndef _smg_H
#define _smg_H
#include "public.h"
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define SMG_A_DP_PORT P0
extern u8 gsmg_code[];
void smg_display(u8 save_buff[],u8 pos);
#endif

3.2.2 smg.c

 #include "smg.h"
u8 gsmg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//save_buff是一个u8类型的数组,方便外部传入要显示的数据
//pos是数码管从左开始第几个位置开始显示,取值范围是1-8
void smg_display(u8 save_buff[],u8 pos){
    u16 i=0;
    u16 pos_temp=pos-1;
    for(i=pos_temp;i<8;i++){
        //位选
        switch(i){
            case 0:
                LSC=1,LSB=1,LSA=1;  //7
                break;
            case 1:
                LSC=1,LSB=1,LSA=0;  //6
                break;
            case 2:
                LSC=1,LSB=0,LSA=1;  //5
                break;
            case 3:
                LSC=1,LSB=0,LSA=0;  //4
                break;
            case 4:
                LSC=0,LSB=1,LSA=1;  //3
                break;
            case 5:
                LSC=0,LSB=1,LSA=0;  //2
                break;
            case 6:
                LSC=0,LSB=0,LSA=1;  //1
                break;
            case 7:
                LSC=0,LSB=0,LSA=0;  //0
                break;
        }
        SMG_A_DP_PORT=save_buff[i-pos_temp]; 
        delay_10us(100);
        SMG_A_DP_PORT=0x00;  //消隐
    }
}

3.3 DS18B20

3.3.1 ds18b20.h

#ifndef _ds18b20_H
#define _ds18b20_H
#include "public.h"
#include "intrins.h"  //_nop_():1us
sbit DS18B20_PORT=P3^7;  //DQ
//初始化时序图13的左半段:复位脉冲时序
void ds18b20_reset();
//初始化时序图13的右半段:检测DS18B20是否存在,返回值0存在;返回值1不存在
u8 ds18b20_check();
//初始化时序
u8 ds18b20_init();
//写时序:写一个字节到ds18b20中,提前准备好数据
void ds18b20_write_byte(u8 dat);
//读一位
u8 ds18b20_read_bit();
//读一个字节
u8 ds18b20_read_byte();
//开始温度转换
void ds18b20_start();
//从ds18b20得到温度值
double ds18b20_read_temperture();
#endif

3.3.2 ds18b20.c

#include "ds18b20.h"
//协议层
//初始化时序图13的左半段:复位脉冲时序
void ds18b20_reset(){
    DS18B20_PORT=0;  //拉低DQ线(单总线)
    delay_10us(75);  //750us(480us-960us)
    DS18B20_PORT=1;  //拉高DQ线
    delay_10us(2);  //20us(15us-60us)
}

//初始化时序图13的右半段:检测DS18B20是否存在,返回值0存在;返回值1不存在
u8 ds18b20_check(){
    u8 time_temp=0;
    while(DS18B20_PORT&&time_temp<20){  //DS18B20_PORT:1
        time_temp++;
        delay_10us(1);  //10us,要循环20次,相当于200us(60-240us)
    }
    if(time_temp>=20){
        return 1;  //超时了,仍没有等到低电平
    }else{
        time_temp=0;
    }
    //如果等到了低电平,DS18B20_PORT变为0
    while((!DS18B20_PORT)&&time_temp<20){  //DS18B20_PORT:0
        time_temp++;
        delay_10us(1);
    }
    if(time_temp>=20){
        return 1;  //超时了,仍没有等到高电平
    }
    return 0;
}

//初始化时序(将初始化时序图13的左半段和右半段连接起来)
u8 ds18b20_init(){
    ds18b20_reset();
    return ds18b20_check();
}


//ds18b20中读写操作
//写时序:写一个字节到ds18b20中,提前准备好数据
void ds18b20_write_byte(u8 dat){  
    u8 i=0;
    u8 temp=0;
    //从低位向高位写 1001 0011
    for(i=0;i<8;i++){
        temp=dat&0x01;  //拿到dat中低位的数据
        dat>>=1;
        if(temp){
            //写1时序
            DS18B20_PORT=0;
            _nop_();  //1us
            _nop_();
            DS18B20_PORT=1;
            delay_10us(10);  //100us(60-120us)
        }else{
            //写0时序
            DS18B20_PORT=0;
            delay_10us(6);
            DS18B20_PORT=1;
            _nop_();  //1us
            _nop_();
        }
    }
}

//读时序:读位、读字节 1001 0011
//读一位
u8 ds18b20_read_bit(){
    u8 dat=0;  //存的是某一位(0或1)
    //主机输出低电平
    DS18B20_PORT=0;
    //延时2us
    _nop_();  //1us
    _nop_();
    DS18B20_PORT=1;
    //延时2us,时间不能过长,必须在15us内读到数据
    _nop_();  //1us
    _nop_();
    if(DS18B20_PORT){
        dat=1;
    }else{
        dat=0;
    }
    delay_10us(5);
    return dat;
}
//读一个字节
u8 ds18b20_read_byte(){
    u8 i=0;
    u8 dat=0;
    u8 temp=0;
    for(i=0;i<8;i++){
        temp=ds18b20_read_bit();  //i=0时,temp=1;i=1时,temp=1
        dat>>=1;  //i=0时,dat=000 0000;i=1时,dat=0100 0000
        dat|=temp<<7;  //i=0时,dat=1000 0000;i=1时,dat=1100 0000
    }
    return dat;
}


/*
DS18B20 的典型温度读取过程为:
复位→发SKIPROM命令(0XCC)→发开始转换命令(0X44)
→延时→
复位→发送SKIPROM命令(0XCC)→发读存储器命令(0XBE)→连续读出两个字节数据(即温度)→结束。
*/
//开始温度转换
void ds18b20_start(){
    ds18b20_init();  //初始化:复位和检查
    ds18b20_write_byte(0xcc);  //发SKIPROM命令(0XCC)
    ds18b20_write_byte(0x44);  //发开始转换命令(0X44)
}
//从ds18b20得到温度值
double ds18b20_read_temperture(){
    double temp;
    u8 dath=0;
    u8 datl=0;
    u16 value=0;
    ds18b20_start();
    ds18b20_init();  //初始化:复位和检查
    ds18b20_write_byte(0xcc);  //发送SKIPROM命令(0XCC)
    ds18b20_write_byte(0xbe);  //发读存储器命令(0XBE)
    //连续读出两个字节数据(即温度)
    datl=ds18b20_read_byte();  //低8位
    dath=ds18b20_read_byte();  //高8位
    //高8位和低8位连接起来,拼成16位
    value=(dath<<8)+datl;  
    //判断是正温度还是负温度
    if((value&0xf800)==0xf800){  //负温度
        value=(~value)+1;
        temp=value*(-0.0625);
    }else{  //正温度
        temp=value*0.0625;
    }
    return temp;
}

3.4 main.c

#include "public.h"
#include "smg.h"
#include "ds18b20.h"
/*
下载程序后,插上DS18B20温度传感器,数码管显示检测的温度值
*/
void main(){
    u8 i=0;
    int temp_value;  //有负温度
    u8 temp_buf[5];
    ds18b20_init();  //起始信号,检查ds18b20在不在,要不要都可以
    while(1){
        i++;
        if(i%50==0){  //减少读的频率,750us转换一次
            temp_value=ds18b20_read_temperture()*10;
        }
        if(temp_value<0){
            //显示符号位
            temp_value=-temp_value;
            temp_buf[0]=0x40;  //显示负号
        }else{
            temp_buf[0]=0x00;  //不显示
        }
        //读的温度要在数码管显示
        temp_buf[1]=gsmg_code[temp_value/1000];
        temp_buf[2]=gsmg_code[temp_value%1000/100];
        temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;
        temp_buf[4]=gsmg_code[temp_value%1000%100%10];
        smg_display(temp_buf,4);
    }
}

相关文章:

51单片机——DS18B20温度传感器

由于DS18B20数字温度传感器是单总线接口&#xff0c;所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信&#xff0c;将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…...

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…...

关于jwt和security

JSON Web Token&#xff08;缩写 JWT&#xff09; 目前最流行、最常见的跨域认证解决方案&#xff0c;前端后端都需要会使用的东西-腾讯云开发者社区-腾讯云 SpringBoot整合Security安全框架、控制权限让我们一起来看看Security吧&#xff01;我想每个写项目的人&#xff0c;都…...

统计学习算法——逻辑斯谛回归

内容来自B站Up主&#xff1a;动画讲编程https://www.bilibili.com/video/BV1CR4y1L7RC、风中摇曳的小萝卜https://www.bilibili.com/video/BV17r4y137bW&#xff0c;仅为个人学习所用。 极大似然估计 几率、概率与似然 几率是指某个事件发生的可能性与不发生的可能性之比&am…...

算法(蓝桥杯)贪心算法5——删数问题的解题思路

问题描述 给定一个高精度的正整数 n&#xff08;n≤1000 位&#xff09;&#xff0c;需要删除其中任意 s 个数字&#xff0c;使得剩下的数字按原左右顺序组成一个新的正整数&#xff0c;并且这个新的正整数最小。例如&#xff0c;对于数字 153748&#xff0c;删除 2 个数字后&a…...

数字孪生发展及应用

一、数字孪生的前世今生 &#xff08;一&#xff09;萌芽的种子&#xff1a;概念的首次提出 数字孪生的概念最早可追溯到 20 世纪 60 年代&#xff0c;美国国家航空航天局&#xff08;NASA&#xff09;在阿波罗计划中&#xff0c;为了训练宇航员和指挥控制人员&#xff0c;使用…...

MYSQL对表的增删改查

表的基本操作 创建表create table [if not exists] <tableName> (<columnName> <columnType> [constraints] [comment] , ...<columnName> <columnType> [constraints] [comment] ) ;删除表drop table [if exists] <tableName> ;…...

左神算法基础提升--4

文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况&#xff1a;1.当前节点参与最大距离的求解&#xff1b;2.当前节点不参与最大距离的求解&#xff1b; 1.当前节点参与最…...

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…...

CloudberryDB(四)并行执行

要查看CloudberryDB & Greenplum数据库的并行度配置&#xff0c;可以使用以下几种方法&#xff1a; ### 方法一&#xff1a;使用SHOW命令 在Greenplum数据库中&#xff0c;可以使用SHOW命令来查看当前的并行度配置。例如&#xff1a; sql SHOW gp_parallel_degree ; SH…...

LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS

题目 大型语言模型是人类级别的提示工程师 论文地址&#xff1a;https://arxiv.org/abs/2211.01910 项目地址&#xff1a;https://github.com/keirp/automatic_prompt_engineer 摘要 通过对自然语言指令进行调节&#xff0c;大语言模型 (LLM) 显示了作为通用计算机的令人印象深…...

rabbitmq安装延迟队列

在RabbitMQ中&#xff0c;延迟队列是一种特殊的队列类型。当消息被发送到此类队列后&#xff0c;不会立即投递给消费者&#xff0c;而是会等待预设的一段时间&#xff0c;待延迟期满后才进行投递。这种队列在多种场景下都极具价值&#xff0c;比如可用于处理需要在特定时间触发…...

Kubernetes (K8s) 入门指南

Kubernetes (K8s) 入门指南 什么是Kubernetes&#xff1f; Kubernetes&#xff0c;通常简称为 K8s&#xff08;因为从 “K” 到 “s” 之间有八个字符&#xff09;&#xff0c;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌设…...

Python 调用 Ollama 库:本地大语言模型使用详解

ollama 是一个用于调用本地大语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的 Python 库&#xff0c;旨在提供简单、高效的 API 接口&#xff0c;以便开发者能够方便地与本地的大语言模型进行交互。以下是关于如何在 Python 中使用 ollama 库的详细介…...

python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像

目录 1. 使用plt.savefig保存无边框图形 2. 显示在屏幕上&#xff0c;并且去掉窗口的标题栏和工具栏 3. 通过配置 matplotlib 的 backend 和使用 Tkinter&#xff08;或其他图形库&#xff09; 方法 1&#xff1a;使用 TkAgg 后端&#xff0c;并禁用窗口的工具栏和标题栏 …...

无人机(Unmanned Aerial Vehicle, UAV)路径规划介绍

无人机&#xff08;Unmanned Aerial Vehicle, UAV&#xff09;是无人驾驶飞行器的简称。凭借其体积小巧、操作简便、生存能力强等诸多优势&#xff0c;无人机在军事、电力巡检、航空航天与科学研究等诸多领域得到了广泛应用。在执行任务时&#xff0c;无人机可搭载多种传感器设…...

python爬虫入门(实践)

python爬虫入门&#xff08;实践&#xff09; 一、对目标网站进行分析 二、博客爬取 获取博客所有h2标题的路由 确定目标&#xff0c;查看源码 代码实现 """ 获取博客所有h2标题的路由 """url "http://www.crazyant.net"import re…...

于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节我们主要来学习单个函数的声明与定义&#xff0c;static和extern… 这里写目录标题 一、单个函数…...

python实现pdf转word和excel

一、引言   在办公中&#xff0c;我们经常遇收到pdf文件格式&#xff0c;因为pdf格式文件不易修改&#xff0c;当我们需要编辑这些pdf文件时&#xff0c;经常需要开通会员或收费功能才能使用编辑功能。今天&#xff0c;我要和大家分享的&#xff0c;是如何使用python编程实现…...

Pandas使用笔记

个人学习笔记 日期转换 索引日期格式&#xff1a;2023-09-12 15:00:00 转换为&#xff1a;2023-09-12 import pandas as pd# 假设你的 DataFrame 名为 df&#xff0c;索引是 2023-09-12 15:00:00 # 这里创建一个示例 DataFrame 用于演示 data {value: [1, 2, 3]} index pd…...

高等数学学习笔记 ☞ 定积分与积分公式

1. 定积分的基本概念 1.1 定积分的定义 1. 定义&#xff1a;设函数在闭区间上有界。在闭区间上任意插入若干个分点&#xff0c;即&#xff0c; 此时每个小区间的长度记作(不一定是等分的)。然后在每个小区间上任意取&#xff0c;对应的函数值为。 为保证每段的值(即矩形面积)无…...

wow-agent---task2使用llama-index创建Agent

一&#xff1a;创造俩个函数&#xff0c;multiply和add作为fuction calling被LLM当做工具来使用&#xff0c;实现计算一个简单的计算题&#xff1a; from llama_index.llms.ollama import Ollama from llama_index.core.agent import ReActAgent from llama_index.core.tools …...

RabbitMQ实现延迟消息发送——实战篇

在项目中&#xff0c;我们经常需要使用消息队列来实现延迟任务&#xff0c;本篇文章就向各位介绍使用RabbitMQ如何实现延迟消息发送&#xff0c;由于是实战篇&#xff0c;所以不会讲太多理论的知识&#xff0c;还不太理解的可以先看看MQ的延迟消息的一个实现原理再来看这篇文章…...

Oracle 拉链式merge sort join 原理

Oracle 拉链式Merge Sort Join 的原理&#xff0c;我用一个生活中的比喻来解释。 --- 比喻场景&#xff1a;匹配快递包裹和收件人 1. 快递包裹清单 想象我们有一个快递公司送货的包裹清单&#xff0c;清单按照收件人的邮编&#xff08;ZIP Code&#xff09;排序&#xff1a; …...

QModbusTCPClient占用内存持续增长

最近使用QModbusTCPClient通信&#xff0c;需要频繁发送读写请求&#xff0c;发现软件占用内存一直在增减&#xff0c;经过不断咨询和尝试&#xff0c;终于解决了。 1.方案一&#xff08;失败&#xff09; 最开始以为是访问太频繁&#xff0c;导致创建reply的对象比delete re…...

代码中使用 Iterable<T> 作为方法参数的解释

/*** 根据课程 id 集合查询课程简单信息* param ids id 集合* return 课程简单信息的列表*/ GetMapping("/courses/simpleInfo/list") List<CourseSimpleInfoDTO> getSimpleInfoList(RequestParam("ids") Iterable<Long> ids); 一、代码解释&…...

Oracle数据库传统审计怎么用

Oracle数据库传统审计怎么用 审计功能开启与关闭By Session还是By AccessWhenever Successful数据库语句审计数据库对象审计查看审计策略和记录Oracle数据库审计功能分为传统审计(Traditional Auditing)和统一审计(Unified Auditing)。统一审计是从Oracle 12c版本开始引入的…...

leetcode-买卖股票问题

309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 动态规划解题思路&#xff1a; 1、暴力递归&#xff08;难点如何定义递归函数&#xff09; 2、记忆化搜索-傻缓存法&#xff08;根据暴力递归可变参数确定缓存数组维度&#xff09; 3、严格表结构依…...

MYSQL学习笔记(三):分组、排序、分页查询

前言&#xff1a; 学习和使用数据库可以说是程序员必须具备能力&#xff0c;这里将更新关于MYSQL的使用讲解&#xff0c;大概应该会更新30篇&#xff0c;涵盖入门、进阶、高级(一些原理分析);这一篇是讲解分组、排序、分页查询&#xff0c;并且结合案例进行讲解&#xff1b;虽…...

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…...

wordpress 文字插件下载/抖音代运营大概多少钱一个月

信号量 信号量的概念 信号量广泛用于进程或线程间的同步和互斥&#xff0c; 信号量本质上是一个非负的整数计数器&#xff0c; 它被用来控制对公共资源的访问 编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限&#xff0c; 当信号量值大于&#xff10; 时&…...

免费个人网站建设公司/百度推广官方网站

解决的问题 springboot&#xff08;当然别的也可以&#xff09;多环境切换需要修改配置文件硬编码&#xff0c;打包时不够方便。 解决&#xff1a; 配置文件能读取pom文件中的配置&#xff0c;根据命令选择不同配置注入springboot的配置文件中 pom配置文件&#xff1a; <…...

梧州网站建设推广/怎么做网站优化

1.查看有无安装过mysqlrpm -qa|grep mysql2.查看有无安装包yum list mysql*3.虚拟机关掉eth0&#xff0c;联网后&#xff0c;安装mysql服务yum install mysql-serveryum install mysql-devel4.开启eth0&#xff0c;Xshell连接后&#xff0c;启动&&停止服务(1)在mysql配…...

模板网站开发/网络营销推广方案模板

时隔一年四个月&#xff0c;周杰伦又发专辑了&#xff0c;虽然还是可怜的只有一首单曲&#xff0c;但是从粉丝的热情程度看&#xff0c;丝毫不减当年的盛况。虽然结婚都当爸爸了&#xff0c;但是依然抵挡不住他的超高人气&#xff0c;说是如今的流量之王都不为过。1、还记得当时…...

ppt超链接至网站怎么做/爱站关键词

// 题目描述 // 输入一棵二叉树&#xff0c;求该树的深度。 // 从根结点到叶结点依次经过的结点&#xff08;含根、叶结点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。public class TreeNode {int val 0;TreeNode left null;TreeNode right…...

綦江中国建设银行官网站/搜索引擎优化的方式

要求&#xff1a; 异步随机生成按照各个路线行驶的车辆。 例如&#xff1a; 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 信号灯忽略黄灯&#xff0c;只考虑红灯和绿灯。 应考虑左转车辆控制信号…...