• 功能介绍:读取传感器SHT85数据,转换成温度、湿度 、饱和水蒸气含量。
  • 注意事项:
  1. SDA脚设置为开漏输出,外部上拉电阻10k。或者设置成推挽,软件切换SDA输入输出。
  2. 调试时可适当加长延时时间。
  3. 在while(1)循环之前调用 TH_Class_SHT85.init(),每隔1S调用一次TH_Class_SHT85.loop()。
  • 代码
  • SHT85驱动.7z

SHT85.h

#ifndef __SHT85_H__
#define __SHT85_H__
#include "main.h"#define CRC_POLYNOMIAL  0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
#define I2C_ADDR        0x44  //SHT85地址/****************************错误码***************************/
#define NO_ERROR        0x00
#define ACK_ERROR       0x01
#define CHECKSUM_ERROR  0x02
#define TIMEOUT_ERROR   0x04/****************************IIC错误码***************************/
typedef enum{ACK    = 0,NO_ACK = 1,
}etI2cAck;/****************************CMD定义***************************/
typedef enum {CMD_READ_SERIALNBR = 0x3780, // read serial numberCMD_READ_STATUS    = 0xF32D, // read status registerCMD_CLEAR_STATUS   = 0x3041, // clear status registerCMD_HEATER_ENABLE  = 0x306D, // enabled heaterCMD_HEATER_DISABLE = 0x3066, // disable heaterCMD_SOFT_RESET     = 0x30A2, // soft resetCMD_MEAS_SINGLE_H  = 0x2400, // single meas., high repeatabilityCMD_MEAS_SINGLE_M  = 0x240B, // single meas., medium repeatabilityCMD_MEAS_SINGLE_L  = 0x2416, // single meas., low repeatabilityCMD_MEAS_PERI_05_H = 0x2032, // periodic meas. 0.5 mps, high repeatabilityCMD_MEAS_PERI_05_M = 0x2024, // periodic meas. 0.5 mps, medium repeatabilityCMD_MEAS_PERI_05_L = 0x202F, // periodic meas. 0.5 mps, low repeatabilityCMD_MEAS_PERI_1_H  = 0x2130, // periodic meas. 1 mps, high repeatabilityCMD_MEAS_PERI_1_M  = 0x2126, // periodic meas. 1 mps, medium repeatabilityCMD_MEAS_PERI_1_L  = 0x212D, // periodic meas. 1 mps, low repeatabilityCMD_MEAS_PERI_2_H  = 0x2236, // periodic meas. 2 mps, high repeatabilityCMD_MEAS_PERI_2_M  = 0x2220, // periodic meas. 2 mps, medium repeatabilityCMD_MEAS_PERI_2_L  = 0x222B, // periodic meas. 2 mps, low repeatabilityCMD_MEAS_PERI_4_H  = 0x2334, // periodic meas. 4 mps, high repeatabilityCMD_MEAS_PERI_4_M  = 0x2322, // periodic meas. 4 mps, medium repeatabilityCMD_MEAS_PERI_4_L  = 0x2329, // periodic meas. 4 mps, low repeatabilityCMD_MEAS_PERI_10_H = 0x2737, // periodic meas. 10 mps, high repeatabilityCMD_MEAS_PERI_10_M = 0x2721, // periodic meas. 10 mps, medium repeatabilityCMD_MEAS_PERI_10_L = 0x272A, // periodic meas. 10 mps, low repeatabilityCMD_FETCH_DATA     = 0xE000, // readout measurements for periodic modeCMD_BREAK          = 0x3093, // stop periodic measurement
}etCommands;// Single Shot Measurement Repeatability
typedef enum {SINGLE_MEAS_LOW        = CMD_MEAS_SINGLE_L, // low repeatabilitySINGLE_MEAS_MEDIUM     = CMD_MEAS_SINGLE_M, // medium repeatabilitySINGLE_MEAS_HIGH       = CMD_MEAS_SINGLE_H  // high repeatability
}etSingleMeasureModes;// Periodic Measurement Configurations
typedef enum {PERI_MEAS_LOW_05_HZ    = CMD_MEAS_PERI_05_L,PERI_MEAS_LOW_1_HZ     = CMD_MEAS_PERI_1_L,PERI_MEAS_LOW_2_HZ     = CMD_MEAS_PERI_2_L,PERI_MEAS_LOW_4_HZ     = CMD_MEAS_PERI_4_L,PERI_MEAS_LOW_10_HZ    = CMD_MEAS_PERI_10_L,PERI_MEAS_MEDIUM_05_HZ = CMD_MEAS_PERI_05_M,PERI_MEAS_MEDIUM_1_HZ  = CMD_MEAS_PERI_1_M,PERI_MEAS_MEDIUM_2_HZ  = CMD_MEAS_PERI_2_M,PERI_MEAS_MEDIUM_4_HZ  = CMD_MEAS_PERI_4_M,PERI_MEAS_MEDIUM_10_HZ = CMD_MEAS_PERI_10_M,PERI_MEAS_HIGH_05_HZ   = CMD_MEAS_PERI_05_H,PERI_MEAS_HIGH_1_HZ    = CMD_MEAS_PERI_1_H,PERI_MEAS_HIGH_2_HZ    = CMD_MEAS_PERI_2_H,PERI_MEAS_HIGH_4_HZ    = CMD_MEAS_PERI_4_H,PERI_MEAS_HIGH_10_HZ   = CMD_MEAS_PERI_10_H,
}etPeriodicMeasureModes;/****************************温湿度传感器结构体定义**************************/
typedef struct _TH_Class{u32 SerialNumber;//传感器SN号float Temperature;//温度float Humidity;//相对湿度float H2O;//绝对湿度void (*init)(void);//初始化函数指针void (*loop)(void);//loop函数指针,循环读取温湿度,周期:1S
}TH_Class_t;extern TH_Class_t TH_Class_SHT85;#endif

SHT85.c

/********************************************
*Filename:       SHT85.c
*Revised:        Date: 06-22 14:42
*Author:         SYMBEL
*Description:    SHT85驱动
*********************************************/
#include "SHT85.h"
#include <stdbool.h>/****************************IIC引脚定义**************************/
#define SHT85_SCL(x) HAL_GPIO_WritePin(SHT85_SCK_GPIO_Port, SHT85_SCK_Pin, x?GPIO_PIN_SET:GPIO_PIN_RESET)
#define SHT85_SDA(x) HAL_GPIO_WritePin(SHT85_SDA_GPIO_Port, SHT85_SDA_Pin, x?GPIO_PIN_SET:GPIO_PIN_RESET)
#define IS_SHT85_SDA() HAL_GPIO_ReadPin(SHT85_SDA_GPIO_Port, SHT85_SDA_Pin) //读取SDA脚电平
/****************************IIC引脚定义**************************//*****************************函数声明***************************/
static u8 StartWriteAccess(void);
static u8 StartReadAccess(void);
static void StopAccess(void);
static u8 WriteCommand(etCommands command);
static u8 Read2BytesAndCrc(uint16_t* data, bool finAck, uint8_t timeout);
static uint8_t CalcCrc(uint8_t data[], uint8_t nbrOfBytes);
static u8 CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum);
static float CalcTemperature(uint16_t rawValue);
static float CalcHumidity(uint16_t rawValue);
void SHT85_Init(void);
void SHT85_FSM(void);/****************************结构体初始化**************************/
TH_Class_t TH_Class_SHT85 = {.SerialNumber = 0,.Temperature = 0.0f,.Humidity = 0.0f,.H2O = 0.0f,.init = SHT85_Init,.loop = SHT85_FSM,
};/**********************************************************
*函数:DelayUs
*功能:延时1us
*参数:us:延时时间 单位:us
*返回:无
*描述:无
**********************************************************/
static void DelayUs(u32 us)
{for(int i=0; i<us; i++){__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();}
}static void I2c_StartCondition(void)
{SHT85_SDA(1);SHT85_SCL(1);DelayUs(3);SHT85_SDA(0);DelayUs(3);SHT85_SCL(0);DelayUs(3);
}static void I2c_StopCondition(void)
{SHT85_SDA(0);SHT85_SCL(0);DelayUs(2);SHT85_SCL(1);DelayUs(3);SHT85_SDA(1);DelayUs(3);
}static u8 I2c_WriteByte(uint8_t txByte)
{uint8_t mask,error=0,i;
//  SHT85_SDA(0);for(i=1;i<20;i++); for(mask=0x80; mask>0; mask>>=1)//shift bit for masking (8 times){ if ((mask & txByte) == 0) SHT85_SDA(0);        //masking txByte, write bit to SDA-Lineelse SHT85_SDA(1);DelayUs(1);     //data hold time(t_HD;DAT)SHT85_SCL(1);           //generate clock pulse on SCLDelayUs(1);     //data set-up time (t_SU;DAT)SHT85_SCL(0);DelayUs(1);     //SCL high time (t_HIGH)}error = IS_SHT85_SDA();             //release SDA-lineSHT85_SCL(1);             //clk #9 for ackDelayUs(1);       //data set-up time (t_SU;DAT)error = IS_SHT85_SDA();SHT85_SCL(0);DelayUs(3);       //wait time to see byte package on scopereturn error;           //return error code
}static uint8_t I2c_ReadByte(etI2cAck ack)
{uint8_t mask,rxByte=0,i,rxb;SHT85_SDA(1);rxb = IS_SHT85_SDA();                       //release SDA-linefor(i=1;i<20;i++); for(mask=0x80; mask>0; mask>>=1)//shift bit for masking (8 times){ SHT85_SCL(1);                  //start clock on SCL-lineDelayUs(2);        //data set-up time (t_SU;DAT)rxb = IS_SHT85_SDA();if(rxb) rxByte=(rxByte | mask); //read bitSHT85_SCL(0);DelayUs(2);      //data hold time(t_HD;DAT)}if(ack == ACK)SHT85_SDA(0);elseSHT85_SDA(1);DelayUs(2);            //data set-up time (t_SU;DAT)SHT85_SCL(1);                      //clk #9 for ackDelayUs(5);             //SCL high time (t_HIGH)SHT85_SCL(0);//SHT85_SDA(1);                        //release SDA-lineDelayUs(2);           //wait time to see byte package on scopereturn rxByte; //return error code
}u8 I2c_GeneralCallReset(void)
{u8 error;I2c_StartCondition();error = I2c_WriteByte(0x00);if(error == NO_ERROR) {error = I2c_WriteByte(0x06);}return error;
}u8 SHT85_ReadSerialNumber(uint32_t* serialNumber)
{u8 error; // error codeuint16_t serialNumWords[2];error = StartWriteAccess();// write "read serial number" commandif(error == NO_ERROR) {error = WriteCommand(CMD_READ_SERIALNBR);}// if no error, start read accessif(error == NO_ERROR) {error = StartReadAccess();}// if no error, read first serial number wordif(error == NO_ERROR) {error = Read2BytesAndCrc(&serialNumWords[0], true, 100);}// if no error, read second serial number wordif(error == NO_ERROR) {error = Read2BytesAndCrc(&serialNumWords[1], false, 0);}StopAccess();// if no error, calc serial number as 32-bit integerif(error == NO_ERROR) {*serialNumber = (serialNumWords[0] << 16) | serialNumWords[1];}return error;
}u8 SHT85_ReadStatus(uint16_t* status)
{u8 error; // error codeerror = StartWriteAccess();// if no error, write "read status" commandif(error == NO_ERROR) {error = WriteCommand(CMD_READ_STATUS);}// if no error, start read accessif(error == NO_ERROR) {error = StartReadAccess();}// if no error, read statusif(error == NO_ERROR) {error = Read2BytesAndCrc(status, false, 0);}StopAccess();return error;
}u8 SHT85_ClearAllAlertFlags(void)
{u8 error; // error codeerror = StartWriteAccess();// if no error, write clear status register commandif(error == NO_ERROR) {error = WriteCommand(CMD_CLEAR_STATUS);}StopAccess();return error;
}u8 SHT85_SingleMeasurment(float* temperature, float* humidity, etSingleMeasureModes measureMode, uint8_t timeout)
{u8  error;           // error codeuint16_t rawValueTemp;    // temperature raw value from sensoruint16_t rawValueHumi;    // humidity raw value from sensorerror  = StartWriteAccess();// if no errorif(error == NO_ERROR) {// start measurementerror = WriteCommand((etCommands)measureMode);}// if no error, wait until measurement readyif(error == NO_ERROR) {// poll every 1ms for measurement ready until timeoutwhile(timeout--) {// check if the measurement has finishederror = StartReadAccess();// if measurement has finished -> exit loopif(error == NO_ERROR) break;// delay 1msDelayUs(1000);}// check for timeout errorif(timeout == 0) {error = TIMEOUT_ERROR;}}// if no error, read temperature and humidity raw valuesif(error == NO_ERROR) {error |= Read2BytesAndCrc(&rawValueTemp, true, 0);error |= Read2BytesAndCrc(&rawValueHumi, false, 0);}StopAccess();// if no error, calculate temperature in °C and humidity in %RHif(error == NO_ERROR) {*temperature = CalcTemperature(rawValueTemp);*humidity = CalcHumidity(rawValueHumi);}return error;
}u8 SHT85_StartPeriodicMeasurment(etPeriodicMeasureModes measureMode)
{u8 error; // error codeerror = StartWriteAccess();// if no error, start periodic measurement if(error == NO_ERROR) {error = WriteCommand((etCommands)measureMode);}StopAccess();return error;
}u8 SHT85_StopPeriodicMeasurment(void)
{u8 error; // error codeerror = StartWriteAccess();// if no error, write breake commandif(error == NO_ERROR) {error = WriteCommand(CMD_BREAK);}StopAccess();return error;
}u8 SHT85_ReadMeasurementBuffer(float* temperature, float* humidity)
{u8  error;        // error codeuint16_t rawValueTemp; // raw temperature from sensoruint16_t rawValueHumi; // raw humidity from sensorerror = StartWriteAccess();// if no error, read measurementsif(error == NO_ERROR) {error = WriteCommand(CMD_FETCH_DATA);}if(error == NO_ERROR) {error = StartReadAccess();  }if(error == NO_ERROR) {error = Read2BytesAndCrc(&rawValueTemp, true, 0);}if(error == NO_ERROR) {error = Read2BytesAndCrc(&rawValueHumi, false, 0);}// if no error, calculate temperature in °C and humidity in %RHif(error == NO_ERROR) {*temperature = CalcTemperature(rawValueTemp);*humidity = CalcHumidity(rawValueHumi);}StopAccess();return error;
}u8 SHT85_EnableHeater(void)
{u8 error; // error codeerror = StartWriteAccess();// if no error, write heater enable commandif(error == NO_ERROR) {error = WriteCommand(CMD_HEATER_ENABLE);}StopAccess();return error;
}u8 SHT85_DisableHeater(void)
{u8 error; // error codeerror = StartWriteAccess();// if no error, write heater disable commandif(error == NO_ERROR) {error = WriteCommand(CMD_HEATER_DISABLE);}StopAccess();return error;
}u8 SHT85_SoftReset(void)
{u8 error; // error codeerror = StartWriteAccess();// write reset commandif(error == NO_ERROR) {error  = WriteCommand(CMD_SOFT_RESET);}StopAccess();// if no error, wait 50 ms after resetif(error == NO_ERROR) {DelayUs(50000);}return error;
}static u8 StartWriteAccess(void)
{u8 error; // error code// write a start conditionI2c_StartCondition();// write the sensor I2C address with the write flagerror = I2c_WriteByte(I2C_ADDR << 1);return error;
}static u8 StartReadAccess(void)
{u8 error; // error code// write a start conditionI2c_StartCondition();// write the sensor I2C address with the read flagerror = I2c_WriteByte(I2C_ADDR << 1|0x01);return error;
}static void StopAccess(void)
{// write a stop conditionI2c_StopCondition();
}static u8 WriteCommand(etCommands command)
{u8 error; // error code// write the upper 8 bits of the command to the sensorerror = I2c_WriteByte(command >> 8);// write the lower 8 bits of the command to the sensorerror |= I2c_WriteByte(command & 0xFF);return error;
}static u8 Read2BytesAndCrc(uint16_t* data, bool finAck, uint8_t timeout)
{u8 error;    // error codeuint8_t bytes[2]; // read data arrayuint8_t checksum; // checksum byte// read two data bytes and one checksum bytebytes[0] = I2c_ReadByte(ACK);bytes[1] = I2c_ReadByte(ACK);checksum = I2c_ReadByte(finAck ? ACK : NO_ACK);// verify checksumerror = CheckCrc(bytes, 2, checksum);// combine the two bytes to a 16-bit value*data = (bytes[0] << 8) | bytes[1];return error;
}static uint8_t CalcCrc(uint8_t data[], uint8_t nbrOfBytes)
{uint8_t bit;        // bit maskuint8_t crc = 0xFF; // calculated checksumuint8_t byteCtr;    // byte counter// calculates 8-Bit checksum with given polynomialfor(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++) {crc ^= (data[byteCtr]);for(bit = 8; bit > 0; --bit) {if(crc & 0x80) {crc = (crc << 1) ^ CRC_POLYNOMIAL;} else {crc = (crc << 1);}}}return crc;
}static u8 CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
{// calculates 8-Bit checksumuint8_t crc = CalcCrc(data, nbrOfBytes);// verify checksumreturn (crc != checksum) ? CHECKSUM_ERROR : NO_ERROR;
}/**********************************************************
*函数:CalcTemperature
*功能:温度转换
*参数:rawValue:温度采样值
*返回:温度,单位℃
*描述:
**********************************************************/
static float CalcTemperature(uint16_t rawValue)
{// calculate temperature [°C]// T = -45 + 175 * rawValue / (2^16-1)return 175.0f * (float)rawValue / 65535.0f - 45.0f;
}/**********************************************************
*函数:CalcHumidity
*功能:相对湿度转换
*参数:rawValue:相对湿度采样值
*返回:相对湿度,单位%
*描述:
**********************************************************/
static float CalcHumidity(uint16_t rawValue)
{// calculate relative humidity [%RH]// RH = rawValue / (2^16-1) * 100return 100.0f * (float)rawValue / 65535.0f;
}/**********************************************************
*函数:FnTandRHToH2O
*功能:饱和水蒸气含量计算
*参数:nInTemp:温度,单位℃
*      nInRH:  相对湿度,单位%
*返回:饱和水蒸气含量,单位℃
*描述:
**********************************************************/
static float FnTandRHToH2O(float nInTemp, float nInRH)
{float fCnH2O; //H2O含量float fCnH2OMax;float fTemp; fTemp = nInTemp;fCnH2OMax = 0.0000008734* fTemp* fTemp* fTemp - 0.0000013617* fTemp* fTemp+ 0.0004784740* fTemp+ 0.0068091716;fCnH2O = nInRH*fCnH2OMax;return(fCnH2O);
}/**********************************************************
*函数:SHT85_Init
*功能:SHT85初始化
*参数:无
*返回:无
*描述:IIC引脚初始化,读取SN,配置测量频率。
**********************************************************/
void SHT85_Init(void)
{/*IIC引脚初始化。此程序使用STM32 HAL库,已在main()初始化*//*读取SN*/SHT85_ReadSerialNumber(&TH_Class_SHT85.SerialNumber);/*设置测量频率*/SHT85_StartPeriodicMeasurment(PERI_MEAS_MEDIUM_10_HZ);
}/**********************************************************
*函数:SHT85_FSM
*功能:SHT85 loop函数
*参数:无
*返回:无
*描述:读取温度、相对湿度、计算饱和水蒸气含量。建议执行频率1Hz。
**********************************************************/
void SHT85_FSM(void)
{/*读取温度、相对湿度*/SHT85_ReadMeasurementBuffer(&TH_Class_SHT85.Temperature, &TH_Class_SHT85.Humidity);/*计算饱和水蒸气含量*/TH_Class_SHT85.H2O = FnTandRHToH2O(TH_Class_SHT85.Temperature, TH_Class_SHT85.Humidity);
}

温湿度传感器驱动SHT85 单片机STM32 HAL库相关推荐

  1. HIH8121(HIH8000系列)温湿度传感器驱动代码-基于STM32 HAL库

    HIH8121温湿度传感器代码基于STM32 HAL库 HIH8121传感器简介 驱动代码.c 驱动代码.h main函数 HIH8121传感器简介 HIH8121是霍尼韦尔公司生产的测量温湿度参数一 ...

  2. 如何快速使用STM32 HAL库和涂鸦Wi-Fi模组进行通信

     简介:本文将教大家如何使用STM32HAL库快速开发和涂鸦WIFI模组通信,接入涂鸦云. 实现功能:通过APP实时监测温湿度数据 程序下载路径:demo程序. demo(定时采集数据)程序. 一.使 ...

  3. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

  4. STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

    STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的 ...

  5. 基于STM32 HAL库的遥控小车

    目录 前言 一.材料清单 二.系统概述 三.硬件设计 1.HC-SR04超声波模块 2.HC-05/06蓝牙模块 3.L298n电机驱动模块 四.代码 1.引脚设置 2.遥控部分 3.超声波报警部分 ...

  6. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  7. STM32 HAL库详解

    STM32 HAL库整体总结 STM32 之二 HAL库详解 及 手动移植 本篇博客是对以上参考资源的一个二次总结与整理. 1. HAL库文件结构 对于开发人员而言,首先要清楚 HAL 库的文件结构. ...

  8. STM32 HAL库组成概述

    STM32 HAL库概述 ## (一)HAL库设计思想 什么是HAL(Hardware Abstraction Layer)? from 百度百科: 硬件抽象层是位于操作系统内核与硬件电路之间的接口层 ...

  9. stm32+HAL库制作转速仪

    stm32+HAL库制作转速仪 前言 电机在运行过程中,需要实时检测其转速的稳定性,有效反映电机的运行情况. 本文介绍了基于stm32的转速仪的设计,可以用光电门传感器和红外对管传感器测量,可以设置选 ...

最新文章

  1. 正则表达式grep、egrep--already
  2. 在腾讯,如何做 Code Review?
  3. React Native填坑之旅--动画篇
  4. C#程序设计笔记(第九章)
  5. c语言程序结果 856400,C语言程序设计答案(黄保和编)第3章.pdf
  6. PyCharm的高效使用技巧
  7. jQuery Validate 合法性,限制性校验
  8. Hbase和MySQL的区别是什么?
  9. 对话Google全球VP Jay Yagnik:TensorFlow2.0会强化可控性
  10. 王者调整期选股技术之喇叭花开
  11. python实现部分实例
  12. 玩转windows内置linux子系统_1.安装
  13. C#怎么调用MATLAB的动态链接库
  14. 60个超实用的网络技能学习平台
  15. 猴子分桃问题的几种解法
  16. 在制品与前置时间(又叫交付时间)
  17. 贾跃亭回应传闻:乐视的成功不是靠政府关系
  18. 深入理解Java虚拟机(周志明版)总结—WSYW126
  19. FineReport分页预览,获取某行某列的值
  20. JAVA反射----->看这篇就够了

热门文章

  1. 为设计指定输入端口驱动强度:set_driving_cell、set_drive 和set_input_transition
  2. IT 外包中的甲方乙方,德国人,美国人,印度人和日本人印象杂谈
  3. 《海盗派测试分析》笔记-01 了解测试任务 KYM
  4. 实验一 常用仪器与门逻辑电路实验
  5. 自媒体平台营销变现,今日头条如何开通收益引流方法教程
  6. Excel 中查找和替换字符
  7. ROS踩坑之.msg文件未能转化为.h文件
  8. 双屏显示例程C#例程
  9. 易语言零基础新手入门系列教程 第一课
  10. 前后端分离-小项目-1前端布局