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)R1和R0用来设置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数字温度传感器是单总线接口,所以需要使用51单片机的一个IO口模拟单总线时序与DS18B20通信,将检测的环境温度读取出来 1、DS18B20模块电路 传感器接口的单总线管脚接至单片机P3.7IO口上 2、DS18B20介绍 2.1 DS18B20外观实物图 管脚1为GN…...
HTML5+Canvas实现的鼠标跟随自定义发光线条源码
源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷,在黑色的背景中,鼠标滑过即产生彩色变换的发光线条效果,且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…...
关于jwt和security
JSON Web Token(缩写 JWT) 目前最流行、最常见的跨域认证解决方案,前端后端都需要会使用的东西-腾讯云开发者社区-腾讯云 SpringBoot整合Security安全框架、控制权限让我们一起来看看Security吧!我想每个写项目的人,都…...
统计学习算法——逻辑斯谛回归
内容来自B站Up主:动画讲编程https://www.bilibili.com/video/BV1CR4y1L7RC、风中摇曳的小萝卜https://www.bilibili.com/video/BV17r4y137bW,仅为个人学习所用。 极大似然估计 几率、概率与似然 几率是指某个事件发生的可能性与不发生的可能性之比&am…...
算法(蓝桥杯)贪心算法5——删数问题的解题思路
问题描述 给定一个高精度的正整数 n(n≤1000 位),需要删除其中任意 s 个数字,使得剩下的数字按原左右顺序组成一个新的正整数,并且这个新的正整数最小。例如,对于数字 153748,删除 2 个数字后&a…...
数字孪生发展及应用
一、数字孪生的前世今生 (一)萌芽的种子:概念的首次提出 数字孪生的概念最早可追溯到 20 世纪 60 年代,美国国家航空航天局(NASA)在阿波罗计划中,为了训练宇航员和指挥控制人员,使用…...
MYSQL对表的增删改查
表的基本操作 创建表create table [if not exists] <tableName> (<columnName> <columnType> [constraints] [comment] , ...<columnName> <columnType> [constraints] [comment] ) ;删除表drop table [if exists] <tableName> ;…...
左神算法基础提升--4
文章目录 树形dp问题Morris遍历 树形dp问题 求解这个问题需要用到我们在基础班上学到的从节点的左子树和右子树上拿信息的方法。 求最大距离主要分为两种情况:1.当前节点参与最大距离的求解;2.当前节点不参与最大距离的求解; 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数据库的并行度配置,可以使用以下几种方法: ### 方法一:使用SHOW命令 在Greenplum数据库中,可以使用SHOW命令来查看当前的并行度配置。例如: sql SHOW gp_parallel_degree ; SH…...
LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS
题目 大型语言模型是人类级别的提示工程师 论文地址:https://arxiv.org/abs/2211.01910 项目地址:https://github.com/keirp/automatic_prompt_engineer 摘要 通过对自然语言指令进行调节,大语言模型 (LLM) 显示了作为通用计算机的令人印象深…...
rabbitmq安装延迟队列
在RabbitMQ中,延迟队列是一种特殊的队列类型。当消息被发送到此类队列后,不会立即投递给消费者,而是会等待预设的一段时间,待延迟期满后才进行投递。这种队列在多种场景下都极具价值,比如可用于处理需要在特定时间触发…...
Kubernetes (K8s) 入门指南
Kubernetes (K8s) 入门指南 什么是Kubernetes? Kubernetes,通常简称为 K8s(因为从 “K” 到 “s” 之间有八个字符),是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌设…...
Python 调用 Ollama 库:本地大语言模型使用详解
ollama 是一个用于调用本地大语言模型(Large Language Models,LLMs)的 Python 库,旨在提供简单、高效的 API 接口,以便开发者能够方便地与本地的大语言模型进行交互。以下是关于如何在 Python 中使用 ollama 库的详细介…...
python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像
目录 1. 使用plt.savefig保存无边框图形 2. 显示在屏幕上,并且去掉窗口的标题栏和工具栏 3. 通过配置 matplotlib 的 backend 和使用 Tkinter(或其他图形库) 方法 1:使用 TkAgg 后端,并禁用窗口的工具栏和标题栏 …...
无人机(Unmanned Aerial Vehicle, UAV)路径规划介绍
无人机(Unmanned Aerial Vehicle, UAV)是无人驾驶飞行器的简称。凭借其体积小巧、操作简便、生存能力强等诸多优势,无人机在军事、电力巡检、航空航天与科学研究等诸多领域得到了广泛应用。在执行任务时,无人机可搭载多种传感器设…...
python爬虫入门(实践)
python爬虫入门(实践) 一、对目标网站进行分析 二、博客爬取 获取博客所有h2标题的路由 确定目标,查看源码 代码实现 """ 获取博客所有h2标题的路由 """url "http://www.crazyant.net"import re…...
于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们主要来学习单个函数的声明与定义,static和extern… 这里写目录标题 一、单个函数…...
python实现pdf转word和excel
一、引言 在办公中,我们经常遇收到pdf文件格式,因为pdf格式文件不易修改,当我们需要编辑这些pdf文件时,经常需要开通会员或收费功能才能使用编辑功能。今天,我要和大家分享的,是如何使用python编程实现…...
Pandas使用笔记
个人学习笔记 日期转换 索引日期格式:2023-09-12 15:00:00 转换为:2023-09-12 import pandas as pd# 假设你的 DataFrame 名为 df,索引是 2023-09-12 15:00:00 # 这里创建一个示例 DataFrame 用于演示 data {value: [1, 2, 3]} index pd…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...
Java高级 |【实验八】springboot 使用Websocket
隶属文章:Java高级 | (二十二)Java常用类库-CSDN博客 系列文章:Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...
