STM32F1基于标准库ST7735 1.8‘‘LCD显示DHT11数据

STM32基于标准库ST7735 1.8‘’LCD显示DHT11数据


  • 📍HAL库驱动可以参考:《STM32基于HAL工程读取DHT11数据》
  • 🌼显示效果:
    在这里插入图片描述
    在这里插入图片描述

🌻ST7735 128x160 1.8’'LCD屏幕

  • 📌屏幕资料和相关驱动可以参考《1.8寸TFT LCD128X160 ST7735S SPI串口屏驱动示例》
  • 🚩如果驱动显示边框出现雪花,那可以调整函数setCursor()中的参数加以修正。

📓DHT11驱动代码

  • 🌿bsp_DHT11.h
/***********************************************************************************************************************************
 **【文件名称】  bsp_DHT11.c
 **【文件功能】
 **【适用平台】  STM32F103 + 标准库v3.5 + keil5

************************************************************************************************************************************/
#include "bsp_DHT11.h"

xDHT11_TypeDef       xDHT11;             // 声明全局结构体, 用于记录信息

static GPIO_TypeDef *DHT11_GPIOx = 0;    // 引脚端口
static uint32_t      DHT11_PINx  = 0;    // 引脚编号

#define  DHT11_BUS_HIGH     (DHT11_GPIOx->BSRR = (uint32_t)DHT11_PINx)           // DAT引脚 置高电平
#define  DHT11_BUS_LOW      (DHT11_GPIOx->BSRR = ((uint32_t)DHT11_PINx) << 16)   // DAT引脚 置低电平
#define  DHT11_BUS_READ     ((DHT11_GPIOx->IDR & DHT11_PINx) ? 1: 0)             // 读取引脚的电平



#if DELAY_MODE_TIM2
#include "stm32f10x_tim.h"
#include "misc.h"
// 定时器初始化配置
// 不使用中断
void Tim2_Init(uint16_t psc, uint16_t arr, FunctionalState NewState)
{
    TIM_TimeBaseInitTypeDef tim;                         // 结构体

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 开启TIM时钟
    TIM_DeInit(TIM2);
    tim.TIM_ClockDivision = TIM_CKD_DIV1;                // 采样分频
    tim.TIM_CounterMode   = TIM_CounterMode_Up;          // 向上计数
    tim.TIM_Period        = arr;                         // 自动重装载寄存器的值
    tim.TIM_Prescaler     = psc - 1;                     // 时钟预分频
    TIM_TimeBaseInit(TIM2, &tim);                        // 初始化结构体
    TIM2->SR = (uint16_t)~((uint16_t)0x01);              // 清除更新标志 
    TIM2->CNT = 0;                                       // 清0计数器
    TIM_Cmd(TIM2, NewState);                             // 是否开始工作
}



static void delay_us(uint32_t us)
{
    Tim2_Init(72, us, ENABLE);
    while ((TIM2->SR & 1) == 0);
    TIM_Cmd(TIM2, DISABLE);
}



static void delay_ms(uint32_t ms)
{
    for (uint16_t i = 0; i < ms; i++)
    {
        Tim2_Init(72, 990, ENABLE);
        while ((TIM2->SR & 1) == 0);
        TIM_Cmd(TIM2, DISABLE);
    }
}
#else

// 本地US粗略延时函数,减少移植时对外部文件依赖;
static void delay_us(uint32_t us)
{
    uint16_t i = 0;
    while (us--)
    {
        i = 7;
        while (i--);
    }
}

// 本地MS粗略延时函数,减少移植时对外部文件依赖;
static void delay_ms(uint32_t ms)
{
    uint32_t i = 0;
    while (ms--)
    {
        i = 12000;
        while (i--);
    }
}
#endif // 结束延时



static void DHT11_Mode_IPU(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = DHT11_PINx ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DHT11_GPIOx, &GPIO_InitStructure);
}

static void DHT11_Mode_Out_PP(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = DHT11_PINx ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DHT11_GPIOx, &GPIO_InitStructure);
}

static void DHT11_Init(GPIO_TypeDef *GPIOx, uint32_t PINx)
{
    DHT11_GPIOx = GPIOx;
    DHT11_PINx = PINx;

    // 时钟使能:引脚端口;用判断端口的方式使能时钟线, 减少移植时的工作
    if (GPIOx == GPIOA)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    if (GPIOx == GPIOB)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    if (GPIOx == GPIOC)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    if (GPIOx == GPIOD)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    if (GPIOx == GPIOE)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
    if (GPIOx == GPIOF)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
    if (GPIOx == GPIOG)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);

    DHT11_Mode_Out_PP();
    DHT11_BUS_HIGH;
}


// 从DHT11读取一个字节,MSB先行
// 1:每bit以50us低电平标置开始,
// 2:以26~28us的高电平表示“0”
// 3:以70us高电平表示“1”
// 4: 通过检测从高电平开后 x us后的电平即可区别这两个状态
static uint8_t readByte(void)
{
    uint8_t  temp = 0;

    for (uint8_t i = 0; i < 8; i++)
    {
        while (DHT11_BUS_READ == 0);             // 每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束
        delay_us(40);                             // 延时x us 这个延时需要大于数据0持续的时间即可
        temp <<= 1;
        if (DHT11_BUS_READ == 1)                 // x us后仍为高电平表示数据“1”
        {
            while (DHT11_BUS_READ == Bit_SET);  // 等待数据1的高电平结束
            temp |= 1;                           // 位置“1“
        }
    }
    return temp;
}


/******************************************************************************
 * 函  数: DHT11_GetData
 * 功  能: 从DHT11中读取数据
 * 参  数: 1:
 * 说  明: 调用后,获取到的数据,保存到结构体xDHT11中
 *          温度值:xDHT11.Temperature (有效范围:0~50℃)
 *          湿度值: xDHT11.Humidity    (有效范围:20%~90%)
 * 返回值: 0-失败; 1-正常
 ******************************************************************************/
uint8_t DHT11_GetData(GPIO_TypeDef *GPIOx, uint32_t PINx)
{
    static uint8_t humiInt = 0;        // 湿度的整数部分
    static uint8_t humiDec = 0;        // 湿度的小数部分
    static uint8_t TempInt = 0;        // 温度的整数部分
    static uint8_t TempDec = 0;        // 温度的小数部分
    static uint8_t sum = 0;            // 校验和

    DHT11_Init(GPIOx, PINx);

    // 1:主机产生开始信号
    DHT11_Mode_Out_PP();               // 输出模式
    DHT11_BUS_LOW;                     // 主机拉低电平
    delay_ms(25);                      // 延时18~30ms
    // 2:主机拉高等待
    DHT11_BUS_HIGH;                    // 总线拉高
    delay_us(50);                      // 延时20~40us,这里设置50,是因为要直接进入下一个时序(电平状态),以方便检测

    // 3: 从机产生响应和准备信号
    DHT11_Mode_IPU();                  // 主机设为输入 判断从机响应信号

    if (DHT11_BUS_READ == 0)           // 判断从机是否产生响应信号_低电平, 如不响应则跳出
    {
        while (DHT11_BUS_READ == 0);   // 等待响应信号结束:低电平持续约80us
        while (DHT11_BUS_READ == 1);   // 等待标置信号结束:高电平持续约80us
        // 4: 从机连续输出5字节数据
        humiInt = readByte();          // 湿度的整数部分// 开始接收数据
        humiDec = readByte();          // 湿度的小数部分
        TempInt = readByte();          // 温度的整数部分
        TempDec = readByte();          // 温度的小数部分
        sum     = readByte();          // 校验和

        DHT11_Mode_Out_PP();           // 读取结束,引脚改为输出模式
        DHT11_BUS_HIGH;                // 主机拉高

        // 5: 检查读取的数据是否正确
        if (sum == (humiInt + humiDec + TempInt + TempDec))
        {
            xDHT11.Humidity = humiInt + humiDec;
            xDHT11.Temperature = (float)TempInt  + (float)TempDec / 10;
            return SUCCESS;            // 校检正确, 返回:SUCCESS=1
        }
        return ERROR;                  // 校检错误,返回:ERROR=0
    }
    return ERROR;                      // 通信错误,返回:ERROR=0
}




/******************************************************************************
 * 函  数: DHT11_GetTemperature
 * 功  能: 从DHT11中读取温度值
 * 参  数: GPIO_TypeDef *GPIOx: GPIO端口号,取值范围:GPIOA ~ GPIOG
 *          uint32_t     PINx  : 引脚编号,  取值范围:GPIO_Pin_0 ~ GPIO_Pin_15
 * 说  明: 温度值有效范围:0~50℃; 精度±2°C; 小数部份无效
 * 返回值: 0-失败,非0值-湿度值
 ******************************************************************************/
float DHT11_GetTemperature(GPIO_TypeDef *GPIOx, uint32_t PINx)
{ 
    DHT11_GetData(GPIOx, PINx);
    return xDHT11.Temperature;
}


/******************************************************************************
 * 函  数: DHT11_GetHumidity
 * 功  能: 从DHT11中读取湿度值
 * 参  数: GPIO_TypeDef *GPIOx: GPIO端口号,取值范围:GPIOA ~ GPIOG
 *          uint32_t     PINx  : 引脚编号,  取值范围:GPIO_Pin_0 ~ GPIO_Pin_15
 * 说  明: 湿度值有效范围:20%~90%; 精度±5%; 小数部分无效
 * 返回值: 0-失败,非0值-湿度值
 ******************************************************************************/
float DHT11_GetHumidity(GPIO_TypeDef *GPIOx, uint32_t PINx)
{  
    DHT11_GetData(GPIOx, PINx);
    return xDHT11.Humidity;
}

  • 🌿bsp_DHT11.h
#ifndef __BSP_DHT11_H
#define __BSP_DHT11_H
/***********************************************************************************************************************************
 **【文件名称】  bsp_DHT11.h
 **【功能测试】  DHT11-温湿度获取
 **【文件名称】  bsp_DHT11.h
 **【功能描述】  定义引脚、定义全局结构体、声明全局函数
 **
 **【适用平台】  STM32F103 + 标准库v3.5 + keil5
 **
 **【实验操作】  1-模块接线,VCC  接 3.3V 或 5V
 **                          DATA 接 PC3
 **                          GND  接 GND
 **
 **【划 重 点】  1-电压范围:3.3V~5.0V,工作电流:0.2~1mA; 待机电流:150uA
 **              2-DHT11反应有点慢:上电后1S后进入稳定状态; 
 **              3-采样周期,不同店家的DHT11,参数不同,一般是1次/秒, 有部分可以数百毫秒间隔采集一次; 当小于采样周期进行重复采集数据,会发生错误;
 **              5-DHT11时序要求较高,us级别,当使用delay粗略延时,同一份代码同一个模块,在不同keil里跑也可能发生错误(代码优化设置对while延时的影响)。建议使用TIM的精准延时;
 **              4-注意判断使用的DHT11器件,是单独的DHT11元件,还是完整的DHT11模块
 **                单独的DHT11元件:蓝色塑料主体、三个引脚,不带上拉电阻;适合低成本工程方案使用,建议测试时引脚使用推挽输出模式;
 **                完整的DTH11模块:蓝色塑料主体、三个引脚、PCB底板、上拉电阻、电源指示LED,适合方案搭建;
 **              6-精度误差:DHT11分旧版和新版
 **                          旧版数据稳定,但只有整数部分,新版有小数部分,但数据跳动稍大;
 **                          温度0-50°C; 精度±2°C; 小数部份无效
 **                          湿度20-80%; 精度±5%; 小数部分无效
 **
 **
 **【文件移植】  步骤1-复制文件:可复制bsp_DHT11.c和bsp_DHT11h两个文件,或复制DHT11文件夹,保存到所需工程目录文件夹下;
 **              步骤2-添加文件:在keil工各程左侧文件管理器中,双击某文件夹,以添加bsp_DHT11.c文件;
 **              步骤3-添加路径:点击魔术棒工具按钮,在“c/c++"选项页中,点击”Include Path"后面的按键,以添加文件存放所在路径(是文件夹,不是文件);
 **         步骤4-添加引脚:在所需DHT11功能的代码文件头部,添加:#include "bsp_DHT11.h";
 **
 **
 **【函数使用】  函数2-DHT11_GetData(GPIOx, GPIO_Pin_x);           // 获取数据, 获取的数据存放于结构体xDHT11中,具体使用方法,可参考示例代码
 **
***********************************************************************************************************************************/
#include <stm32f10x.h>
#include <stdio.h>


#define   DELAY_MODE_TIM2   1     // 通信时序中的延时方式:0_使用while方式的粗略延时; 1_使用TIM2进行计时; 注意计时器是否和其它设备有冲突
                                  // 0_使用粗略延时:注意本代码是在勾选下列参数状态下调试的:Options / C++ /One ELF Section per Function ;
                                  // 1_使用TIM2计时:首选推荐; 注意同一工程中是否有其它功能使用TIM2,以免发生冲突;

/*****************************************************************************
 ** 声明 全局变量
****************************************************************************/
typedef struct
{
    float          Temperature;   // 温度值:在调用DHT11_GetTemp()函数后,获取到的温度值;
    float          Humidity;      // 湿度值:在调用DHT11_GetTemp()函数后,获取到的温度值;
} xDHT11_TypeDef;
extern xDHT11_TypeDef  xDHT11;    // 声明全局结构体, 用于存放读取的结果值



/*****************************************************************************
 ** 声明  全局函数
****************************************************************************/
uint8_t DHT11_GetData(GPIO_TypeDef *GPIOx, uint32_t PINx);
float DHT11_GetTemperature(GPIO_TypeDef *GPIOx, uint32_t PINx);
float DHT11_GetHumidity(GPIO_TypeDef *GPIOx, uint32_t PINx);

#endif 

  • 📝main.c
#include <stm32f10x.h>            // 头文件引用(标准库); 内核、芯片外设....;(stm32f10x.conf.h, 对标准库头文件进行调用)     
#include "stm32f10x_conf.h"       // 头文件引用(标准库); 内核、芯片外设....;(stm32f10x.conf.h, 对标准库头文件进行调用) 
#include "bsp_led.h"              // LED指示灯
#include "bsp_usart.h"            // USART1、2、3,UART4、5
#include "bsp_lcd_ST7735.h"       // 1.8寸显示屏驱动 
//#include "bsp_w25Qxx.h"           // 外部FLASH,用于中文支持
#include "bsp_DHT11.h"            // DHT11

float temperature = 0.0;          // 用于存储温度值; DHT11的精度,小数部分无效
float humidity = 0.0;             // 用于存储湿度值; DHT11的精度,小数部分无效
char   strTem[12];               // 用于临时存储字符串


// ms延时函数,减少移植时对外部文件依赖;
static void delay_ms(u32 ms)
{
    ms = ms * 6500;
    for (u32 i = 0; i < ms; i++); // 72MHz系统时钟下,多少个空循环约耗时1ms
}


// 主函数
int main(void)
{
    USART1_Init(115200);                                        // 串口初始化:USART1(115200-N-8-1), 且工程已把printf重定向至USART1输出

    Led_Init();                                                 // LED 初始化
    LED_RED_ON;                                                 // 点亮红灯

//    W25qx_Init();                                               // 初始化外部Flash, 已烧录有中文字库

    LCD_Init();                                                 // 初始化显示屏-驱动芯片ST7735
    LCD_String(25, 3, "DHT11 DATA", 16, WHITE, BLACK);      // 预先显示固定的屏显内容,不用重复刷新占用芯片资源
    LCD_Line(0, 25, 127, 25, WHITE);
    LCD_String(5, 35, "Temp Value:", 12, WHITE, BLACK);
    LCD_String(5, 55, "Humi Value:", 12, WHITE, BLACK);
		LCD_Chinese16ForFile(101, 35, 6, GREEN, BLACK);
    while (1)                                                   // while函数死循环,不能让main函数运行结束,否则会产生硬件错误
    {
        delay_ms(500);                                          // 延时500ms
        LED_RED_TOGGLE;                                         // 红色LED,间隔亮灭,以判断系统正常工作

        printf("DHT11  ");

        temperature = DHT11_GetTemperature(GPIOC, GPIO_Pin_3);  // 获取DHT11温度值, 注意,DHT11的精度,小数部分无效
        printf("温度:%4.1f℃   ", temperature);                  // 把数据输出到电脑串口软件,方便观察
        sprintf(strTem, "%4.1f", temperature);              // 格式化,把float值存储为字符数组
        LCD_String(75, 35, strTem, 12, GREEN, BLACK);           // 温度值显示在显示屏上

        humidity =  DHT11_GetHumidity(GPIOC, GPIO_Pin_3);       // 获取DHT11湿度值, 注意,DHT11的精度,小数部分无效
        printf("湿度:%4.1fRH%%\r\n", humidity);                 // 把数据输出到电脑串口软件,方便观察
        sprintf(strTem, "%4.1f%%  ", humidity);                 // 格式化,把float值存储为字符数组
        LCD_String(75, 55, strTem, 12, GREEN, BLACK);           // 温度值显示在显示屏上
    }
}

📚工程源码

链接:https://pan.baidu.com/s/1k6iZADRF0rSesPrTYK7rxA 
提取码:82cz

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

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

相关文章

《golang设计模式》第一部分·创建型模式-04-抽象工厂模式(Abstract Factory)

文章目录 1. 概述1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概述 1.1 角色 AbstractFactory&#xff08;抽象工厂&#xff09;&#xff1a;它声明了一组用于创建产品的方法&#xff0c;每一个方法对应一种产品。ConcreteFactory&#xff08;具体工厂&#xf…

ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面

1. 简介 场景&#xff1a;在RK3588上做qt开发工作 RK3588安装Qtopencv采集摄像头画面 2. 环境介绍 这里使用了OpenCV所带的库函数捕获摄像头的视频图像。 硬件环境&#xff1a; ArmSoM-RK3588开发板、&#xff08;MIPI-DSI&#xff09;摄像头 软件版本&#xff1a; OS&…

[C++]

C 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWorld 首先到官网下载并安…

贯穿设计模式--开闭原则

&#x1f335;概述 该原则主要说明的是扩展开放&#xff0c;对修改关闭&#xff0c;即尽量通过扩展软件实体类等来解决需求变化&#xff0c;而不是通过修改已有的代码来完成变化&#xff1b;实现开闭原则的核心思想就是面向抽象编程&#xff0c;强调的是用抽象构建框架&#x…

Windows驱动开发必备工具

Windows驱动开发必备工具 设备树文软件 可以查看设备信息 数字签名工具安装包 开发用的数字签名证书密钥 断点命中工具包&#xff08;双机调试必备&#xff09; 二进制文件解析工具 日志查看工具&#xff08;必备&#xff09; IRP查看工具 C驱动开发相关书籍 有需要工具、书籍…

怎么学习CSS相关技术知识? - 易智编译EaseEditing

学习CSS技术是前端开发中的重要一环&#xff0c;它用于控制网页的样式和布局&#xff0c;使网页更加美观和易于使用。以下是学习CSS技术的几个方面&#xff1a; 基本语法和选择器&#xff1a; 了解CSS的基本语法&#xff0c;学习如何使用选择器来选择HTML元素并应用样式。 样…

vim、awk、tail、grep的使用

vim命令 $定位到光标所在行的行末^定位到光标所在行的行首gg定位到文件的首行G定位到文件的末行dd删除光标所在行ndd删除n行&#xff08;从光标所在行开始&#xff09;D删除光标所在行&#xff0c;使之变为空白行x删除光标所在位置字符nx删除n个字符&#xff0c;从光标开始向后…

使用Flutter的image_picker插件实现设备的相册的访问和拍照

文章目录 需求描述Flutter插件image_picker的介绍使用步骤1、添加依赖2、导入 例子完整的代码效果 总结 需求描述 在应用开发时&#xff0c;我们有很多场景要使用到更换图片的功能&#xff0c;即将原本的图像替换设置成其他的图像&#xff0c;从设备的相册或相机中选择图片或拍…

CAD .NET 15.0 企业版 Crack

CAD .NET 15.0 企业版 企业版 企业版 企业版 企业版 Updated: June 14, 2023 | Version 15.0 NEW CAD .NET is a library for developing solutions in .NET environment. It supports AutoCAD DWG/ DXF, PLT and other CAD formats. The library can be used in a wide rang…

visual studio 生成dll文件以及修改输出dll文件名称操作

目录 visual studio 生成dll文件以及修改dll文件名称一、准备测试代码二、设置导出dll属性三、生成dll文件 .lib .dll .pdb 的简单介绍dll文件使用方式lib文件使用方式1、动态链接 &#xff08;原理&#xff09;2、静态链接&#xff1a; visual studio 生成dll文件以及修改dll文…

flex 弹性布局

Flex 布局的使用 任何一个容器都可以指定为 Flex 布局。 .box{ display: flex; //flex作为display的一个属性使用 } 行内元素也可以使用 Flex 布局。 .box{ display: inline-flex; } 注意&#xff1a;设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align…

MySQL做分布式锁

分布式锁mysql实现方式 方式1&#xff1a;唯一索引 创建锁表&#xff0c;内部存在字段表示资源名及资源描述&#xff0c;同一资源名使用数据库唯一性限制。多个进程同时往数据库锁表中写入对某个资源的占有记录&#xff0c;当某个进程成功写入时则表示其获取锁成功其他进程由于…

备战秋招 | 笔试强化22

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、在有序双向链表中定位删除一个元素的平均时间复杂度为 A. O(1) B. O(N) C. O(logN) D. O(N*logN) 2、在一个以 h 为头指针的单循环链表中&#xff0c;p 指针指向链尾结点的条件是( ) A. p->ne…

小程序云开发快速入门(2/4)

前言 我们对《微信小程序云开发快速入门&#xff08;1/4&#xff09;》的知识进行回顾一下。在上章节我们知道了云开发的优势以及能力&#xff0c;并且我们还完成了码仔备忘录的本地版到网络版的改造&#xff0c;主要学习了云数据库同时还通过在小程序使用云API直接操作了云数…

【无标题】uniapp引入萤石云 真机无法运行 踩坑集合

Uniapp 接入萤石云 踩坑 1.先用了 UIKit Javascript 就是在 pc端 那套流程 npm install ezuikit-jsimport EZUIKit from ezuikit-js;这套流程貌似只适用于pc端&#xff0c;我在接入uniapp的时候没看官网 以为都是一套流程&#xff0c;然后就在uniapp中也来了这一套&#xff0…

Linux安装部署并使用Redis(包含Redis Desktop Manager界面化工具)

文章目录 前言一、Redis的简介二、redis的安装与配置&#xff08;Linux环境&#xff09;三、redis的使用&#xff08;Redis Desktop Manager界面化&#xff09;四、基本命令**String基本命令&#xff1a;****hash基本命令&#xff1a;****List基本命令&#xff1a;****set基本命…

Python高阶技巧 网络编程

Socket ocket (简称 套接字) 是进程之间通信一个工具&#xff0c;好比现实生活中的插座&#xff0c;所有的家用电器要想工作都是基于插座进行&#xff0c;进程之间想要进行网络通信需要socket。 Socket负责进程之间的网络数据传输&#xff0c;好比数据的搬运工。 客户端和服务…

364 · 接雨水 II

链接&#xff1a;九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 题解&#xff1a; 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧

数据库访问中间件--springdata-jpa的基本使用

二、单表SQL操作-使用关键字拼凑方法 回顾 public interface UserRepository extends JpaRepository<User,Integer> {User findByUsernameLike(String username); }GetMapping("/user/username/{username}")public Object findUserByUsername(PathVariable S…

[回馈]ASP.NET Core MVC开发实战之商城系统(四)

经过一段时间的准备&#xff0c;新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始&#xff0c;在之前的文章中&#xff0c;讲解了商城系统的整体功能设计&#xff0c;页面布局设计&#xff0c;环境搭建&#xff0c;系统配置&#xff0c;及首页【商品类型&#xff0c;ba…