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)R1R0用来设置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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云手机技术怎么实现的?

前言 随着亚矩阵云手机在跨境电商、海外社媒矩阵搭建、出海运营、海外广告投放、国内新媒体矩阵运营、品牌应用矩阵运营等领域内的普及和使用&#xff0c;云手机的理念已经被越来越多人所接受和认同。今天我们就一起来浅析一下&#xff0c;到底云手机的技术是怎么实现的&#…

HTML中link的用法

一点寒芒先到&#xff0c;随后&#xff0c;抢出如龙&#xff01; 对于本人而言&#xff0c;这篇笔记内容有些扩展了&#xff0c;有些还未学到的也用上了&#xff0c;但是大概可以使用的明白&#xff0c;坚持下去&#xff0c;相信一定可以建设一个稳固的根基。 该文章为个人成…

闪豆多平台视频批量下载器

1. 视频链接获取与解析 首先&#xff0c;在哔哩哔哩网页中随意点击一个视频&#xff0c;比如你最近迷上了一个UP主的美食制作视频&#xff0c;想要下载下来慢慢学。点击视频后&#xff0c;复制视频页面的链接。复制完成后&#xff0c;不要急着关闭浏览器&#xff0c;因为接下来…

Vulnhub DC-8靶机攻击实战(一)

导语   Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…

JWT在线解密/解码 - 加菲工具

JWT在线解密/解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.online 或者直接进入JWT 在线解密/解码 https://www.orcc.online/tools/jwt 进入功能页面 使用 输入对应的jwt内容&#xff0c;点击解码按钮即可

换了城市ip属地会变吗?为什么换了城市IP属地不变

当我们跨越城市的界限&#xff0c;从一个地方迁移到另一个地方时&#xff0c;许多日常使用的网络服务和应用程序都会感知到这种变化&#xff0c;其中一个显著的现象就是IP属地的变化。IP属地&#xff0c;即IP地址所在的地理位置信息&#xff0c;它通常与互联网服务提供商&#…

如何在谷歌浏览器中设置自定义安全警告

随着网络环境的日益复杂&#xff0c;浏览器的安全问题也愈发引人关注。谷歌浏览器作为一款广泛使用的浏览器&#xff0c;其自定义安全警告功能为用户提供了更加个性化和安全的浏览体验。本文将详细介绍如何在谷歌浏览器中设置自定义安全警告&#xff0c;帮助用户更好地保护自己…

深度学习中的卷积和反卷积(四)——卷积和反卷积的梯度

本系列已完结&#xff0c;全部文章地址为&#xff1a; 深度学习中的卷积和反卷积&#xff08;一&#xff09;——卷积的介绍 深度学习中的卷积和反卷积&#xff08;二&#xff09;——反卷积的介绍 深度学习中的卷积和反卷积&#xff08;三&#xff09;——卷积和反卷积的计算 …

Mongodb相关内容

Mongodb相关内容 1、Windows平台安装2、Linux平台安装3、基本常用命令文档更新删除文档分页查询索引 pymongo操作 客户端下载&#xff1a;https://download.csdn.net/download/guoqingru0311/90273435 1、Windows平台安装 方式一&#xff1a; 方式2&#xff1a; 方式3&#…

RabbitMQ前置概念

文章目录 1.AMQP协议是什么&#xff1f;2.rabbitmq端口介绍3.消息队列的作用和使用场景4.rabbitmq工作原理5.整体架构核心概念6.使用7.消费者消息推送限制&#xff08;work模型&#xff09;8.fanout交换机9.Direct交换机10.Topic交换机&#xff08;推荐&#xff09;11.声明队列…

[Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图

目录 1. MAC安装环境 1. 1 Icarus Verilog 编译 1. 2 gtkwave 查看波形 2. 安装遇到的问题 2. 1 macOS cannot verify that this app is free from malware 2. 2 gtkwave-bin is not compatible with macOS 14 or later 3. 运行示例 3. 1 源代码 3. 2 编译Verilog 3. 3 生成.v…

kalilinux - 目录扫描之dirsearch

情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站&#xff0c;例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考&#xff0c;我们只指导https://www.example.com/ 但不知道它下面有什么文件&#xff0c;文…

如何制作符合自己设备的FLM下载算法

如何制作符合自己设备的FLM下载算法 --------以I.MXRT1062 QSPI FLAH为例&#xff08;串行qspi nor flash&#xff09; 本文介绍一种基于i.mxrt1062的外挂flah的qspi nor flash下载算法FLM的一种方法&#xff0c;Flash 编程算法是一种用于擦除或下载应用程序到 Flash 设备的软…

LLMs之RAG:《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读

LLMs之RAG&#xff1a;《EdgeRAG: Online-Indexed RAG for Edge Devices》翻译与解读 导读&#xff1a;这篇论文针对在资源受限的边缘设备上部署检索增强生成 (RAG) 系统的挑战&#xff0c;提出了一种名为 EdgeRAG 的高效方法。EdgeRAG 通过巧妙地结合预计算、在线生成和缓存策…

基于Java的百度AOI数据解析与转换的实现方法

目录 前言 一、AOI数据结构简介 1、官网的实例接口 2、响应参数介绍 二、Java对AOI数据的解析 1、数据解析流程图 2、数据解析实现 3、AOI数据解析成果 三、总结 前言 在当今信息化社会&#xff0c;地理信息数据在城市规划、交通管理、商业选址等领域扮演着越来越重要的…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

2013年IMO几何预选题第4题

在 △ A B C \triangle ABC △ABC 中, A B < A C AB < AC AB<AC. P P P, Q Q Q 是直线 A C AC AC 上的两个不同的点, 满足 ∠ P B A ∠ Q B A ∠ A C B \angle PBA \angle QBA \angle ACB ∠PBA∠QBA∠ACB, 且 A A A 在 P P P 与 C C C 之间. 已知在线段…

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…

网络科技有限公司网络设计

网络科技有限公司网络设计 摘要&#xff1a;伴随着信息科技发展&#xff0c;上网变得一件必不可少的事情&#xff0c;当然网络安全对我们也是越来越重要。像我们的传统网结构是无法为我们的上网提供一个安全的网络环境。锐雯网络科技有限公司就是以网络安全为基本的对网络惊醒…

【c++】哈希

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 目录 1. unordered系列关联式容器1.1 unordered_map1.2 接口函数 例题 2.哈希概念2.1哈希冲突2.2哈希函数2.3哈希冲突解决2.3.1线性探测二次探测 2.3.2开散列 3. 封装迭代器封装完整代码&a…