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…...
单细胞组学大模型(8)--- scGenePT,scGPT和GenePT的结合,实验数据和文本数据的交融模型
–https://doi.org/10.1101/2024.10.23.619972 研究团队和单位 Theofanis Karaletsos–Head Of AI - Science at Chan Zuckerberg Initiative (Chan Zuckerberg Initiative是扎克伯格和他妻子Chan成立的科研&教育机构) 研究简介 研究背景&…...
详解如何自定义 Android Dex VMP 保护壳
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 前言 Android Dex VMP(Virtual Machine Protection,虚拟机保护)壳是一种常见的应用保护技术,主要用于保护 And…...
PHP中的魔术函数
PHP 魔术函数是在某些情况下会自动调用的特殊函数,它们以双下划线 __ 开头,以下是对常见 PHP 魔术函数的详细介绍: ### 构造函数和析构函数 - **__construct()**: - 这是一个构造函数,在创建类的新对象时会自动调…...
excel 判断某个单元格的日期,如果超过3天,则在另一个单元格显示超过三天的公式
excel 判断某个单元格的日期,如果超过3天,则在另一个单元格显示超过三天的公式,公式如下: IF(DATEDIF(C627,TODAY(),"d")<4,"3天以内","超过三天") IF(D627"超过3天","文件赶紧…...
TCP 序列和确认号说明 | seq 和 ack 号计算方法
注:本文为 “TCP 序列” 相关文章合辑。 英文引文机翻未校。 TCP Sequence and Acknowledgement Numbers Explained TCP 序列和确认编号说明 TCP Sequence (seq) and Acknowledgement (ack) numbers help enable ordered reliable data transfer for TCP streams…...
【Linux】Mysql部署步骤
一、JDK安装配置 在home目录下执行命令:mkdir Jdk 1.将JDK 上传至该文件夹,有些终端工具可以直接上传文件,比如:MobaXterm 可以看到安装包已经上传上来了 2.直接安装 命令:rpm -ivh jdk-8u311-linux-x64.rpm 3.安装成…...
【算法】枚举
枚举 普通枚举1.铺地毯2.回文日期3.扫雷 二进制枚举1.子集2.费解的开关3.Even Parity 顾名思义,就是把所有情况全都罗列出来,然后找出符合题目要求的那一个。因此,枚举是一种纯暴力的算法。一般情况下,枚举策略都是会超时的。此时…...
【C++】构造函数与析构函数
写在前面 构造函数与析构函数都是属于类的默认成员函数! 默认成员函数是程序猿不显示声明定义,编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的,关于类与对象不才在前面笔记中有详细的介绍:点我…...
力扣刷题汇总
动态规划 1 . 最大子序和 (Maximum Subarray Sum) Leetcode 53. 最大子数组和 经典dp 问题描述:给定一个整数数组,求其中和最大的连续子数组的和。 状态定义:dp[i] 表示以第 i 个元素结尾的最大子序和。 2 . 最长公共子序列 (Longest Commo…...
Ansible自动化运维:基础与实践
在当今的IT运维领域,Ansible作为一款强大的自动化运维工具,正发挥着日益重要的作用。本文将详细介绍Ansible的相关知识,包括其作用、特点、安装配置以及常用模块的使用方法,旨在帮助读者快速上手并熟练运用Ansible进行自动化运维工…...
微信小程序在使用页面栈保存页面信息时,如何避免数据丢失?
微信小程序在使用页面栈保存页面信息时避免数据丢失的方法: 一、使用全局变量存储关键数据: 定义一个全局变量,例如在 app.js 中,用于存储页面的重要信息。在页面的 onHide 或 onUnload 生命周期中,将需要保存的数据…...
我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时
据央视新闻从中国民航局了解到,2024 年我国全年新增通航企业 145 家、通用机场 26 个,颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架,无人机运营单位总数超过 2 万家,累计完成无人机飞行 2666 万小时&#x…...
vue3+vite+ts+router4+Pinia+Axios+sass 从0到1搭建
1、使用vite构建项目 npm create vitelatest 填写项目名的时候不能大写 2、跑起来之后配置下 import { defineConfig } from vite import vue from vitejs/plugin-vue import { resolve } from path // https://vite.dev/config/ export default defineConfig({plugins: [vue…...
C语言:-三子棋游戏代码:分支-循环-数组-函数集合
思路分析: 1、写菜单 2、菜单之后进入游戏的操作 3、写函数 实现游戏 3.1、初始化棋盘函数,使数组元素都为空格 3.2、打印棋盘 棋盘的大概样子 3.3、玩家出棋 3.3.1、限制玩家要下的坐标位置 3.3.2、判断玩家要下的位置是否由棋子 3.4、电脑出棋 3.4.1、…...
前端调试遇到的无限debugger的原理与绕过
背景 debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字,只要遇到它,JavaScript 的执行便会在此处中断,进入调试模式。有了 debugger 这个关键字,我们就可以非常方便地对 JavaScript 代码进行调试,比如使用 JavaScript Hook 时,我们可以加入 debugger 关键字…...
Java负载均衡
Java中的负载均衡原理是指通过合理分配网络请求或计算任务的方式,将工作负载分配到多个服务器、处理单元或服务实例上,从而提高系统的性能、可扩展性和可用性。负载均衡不仅可以分散请求压力,还能增强系统的容错能力,避免单点故障…...
spark,读取和写入同一张表问题
读取a表,写入a表 1.写入的是分区表,不报错 2.读取上来之后,创建为临时视图temp,然后先写入a表,再使用temp,就会报错 解决办法:可以先使用temp,再写入a表 3.写入的不是分区表&…...
用gpg和sha256验证ubuntu.iso
链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说,命令的各个部分含义如下: …...
HIVE技术
本文章基于黑马免费资料编写。 hive介绍 简介 hive架构 hive需要启动的配置 执行元数据库初始化命令 使用hive必须启动的服务 ./schematool -initSchema -dbType mysql -verbos启动 Hive 创建一个 hive 的日志文件夹 mkdir /export/server/hive/logs启动元数据管理服务 n…...
我的世界-与门、或门、非门等基本门电路实现
一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…...
GPU 硬件原理架构(一)
这张费米管线架构图能看懂了,整个GPU的架构基本就熟了。市面上有很多GPU厂家,他们产品的架构各不相同,但是核心往往差不多,整明白一了个基本上就可以触类旁通了。下面这张图信息量很大,可以结合博客GPU 英伟达GPU架构回…...
[Qt]窗口-QMainWindow类-QMenuBar、QToolBar、QStatusBar、QDockWidget控件
目录 1.QMainWindow类介绍 2.菜单栏-QMenuBar控件 创建菜单栏 添加菜单和菜单选项 triggered信号 设置快捷键 添加分割线 添加图标 使用案例 3.工具栏-QToolBar控件 使用介绍 设置停靠位置 设置浮动属性 设置移动属性 使用案例 4.状态栏-QStatusBar控件 状…...
Linux命令行工具-使用方法
参考资料 Linux网络命令:网络工具socat详解-CSDN博客 arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别_aarch64-elf-gcc aarch64-linux-gnu-CSDN博客 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 热爱学习地派大星-CS…...
HTML中如何保留字符串的空白符和换行符号的效果
有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} , HTML中想要保留 \n的换行效果的有下面3种方法: 1、style 中 设置 white-space: pre-lin…...
ASP.NET Core WebApi接口IP限流实践技术指南
在当今的Web开发中,接口的安全性和稳定性至关重要。面对恶意请求或频繁访问,我们需要采取有效的措施来保护我们的WebApi接口。IP限流是一种常见的技术手段,通过对来自同一IP地址的请求进行频率控制,可以有效地防止恶意攻击和过度消…...
SparkSQL数据模型综合实践
文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序,查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…...
C++实现设计模式---外观模式 (Facade)
外观模式 (Facade) 外观模式 是一种结构型设计模式,为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口,使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口,屏蔽子系统的内部细节。 …...
计算机网络 (43)万维网WWW
前言 万维网(World Wide Web,WWW)是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义:万维网是一个分布式、联机式的信息存储空间,通过超文本链接的方式将分散的信息…...
C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等
在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响。然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题,让我们能够更好地处理这些文件。…...
Docker Desktop 中安装 MySQL 并开启远程访问的详细教程
是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程: 一、安装 MySQL 容器 拉取 MySQL 镜像: docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL,可以将 latest 替换为具体…...
沸点 | 聚焦嬴图Cloud V2.1:具备水平可扩展性+深度计算的云原生嬴图动力站!
近日,嬴图正式推出嬴图Cloud V2.1,此次发布专注于提供无与伦比的用户体验,包括具有水平可扩展性的嬴图Powerhouse的一键部署、具有灵活定制功能的管理控制台、VPC / 专用链接等,旨在满足用户不断变化需求的各项前沿功能࿰…...
西门子【Library of Basic Controls (LBC)基本控制库”(LBC) 提供基本控制功能】
AF架构中使用的库 文章目录 Table of contents Legal information ..............................................................................................................................2 1 Introduction ................................................…...
EMQX集群搭建
集群搭建 通过使用 EMQX 集群,您可以在一个或多个节点发生故障时仍然保持集群运行,从而享受到容错和高可用性的好处。 尽管没有严格的上限,但建议在 EMQX 开源版中将集群大小限制为三个节点。仅使用核心类型节点时,较小的集群规模…...
【Flink系列】10. Flink SQL
10. Flink SQL Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认为它们是一体的。Flink是批流统一的处理框架,无论是批处理(…...
Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入
前言 之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理,那么今天我们就讲一下利用以及发现。 这里推荐两个专门研究java漏洞的靶场,本次也是根据这两个靶场来分析代码,两个靶场都是差不多的。 https://github.com/bewhale/JavaSec …...
TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
注:本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态:SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层,有个 FLAGS 字段,这个字段有…...
OSPF的LSA的学习研究
OSPF常见1、2、3、4、5、7类LSA的研究 1、拓扑如图,按照地址表配置,激活OSPF划分相关区域并宣告相关网段 2、1类LSA,每台运行了OSPF的路由器都会产生,描述了路由器的直连接口状况和cost 可以看到R1产生了一条router lsa࿰…...
C# OpenCV机器视觉:转速测量
在一个看似平常却又暗藏神秘能量的日子里,阿杰正在他那充满科技感的实验室里,对着一堆奇奇怪怪的仪器发呆。突然,手机铃声如一道凌厉的剑气划破寂静,原来是工厂的赵厂长打来的紧急电话:“阿杰啊,咱们工厂新…...
wireshark 网络分析工具
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网络安全从菜鸟到飞鸟的逆袭 目录 一、网络截获数据包的基础1、以太网…...
XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展
在当今企业数字化转型加速的时代背景下,任务调度在保障系统高效运行方面的关键作用日益凸显。XXL-JOB 正式加入 GitCode,成为 G-Star 优秀毕业项目,为分布式任务调度领域带来了新的契机与活力,助力企业应对复杂多变的业务需求。 X…...
Java Web开发进阶——WebSocket与实时通信
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,广泛应用于需要实时数据交换的应用程序中。它能够实现服务器与客户端之间的双向通信,避免了传统 HTTP 请求/响应的延迟。结合 Spring Boot,开发实时通信应用变得更加高效与简便。 1. …...
解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题
解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题 问题描述 本人在使用zotero中的zotero one(青柠学术插件)的时候,使用插件跳转obsidian中的对应笔记,出现上图情况。(错误中提到的…...
晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...
分布式数据存储基础与HDFS操作实践(副本)
以下为作者本人撰写的报告,步骤略有繁琐,不建议作为参考内容,可以适当浏览,进一步理解。 一、实验目的 1、理解分布式文件系统的基本概念和工作原理。 2、掌握Hadoop分布式文件系统(HDFS)的基本操作。 …...
Rust:指针 `*T` 和引用 `T`的区别
在 Rust 编程语言中,*T 和 &T 是两种不同类型的指针,它们各自代表了不同的内存访问方式和所有权模型。 *T(原始指针或裸指针): *T 是一个原始指针(也称为裸指针或裸引用),它可以…...
【2025最新版】PCL点云处理算法汇总(C++长期更新版)
博客长期更新,最近一次更新时间为:2025年1月17日。 pcl::copyPointCloud(*cloud, indicesY, *cloud_yboundary);目录 配库常用数据免费下载链接一、点云滤波1、常用滤波器2、采样滤波3、裁剪滤波 二、KD树与八叉树1、KD树2、八叉树 三、点云配准粗配准精…...
换了城市ip属地会变吗?为什么换了城市IP属地不变
当我们跨越城市的界限,从一个地方迁移到另一个地方时,许多日常使用的网络服务和应用程序都会感知到这种变化,其中一个显著的现象就是IP属地的变化。IP属地,即IP地址所在的地理位置信息,它通常与互联网服务提供商&#…...
mysql 如何快速删除表数据
在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…...
Windows安装Jenkins——及修改主目录、配置简体中文、修改插件源
一、简介 Jenkinshttps://www.jenkins.io/zh/ Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 二、Windows安装配置Jenkins2.479 2.1、J...