【正点原子STM32连载】 第四十二章 DS18B20数字温度传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

news2025/1/4 19:52:13

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#

第四十二章 DS18B20数字温度传感器实验

本章,我们将介绍STM32F103如何读取外部温度传感器的温度,来得到较为准确的环境温度。我们将学习单总线技术,通过它来实现STM32和外部温度传感器DS18B20的通信,并把从温度传感器得到的温度显示在LCD上。
本章分为如下几个小节:
42.1 DS18B20及工作时序简介
42.2 硬件设计
42.3 程序设计
42.4 下载验证

42.1 DS18B20及工作时序简介

42.1.1 DS18B20简介
DS18B20是由DALLAS半导体公司推出的一种“单总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。单总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新的概念,测试温度范围为-55+125℃,精度为±0.5℃。现场温度直接以单总线的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。它的工作电压范围为3~5.5V,采用多种封装形式,从而使系统设置灵活、方便,设定分辨率以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。其内部结构如图42.1.1.1所示:
在这里插入图片描述

图42.1.1.1 DS18B20内部结构图
ROM中的64位序列号是出厂前被设置好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排列是:前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。ROM作用是使每一个DS18B20都各不相同,这样设计可以允许一根总线上挂载多个DS18B20模块同时工作且不会引起冲突。
42.1.2 DS18B20工作时序简介
所有单总线器件要求采用严格的信号时序,以保证数据的完整性。DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都是由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。这里我们简单介绍这几个信号的时序。
1)复位脉冲和应答脉冲
在这里插入图片描述

图42.1.2.1 复位脉冲和应答脉冲时序图
单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少要在480us,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时时间要在1560us,并进入接收模式(Rx)。接着DS18B20拉低总线60240us,以产生低电平应答脉冲。
2)写时序
在这里插入图片描述

图42.1.2.2 写时序图
写时序包括写0时序和写1时序。所有写时序至少需要60us,且在两次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线延时2us。
3)读时序
在这里插入图片描述

图42.1.2.3读时序图
单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。
在了解单总线时序之后,我们来看一下DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位→发SKIP ROM(0xCC)→发开始转换命令(0x44)→延时→复位→发送SKIP ROM命令(0xCC)→发送存储器命令(0xBE)→连续读取两个字节数据(即温度)→结束。
42.2 硬件设计

  1. 例程功能
    本实验开机的时候先检测是否有DS18B20存在,如果没有,则提示错误。只有在检测到DS18B20之后才开始读取温度并显示在LCD上,如果发现了DS18B20,则程序每隔100ms左右读取一次数据,并把温度显示在LCD上。LED0闪烁用于提示程序正在运行。
  2. 硬件资源
    1)LED灯
    LED0 – PB5
    2)DS18B20温度传感器 – PG11
    3)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面)
    4)正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  3. 原理图
    DS18B20接口与STM32的连接关系,如下图所示:
    在这里插入图片描述

图42.2.1 DS18B20连接原理
从上图可以看出,我们使用的是STM32的PG11来连接U6的DQ引脚,图中U6为DHT11(数字温湿度传感器)和DS18B20共用的一个接口,DHT11我们将在下一章介绍。
DS18B20只用到U6的3个引脚(U6的1、2和3脚),将DS18B20传感器插入到这个上面就可以通过STM32来读取DS18B20的温度了。连接示意图如图42.2.2所示:
在这里插入图片描述

图42.2.2 DS18B20连接示意图
从上图可以看出,DS18B20的平面部分(有字的那面)应该朝内,而曲面部分朝外。然后插入如图所示的三个孔内。
42.3 程序设计
DS18B20实验中使用的是单总线协议,用到的是HAL中GPIO相关函数,前面也有介绍到,这里就不做展开了。下面介绍一下如何驱动DS18B20。
DS18B20配置步骤
1)使能DS18B20数据线对应的GPIO时钟。
本实验中DS18B20的数据线引脚是PG11,因此需要先使能GPIOG的时钟,代码如下:
__HAL_RCC_GPIOG_CLK_ENABLE(); /* PG口时钟使能 */
2)设置对应GPIO工作模式(开漏输出)
本实验GPIO使用开漏输出模式,通过函数HAL_GPIO_Init设置实现。
3)参考单总线协议,编写信号函数(复位脉冲、应答脉冲、写0/1、读0/1)
复位脉冲:主机发出低电平,保持低电平时间至少480us。
应答脉冲:DS18B20拉低总线60~240us,以产生低电平应答信号。
写1信号:主机输出低电平,延时2us,然后释放总线,延时60us。
写0信号:主机输出低电平,延时60us,然后释放总线,延时2us。
读0/1信号:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。
4)编写DS18B20的读和写函数
基于写1bit数据和读1bit数据的基础上,编写DS18B20写1字节和读1字节函数。
5)编写DS18B20获取温度函数
参考DS18B20典型温度读取过程,编写获取温度函数。
42.3.1 程序流程图
在这里插入图片描述

图42.3.2.1 DS18B20实验程序流程图
42.3.2 程序解析
1.DS18B20驱动代码
这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。温度传感器驱动源码包括两个文件:ds18b20.c和ds18b20.h。
首先我们先看一下ds18b20头文件里面的内容,其定义如下:

/* DS18B20引脚 定义 */
#define DS18B20_DQ_GPIO_PORT                	GPIOG
#define DS18B20_DQ_GPIO_PIN                 	GPIO_PIN_11
#define DS18B20_DQ_GPIO_CLK_ENABLE()		do{ __HAL_RCC_GPIOG_CLK_ENABLE();\
 	}while(0)   /* PG口时钟使能 */

/* IO操作函数 */
#define DS18B20_DQ_OUT(x)   do{ x ? \
  HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT,DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET):\
  HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_RESET);\
                                   }while(0)                                                     /* 数据端口输出 */
#define DS18B20_DQ_IN       HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, \
DS18B20_DQ_GPIO_PIN)/* 数据端口输入 */
在ds18b20.h的操作跟IIC实验代码很类似,主要对用到GPIO口进行宏定义,以及宏定义IO操作函数,方便时序函数调用。
下面我们直接介绍ds18b20.c的程序,首先先介绍一下DS18B20传感器的初始化函数,其定义如下:
/**
 * @brief      	初始化DS18B20的IO口 DQ 同时检测DS18B20的存在
 * @param       	无
 * @retval      	0, 正常
 *               	1, 不存在/不正常
 */
uint8_t ds18b20_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    DS18B20_DQ_GPIO_CLK_ENABLE();   /* 开启DQ引脚时钟 */

    gpio_init_struct.Pin = DS18B20_DQ_GPIO_PIN;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_OD;            /* 开漏输出 */
    gpio_init_struct.Pull = GPIO_PULLUP;                      /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(DS18B20_DQ_GPIO_PORT, &gpio_init_struct); 
/* DS18B20_DQ引脚模式设置,开漏输出,上拉, 这样就不用再设置IO方向了, 开漏输出的
时候(=1), 也可以读取外部信号的高低电平 */
    ds18b20_reset();
    return ds18b20_check();
}

在ds18b20的初始化函数中,主要对用到的GPIO口进行初始化,同时在函数最后调用复位函数和自检函数,这两个函数在后面会解释到。
下面介绍一下在前面提及的几个信号类型:

/**
 * @brief      	复位DS18B20
 * @param      	data: 要写入的数据
 * @retval      	无
 */
static void ds18b20_reset(void)
{
    DS18B20_DQ_OUT(0);  	/* 拉低DQ,复位 */
    delay_us(750);      	/* 拉低750us */
    DS18B20_DQ_OUT(1);  	/* DQ=1, 释放复位 */
    delay_us(15);       	/* 延迟15US */
}

/**
 * @brief     	等待DS18B20的回应
 * @param      	无
 * @retval     	0, DS18B20正常
 *              	1, DS18B20异常/不存在
 */
uint8_t ds18b20_check(void)
{
    uint8_t retry = 0;
    uint8_t rval = 0;

    while (DS18B20_DQ_IN && retry < 200)    /* 等待DQ变低, 等待200us */
    {
        retry++;
        delay_us(1);
    }

    if (retry >= 200)
    {
        rval = 1;
    }
    else
    {
        retry = 0;

        while (!DS18B20_DQ_IN && retry < 240)   /* 等待DQ变高, 等待240us */
        {
            retry++;
            delay_us(1);
        }
        if (retry >= 240) rval = 1;
    }
    return rval;
}

以上两个函数分别代表着前面所说的复位脉冲与应答信号,大家可以对比前面的时序图进行理解。由于复位脉冲比较简单,所以这里不做展开。现在看一下应答信号函数,函数主要是对于DS18B20传感器的回应信号进行检测,对此判断其是否存在。函数的实现也是依据时序图进行逻辑判断,例如当主机发送了复位信号之后,按照时序,DS18B20会拉低数据线60~240us,同时主机接收最小时间为480us,我们就依据这两个硬性条件进行判断,首先需要设置一个时限等待DS18B20响应,后面也设置一个时限等待DS18B20释放数据线拉高,满足这两个条件即DS18B20成功响应。
下面接着看一下写函数:

/**
 * @brief     	写一个字节到DS18B20
 * @param      	data: 要写入的字节
 * @retval    	无
 */
static void ds18b20_write_byte(uint8_t data)
{
    uint8_t j;

    for (j = 1; j <= 8; j++)
    {
        if (data & 0x01)
        {
            DS18B20_DQ_OUT(0);  	/*  Write 1 */
            delay_us(2);
            DS18B20_DQ_OUT(1);
            delay_us(60);
        }
        else
        {
            DS18B20_DQ_OUT(0);  	/*  Write 0 */
            delay_us(60);
            DS18B20_DQ_OUT(1);
            delay_us(2);
        }
        data >>= 1;             	/* 右移,获取高一位数据 */
    }
}

通过形参决定是写1还是写0,按照前面对写时序的分析,我们可以很清晰知道写函数的逻辑处理。
有写函数肯定就有读函数,下面看一下读函数:

/**
 * @brief     	从DS18B20读取一个位
 * @param     	无
 * @retval    	读取到的位值: 0 / 1
 */
static uint8_t ds18b20_read_bit(void)
{
    uint8_t data = 0;
    DS18B20_DQ_OUT(0);
    delay_us(2);
    DS18B20_DQ_OUT(1);
    delay_us(12);
    if (DS18B20_DQ_IN)
    {
        data = 1;
    }
    delay_us(50);
    return data;
}

/**
 * @brief     	从DS18B20读取一个字节
 * @param      	无
 * @retval     	读到的数据
 */
static uint8_t ds18b20_read_byte(void)
{
    uint8_t i, b, data = 0;

    for (i = 0; i < 8; i++)
    {
        b = ds18b20_read_bit();	/* DS18B20先输出低位数据 ,高位数据后输出 */
        
        data |= b << i;         	/* 填充data的每一位 */ 
    }

    return data;
}

在这里ds18b20_read_bit函数从DS18B20处读取1位数据,在前面已经对读时序也进行了详细的分析,所以这里也不展开解释了。
下面介绍读取温度函数,其定义如下:

/**
 * @brief    	开始温度转换
 * @param     	无
 * @retval    	无
 */
static void ds18b20_start(void)
{
    ds18b20_reset();
    ds18b20_check();
    ds18b20_write_byte(0xcc);   /*  skip rom */
    ds18b20_write_byte(0x44);   /*  convert */
}

/**
 * @brief    	从ds18b20得到温度值(精度:0.1C)
 * @param     	无
 * @retval    	温度值 (-550~1250)
 * @note   	     返回的温度值放大了10倍.
 *            	实际使用的时候,要除以10才是实际温度.
 */
short ds18b20_get_temperature(void)
{
    uint8_t flag = 1;           	/* 默认温度为正数 */
    uint8_t TL, TH;
    short temp;
    
    ds18b20_start();            	/*  ds1820 start convert */
    ds18b20_reset();
    ds18b20_check();
    ds18b20_write_byte(0xcc);   	/*  skip rom */
    ds18b20_write_byte(0xbe);   	/*  convert */
    TL = ds18b20_read_byte();   	/*  LSB */
    TH = ds18b20_read_byte();   	/*  MSB */

    if (TH > 7)
    {	/* 温度为负,查看DS18B20的温度表示法与计算机存储正负数据的原理一致:
                正数补码为寄存器存储的数据自身,负数补码为寄存器存储值按位取反后+1
                所以我们直接取它实际的负数部分,但负数的补码为取反后加一,但考虑到低位可能+1后有进位和代码冗余,我们这里先暂时没有作+1的处理,这里需要留意 */
        TH = ~TH;
        TL = ~TL;
        flag = 0;   
    }

    temp = TH;      /* 获得高八位 */
    temp <<= 8;
    temp += TL;     /* 获得低八位 */
        
    /* 转换成实际温度 */
    if (flag == 0)
    {   /* 将温度转换成负温度,这里的+1参考前面的说明 */
        temp = (double)(temp+1) * 0.625;
        temp = -temp;   
}
else
{
        temp = (double)temp * 0.625;
}    
    return temp;
}

在这里简单介绍一下上面用到的RAM指令:
跳过ROM(0xCC),该指令只适合总线只有一个节点,它通过允许总线上的主机不提供64位ROM序列号而直接访问RAM,节省了操作时间。
温度转换(0x44),启动DS18B20进行温度转换,结果存入内部RAM。
读暂存器(0xBE),读暂存器9个字节内容,该指令从RAM的第一个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。
2. main.c代码
在main.c里面编写如下代码:

int main(void)
{
    uint8_t t = 0;
    short temperature;

    HAL_Init();                              	/* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); 	/* 设置时钟, 72Mhz */
    delay_init(72);                         	/* 延时初始化 */
    usart_init(115200);                    	/* 串口初始化为115200 */
    led_init();                             		/* 初始化LED */
    lcd_init();                             		/* 初始化LCD */

    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
    lcd_show_string(30, 70, 200, 16, 16, "DS18B20 TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);

    while (ds18b20_init()) /* DS18B20初始化 */
    {
        lcd_show_string(30, 110, 200, 16, 16, "DS18B20 Error", RED);
        delay_ms(200);
        lcd_fill(30, 110, 239, 130 + 16, WHITE);
        delay_ms(200);
}

    lcd_show_string(30, 110, 200, 16, 16, "DS18B20 OK", RED);
lcd_show_string(30, 130, 200, 16, 16, "Temp:   . C", BLUE);

    while (1)
    {
        if (t % 10 == 0) /* 每100ms读取一次 */
        {
            temperature = ds18b20_get_temperature();
            if (temperature < 0)
            {
                lcd_show_char(30 + 40, 130, '-', 16, 0, BLUE); 	/* 显示负号 */
                temperature = -temperature;						/* 转为正数 */
            }
            else
            {
                lcd_show_char(30 + 40, 130, ' ', 16, 0, BLUE);	/* 去掉负号 */
            }
/* 显示正数部分 */
            lcd_show_num(30 + 40 + 8, 130, temperature / 10, 2, 16, BLUE);  
/* 显示小数部分 */
            lcd_show_num(30 + 40 + 32, 130, temperature % 10, 1, 16, BLUE); 
        }

        delay_ms(10);
        t++;

        if (t == 20)
        {
            t = 0;
            LED0_TOGGLE(); /* LED0闪烁 */
        }
    }
}

主函数代码比较简单,一系列硬件初始化后,在循环中调用ds18b20_get_temperature函数获取温度值,然后显示在LCD上。
42.4 下载验证
假定DS18B20传感器已经接上去正确的位置,将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示当前的温度值的内容如图42.4.1所示:
在这里插入图片描述

图42.4.1 程序运行效果图
该程序还可以读取并显示负温度值,具备零下温度条件可以测试一下。

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

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

相关文章

IEEE Vis会议内容整理

IEEE Vis 2017 IEEE 2017的VIS会议主题按论文的类型划分为三类&#xff1a;可视分析&#xff08;VAST&#xff09;、信息可视化&#xff08;InfoVis&#xff09;、科学可视化&#xff08;SciVis&#xff09;。因为可视化研究的涉及的方向越来越多&#xff0c;已超出了这三个主…

python爬虫学习简记

目录 页面结构的简单认识 爬虫概念理解 urllib库使用 爬虫解析工具xpath JsonPath Selenium requests基本使用 scrapy 页面结构的简单认识 如图是我们在pycharm中创建一个HTML文件后所看到的内容 这里我们需要认识的是上图的代码结构&#xff0c;即html标签包含了hea…

13、Nginx高级之高级模块(geoip_module)

一、ngx_http_geoip_module模块 ngx_http_geoip_module模块使用预编译的MaxMind数据库&#xff0c;根据客户端IP地址创建变量值 &#xff0c;读取ip所在地信息。 当使用支持IPv6的数据库(1.3.12, 1.2.7)时&#xff0c;IPv4地址被查找为IPv4映射的IPv6地址。 默认情况下不构建此…

聚焦数字能源供给侧和需求侧,龙讯旷腾出席2023全球数字能源展

本月初&#xff0c;深圳市人民政府新闻办召开2023全球数字能源展新闻发布会&#xff0c;宣布本次展会将于6月29日-7月2日在深圳会展中心&#xff08;福田馆&#xff09;举办。此次展会将聚焦数字能源供给侧和需求侧&#xff0c;着力打造数字能源领域集专业性、实践性、国际性和…

打造智能公路工程:BIM+GIS可视化管理平台的应用

摘要&#xff1a; 本文研究了BIM技术在交通基础设施领域的应用现状&#xff0c;并探索了BIM与GIS技术的关键融合方法&#xff0c;研发了BIMGIS可视化管理平台&#xff0c;并通过实际项目应用验证方案的可行性。研究表明&#xff0c;BIM与GIS的融合技术具有广泛的应用价值&…

人人都能生成火爆全网的最不像二维码的二维码

最近有人展示了使用 Stable Diffusion 创建的艺术二维码。这些二维码是使用定制训练的 ControlNet模型生成的。 但是操作门槛有点高。 你需要 GPU&#xff0c;还需要学习如何使用 Stable Diffusion。 现在有一款非常无脑的产品&#xff0c;使用这个产品来创建艺术二维码&…

【算法题】算法之动态规划系列(基础篇)

算法之动态规划系列&#xff08;基础篇&#xff09; 一、前置基础二、题目-- 爬楼梯2.1、思路2.2 代码实现 三、题目--杨辉三角3.1、思路3.2、代码实现 四、题目--买卖股票的最佳时机4.1、思路4.2、代码实现4.3、优化 五、比特位计数5.1、思路5.2、代码实现&#xff08;最高有效…

大数据从0到1的完美落地之sqoop命令执行

Sqoop命令执行 常见命令执行参数 通过Sqoop加不同参数可以执行导入导出,通过sqoop help 可以查看常见的命令行 #常见Sqoop参数 [rootqianfeng01 sqoop-1.4.7] sqoop helpcodegen Generate code to interact with database recordscreate-hive-table Import a ta…

DC-DC降压恒流芯片 12-110V 9V/1A AP2400 LED汽车摩托车灯驱动IC

1,方案来源&#xff1a;深圳市世微半导体有限公司 2&#xff0c;产品BOM表&#xff1a;输入 12-100V 输出9V 0.9A 3&#xff0c;产品线路图&#xff1a;输入 12-100V 输出9V 0.9A 4&#xff0c;产品介绍 AP2400 是一款 PWM 工作模式, 率、外围简单、外驱功率管&#xff0…

Axure教程—复选框全选与反选

很多业务系统之中都会有以列表的形式展现数据的情况&#xff0c;那么问题来了&#xff0c;对列表选择时会出现多选、全选、反选的问题&#xff0c;今天就来介绍如何使用axure原型工具实现复选框的多选、全选和反选。 效果预览 预览地址&#xff1a;https://ddprtm.axshare.com…

FFmpeg流媒体处理的收流与推流

1. 简介 流媒体是使用了流式传输的多媒体应用技术。如下是维基百科关于流媒体概念的定义&#xff1a; 流媒体 (streaming media) 是指将一连串的媒体数据压缩后&#xff0c;经过网络分段发送数据&#xff0c;在网络上即时传输影音以供观赏的一种技术与过程&#xff0c;此技术使…

20亿元项目“落子”杭州,这家企业加速全栈智驾平台规模化交付

6月20日&#xff0c;在“幸会杭州”投资促进大会上&#xff0c;中国领先的智能驾驶解决方案服务商和产品供应商福瑞泰克与杭州市政府就在杭州市高新技术开发区&#xff08;滨江&#xff09;建设全球研发管理总部达成签约。福瑞泰克董事长兼首席执行官张林博士受邀出席大会&…

SSM摄影服务线上选购预约系统-计算机毕设 附源码83784

SSM摄影服务线上选购预约系统 摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用SSM技…

网络安全|渗透测试入门学习,从零基础入门到精通—动态分析技术OllyDbg案例详情

目录 1、准备工作 2、加载目标文件进行调试 3、单步跟踪 4、设置断点 5、调试分析 1、准备工作 分析一个Windows程序要比分析一个DOS程序容易得多因为在Windows中只要API函数被使用了&#xff0c;再想对要寻找蛛丝马迹的人隐藏一些信息就比较困难了。因此&#xff0c;在分析…

软考高级系统架构设计师(七) 需求工程相关

目录 需求工程概述 需求工程-需求获取 需求开发-需求分析 需求分析-OOA OOA-UML-41视图 需求定义 需求验证 需求跟踪 需求变更管理 软件系统建模 结构化设计 面向对象设计 软件界面设计 需求工程概述 需求工程-需求获取 需求获取方法&#xff1a; 需求开发-需求分…

在 BI 工具 Tableau 中使用 databend

Tableau是一款流行的数据可视化和业务智能工具。它提供了直观、交互式的方式来探索、分析和呈现数据&#xff0c;帮助用户更好地理解数据的意义和洞察。 本教程帮助用户在 Tableau 中连接 databend 进行 BI 数据分析。 Databend jdbc Tableau 支持所有实现了 JDBC 协议的数据…

如何在 Spring Boot 中使用 WebFlux

如何在 Spring Boot 中使用 WebFlux 随着互联网应用的复杂度不断增加&#xff0c;传统的请求响应模型已经无法满足日益增长的需求。传统的 Web 应用使用 Servlet 容器&#xff0c;采用同步阻塞的方式来处理请求&#xff0c;请求需要等待相应的处理逻辑完成后才能返回结果。这种…

【C/C++实战项目】万年历

目录 项目分析 项目效果 头文件及全局变量 获取天数 打印月份、年份日历 main函数 项目分析 实现查询某一个年份、月份&#xff0c;以日历的格式打印为了观赏性利用符号对打印的每一个日期进行分格特殊节日日期能够在日历中标注出来万年历的起始日期是公元1年&#xff0…

[Orin Nx] 如何跑满GPU和CPU,观察温度和散热性能?

1、环境说明 硬件: Nvidia Orin NX 16GB 软件&#xff1a;Jetson Linux R35.3.1 2、工具安装部署 GPU的压力测试主要使用工具&#xff1a; https://github.com/anseeto/jetson-gpu-burn CPU的压力测试主要使用工具 stress 注意安装 jetson-gpu-burn需要在 /etc/apt/sourc…

SpringBoot 客户信息管理系统-计算机毕设 附源码80944

SpringBoot客户信息管理系统 摘 要 随着计算机技术的发展&#xff0c;特别是计算机网络技术与数据库技术的发展&#xff0c;使用人们的生活与工作方式发生了很大的改观。本课题研究的客户信息管理系统&#xff0c;主要功能模块包括统计图&#xff0c;系统用户&#xff08;管理…